This allows untangling the eatqi decoder from the MPEG-1 decoder. Signed-off-by: Vittorio Giovara <vittorio.giov...@gmail.com> --- libavcodec/eatqi.c | 9 ++++- libavcodec/mpeg12.c | 89 +++++++++++++++++++++++++++++++++++++++++++ libavcodec/mpeg12.h | 6 ++- libavcodec/mpeg12dec.c | 101 +++++++------------------------------------------ 4 files changed, 114 insertions(+), 91 deletions(-)
diff --git a/libavcodec/eatqi.c b/libavcodec/eatqi.c index f5dcb53..59bba97 100644 --- a/libavcodec/eatqi.c +++ b/libavcodec/eatqi.c @@ -66,9 +66,14 @@ static int tqi_decode_mb(MpegEncContext *s, int16_t (*block)[64]) { int n; s->bdsp.clear_blocks(block[0]); - for (n=0; n<6; n++) - if (ff_mpeg1_decode_block_intra(s, block[n], n) < 0) + for (n = 0; n < 6; n++) { + int ret = ff_mpeg1_decode_block_intra(&s->gb, + s->intra_matrix, + s->intra_scantable.permutated, + s->last_dc, block[n], n, 1); + if (ret < 0) return -1; + } return 0; } diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c index 69c6d0a..9e610d3 100644 --- a/libavcodec/mpeg12.c +++ b/libavcodec/mpeg12.c @@ -236,3 +236,92 @@ int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size, pc->state = state; return END_NOT_FOUND; } + +int ff_mpeg1_decode_block_intra(GetBitContext *gb, + const uint16_t *quant_matrix, + uint8_t *const scantable, int last_dc[3], + int16_t *block, int index, int qscale) +{ + int dc, diff, component; + int i, j; + + /* DC coefficient */ + component = index <= 3 ? 0 : index - 4 + 1; + + diff = decode_dc(gb, component); + if (diff >= 0xffff) + return AVERROR_INVALIDDATA; + + dc = last_dc[component]; + dc += diff; + last_dc[component] = dc; + + block[0] = dc * quant_matrix[0]; + ff_dlog(NULL, "dc=%d diff=%d\n", dc, diff); + i = 0; + + { + OPEN_READER(re, gb); + /* now quantify & encode AC coefficients */ + while (1) { + int level, run; + RLTable *rl = &ff_rl_mpeg1; + + UPDATE_CACHE(re, gb); + GET_RL_VLC(level, run, re, gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); + + if (level == 127) { + break; + } else if (level != 0) { + i += run; + if (i > 63) + break; + + j = scantable[i]; + level = (level * qscale * quant_matrix[j]) >> 4; + level = (level - 1) | 1; + level = (level ^ SHOW_SBITS(re, gb, 1)) - + SHOW_SBITS(re, gb, 1); + LAST_SKIP_BITS(re, gb, 1); + } else { + /* escape */ + run = SHOW_UBITS(re, gb, 6) + 1; + LAST_SKIP_BITS(re, gb, 6); + UPDATE_CACHE(re, gb); + level = SHOW_SBITS(re, gb, 8); + SKIP_BITS(re, gb, 8); + + if (level == -128) { + level = SHOW_UBITS(re, gb, 8) - 256; + LAST_SKIP_BITS(re, gb, 8); + } else if (level == 0) { + level = SHOW_UBITS(re, gb, 8); + LAST_SKIP_BITS(re, gb, 8); + } + + i += run; + if (i > 63) + break; + + j = scantable[i]; + if (level < 0) { + level = -level; + level = (level * qscale * quant_matrix[j]) >> 4; + level = (level - 1) | 1; + level = -level; + } else { + level = (level * qscale * quant_matrix[j]) >> 4; + level = (level - 1) | 1; + } + } + + block[j] = level; + } + CLOSE_READER(re, gb); + } + + if (i > 63) + i = AVERROR_INVALIDDATA; + + return i; +} diff --git a/libavcodec/mpeg12.h b/libavcodec/mpeg12.h index fda1a53..c0a86b6 100644 --- a/libavcodec/mpeg12.h +++ b/libavcodec/mpeg12.h @@ -50,7 +50,11 @@ static inline int decode_dc(GetBitContext *gb, int component) return diff; } -int ff_mpeg1_decode_block_intra(MpegEncContext *s, int16_t *block, int n); +int ff_mpeg1_decode_block_intra(GetBitContext *gb, + const uint16_t *quant_matrix, + uint8_t *const scantable, int last_dc[3], + int16_t *block, int index, int qscale); + void ff_mpeg1_clean_buffers(MpegEncContext *s); int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size, AVCodecParserContext *s); diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c index 1e1e4a5..9b6c732 100644 --- a/libavcodec/mpeg12dec.c +++ b/libavcodec/mpeg12dec.c @@ -137,92 +137,6 @@ static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred) } \ } while (0) -static inline int mpeg1_decode_block_intra(MpegEncContext *s, - int16_t *block, int n) -{ - int level, dc, diff, i, j, run; - int component; - RLTable *rl = &ff_rl_mpeg1; - uint8_t *const scantable = s->intra_scantable.permutated; - const uint16_t *quant_matrix = s->intra_matrix; - const int qscale = s->qscale; - - /* DC coefficient */ - component = (n <= 3 ? 0 : n - 4 + 1); - diff = decode_dc(&s->gb, component); - if (diff >= 0xffff) - return AVERROR_INVALIDDATA; - dc = s->last_dc[component]; - dc += diff; - s->last_dc[component] = dc; - block[0] = dc * quant_matrix[0]; - ff_dlog(s->avctx, "dc=%d diff=%d\n", dc, diff); - i = 0; - { - OPEN_READER(re, &s->gb); - /* now quantify & encode AC coefficients */ - for (;;) { - UPDATE_CACHE(re, &s->gb); - GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], - TEX_VLC_BITS, 2, 0); - - if (level == 127) { - break; - } else if (level != 0) { - i += run; - if (i > 63) - break; - j = scantable[i]; - level = (level * qscale * quant_matrix[j]) >> 4; - level = (level - 1) | 1; - level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - - SHOW_SBITS(re, &s->gb, 1); - LAST_SKIP_BITS(re, &s->gb, 1); - } else { - /* escape */ - run = SHOW_UBITS(re, &s->gb, 6) + 1; - LAST_SKIP_BITS(re, &s->gb, 6); - UPDATE_CACHE(re, &s->gb); - level = SHOW_SBITS(re, &s->gb, 8); - SKIP_BITS(re, &s->gb, 8); - if (level == -128) { - level = SHOW_UBITS(re, &s->gb, 8) - 256; - LAST_SKIP_BITS(re, &s->gb, 8); - } else if (level == 0) { - level = SHOW_UBITS(re, &s->gb, 8); - LAST_SKIP_BITS(re, &s->gb, 8); - } - i += run; - if (i > 63) - break; - j = scantable[i]; - if (level < 0) { - level = -level; - level = (level * qscale * quant_matrix[j]) >> 4; - level = (level - 1) | 1; - level = -level; - } else { - level = (level * qscale * quant_matrix[j]) >> 4; - level = (level - 1) | 1; - } - } - - block[j] = level; - } - CLOSE_READER(re, &s->gb); - } - - check_scantable_index(s, i); - - s->block_last_index[n] = i; - return 0; -} - -int ff_mpeg1_decode_block_intra(MpegEncContext *s, int16_t *block, int n) -{ - return mpeg1_decode_block_intra(s, block, n); -} - static inline int mpeg1_decode_block_inter(MpegEncContext *s, int16_t *block, int n) { @@ -839,9 +753,20 @@ FF_ENABLE_DEPRECATION_WARNINGS return ret; } } else { - for (i = 0; i < 6; i++) - if ((ret = mpeg1_decode_block_intra(s, *s->pblocks[i], i)) < 0) + for (i = 0; i < 6; i++) { + ret = ff_mpeg1_decode_block_intra(&s->gb, + s->intra_matrix, + s->intra_scantable.permutated, + s->last_dc, *s->pblocks[i], + i, s->qscale); + if (ret < 0) { + av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", + s->mb_x, s->mb_y); return ret; + } + + s->block_last_index[i] = ret; + } } } else { if (mb_type & MB_TYPE_ZERO_MV) { -- 2.6.4 _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel