From fbd0dacc8d61ab418b3fa8e7be22017558323e56 Mon Sep 17 00:00:00 2001 From: Luca Barbato Date: Sun, 9 Jun 2013 21:50:57 +0200 Subject: 4xm: refactor decode_p_block Directly return from code 1, 2 and 6 codepaths and simplify the remaining one to have a single overflow check and a single call to mcdc. --- libavcodec/4xm.c | 65 ++++++++++++++++++++++++++------------------------------ 1 file changed, 30 insertions(+), 35 deletions(-) (limited to 'libavcodec/4xm.c') 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; } -- cgit v1.2.3