Commit 1cd74a9b authored by Michael Niedermayer's avatar Michael Niedermayer

Merge commit '25a6666f'

* commit '25a6666f':
  indeo: Bound-check before applying motion compensation

The added checks and one previously added check are replaced by asserts,
the conditions can only be
true when vectors are invalid or there are worse inconsistencies.
We are checking the vectors validity and there should be no
inconsistencies, thus the checks should not be needed.
Also no files are known to cause any anomalies in ffmpeg
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents 2fe5e3e9 25a6666f
......@@ -44,16 +44,19 @@ static VLC ivi_blk_vlc_tabs[8]; ///< static block Huffman tables
typedef void (*ivi_mc_func) (int16_t *buf, const int16_t *ref_buf,
uint32_t pitch, int mc_type);
static int ivi_mc(ivi_mc_func mc, int16_t *buf, const int16_t *ref_buf,
int offs, int mv_x, int mv_y, uint32_t pitch,
int mc_type)
static int ivi_mc(IVIBandDesc *band, ivi_mc_func mc,
int offs, int mv_x, int mv_y, int mc_type)
{
int ref_offs = offs + mv_y * pitch + mv_x;
int ref_offs = offs + mv_y * band->pitch + mv_x;
int buf_size = band->pitch * band->aheight;
int min_size = band->pitch * (band->blk_size - 1) + band->blk_size;
int ref_size = (mc_type > 1) * band->pitch + (mc_type & 1);
if (offs < 0 || ref_offs < 0 || !ref_buf)
return AVERROR_INVALIDDATA;
av_assert0(offs >= 0 && ref_offs >= 0 && band->ref_buf);
av_assert0(buf_size - min_size >= offs);
av_assert0(buf_size - min_size - ref_size >= ref_offs);
mc(buf + offs, ref_buf + ref_offs, pitch, mc_type);
mc(band->buf + offs, band->ref_buf + ref_offs, band->pitch, mc_type);
return 0;
}
......@@ -522,8 +525,7 @@ static int ivi_decode_coded_blocks(GetBitContext *gb, IVIBandDesc *band,
/* apply motion compensation */
if (!is_intra)
return ivi_mc(mc, band->buf, band->ref_buf, offs, mv_x, mv_y,
band->pitch, mc_type);
return ivi_mc(band, mc, offs, mv_x, mv_y, mc_type);
return 0;
}
......@@ -626,8 +628,8 @@ static int ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band,
if (ret < 0)
return ret;
} else {
ret = ivi_mc(mc_no_delta_func, band->buf, band->ref_buf,
buf_offs, mv_x, mv_y, band->pitch, mc_type);
ret = ivi_mc(band, mc_no_delta_func, buf_offs,
mv_x, mv_y, mc_type);
if (ret < 0)
return ret;
}
......@@ -749,8 +751,8 @@ static int ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
for (blk = 0; blk < num_blocks; blk++) {
/* adjust block position in the buffer according with its number */
offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
ret = ivi_mc(mc_no_delta_func, band->buf, band->ref_buf,
offs, mv_x, mv_y, band->pitch, mc_type);
ret = ivi_mc(band, mc_no_delta_func, offs,
mv_x, mv_y, mc_type);
if (ret < 0)
return ret;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment