X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Findeo5.c;h=deb76b97952862541ed54a896fabb529febcd1e4;hb=cb7190cd2c691fd93e4d3664f3fce6c19ee001dd;hp=db4933dfb84d71c43f7cc3c343fab436a4513220;hpb=411e859bceefd465864f9a8ed29e1c08927e12f3;p=ffmpeg diff --git a/libavcodec/indeo5.c b/libavcodec/indeo5.c index db4933dfb84..deb76b97952 100644 --- a/libavcodec/indeo5.c +++ b/libavcodec/indeo5.c @@ -2,20 +2,20 @@ * Indeo Video Interactive v5 compatible decoder * Copyright (c) 2009 Maxim Poliakovski * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -27,7 +27,7 @@ * Known FOURCCs: 'IV50' */ -#define ALT_BITSTREAM_READER_LE +#define BITSTREAM_READER_LE #include "avcodec.h" #include "get_bits.h" #include "dsputil.h" @@ -80,17 +80,18 @@ typedef struct { /** - * Decodes Indeo5 GOP (Group of pictures) header. + * Decode Indeo5 GOP (Group of pictures) header. * This header is present in key frames only. * It defines parameters for all frames in a GOP. * - * @param ctx [in,out] ptr to the decoder context - * @param avctx [in] ptr to the AVCodecContext + * @param[in,out] ctx ptr to the decoder context + * @param[in] avctx ptr to the AVCodecContext * @return result code: 0 = OK, -1 = error */ static int decode_gop_header(IVI5DecContext *ctx, AVCodecContext *avctx) { - int result, i, p, tile_size, pic_size_indx, mb_size, blk_size, blk_size_changed = 0; + int result, i, p, tile_size, pic_size_indx, mb_size, blk_size; + int quant_mat, blk_size_changed = 0; IVIBandDesc *band, *band1, *band2; IVIPicConfig pic_conf; @@ -212,9 +213,21 @@ static int decode_gop_header(IVI5DecContext *ctx, AVCodecContext *avctx) /* select dequant matrix according to plane and band number */ if (!p) { - band->quant_mat = (pic_conf.luma_bands > 1) ? i+1 : 0; + quant_mat = (pic_conf.luma_bands > 1) ? i+1 : 0; } else { - band->quant_mat = 5; + quant_mat = 5; + } + + if (band->blk_size == 8) { + band->intra_base = &ivi5_base_quant_8x8_intra[quant_mat][0]; + band->inter_base = &ivi5_base_quant_8x8_inter[quant_mat][0]; + band->intra_scale = &ivi5_scale_quant_8x8_intra[quant_mat][0]; + band->inter_scale = &ivi5_scale_quant_8x8_inter[quant_mat][0]; + } else { + band->intra_base = ivi5_base_quant_4x4_intra; + band->inter_base = ivi5_base_quant_4x4_inter; + band->intra_scale = ivi5_scale_quant_4x4_intra; + band->inter_scale = ivi5_scale_quant_4x4_inter; } if (get_bits(&ctx->gb, 2)) { @@ -234,7 +247,10 @@ static int decode_gop_header(IVI5DecContext *ctx, AVCodecContext *avctx) band2->mb_size = band1->mb_size; band2->blk_size = band1->blk_size; band2->is_halfpel = band1->is_halfpel; - band2->quant_mat = band1->quant_mat; + band2->intra_base = band1->intra_base; + band2->inter_base = band1->inter_base; + band2->intra_scale = band1->intra_scale; + band2->inter_scale = band1->inter_scale; band2->scan = band1->scan; band2->inv_transform = band1->inv_transform; band2->dc_transform = band1->dc_transform; @@ -280,9 +296,9 @@ static int decode_gop_header(IVI5DecContext *ctx, AVCodecContext *avctx) /** - * Skips a header extension. + * Skip a header extension. * - * @param gb [in,out] the GetBit context + * @param[in,out] gb the GetBit context */ static inline void skip_hdr_extension(GetBitContext *gb) { @@ -296,10 +312,10 @@ static inline void skip_hdr_extension(GetBitContext *gb) /** - * Decodes Indeo5 picture header. + * Decode Indeo5 picture header. * - * @param ctx [in,out] ptr to the decoder context - * @param avctx [in] ptr to the AVCodecContext + * @param[in,out] ctx ptr to the decoder context + * @param[in] avctx ptr to the AVCodecContext * @return result code: 0 = OK, -1 = error */ static int decode_pic_hdr(IVI5DecContext *ctx, AVCodecContext *avctx) @@ -348,11 +364,11 @@ static int decode_pic_hdr(IVI5DecContext *ctx, AVCodecContext *avctx) /** - * Decodes Indeo5 band header. + * Decode Indeo5 band header. * - * @param ctx [in,out] ptr to the decoder context - * @param band [in,out] ptr to the band descriptor - * @param avctx [in] ptr to the AVCodecContext + * @param[in,out] ctx ptr to the decoder context + * @param[in,out] band ptr to the band descriptor + * @param[in] avctx ptr to the AVCodecContext * @return result code: 0 = OK, -1 = error */ static int decode_band_hdr(IVI5DecContext *ctx, IVIBandDesc *band, @@ -416,13 +432,13 @@ static int decode_band_hdr(IVI5DecContext *ctx, IVIBandDesc *band, /** - * Decodes info (block type, cbp, quant delta, motion vector) + * Decode info (block type, cbp, quant delta, motion vector) * for all macroblocks in the current tile. * - * @param ctx [in,out] ptr to the decoder context - * @param band [in,out] ptr to the band descriptor - * @param tile [in,out] ptr to the tile descriptor - * @param avctx [in] ptr to the AVCodecContext + * @param[in,out] ctx ptr to the decoder context + * @param[in,out] band ptr to the band descriptor + * @param[in,out] tile ptr to the tile descriptor + * @param[in] avctx ptr to the AVCodecContext * @return result code: 0 = OK, -1 = error */ static int decode_mb_info(IVI5DecContext *ctx, IVIBandDesc *band, @@ -437,6 +453,10 @@ static int decode_mb_info(IVI5DecContext *ctx, IVIBandDesc *band, ref_mb = tile->ref_mbs; offs = tile->ypos * band->pitch + tile->xpos; + if (!ref_mb && + ((band->qdelta_present && band->inherit_qdelta) || band->inherit_mv)) + return AVERROR_INVALIDDATA; + /* scale factor for motion vectors */ mv_scale = (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3); mv_x = mv_y = 0; @@ -541,11 +561,11 @@ static int decode_mb_info(IVI5DecContext *ctx, IVIBandDesc *band, /** - * Decodes an Indeo5 band. + * Decode an Indeo5 band. * - * @param ctx [in,out] ptr to the decoder context - * @param band [in,out] ptr to the band descriptor - * @param avctx [in] ptr to the AVCodecContext + * @param[in,out] ctx ptr to the decoder context + * @param[in,out] band ptr to the band descriptor + * @param[in] avctx ptr to the AVCodecContext * @return result code: 0 = OK, -1 = error */ static int decode_band(IVI5DecContext *ctx, int plane_num, @@ -570,18 +590,6 @@ static int decode_band(IVI5DecContext *ctx, int plane_num, return -1; } - if (band->blk_size == 8) { - band->intra_base = &ivi5_base_quant_8x8_intra[band->quant_mat][0]; - band->inter_base = &ivi5_base_quant_8x8_inter[band->quant_mat][0]; - band->intra_scale = &ivi5_scale_quant_8x8_intra[band->quant_mat][0]; - band->inter_scale = &ivi5_scale_quant_8x8_inter[band->quant_mat][0]; - } else { - band->intra_base = ivi5_base_quant_4x4_intra; - band->inter_base = ivi5_base_quant_4x4_inter; - band->intra_scale = ivi5_scale_quant_4x4_intra; - band->inter_scale = ivi5_scale_quant_4x4_inter; - } - band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel]; /* apply corrections to the selected rvmap table if present */ @@ -625,7 +633,7 @@ static int decode_band(IVI5DecContext *ctx, int plane_num, FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]); } -#if IVI_DEBUG +#ifdef DEBUG if (band->checksum_present) { uint16_t chksum = ivi_calc_band_checksum(band); if (chksum != band->checksum) { @@ -643,9 +651,9 @@ static int decode_band(IVI5DecContext *ctx, int plane_num, /** - * Switches buffers. + * Switch buffers. * - * @param ctx [in,out] ptr to the decoder context + * @param[in,out] ctx ptr to the decoder context */ static void switch_buffers(IVI5DecContext *ctx) { @@ -686,7 +694,7 @@ static void switch_buffers(IVI5DecContext *ctx) /** - * Initializes Indeo5 decoder. + * Initialize Indeo5 decoder. */ static av_cold int decode_init(AVCodecContext *avctx) { @@ -753,7 +761,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, switch_buffers(ctx); - //START_TIMER; + //{ START_TIMER; if (ctx->frame_type != FRAMETYPE_NULL) { for (p = 0; p < 3; p++) { @@ -768,7 +776,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, } } - //STOP_TIMER("decode_planes"); + //STOP_TIMER("decode_planes"); } if (ctx->frame.data[0]) avctx->release_buffer(avctx, &ctx->frame); @@ -796,7 +804,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, /** - * Closes Indeo5 decoder and cleans up its context. + * Close Indeo5 decoder and clean up its context. */ static av_cold int decode_close(AVCodecContext *avctx) { @@ -805,7 +813,7 @@ static av_cold int decode_close(AVCodecContext *avctx) ff_ivi_free_buffers(&ctx->planes[0]); if (ctx->mb_vlc.cust_tab.table) - free_vlc(&ctx->mb_vlc.cust_tab); + ff_free_vlc(&ctx->mb_vlc.cust_tab); if (ctx->frame.data[0]) avctx->release_buffer(avctx, &ctx->frame); @@ -814,7 +822,7 @@ static av_cold int decode_close(AVCodecContext *avctx) } -AVCodec indeo5_decoder = { +AVCodec ff_indeo5_decoder = { .name = "indeo5", .type = AVMEDIA_TYPE_VIDEO, .id = CODEC_ID_INDEO5,