From 81ad97eedad2b34a8b758fda72f68488d7f86118 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Sat, 19 May 2012 18:44:16 +0100 Subject: lavf: make output format matching case insensitive This is consistent with how input formats are matched. Signed-off-by: Mans Rullgard --- libavformat/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavformat/utils.c b/libavformat/utils.c index e51884774b..e8430b23fa 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -218,7 +218,7 @@ AVOutputFormat *av_guess_format(const char *short_name, const char *filename, score_max = 0; while ((fmt = av_oformat_next(fmt))) { score = 0; - if (fmt->name && short_name && !strcmp(fmt->name, short_name)) + if (fmt->name && short_name && !av_strcasecmp(fmt->name, short_name)) score += 100; if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type)) score += 10; -- cgit v1.2.3 From 68aef0b481f11931f078dc915a93bdfa680f90a4 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Sat, 19 May 2012 17:13:17 +0100 Subject: lavf: change some (de)muxer names to lowercase This is consistent with other format names. Signed-off-by: Mans Rullgard --- libavformat/idroqdec.c | 2 +- libavformat/idroqenc.c | 2 +- libavformat/iff.c | 2 +- libavformat/iss.c | 2 +- libavformat/mtv.c | 2 +- tests/fate/video.mak | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libavformat/idroqdec.c b/libavformat/idroqdec.c index 5c1528de0f..be3122e789 100644 --- a/libavformat/idroqdec.c +++ b/libavformat/idroqdec.c @@ -217,7 +217,7 @@ static int roq_read_packet(AVFormatContext *s, } AVInputFormat ff_roq_demuxer = { - .name = "RoQ", + .name = "roq", .long_name = NULL_IF_CONFIG_SMALL("id RoQ format"), .priv_data_size = sizeof(RoqDemuxContext), .read_probe = roq_probe, diff --git a/libavformat/idroqenc.c b/libavformat/idroqenc.c index 266a731cc3..394d16ff4d 100644 --- a/libavformat/idroqenc.c +++ b/libavformat/idroqenc.c @@ -36,7 +36,7 @@ static int roq_write_header(struct AVFormatContext *s) } AVOutputFormat ff_roq_muxer = { - .name = "RoQ", + .name = "roq", .long_name = NULL_IF_CONFIG_SMALL("raw id RoQ format"), .extensions = "roq", .audio_codec = CODEC_ID_ROQ_DPCM, diff --git a/libavformat/iff.c b/libavformat/iff.c index 8ed68125cb..cde420ea3e 100644 --- a/libavformat/iff.c +++ b/libavformat/iff.c @@ -281,7 +281,7 @@ static int iff_read_packet(AVFormatContext *s, } AVInputFormat ff_iff_demuxer = { - .name = "IFF", + .name = "iff", .long_name = NULL_IF_CONFIG_SMALL("Interchange File Format"), .priv_data_size = sizeof(IffDemuxContext), .read_probe = iff_probe, diff --git a/libavformat/iss.c b/libavformat/iss.c index 8c297f8ffb..b9848d3139 100644 --- a/libavformat/iss.c +++ b/libavformat/iss.c @@ -123,7 +123,7 @@ static int iss_read_packet(AVFormatContext *s, AVPacket *pkt) } AVInputFormat ff_iss_demuxer = { - .name = "ISS", + .name = "iss", .long_name = NULL_IF_CONFIG_SMALL("Funcom ISS format"), .priv_data_size = sizeof(IssDemuxContext), .read_probe = iss_probe, diff --git a/libavformat/mtv.c b/libavformat/mtv.c index 0d4a05c5f5..e917a1980c 100644 --- a/libavformat/mtv.c +++ b/libavformat/mtv.c @@ -188,7 +188,7 @@ static int mtv_read_packet(AVFormatContext *s, AVPacket *pkt) } AVInputFormat ff_mtv_demuxer = { - .name = "MTV", + .name = "mtv", .long_name = NULL_IF_CONFIG_SMALL("MTV format"), .priv_data_size = sizeof(MTVDemuxContext), .read_probe = mtv_probe, diff --git a/tests/fate/video.mak b/tests/fate/video.mak index 2ae028ed7f..e173c4a4b8 100644 --- a/tests/fate/video.mak +++ b/tests/fate/video.mak @@ -119,7 +119,7 @@ FATE_SAMPLES_AVCONV += fate-id-cin-video fate-id-cin-video: CMD = framecrc -i $(SAMPLES)/idcin/idlog-2MB.cin -pix_fmt rgb24 FATE_SAMPLES_AVCONV += fate-idroq-video-encode -fate-idroq-video-encode: CMD = md5 -f image2 -vcodec pgmyuv -i $(SAMPLES)/ffmpeg-synthetic/vsynth1/%02d.pgm -sws_flags +bitexact -vf pad=512:512:80:112 -f RoQ -t 0.2 +fate-idroq-video-encode: CMD = md5 -f image2 -vcodec pgmyuv -i $(SAMPLES)/ffmpeg-synthetic/vsynth1/%02d.pgm -sws_flags +bitexact -vf pad=512:512:80:112 -f roq -t 0.2 FATE_IFF += fate-iff-byterun1 fate-iff-byterun1: CMD = framecrc -i $(SAMPLES)/iff/ASH.LBM -pix_fmt rgb24 -- cgit v1.2.3 From b37d945dd4213cb8e92146571b0374cd45d52286 Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Wed, 16 May 2012 18:39:40 +0200 Subject: mp3: fix start band index for block type 2 in 8kHz audio In hybrid frames long window part ends at 36 samples for most of the cases but at 72 for 8kHz case. For some reason decoder assumed it's 48 or even 36 samples, which caused wrong bitstream decoding for such blocks. l3_25207.mpg from conformance suite demonstrates it the best. --- libavcodec/mpegaudiodec.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/libavcodec/mpegaudiodec.c b/libavcodec/mpegaudiodec.c index f72e65cb0e..6c1e8af845 100644 --- a/libavcodec/mpegaudiodec.c +++ b/libavcodec/mpegaudiodec.c @@ -174,9 +174,12 @@ static void ff_region_offset2size(GranuleDef *g) static void ff_init_short_region(MPADecodeContext *s, GranuleDef *g) { - if (g->block_type == 2) - g->region_size[0] = (36 / 2); - else { + if (g->block_type == 2) { + if (s->sample_rate_index != 8) + g->region_size[0] = (36 / 2); + else + g->region_size[0] = (72 / 2); + } else { if (s->sample_rate_index <= 2) g->region_size[0] = (36 / 2); else if (s->sample_rate_index != 8) @@ -201,14 +204,12 @@ static void ff_compute_band_indexes(MPADecodeContext *s, GranuleDef *g) if (g->block_type == 2) { if (g->switch_point) { /* if switched mode, we handle the 36 first samples as - long blocks. For 8000Hz, we handle the 48 first - exponents as long blocks (XXX: check this!) */ + long blocks. For 8000Hz, we handle the 72 first + exponents as long blocks */ if (s->sample_rate_index <= 2) g->long_end = 8; - else if (s->sample_rate_index != 8) - g->long_end = 6; else - g->long_end = 4; /* 8000 Hz */ + g->long_end = 6; g->short_start = 2 + (s->sample_rate_index != 8); } else { @@ -1018,7 +1019,7 @@ static void reorder_block(MPADecodeContext *s, GranuleDef *g) if (s->sample_rate_index != 8) ptr = g->sb_hybrid + 36; else - ptr = g->sb_hybrid + 48; + ptr = g->sb_hybrid + 72; } else { ptr = g->sb_hybrid; } -- cgit v1.2.3 From aa372cf4705343a9fff422ab9ead99cef7e0b415 Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Sat, 19 May 2012 12:23:23 +0200 Subject: factor out common decoding code for Indeo 4 and Indeo 5 --- libavcodec/indeo4.c | 271 +++++------------------------------------------- libavcodec/indeo5.c | 241 ++++-------------------------------------- libavcodec/ivi_common.c | 210 +++++++++++++++++++++++++++++++++++++ libavcodec/ivi_common.h | 60 +++++++++++ 4 files changed, 317 insertions(+), 465 deletions(-) diff --git a/libavcodec/indeo4.c b/libavcodec/indeo4.c index 3e8a3988d6..c8ee0becbd 100644 --- a/libavcodec/indeo4.c +++ b/libavcodec/indeo4.c @@ -35,9 +35,6 @@ #include "ivi_common.h" #include "indeo4data.h" -#define IVI4_STREAM_ANALYSER 0 -#define IVI4_DEBUG_CHECKSUM 0 - /** * Indeo 4 frame types. */ @@ -54,46 +51,6 @@ enum { #define IVI4_PIC_SIZE_ESC 7 -typedef struct { - GetBitContext gb; - AVFrame frame; - RVMapDesc rvmap_tabs[9]; ///< local corrected copy of the static rvmap tables - - uint32_t frame_num; - int frame_type; - int prev_frame_type; ///< frame type of the previous frame - uint32_t data_size; ///< size of the frame data in bytes from picture header - int is_scalable; - int transp_status; ///< transparency mode status: 1 - enabled - - IVIPicConfig pic_conf; - IVIPlaneDesc planes[3]; ///< color planes - - int buf_switch; ///< used to switch between three buffers - int dst_buf; ///< buffer index for the currently decoded frame - int ref_buf; ///< inter frame reference buffer index - - IVIHuffTab mb_vlc; ///< current macroblock table descriptor - IVIHuffTab blk_vlc; ///< current block table descriptor - - uint16_t checksum; ///< frame checksum - - uint8_t rvmap_sel; - uint8_t in_imf; - uint8_t in_q; ///< flag for explicitly stored quantiser delta - uint8_t pic_glob_quant; - uint8_t unknown1; - -#if IVI4_STREAM_ANALYSER - uint8_t has_b_frames; - uint8_t has_transp; - uint8_t uses_tiling; - uint8_t uses_haar; - uint8_t uses_fullpel; -#endif -} IVI4DecContext; - - static const struct { InvTransformPtr *inv_trans; DCTransformPtr *dc_trans; @@ -158,7 +115,7 @@ static inline int scale_tile_size(int def_size, int size_factor) * @param[in] avctx pointer to the AVCodecContext * @return result code: 0 = OK, negative number = error */ -static int decode_pic_hdr(IVI4DecContext *ctx, AVCodecContext *avctx) +static int decode_pic_hdr(IVI45DecContext *ctx, AVCodecContext *avctx) { int pic_size_indx, i, p; IVIPicConfig pic_conf; @@ -322,7 +279,7 @@ static int decode_pic_hdr(IVI4DecContext *ctx, AVCodecContext *avctx) * @param[in] avctx pointer to the AVCodecContext * @return result code: 0 = OK, negative number = error */ -static int decode_band_hdr(IVI4DecContext *ctx, IVIBandDesc *band, +static int decode_band_hdr(IVI45DecContext *ctx, IVIBandDesc *band, AVCodecContext *avctx) { int plane, band_num, indx, transform_id, scan_indx; @@ -458,7 +415,7 @@ static int decode_band_hdr(IVI4DecContext *ctx, IVIBandDesc *band, * @param[in] avctx pointer to the AVCodecContext * @return result code: 0 = OK, negative number = error */ -static int decode_mb_info(IVI4DecContext *ctx, IVIBandDesc *band, +static int decode_mb_info(IVI45DecContext *ctx, IVIBandDesc *band, IVITile *tile, AVCodecContext *avctx) { int x, y, mv_x, mv_y, mv_delta, offs, mb_offset, blks_per_mb, @@ -573,126 +530,12 @@ static int decode_mb_info(IVI4DecContext *ctx, IVIBandDesc *band, } -/** - * Decode an Indeo 4 band. - * - * @param[in,out] ctx pointer to the decoder context - * @param[in,out] band pointer to the band descriptor - * @param[in] avctx pointer to the AVCodecContext - * @return result code: 0 = OK, negative number = error - */ -static int decode_band(IVI4DecContext *ctx, int plane_num, - IVIBandDesc *band, AVCodecContext *avctx) -{ - int result, i, t, pos, idx1, idx2; - IVITile *tile; - - band->buf = band->bufs[ctx->dst_buf]; - band->ref_buf = band->bufs[ctx->ref_buf]; - - result = decode_band_hdr(ctx, band, avctx); - if (result) { - av_log(avctx, AV_LOG_ERROR, "Error decoding band header\n"); - return result; - } - - if (band->is_empty) { - av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n"); - return AVERROR_INVALIDDATA; - } - - band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel]; - - /* apply corrections to the selected rvmap table if present */ - for (i = 0; i < band->num_corr; i++) { - idx1 = band->corr[i * 2]; - idx2 = band->corr[i * 2 + 1]; - FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]); - FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]); - } - - pos = get_bits_count(&ctx->gb); - - for (t = 0; t < band->num_tiles; t++) { - tile = &band->tiles[t]; - - tile->is_empty = get_bits1(&ctx->gb); - if (tile->is_empty) { - ff_ivi_process_empty_tile(avctx, band, tile, - (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3)); - av_dlog(avctx, "Empty tile encountered!\n"); - } else { - tile->data_size = ff_ivi_dec_tile_data_size(&ctx->gb); - if (!tile->data_size) { - av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n"); - return AVERROR_INVALIDDATA; - } - - result = decode_mb_info(ctx, band, tile, avctx); - if (result < 0) - break; - - result = ff_ivi_decode_blocks(&ctx->gb, band, tile); - if (result < 0 || ((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) { - av_log(avctx, AV_LOG_ERROR, "Corrupted tile data encountered!\n"); - break; - } - - pos += tile->data_size << 3; // skip to next tile - } - } - - /* restore the selected rvmap table by applying its corrections in reverse order */ - for (i = band->num_corr - 1; i >= 0; i--) { - idx1 = band->corr[i * 2]; - idx2 = band->corr[i * 2 + 1]; - FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]); - FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]); - } - -#if defined(DEBUG) && IVI4_DEBUG_CHECKSUM - if (band->checksum_present) { - uint16_t chksum = ivi_calc_band_checksum(band); - if (chksum != band->checksum) { - av_log(avctx, AV_LOG_ERROR, - "Band checksum mismatch! Plane %d, band %d, received: %x, calculated: %x\n", - band->plane, band->band_num, band->checksum, chksum); - } - } -#endif - - align_get_bits(&ctx->gb); - - return 0; -} - - -static av_cold int decode_init(AVCodecContext *avctx) -{ - IVI4DecContext *ctx = avctx->priv_data; - - ff_ivi_init_static_vlc(); - - /* copy rvmap tables in our context so we can apply changes to them */ - memcpy(ctx->rvmap_tabs, ff_ivi_rvmap_tabs, sizeof(ff_ivi_rvmap_tabs)); - - /* Force allocation of the internal buffers */ - /* during picture header decoding. */ - ctx->pic_conf.pic_width = 0; - ctx->pic_conf.pic_height = 0; - - avctx->pix_fmt = PIX_FMT_YUV410P; - - return 0; -} - - /** * Rearrange decoding and reference buffers. * * @param[in,out] ctx pointer to the decoder context */ -static void switch_buffers(IVI4DecContext *ctx) +static void switch_buffers(IVI45DecContext *ctx) { switch (ctx->prev_frame_type) { case FRAMETYPE_INTRA: @@ -721,95 +564,33 @@ static void switch_buffers(IVI4DecContext *ctx) } -static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, - AVPacket *avpkt) +static int is_nonnull_frame(IVI45DecContext *ctx) { - IVI4DecContext *ctx = avctx->priv_data; - const uint8_t *buf = avpkt->data; - int buf_size = avpkt->size; - int result, p, b; - - init_get_bits(&ctx->gb, buf, buf_size * 8); - - result = decode_pic_hdr(ctx, avctx); - if (result) { - av_log(avctx, AV_LOG_ERROR, "Error decoding picture header\n"); - return result; - } - - switch_buffers(ctx); - - if (ctx->frame_type < FRAMETYPE_NULL_FIRST) { - for (p = 0; p < 3; p++) { - for (b = 0; b < ctx->planes[p].num_bands; b++) { - result = decode_band(ctx, p, &ctx->planes[p].bands[b], avctx); - if (result) { - av_log(avctx, AV_LOG_ERROR, - "Error decoding band: %d, plane: %d\n", b, p); - return result; - } - } - } - } - - /* If the bidirectional mode is enabled, next I and the following P frame will */ - /* be sent together. Unfortunately the approach below seems to be the only way */ - /* to handle the B-frames mode. That's exactly the same Intel decoders do. */ - if (ctx->frame_type == FRAMETYPE_INTRA) { - while (get_bits(&ctx->gb, 8)); // skip version string - skip_bits_long(&ctx->gb, 64); // skip padding, TODO: implement correct 8-bytes alignment - if (get_bits_left(&ctx->gb) > 18 && show_bits(&ctx->gb, 18) == 0x3FFF8) - av_log(avctx, AV_LOG_ERROR, "Buffer contains IP frames!\n"); - } - - if (ctx->frame.data[0]) - avctx->release_buffer(avctx, &ctx->frame); - - ctx->frame.reference = 0; - if ((result = avctx->get_buffer(avctx, &ctx->frame)) < 0) { - av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); - return result; - } - - if (ctx->is_scalable) { - ff_ivi_recompose_haar(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0], 4); - } else { - ff_ivi_output_plane(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0]); - } - - ff_ivi_output_plane(&ctx->planes[2], ctx->frame.data[1], ctx->frame.linesize[1]); - ff_ivi_output_plane(&ctx->planes[1], ctx->frame.data[2], ctx->frame.linesize[2]); - - *data_size = sizeof(AVFrame); - *(AVFrame*)data = ctx->frame; - - return buf_size; + return ctx->frame_type < FRAMETYPE_NULL_FIRST; } -static av_cold int decode_close(AVCodecContext *avctx) +static av_cold int decode_init(AVCodecContext *avctx) { - IVI4DecContext *ctx = avctx->priv_data; + IVI45DecContext *ctx = avctx->priv_data; - ff_ivi_free_buffers(&ctx->planes[0]); + ff_ivi_init_static_vlc(); - if (ctx->frame.data[0]) - avctx->release_buffer(avctx, &ctx->frame); + /* copy rvmap tables in our context so we can apply changes to them */ + memcpy(ctx->rvmap_tabs, ff_ivi_rvmap_tabs, sizeof(ff_ivi_rvmap_tabs)); -#if IVI4_STREAM_ANALYSER - if (ctx->is_scalable) - av_log(avctx, AV_LOG_ERROR, "This video uses scalability mode!\n"); - if (ctx->uses_tiling) - av_log(avctx, AV_LOG_ERROR, "This video uses local decoding!\n"); - if (ctx->has_b_frames) - av_log(avctx, AV_LOG_ERROR, "This video contains B-frames!\n"); - if (ctx->has_transp) - av_log(avctx, AV_LOG_ERROR, "Transparency mode is enabled!\n"); - if (ctx->uses_haar) - av_log(avctx, AV_LOG_ERROR, "This video uses Haar transform!\n"); - if (ctx->uses_fullpel) - av_log(avctx, AV_LOG_ERROR, "This video uses fullpel motion vectors!\n"); -#endif + /* Force allocation of the internal buffers */ + /* during picture header decoding. */ + ctx->pic_conf.pic_width = 0; + ctx->pic_conf.pic_height = 0; + + avctx->pix_fmt = PIX_FMT_YUV410P; + + ctx->decode_pic_hdr = decode_pic_hdr; + ctx->decode_band_hdr = decode_band_hdr; + ctx->decode_mb_info = decode_mb_info; + ctx->switch_buffers = switch_buffers; + ctx->is_nonnull_frame = is_nonnull_frame; return 0; } @@ -819,9 +600,9 @@ AVCodec ff_indeo4_decoder = { .name = "indeo4", .type = AVMEDIA_TYPE_VIDEO, .id = CODEC_ID_INDEO4, - .priv_data_size = sizeof(IVI4DecContext), + .priv_data_size = sizeof(IVI45DecContext), .init = decode_init, - .close = decode_close, - .decode = decode_frame, + .close = ff_ivi_decode_close, + .decode = ff_ivi_decode_frame, .long_name = NULL_IF_CONFIG_SMALL("Intel Indeo Video Interactive 4"), }; diff --git a/libavcodec/indeo5.c b/libavcodec/indeo5.c index deb76b9795..d903cb2773 100644 --- a/libavcodec/indeo5.c +++ b/libavcodec/indeo5.c @@ -48,37 +48,6 @@ enum { #define IVI5_PIC_SIZE_ESC 15 -#define IVI5_IS_PROTECTED 0x20 - -typedef struct { - GetBitContext gb; - AVFrame frame; - RVMapDesc rvmap_tabs[9]; ///< local corrected copy of the static rvmap tables - IVIPlaneDesc planes[3]; ///< color planes - const uint8_t *frame_data; ///< input frame data pointer - int buf_switch; ///< used to switch between three buffers - int inter_scal; ///< signals a sequence of scalable inter frames - int dst_buf; ///< buffer index for the currently decoded frame - int ref_buf; ///< inter frame reference buffer index - int ref2_buf; ///< temporal storage for switching buffers - uint32_t frame_size; ///< frame size in bytes - int frame_type; - int prev_frame_type; ///< frame type of the previous frame - int frame_num; - uint32_t pic_hdr_size; ///< picture header size in bytes - uint8_t frame_flags; - uint16_t checksum; ///< frame checksum - - IVIHuffTab mb_vlc; ///< vlc table for decoding macroblock data - - uint16_t gop_hdr_size; - uint8_t gop_flags; - int is_scalable; - uint32_t lock_word; - IVIPicConfig pic_conf; -} IVI5DecContext; - - /** * Decode Indeo5 GOP (Group of pictures) header. * This header is present in key frames only. @@ -88,7 +57,7 @@ typedef struct { * @param[in] avctx ptr to the AVCodecContext * @return result code: 0 = OK, -1 = error */ -static int decode_gop_header(IVI5DecContext *ctx, AVCodecContext *avctx) +static int decode_gop_header(IVI45DecContext *ctx, AVCodecContext *avctx) { int result, i, p, tile_size, pic_size_indx, mb_size, blk_size; int quant_mat, blk_size_changed = 0; @@ -318,7 +287,7 @@ static inline void skip_hdr_extension(GetBitContext *gb) * @param[in] avctx ptr to the AVCodecContext * @return result code: 0 = OK, -1 = error */ -static int decode_pic_hdr(IVI5DecContext *ctx, AVCodecContext *avctx) +static int decode_pic_hdr(IVI45DecContext *ctx, AVCodecContext *avctx) { if (get_bits(&ctx->gb, 5) != 0x1F) { av_log(avctx, AV_LOG_ERROR, "Invalid picture start code!\n"); @@ -371,7 +340,7 @@ static int decode_pic_hdr(IVI5DecContext *ctx, AVCodecContext *avctx) * @param[in] avctx ptr to the AVCodecContext * @return result code: 0 = OK, -1 = error */ -static int decode_band_hdr(IVI5DecContext *ctx, IVIBandDesc *band, +static int decode_band_hdr(IVI45DecContext *ctx, IVIBandDesc *band, AVCodecContext *avctx) { int i; @@ -441,7 +410,7 @@ static int decode_band_hdr(IVI5DecContext *ctx, IVIBandDesc *band, * @param[in] avctx ptr to the AVCodecContext * @return result code: 0 = OK, -1 = error */ -static int decode_mb_info(IVI5DecContext *ctx, IVIBandDesc *band, +static int decode_mb_info(IVI45DecContext *ctx, IVIBandDesc *band, IVITile *tile, AVCodecContext *avctx) { int x, y, mv_x, mv_y, mv_delta, offs, mb_offset, @@ -560,102 +529,12 @@ static int decode_mb_info(IVI5DecContext *ctx, IVIBandDesc *band, } -/** - * Decode an Indeo5 band. - * - * @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, - IVIBandDesc *band, AVCodecContext *avctx) -{ - int result, i, t, idx1, idx2, pos; - IVITile *tile; - - band->buf = band->bufs[ctx->dst_buf]; - band->ref_buf = band->bufs[ctx->ref_buf]; - band->data_ptr = ctx->frame_data + (get_bits_count(&ctx->gb) >> 3); - - result = decode_band_hdr(ctx, band, avctx); - if (result) { - av_log(avctx, AV_LOG_ERROR, "Error while decoding band header: %d\n", - result); - return -1; - } - - if (band->is_empty) { - av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n"); - return -1; - } - - band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel]; - - /* apply corrections to the selected rvmap table if present */ - for (i = 0; i < band->num_corr; i++) { - idx1 = band->corr[i*2]; - idx2 = band->corr[i*2+1]; - FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]); - FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]); - } - - pos = get_bits_count(&ctx->gb); - - for (t = 0; t < band->num_tiles; t++) { - tile = &band->tiles[t]; - - tile->is_empty = get_bits1(&ctx->gb); - if (tile->is_empty) { - ff_ivi_process_empty_tile(avctx, band, tile, - (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3)); - } else { - tile->data_size = ff_ivi_dec_tile_data_size(&ctx->gb); - - result = decode_mb_info(ctx, band, tile, avctx); - if (result < 0) - break; - - result = ff_ivi_decode_blocks(&ctx->gb, band, tile); - if (result < 0 || (get_bits_count(&ctx->gb) - pos) >> 3 != tile->data_size) { - av_log(avctx, AV_LOG_ERROR, "Corrupted tile data encountered!\n"); - break; - } - pos += tile->data_size << 3; // skip to next tile - } - } - - /* restore the selected rvmap table by applying its corrections in reverse order */ - for (i = band->num_corr-1; i >= 0; i--) { - idx1 = band->corr[i*2]; - idx2 = band->corr[i*2+1]; - FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]); - FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]); - } - -#ifdef DEBUG - if (band->checksum_present) { - uint16_t chksum = ivi_calc_band_checksum(band); - if (chksum != band->checksum) { - av_log(avctx, AV_LOG_ERROR, - "Band checksum mismatch! Plane %d, band %d, received: %x, calculated: %x\n", - band->plane, band->band_num, band->checksum, chksum); - } - } -#endif - - align_get_bits(&ctx->gb); - - return result; -} - - /** * Switch buffers. * * @param[in,out] ctx ptr to the decoder context */ -static void switch_buffers(IVI5DecContext *ctx) +static void switch_buffers(IVI45DecContext *ctx) { switch (ctx->prev_frame_type) { case FRAMETYPE_INTRA: @@ -693,12 +572,18 @@ static void switch_buffers(IVI5DecContext *ctx) } +static int is_nonnull_frame(IVI45DecContext *ctx) +{ + return ctx->frame_type != FRAMETYPE_NULL; +} + + /** * Initialize Indeo5 decoder. */ static av_cold int decode_init(AVCodecContext *avctx) { - IVI5DecContext *ctx = avctx->priv_data; + IVI45DecContext *ctx = avctx->priv_data; int result; ff_ivi_init_static_vlc(); @@ -726,97 +611,13 @@ static av_cold int decode_init(AVCodecContext *avctx) ctx->buf_switch = 0; ctx->inter_scal = 0; - avctx->pix_fmt = PIX_FMT_YUV410P; - - return 0; -} - - -/** - * main decoder function - */ -static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, - AVPacket *avpkt) -{ - IVI5DecContext *ctx = avctx->priv_data; - const uint8_t *buf = avpkt->data; - int buf_size = avpkt->size; - int result, p, b; - - init_get_bits(&ctx->gb, buf, buf_size * 8); - ctx->frame_data = buf; - ctx->frame_size = buf_size; - - result = decode_pic_hdr(ctx, avctx); - if (result) { - av_log(avctx, AV_LOG_ERROR, - "Error while decoding picture header: %d\n", result); - return -1; - } - - if (ctx->gop_flags & IVI5_IS_PROTECTED) { - av_log(avctx, AV_LOG_ERROR, "Password-protected clip!\n"); - return -1; - } + ctx->decode_pic_hdr = decode_pic_hdr; + ctx->decode_band_hdr = decode_band_hdr; + ctx->decode_mb_info = decode_mb_info; + ctx->switch_buffers = switch_buffers; + ctx->is_nonnull_frame = is_nonnull_frame; - switch_buffers(ctx); - - //{ START_TIMER; - - if (ctx->frame_type != FRAMETYPE_NULL) { - for (p = 0; p < 3; p++) { - for (b = 0; b < ctx->planes[p].num_bands; b++) { - result = decode_band(ctx, p, &ctx->planes[p].bands[b], avctx); - if (result) { - av_log(avctx, AV_LOG_ERROR, - "Error while decoding band: %d, plane: %d\n", b, p); - return -1; - } - } - } - } - - //STOP_TIMER("decode_planes"); } - - if (ctx->frame.data[0]) - avctx->release_buffer(avctx, &ctx->frame); - - ctx->frame.reference = 0; - if (avctx->get_buffer(avctx, &ctx->frame) < 0) { - av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); - return -1; - } - - if (ctx->is_scalable) { - ff_ivi_recompose53 (&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0], 4); - } else { - ff_ivi_output_plane(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0]); - } - - ff_ivi_output_plane(&ctx->planes[2], ctx->frame.data[1], ctx->frame.linesize[1]); - ff_ivi_output_plane(&ctx->planes[1], ctx->frame.data[2], ctx->frame.linesize[2]); - - *data_size = sizeof(AVFrame); - *(AVFrame*)data = ctx->frame; - - return buf_size; -} - - -/** - * Close Indeo5 decoder and clean up its context. - */ -static av_cold int decode_close(AVCodecContext *avctx) -{ - IVI5DecContext *ctx = avctx->priv_data; - - ff_ivi_free_buffers(&ctx->planes[0]); - - if (ctx->mb_vlc.cust_tab.table) - ff_free_vlc(&ctx->mb_vlc.cust_tab); - - if (ctx->frame.data[0]) - avctx->release_buffer(avctx, &ctx->frame); + avctx->pix_fmt = PIX_FMT_YUV410P; return 0; } @@ -826,9 +627,9 @@ AVCodec ff_indeo5_decoder = { .name = "indeo5", .type = AVMEDIA_TYPE_VIDEO, .id = CODEC_ID_INDEO5, - .priv_data_size = sizeof(IVI5DecContext), + .priv_data_size = sizeof(IVI45DecContext), .init = decode_init, - .close = decode_close, - .decode = decode_frame, + .close = ff_ivi_decode_close, + .decode = ff_ivi_decode_frame, .long_name = NULL_IF_CONFIG_SMALL("Intel Indeo Video Interactive 5"), }; diff --git a/libavcodec/ivi_common.c b/libavcodec/ivi_common.c index b9ec1c28cd..93d499f9bc 100644 --- a/libavcodec/ivi_common.c +++ b/libavcodec/ivi_common.c @@ -620,6 +620,216 @@ void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch) } } +/** + * Decode an Indeo 4 or 5 band. + * + * @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(IVI45DecContext *ctx, int plane_num, + IVIBandDesc *band, AVCodecContext *avctx) +{ + int result, i, t, idx1, idx2, pos; + IVITile *tile; + + band->buf = band->bufs[ctx->dst_buf]; + band->ref_buf = band->bufs[ctx->ref_buf]; + band->data_ptr = ctx->frame_data + (get_bits_count(&ctx->gb) >> 3); + + result = ctx->decode_band_hdr(ctx, band, avctx); + if (result) { + av_log(avctx, AV_LOG_ERROR, "Error while decoding band header: %d\n", + result); + return result; + } + + if (band->is_empty) { + av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n"); + return AVERROR_INVALIDDATA; + } + + band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel]; + + /* apply corrections to the selected rvmap table if present */ + for (i = 0; i < band->num_corr; i++) { + idx1 = band->corr[i * 2]; + idx2 = band->corr[i * 2 + 1]; + FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]); + FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]); + } + + pos = get_bits_count(&ctx->gb); + + for (t = 0; t < band->num_tiles; t++) { + tile = &band->tiles[t]; + + tile->is_empty = get_bits1(&ctx->gb); + if (tile->is_empty) { + ff_ivi_process_empty_tile(avctx, band, tile, + (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3)); + av_dlog(avctx, "Empty tile encountered!\n"); + } else { + tile->data_size = ff_ivi_dec_tile_data_size(&ctx->gb); + if (!tile->data_size) { + av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n"); + return AVERROR_INVALIDDATA; + } + + result = ctx->decode_mb_info(ctx, band, tile, avctx); + if (result < 0) + break; + + result = ff_ivi_decode_blocks(&ctx->gb, band, tile); + if (result < 0 || ((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) { + av_log(avctx, AV_LOG_ERROR, "Corrupted tile data encountered!\n"); + break; + } + + pos += tile->data_size << 3; // skip to next tile + } + } + + /* restore the selected rvmap table by applying its corrections in reverse order */ + for (i = band->num_corr-1; i >= 0; i--) { + idx1 = band->corr[i*2]; + idx2 = band->corr[i*2+1]; + FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]); + FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]); + } + +#ifdef DEBUG + if (band->checksum_present) { + uint16_t chksum = ivi_calc_band_checksum(band); + if (chksum != band->checksum) { + av_log(avctx, AV_LOG_ERROR, + "Band checksum mismatch! Plane %d, band %d, received: %x, calculated: %x\n", + band->plane, band->band_num, band->checksum, chksum); + } + } +#endif + + align_get_bits(&ctx->gb); + + return result; +} + +int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *data_size, + AVPacket *avpkt) +{ + IVI45DecContext *ctx = avctx->priv_data; + const uint8_t *buf = avpkt->data; + int buf_size = avpkt->size; + int result, p, b; + + init_get_bits(&ctx->gb, buf, buf_size * 8); + ctx->frame_data = buf; + ctx->frame_size = buf_size; + + result = ctx->decode_pic_hdr(ctx, avctx); + if (result) { + av_log(avctx, AV_LOG_ERROR, + "Error while decoding picture header: %d\n", result); + return -1; + } + + if (ctx->gop_flags & IVI5_IS_PROTECTED) { + av_log(avctx, AV_LOG_ERROR, "Password-protected clip!\n"); + return -1; + } + + ctx->switch_buffers(ctx); + + //{ START_TIMER; + + if (ctx->is_nonnull_frame(ctx)) { + for (p = 0; p < 3; p++) { + for (b = 0; b < ctx->planes[p].num_bands; b++) { + result = decode_band(ctx, p, &ctx->planes[p].bands[b], avctx); + if (result) { + av_log(avctx, AV_LOG_ERROR, + "Error while decoding band: %d, plane: %d\n", b, p); + return -1; + } + } + } + } + + //STOP_TIMER("decode_planes"); } + + /* If the bidirectional mode is enabled, next I and the following P frame will */ + /* be sent together. Unfortunately the approach below seems to be the only way */ + /* to handle the B-frames mode. That's exactly the same Intel decoders do. */ + if (avctx->codec_id == CODEC_ID_INDEO4 && ctx->frame_type == 0/*FRAMETYPE_INTRA*/) { + while (get_bits(&ctx->gb, 8)); // skip version string + skip_bits_long(&ctx->gb, 64); // skip padding, TODO: implement correct 8-bytes alignment + if (get_bits_left(&ctx->gb) > 18 && show_bits(&ctx->gb, 18) == 0x3FFF8) + av_log(avctx, AV_LOG_ERROR, "Buffer contains IP frames!\n"); + } + + if (ctx->frame.data[0]) + avctx->release_buffer(avctx, &ctx->frame); + + ctx->frame.reference = 0; + if ((result = avctx->get_buffer(avctx, &ctx->frame)) < 0) { + av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); + return result; + } + + if (ctx->is_scalable) { + if (avctx->codec_id == CODEC_ID_INDEO4) + ff_ivi_recompose_haar(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0], 4); + else + ff_ivi_recompose53 (&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0], 4); + } else { + ff_ivi_output_plane(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0]); + } + + ff_ivi_output_plane(&ctx->planes[2], ctx->frame.data[1], ctx->frame.linesize[1]); + ff_ivi_output_plane(&ctx->planes[1], ctx->frame.data[2], ctx->frame.linesize[2]); + + *data_size = sizeof(AVFrame); + *(AVFrame*)data = ctx->frame; + + return buf_size; +} + +/** + * Close Indeo5 decoder and clean up its context. + */ +av_cold int ff_ivi_decode_close(AVCodecContext *avctx) +{ + IVI45DecContext *ctx = avctx->priv_data; + + ff_ivi_free_buffers(&ctx->planes[0]); + + if (ctx->mb_vlc.cust_tab.table) + ff_free_vlc(&ctx->mb_vlc.cust_tab); + + if (ctx->frame.data[0]) + avctx->release_buffer(avctx, &ctx->frame); + +#if IVI4_STREAM_ANALYSER + if (avctx->codec_id == CODEC_ID_INDEO4) { + if (ctx->is_scalable) + av_log(avctx, AV_LOG_ERROR, "This video uses scalability mode!\n"); + if (ctx->uses_tiling) + av_log(avctx, AV_LOG_ERROR, "This video uses local decoding!\n"); + if (ctx->has_b_frames) + av_log(avctx, AV_LOG_ERROR, "This video contains B-frames!\n"); + if (ctx->has_transp) + av_log(avctx, AV_LOG_ERROR, "Transparency mode is enabled!\n"); + if (ctx->uses_haar) + av_log(avctx, AV_LOG_ERROR, "This video uses Haar transform!\n"); + if (ctx->uses_fullpel) + av_log(avctx, AV_LOG_ERROR, "This video uses fullpel motion vectors!\n"); + } +#endif + + return 0; +} + /** * These are 2x8 predefined Huffman codebooks for coding macroblock/block diff --git a/libavcodec/ivi_common.h b/libavcodec/ivi_common.h index 4b2ae063b1..d3edea0c0e 100644 --- a/libavcodec/ivi_common.h +++ b/libavcodec/ivi_common.h @@ -34,6 +34,8 @@ #include #define IVI_VLC_BITS 13 ///< max number of bits of the ivi's huffman codes +#define IVI4_STREAM_ANALYSER 0 +#define IVI5_IS_PROTECTED 0x20 /** * huffman codebook descriptor @@ -192,6 +194,60 @@ typedef struct { uint8_t chroma_bands; } IVIPicConfig; +typedef struct IVI45DecContext { + GetBitContext gb; + AVFrame frame; + RVMapDesc rvmap_tabs[9]; ///< local corrected copy of the static rvmap tables + + uint32_t frame_num; + int frame_type; + int prev_frame_type; ///< frame type of the previous frame + uint32_t data_size; ///< size of the frame data in bytes from picture header + int is_scalable; + int transp_status; ///< transparency mode status: 1 - enabled + const uint8_t *frame_data; ///< input frame data pointer + int inter_scal; ///< signals a sequence of scalable inter frames + uint32_t frame_size; ///< frame size in bytes + uint32_t pic_hdr_size; ///< picture header size in bytes + uint8_t frame_flags; + uint16_t checksum; ///< frame checksum + + IVIPicConfig pic_conf; + IVIPlaneDesc planes[3]; ///< color planes + + int buf_switch; ///< used to switch between three buffers + int dst_buf; ///< buffer index for the currently decoded frame + int ref_buf; ///< inter frame reference buffer index + int ref2_buf; ///< temporal storage for switching buffers + + IVIHuffTab mb_vlc; ///< current macroblock table descriptor + IVIHuffTab blk_vlc; ///< current block table descriptor + + uint8_t rvmap_sel; + uint8_t in_imf; + uint8_t in_q; ///< flag for explicitly stored quantiser delta + uint8_t pic_glob_quant; + uint8_t unknown1; + + uint16_t gop_hdr_size; + uint8_t gop_flags; + uint32_t lock_word; + +#if IVI4_STREAM_ANALYSER + uint8_t has_b_frames; + uint8_t has_transp; + uint8_t uses_tiling; + uint8_t uses_haar; + uint8_t uses_fullpel; +#endif + + int (*decode_pic_hdr) (struct IVI45DecContext *ctx, AVCodecContext *avctx); + int (*decode_band_hdr) (struct IVI45DecContext *ctx, IVIBandDesc *band, AVCodecContext *avctx); + int (*decode_mb_info) (struct IVI45DecContext *ctx, IVIBandDesc *band, IVITile *tile, AVCodecContext *avctx); + void (*switch_buffers) (struct IVI45DecContext *ctx); + int (*is_nonnull_frame)(struct IVI45DecContext *ctx); +} IVI45DecContext; + /** compare some properties of two pictures */ static inline int ivi_pic_config_cmp(IVIPicConfig *str1, IVIPicConfig *str2) { @@ -348,4 +404,8 @@ uint16_t ivi_calc_band_checksum (IVIBandDesc *band); */ int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch); +int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *data_size, + AVPacket *avpkt); +av_cold int ff_ivi_decode_close(AVCodecContext *avctx); + #endif /* AVCODEC_IVI_COMMON_H */ -- cgit v1.2.3 From fe7a37c36febd71576cbefc385d995a8d6e444e7 Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Sat, 19 May 2012 12:39:49 +0200 Subject: indeo: check custom Huffman tables for errors --- libavcodec/ivi_common.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libavcodec/ivi_common.c b/libavcodec/ivi_common.c index 93d499f9bc..b66dde54e5 100644 --- a/libavcodec/ivi_common.c +++ b/libavcodec/ivi_common.c @@ -123,6 +123,10 @@ int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab, if (huff_tab->tab_sel == 7) { /* custom huffman table (explicitly encoded) */ new_huff.num_rows = get_bits(gb, 4); + if (!new_huff.num_rows) { + av_log(avctx, AV_LOG_ERROR, "Empty custom Huffman table!\n"); + return AVERROR_INVALIDDATA; + } for (i = 0; i < new_huff.num_rows; i++) new_huff.xbits[i] = get_bits(gb, 4); @@ -136,9 +140,10 @@ int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab, result = ff_ivi_create_huff_from_desc(&huff_tab->cust_desc, &huff_tab->cust_tab, 0); if (result) { + huff_tab->cust_desc.num_rows = 0; // reset faulty description av_log(avctx, AV_LOG_ERROR, "Error while initializing custom vlc table!\n"); - return -1; + return result; } } huff_tab->tab = &huff_tab->cust_tab; -- cgit v1.2.3 From a6e4ac40a62930d3c90f869990f96fedb9a5d654 Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Sat, 19 May 2012 13:08:51 +0200 Subject: indeo: track tile macroblock size --- libavcodec/ivi_common.c | 6 ++++++ libavcodec/ivi_common.h | 1 + 2 files changed, 7 insertions(+) diff --git a/libavcodec/ivi_common.c b/libavcodec/ivi_common.c index b66dde54e5..581e7a5080 100644 --- a/libavcodec/ivi_common.c +++ b/libavcodec/ivi_common.c @@ -287,6 +287,7 @@ av_cold int ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_hei for (x = 0; x < band->width; x += t_width) { tile->xpos = x; tile->ypos = y; + tile->mb_size = band->mb_size; tile->width = FFMIN(band->width - x, t_width); tile->height = FFMIN(band->height - y, t_height); tile->is_empty = tile->data_size = 0; @@ -670,6 +671,11 @@ static int decode_band(IVI45DecContext *ctx, int plane_num, for (t = 0; t < band->num_tiles; t++) { tile = &band->tiles[t]; + if (tile->mb_size != band->mb_size) { + av_log(avctx, AV_LOG_ERROR, "MB sizes mismatch: %d vs. %d\n", + band->mb_size, tile->mb_size); + return AVERROR_INVALIDDATA; + } tile->is_empty = get_bits1(&ctx->gb); if (tile->is_empty) { ff_ivi_process_empty_tile(avctx, band, tile, diff --git a/libavcodec/ivi_common.h b/libavcodec/ivi_common.h index d3edea0c0e..6842d748b3 100644 --- a/libavcodec/ivi_common.h +++ b/libavcodec/ivi_common.h @@ -118,6 +118,7 @@ typedef struct { int ypos; int width; int height; + int mb_size; int is_empty; ///< = 1 if this tile doesn't contain any data int data_size; ///< size of the data in bytes int num_MBs; ///< number of macroblocks in this tile -- cgit v1.2.3 From 23ba1503f2b11057c65052b4a07961236d8d69c7 Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Sat, 19 May 2012 13:39:15 +0200 Subject: indeo: clear allocated band buffers --- libavcodec/ivi_common.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libavcodec/ivi_common.c b/libavcodec/ivi_common.c index 581e7a5080..0d773761ff 100644 --- a/libavcodec/ivi_common.c +++ b/libavcodec/ivi_common.c @@ -212,14 +212,14 @@ av_cold int ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg) band->width = b_width; band->height = b_height; band->pitch = width_aligned; - band->bufs[0] = av_malloc(buf_size); - band->bufs[1] = av_malloc(buf_size); + band->bufs[0] = av_mallocz(buf_size); + band->bufs[1] = av_mallocz(buf_size); if (!band->bufs[0] || !band->bufs[1]) return AVERROR(ENOMEM); /* allocate the 3rd band buffer for scalability mode */ if (cfg->luma_bands > 1) { - band->bufs[2] = av_malloc(buf_size); + band->bufs[2] = av_mallocz(buf_size); if (!band->bufs[2]) return AVERROR(ENOMEM); } -- cgit v1.2.3 From 96037382210b5c1b0202647ac0ca196ce5de4487 Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Sat, 19 May 2012 13:45:00 +0200 Subject: indeo: check that band output buffer exists --- libavcodec/ivi_common.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libavcodec/ivi_common.c b/libavcodec/ivi_common.c index 0d773761ff..6979231b7d 100644 --- a/libavcodec/ivi_common.c +++ b/libavcodec/ivi_common.c @@ -641,6 +641,10 @@ static int decode_band(IVI45DecContext *ctx, int plane_num, IVITile *tile; band->buf = band->bufs[ctx->dst_buf]; + if (!band->buf) { + av_log(avctx, AV_LOG_ERROR, "Band buffer points to no data!\n"); + return AVERROR_INVALIDDATA; + } band->ref_buf = band->bufs[ctx->ref_buf]; band->data_ptr = ctx->frame_data + (get_bits_count(&ctx->gb) >> 3); -- cgit v1.2.3 From cf61aaaca16810b9b3a28395ed48fda8db0e87d9 Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Sat, 19 May 2012 16:07:42 +0200 Subject: indeo: check for invalid motion vectors --- libavcodec/ivi_common.c | 16 ++++++++++++++++ libavcodec/ivi_common.h | 1 + 2 files changed, 17 insertions(+) diff --git a/libavcodec/ivi_common.c b/libavcodec/ivi_common.c index 6979231b7d..caa545c57f 100644 --- a/libavcodec/ivi_common.c +++ b/libavcodec/ivi_common.c @@ -212,6 +212,7 @@ av_cold int ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg) band->width = b_width; band->height = b_height; band->pitch = width_aligned; + band->aheight = height_aligned; band->bufs[0] = av_mallocz(buf_size); band->bufs[1] = av_mallocz(buf_size); if (!band->bufs[0] || !band->bufs[1]) @@ -381,6 +382,21 @@ int ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile) mv_x >>= 1; mv_y >>= 1; /* convert halfpel vectors into fullpel ones */ } + if (mb->type) { + int dmv_x, dmv_y, cx, cy; + + dmv_x = mb->mv_x >> band->is_halfpel; + dmv_y = mb->mv_y >> band->is_halfpel; + cx = mb->mv_x & band->is_halfpel; + cy = mb->mv_y & band->is_halfpel; + + if ( mb->xpos + dmv_x < 0 + || mb->xpos + dmv_x + band->mb_size + cx > band->pitch + || mb->ypos + dmv_y < 0 + || mb->ypos + dmv_y + band->mb_size + cy > band->aheight) { + return AVERROR_INVALIDDATA; + } + } } for (blk = 0; blk < num_blocks; blk++) { diff --git a/libavcodec/ivi_common.h b/libavcodec/ivi_common.h index 6842d748b3..8c37b94da5 100644 --- a/libavcodec/ivi_common.h +++ b/libavcodec/ivi_common.h @@ -135,6 +135,7 @@ typedef struct { int band_num; ///< band number int width; int height; + int aheight; ///< aligned band height const uint8_t *data_ptr; ///< ptr to the first byte of the band data int data_size; ///< size of the band data int16_t *buf; ///< pointer to the output buffer for this band -- cgit v1.2.3 From 4852cb37ce25e9251bb526ff75afdb90f16812c9 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Sat, 19 May 2012 22:56:01 +0100 Subject: fate: fix dependencies for non-SAMPLES avconv tests The encode/decode tests should all depend on avconv. Since avconv requires libavfilter, there is no need to enable those tests selectively. Signed-off-by: Mans Rullgard --- tests/Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/Makefile b/tests/Makefile index 55e8867d4e..79316b8d11 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -74,16 +74,16 @@ FATE_LAVF = $(LAVF_TESTS:%=fate-lavf-%) FATE_LAVFI = $(LAVFI_TESTS:%=fate-lavfi-%) FATE_SEEK = $(SEEK_TESTS:seek_%=fate-seek-%) -FATE = $(FATE_ACODEC) \ - $(FATE_VCODEC) \ - $(FATE_LAVF) \ - $(FATE_SEEK) \ +FATE_AVCONV += $(FATE_ACODEC) \ + $(FATE_VCODEC) \ + $(FATE_LAVF) \ + $(FATE_LAVFI) \ + $(FATE_SEEK) \ FATE_AVCONV += $(FATE_AVCONV-yes) FATE-$(CONFIG_AVCONV) += $(FATE_AVCONV) FATE-$(CONFIG_AVCODEC) += $(FATE_LIBAVCODEC) -FATE-$(CONFIG_AVFILTER) += $(FATE_LAVFI) FATE_SAMPLES-$(CONFIG_AVCONV) += $(FATE_SAMPLES_AVCONV) FATE_SAMPLES += $(FATE_SAMPLES-yes) -- cgit v1.2.3 From f05b69a79fd6849a9f302909254bcc34d1870b65 Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Sun, 20 May 2012 13:55:33 +0200 Subject: fix typo in comment --- libavcodec/imc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/imc.c b/libavcodec/imc.c index 2c9efb9b12..ea37139139 100644 --- a/libavcodec/imc.c +++ b/libavcodec/imc.c @@ -25,7 +25,7 @@ * @file * IMC - Intel Music Coder * A mdct based codec using a 256 points large transform - * divied into 32 bands with some mix of scale factors. + * divided into 32 bands with some mix of scale factors. * Only mono is supported. * */ -- cgit v1.2.3 From 4466d0e84b3a105a02170ce8bc9e22820ff0152f Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Fri, 29 Jul 2011 12:48:45 +0200 Subject: truemotion1: remove disabled code --- libavcodec/truemotion1.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/libavcodec/truemotion1.c b/libavcodec/truemotion1.c index 9e1168af43..bc501a20b7 100644 --- a/libavcodec/truemotion1.c +++ b/libavcodec/truemotion1.c @@ -354,14 +354,7 @@ static int truemotion1_decode_header(TrueMotion1Context *s) if (s->flags & FLAG_SPRITE) { av_log_ask_for_sample(s->avctx, "SPRITE frame found.\n"); /* FIXME header.width, height, xoffset and yoffset aren't initialized */ -#if 0 - s->w = header.width; - s->h = header.height; - s->x = header.xoffset; - s->y = header.yoffset; -#else return -1; -#endif } else { s->w = header.xsize; s->h = header.ysize; -- cgit v1.2.3 From 0c517644b267d6bb41f898104725346d92202cc7 Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Wed, 11 Apr 2012 15:00:37 +0200 Subject: avcodec/utils: cast a function argument to shut up a compiler warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit libavcodec/utils.c:251: note: expected ‘const uint8_t *’ but argument is of type ‘const short int *’ --- libavcodec/utils.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libavcodec/utils.c b/libavcodec/utils.c index 9ec4a9e848..d2ee9f893b 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -1047,7 +1047,8 @@ int attribute_align_arg avcodec_encode_audio(AVCodecContext *avctx, avctx->sample_fmt, 1); if ((ret = avcodec_fill_audio_frame(frame, avctx->channels, avctx->sample_fmt, - samples, samples_size, 1))) + (const uint8_t *) samples, + samples_size, 1))) return ret; /* fabricate frame pts from sample count. -- cgit v1.2.3 From 9ccbdc0acafcfd1947e019c24817f2526581da49 Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Sat, 19 May 2012 16:41:42 +0200 Subject: indeo: Drop unused debug function ivi_check_band(). --- libavcodec/ivi_common.c | 25 ------------------------- libavcodec/ivi_common.h | 5 ----- 2 files changed, 30 deletions(-) diff --git a/libavcodec/ivi_common.c b/libavcodec/ivi_common.c index caa545c57f..37888d3d8c 100644 --- a/libavcodec/ivi_common.c +++ b/libavcodec/ivi_common.c @@ -598,31 +598,6 @@ uint16_t ivi_calc_band_checksum (IVIBandDesc *band) return checksum; } - -int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch) -{ - int x, y, result; - uint8_t t1, t2; - int16_t *src; - - src = band->buf; - result = 0; - - for (y = 0; y < band->height; src += band->pitch, y++) { - for (x = 0; x < band->width; x++) { - t1 = av_clip(src[x] + 128, 0, 255); - t2 = ref[x]; - if (t1 != t2) { - av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n", - y / band->blk_size, x / band->blk_size); - result = -1; - } - } - ref += pitch; - } - - return result; -} #endif void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch) diff --git a/libavcodec/ivi_common.h b/libavcodec/ivi_common.h index 8c37b94da5..24e52cca53 100644 --- a/libavcodec/ivi_common.h +++ b/libavcodec/ivi_common.h @@ -401,11 +401,6 @@ void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch); */ uint16_t ivi_calc_band_checksum (IVIBandDesc *band); -/** - * Verify that band data lies in range. - */ -int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch); - int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt); av_cold int ff_ivi_decode_close(AVCodecContext *avctx); -- cgit v1.2.3 From 4f04f5cc8b2a590217fe69492da3d65376ebcff3 Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Sun, 20 May 2012 15:59:30 +0200 Subject: indeo: Make ivi_calc_band_checksum() static, it is only used in one file. --- libavcodec/ivi_common.c | 2 +- libavcodec/ivi_common.h | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/libavcodec/ivi_common.c b/libavcodec/ivi_common.c index 37888d3d8c..cbcd970980 100644 --- a/libavcodec/ivi_common.c +++ b/libavcodec/ivi_common.c @@ -584,7 +584,7 @@ void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band, #ifdef DEBUG -uint16_t ivi_calc_band_checksum (IVIBandDesc *band) +static uint16_t ivi_calc_band_checksum(IVIBandDesc *band) { int x, y; int16_t *src, checksum; diff --git a/libavcodec/ivi_common.h b/libavcodec/ivi_common.h index 24e52cca53..1ba431b4ed 100644 --- a/libavcodec/ivi_common.h +++ b/libavcodec/ivi_common.h @@ -396,11 +396,6 @@ void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band, */ void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch); -/** - * Calculate band checksum from band data. - */ -uint16_t ivi_calc_band_checksum (IVIBandDesc *band); - int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt); av_cold int ff_ivi_decode_close(AVCodecContext *avctx); -- cgit v1.2.3