diff options
author | Derek Buitenhuis <derek.buitenhuis@gmail.com> | 2016-02-16 19:19:23 +0000 |
---|---|---|
committer | Derek Buitenhuis <derek.buitenhuis@gmail.com> | 2016-02-16 19:25:17 +0000 |
commit | 58dd885f9ae7feee002773253e345e11e7142739 (patch) | |
tree | fbc4ca8c9d0367b61a7654b0f479bf528cb04058 /libavcodec/mpeg12dec.c | |
parent | 8e2105297daecba193ce6f264becd2d5245f2d9d (diff) | |
parent | 7c25ffe070c286874a8c3513f7504b90e1626b0c (diff) | |
download | ffmpeg-58dd885f9ae7feee002773253e345e11e7142739.tar.gz |
Merge commit '7c25ffe070c286874a8c3513f7504b90e1626b0c'
* commit '7c25ffe070c286874a8c3513f7504b90e1626b0c':
mpeg1: Make intra-block decoding independent of MpegEncContext
Merged-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
Diffstat (limited to 'libavcodec/mpeg12dec.c')
-rw-r--r-- | libavcodec/mpeg12dec.c | 115 |
1 files changed, 13 insertions, 102 deletions
diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c index 91c004f80a..55f9207782 100644 --- a/libavcodec/mpeg12dec.c +++ b/libavcodec/mpeg12dec.c @@ -134,106 +134,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 index) -{ - int dc, diff, i = 0, 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 = index <= 3 ? 0 : index - 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]; - - { - OPEN_READER(re, &s->gb); - UPDATE_CACHE(re, &s->gb); - if (((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) - goto end; - - /* now quantify & encode AC coefficients */ - while (1) { - int level, run, j; - - GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], - TEX_VLC_BITS, 2, 0); - - if (level != 0) { - i += run; - if (i > MAX_INDEX) - 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); - 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; - SKIP_BITS(re, &s->gb, 8); - } else if (level == 0) { - level = SHOW_UBITS(re, &s->gb, 8); - SKIP_BITS(re, &s->gb, 8); - } - - i += run; - if (i > MAX_INDEX) - 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; - if (((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) - break; - - UPDATE_CACHE(re, &s->gb); - } -end: - LAST_SKIP_BITS(re, &s->gb, 2); - CLOSE_READER(re, &s->gb); - } - - check_scantable_index(s, i); - - s->block_last_index[index] = i; - return 0; -} - -int ff_mpeg1_decode_block_intra(MpegEncContext *s, int16_t *block, int index) -{ - return mpeg1_decode_block_intra(s, block, index); -} - static inline int mpeg1_decode_block_inter(MpegEncContext *s, int16_t *block, int n) { @@ -887,9 +787,20 @@ static int mpeg_decode_mb(MpegEncContext *s, int16_t block[12][64]) 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, s->block_last_index); + 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) { |