diff options
Diffstat (limited to 'libavcodec/4xm.c')
-rw-r--r-- | libavcodec/4xm.c | 65 |
1 files changed, 30 insertions, 35 deletions
diff --git a/libavcodec/4xm.c b/libavcodec/4xm.c index 2554ba9dff..5814c3afd4 100644 --- a/libavcodec/4xm.c +++ b/libavcodec/4xm.c @@ -342,52 +342,26 @@ static int decode_p_block(FourXContext *f, uint16_t *dst, uint16_t *src, uint16_t *start = (uint16_t *)f->last_picture->data[0]; uint16_t *end = start + stride * (f->avctx->height - h + 1) - (1 << log2w); int ret; + int scale = 1; + unsigned dc = 0; if (code < 0 || code > 6 || log2w < 0) return AVERROR_INVALIDDATA; - if (code == 0) { - src += f->mv[bytestream2_get_byte(&f->g)]; - if (start > src || src > end) { - av_log(f->avctx, AV_LOG_ERROR, "mv out of pic\n"); - return AVERROR_INVALIDDATA; - } - mcdc(dst, src, log2w, h, stride, 1, 0); - } else if (code == 1) { + if (code == 1) { log2h--; if ((ret = decode_p_block(f, dst, src, log2w, log2h, stride)) < 0) return ret; - if ((ret = decode_p_block(f, dst + (stride << log2h), - src + (stride << log2h), - log2w, log2h, stride)) < 0) - return ret; + return decode_p_block(f, dst + (stride << log2h), + src + (stride << log2h), + log2w, log2h, stride); } else if (code == 2) { log2w--; if ((ret = decode_p_block(f, dst , src, log2w, log2h, stride)) < 0) return ret; - if ((ret = decode_p_block(f, dst + (1 << log2w), - src + (1 << log2w), - log2w, log2h, stride)) < 0) - return ret; - } else if (code == 3 && f->version < 2) { - if (start > src || src > end) { - av_log(f->avctx, AV_LOG_ERROR, "mv out of pic\n"); - return AVERROR_INVALIDDATA; - } - mcdc(dst, src, log2w, h, stride, 1, 0); - } else if (code == 4) { - src += f->mv[bytestream2_get_byte(&f->g)]; - if (start > src || src > end) { - av_log(f->avctx, AV_LOG_ERROR, "mv out of pic\n"); - return AVERROR_INVALIDDATA; - } - mcdc(dst, src, log2w, h, stride, 1, bytestream2_get_le16(&f->g2)); - } else if (code == 5) { - if (start > src || src > end) { - av_log(f->avctx, AV_LOG_ERROR, "mv out of pic\n"); - return AVERROR_INVALIDDATA; - } - mcdc(dst, src, log2w, h, stride, 0, bytestream2_get_le16(&f->g2)); + return decode_p_block(f, dst + (1 << log2w), + src + (1 << log2w), + log2w, log2h, stride); } else if (code == 6) { if (log2w) { dst[0] = bytestream2_get_le16(&f->g2); @@ -396,7 +370,28 @@ static int decode_p_block(FourXContext *f, uint16_t *dst, uint16_t *src, dst[0] = bytestream2_get_le16(&f->g2); dst[stride] = bytestream2_get_le16(&f->g2); } + return 0; + } + + if (code == 0) { + src += f->mv[bytestream2_get_byte(&f->g)]; + } else if (code == 3 && f->version >= 2) { + return 0; + } else if (code == 4) { + src += f->mv[bytestream2_get_byte(&f->g)]; + dc = bytestream2_get_le16(&f->g2); + } else if (code == 5) { + scale = 0; + dc = bytestream2_get_le16(&f->g2); } + + if (start > src || src > end) { + av_log(f->avctx, AV_LOG_ERROR, "mv out of pic\n"); + return AVERROR_INVALIDDATA; + } + + mcdc(dst, src, log2w, h, stride, scale, dc); + return 0; } |