* commit 'd05f72c75445969cd7bdb1d860635c9880c67fb6': dfa: improve boundary checks in decode_dds1() wmalosslessdec: Fix reading too many bits in decode_channel_residues() wmalosslessdec: fix a get_bits(0) in decode_ac_filter wmalosslessdec: make MCLMS arrays big enough for what is written into them. indeo4/5: check empty tile size in decode_mb_info(). ivi_common: make ff_ivi_process_empty_tile() static. indeo5: check tile size in decode_mb_info(). indeo3: fix out of cell write. Conflicts: libavcodec/dfa.c libavcodec/indeo3.c libavcodec/indeo5.c libavcodec/ivi_common.c libavcodec/wmalosslessdec.c Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n1.1
| @@ -157,8 +157,7 @@ static int decode_dds1(GetByteContext *gb, uint8_t *frame, int width, int height | |||||
| bitbuf = bytestream2_get_le16u(gb); | bitbuf = bytestream2_get_le16u(gb); | ||||
| mask = 1; | mask = 1; | ||||
| } | } | ||||
| if (frame_end - frame < width + 2) | |||||
| return AVERROR_INVALIDDATA; | |||||
| if (bitbuf & mask) { | if (bitbuf & mask) { | ||||
| v = bytestream2_get_le16(gb); | v = bytestream2_get_le16(gb); | ||||
| offset = (v & 0x1FFF) << 2; | offset = (v & 0x1FFF) << 2; | ||||
| @@ -172,9 +171,12 @@ static int decode_dds1(GetByteContext *gb, uint8_t *frame, int width, int height | |||||
| frame += 2; | frame += 2; | ||||
| } | } | ||||
| } else if (bitbuf & (mask << 1)) { | } else if (bitbuf & (mask << 1)) { | ||||
| frame += bytestream2_get_le16(gb) * 2; | |||||
| v = bytestream2_get_le16(gb)*2; | |||||
| if (frame - frame_end < v) | |||||
| return AVERROR_INVALIDDATA; | |||||
| frame += v; | |||||
| } else { | } else { | ||||
| if (frame_end - frame < width + 2) | |||||
| if (frame_end - frame < width + 3) | |||||
| return AVERROR_INVALIDDATA; | return AVERROR_INVALIDDATA; | ||||
| frame[0] = frame[1] = | frame[0] = frame[1] = | ||||
| frame[width] = frame[width + 1] = bytestream2_get_byte(gb); | frame[width] = frame[width + 1] = bytestream2_get_byte(gb); | ||||
| @@ -427,8 +427,11 @@ static int decode_cell_data(Cell *cell, uint8_t *block, uint8_t *ref_block, | |||||
| blk_row_offset = (row_offset << (2 + v_zoom)) - (cell->width << 2); | blk_row_offset = (row_offset << (2 + v_zoom)) - (cell->width << 2); | ||||
| line_offset = v_zoom ? row_offset : 0; | line_offset = v_zoom ? row_offset : 0; | ||||
| for (y = 0; y + v_zoom < cell->height; is_first_row = 0, y += 1 + v_zoom) { | |||||
| for (x = 0; x + h_zoom < cell->width; x += 1 + h_zoom) { | |||||
| if (cell->height & v_zoom || cell->width & h_zoom) | |||||
| return IV3_BAD_DATA; | |||||
| for (y = 0; y < cell->height; is_first_row = 0, y += 1 + v_zoom) { | |||||
| for (x = 0; x < cell->width; x += 1 + h_zoom) { | |||||
| ref = ref_block; | ref = ref_block; | ||||
| dst = block; | dst = block; | ||||
| @@ -452,8 +452,8 @@ static int decode_mb_info(IVI45DecContext *ctx, IVIBandDesc *band, | |||||
| ((band->qdelta_present && band->inherit_qdelta) || band->inherit_mv)) | ((band->qdelta_present && band->inherit_qdelta) || band->inherit_mv)) | ||||
| return AVERROR_INVALIDDATA; | return AVERROR_INVALIDDATA; | ||||
| if( tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size) ){ | |||||
| av_log(avctx, AV_LOG_ERROR, "allocated tile size %d mismatches parameters %d\n", | |||||
| if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches parameters %d\n", | |||||
| tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)); | tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)); | ||||
| return AVERROR_INVALIDDATA; | return AVERROR_INVALIDDATA; | ||||
| } | } | ||||
| @@ -495,8 +495,17 @@ int ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band, | |||||
| IVITile *tile, int32_t mv_scale) | |||||
| /** | |||||
| * Handle empty tiles by performing data copying and motion | |||||
| * compensation respectively. | |||||
| * | |||||
| * @param[in] avctx ptr to the AVCodecContext | |||||
| * @param[in] band pointer to the band descriptor | |||||
| * @param[in] tile pointer to the tile descriptor | |||||
| * @param[in] mv_scale scaling factor for motion vectors | |||||
| */ | |||||
| static int ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band, | |||||
| IVITile *tile, int32_t mv_scale) | |||||
| { | { | ||||
| int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type; | int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type; | ||||
| int offs, mb_offset, row_offset; | int offs, mb_offset, row_offset; | ||||
| @@ -506,10 +515,11 @@ void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band, | |||||
| void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, | void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, | ||||
| int mc_type); | int mc_type); | ||||
| if( tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size) ){ | |||||
| av_log(avctx, AV_LOG_ERROR, "allocated tile size %d mismatches parameters %d in ff_ivi_process_empty_tile()\n", | |||||
| if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches " | |||||
| "parameters %d in ivi_process_empty_tile()\n", | |||||
| tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)); | tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)); | ||||
| return; | |||||
| return AVERROR_INVALIDDATA; | |||||
| } | } | ||||
| offs = tile->ypos * band->pitch + tile->xpos; | offs = tile->ypos * band->pitch + tile->xpos; | ||||
| @@ -592,6 +602,8 @@ void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band, | |||||
| dst += band->pitch; | dst += band->pitch; | ||||
| } | } | ||||
| } | } | ||||
| return 0; | |||||
| } | } | ||||
| @@ -689,8 +701,10 @@ static int decode_band(IVI45DecContext *ctx, int plane_num, | |||||
| } | } | ||||
| tile->is_empty = get_bits1(&ctx->gb); | tile->is_empty = get_bits1(&ctx->gb); | ||||
| if (tile->is_empty) { | if (tile->is_empty) { | ||||
| ff_ivi_process_empty_tile(avctx, band, tile, | |||||
| result = ivi_process_empty_tile(avctx, band, tile, | |||||
| (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3)); | (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3)); | ||||
| if (result < 0) | |||||
| break; | |||||
| av_dlog(avctx, "Empty tile encountered!\n"); | av_dlog(avctx, "Empty tile encountered!\n"); | ||||
| } else { | } else { | ||||
| tile->data_size = ff_ivi_dec_tile_data_size(&ctx->gb); | tile->data_size = ff_ivi_dec_tile_data_size(&ctx->gb); | ||||
| @@ -377,18 +377,6 @@ int ff_ivi_dec_tile_data_size(GetBitContext *gb); | |||||
| */ | */ | ||||
| int ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile); | int ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile); | ||||
| /** | |||||
| * Handle empty tiles by performing data copying and motion | |||||
| * compensation respectively. | |||||
| * | |||||
| * @param[in] avctx ptr to the AVCodecContext | |||||
| * @param[in] band pointer to the band descriptor | |||||
| * @param[in] tile pointer to the tile descriptor | |||||
| * @param[in] mv_scale scaling factor for motion vectors | |||||
| */ | |||||
| void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band, | |||||
| IVITile *tile, int32_t mv_scale); | |||||
| /** | /** | ||||
| * Convert and output the current plane. | * Convert and output the current plane. | ||||
| * This conversion is done by adding back the bias value of 128 | * This conversion is done by adding back the bias value of 128 | ||||
| @@ -406,7 +406,8 @@ static void decode_ac_filter(WmallDecodeCtx *s) | |||||
| s->acfilter_scaling = get_bits(&s->gb, 4); | s->acfilter_scaling = get_bits(&s->gb, 4); | ||||
| for (i = 0; i < s->acfilter_order; i++) | for (i = 0; i < s->acfilter_order; i++) | ||||
| s->acfilter_coeffs[i] = (s->acfilter_scaling ? get_bits(&s->gb, s->acfilter_scaling) : 0) + 1; | |||||
| s->acfilter_coeffs[i] = (s->acfilter_scaling ? | |||||
| get_bits(&s->gb, s->acfilter_scaling) : 0) + 1; | |||||
| } | } | ||||
| static void decode_mclms(WmallDecodeCtx *s) | static void decode_mclms(WmallDecodeCtx *s) | ||||