diff options
author | Jason Garrett-Glaser <darkshikari@gmail.com> | 2010-08-02 20:57:03 +0000 |
---|---|---|
committer | Jason Garrett-Glaser <darkshikari@gmail.com> | 2010-08-02 20:57:03 +0000 |
commit | f311208cf1ebbd74f8a3bd111d9172f41188aa83 (patch) | |
tree | 6183bd58dae57998d1b8cb1e8fd78b941e1aed95 /libavcodec/vp8.c | |
parent | c934562c1293167a35a0350358e8b76ec73a3364 (diff) | |
download | ffmpeg-f311208cf1ebbd74f8a3bd111d9172f41188aa83.tar.gz |
VP8: much faster DC transform handling
A lot of the time the DC block is empty: don't do the WHT in this case.
A lot of the rest of the time, there's only one coefficient: make a special
DC-only transform for that case.
When the block is empty, don't incorrectly mark luma DCT blocks as having DC
coefficients.
Originally committed as revision 24670 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/vp8.c')
-rw-r--r-- | libavcodec/vp8.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c index 651924196b..106950683f 100644 --- a/libavcodec/vp8.c +++ b/libavcodec/vp8.c @@ -868,6 +868,7 @@ void decode_mb_coeffs(VP8Context *s, VP56RangeCoder *c, VP8Macroblock *mb, int i, x, y, luma_start = 0, luma_ctx = 3; int nnz_pred, nnz, nnz_total = 0; int segment = s->segment; + int block_dc = 0; if (mb->mode != MODE_I4x4 && mb->mode != VP8_MVMODE_SPLIT) { nnz_pred = t_nnz[8] + l_nnz[8]; @@ -876,8 +877,14 @@ void decode_mb_coeffs(VP8Context *s, VP56RangeCoder *c, VP8Macroblock *mb, nnz = decode_block_coeffs(c, s->block_dc, s->prob->token[1], 0, nnz_pred, s->qmat[segment].luma_dc_qmul); l_nnz[8] = t_nnz[8] = !!nnz; - nnz_total += nnz; - s->vp8dsp.vp8_luma_dc_wht(s->block, s->block_dc); + if (nnz) { + nnz_total += nnz; + block_dc = 1; + if (nnz == 1) + s->vp8dsp.vp8_luma_dc_wht_dc(s->block, s->block_dc); + else + s->vp8dsp.vp8_luma_dc_wht(s->block, s->block_dc); + } luma_start = 1; luma_ctx = 0; } @@ -888,8 +895,8 @@ void decode_mb_coeffs(VP8Context *s, VP56RangeCoder *c, VP8Macroblock *mb, nnz_pred = l_nnz[y] + t_nnz[x]; nnz = decode_block_coeffs(c, s->block[y][x], s->prob->token[luma_ctx], luma_start, nnz_pred, s->qmat[segment].luma_qmul); - // nnz+luma_start may be one more than the actual last index, but we don't care - s->non_zero_count_cache[y][x] = nnz + luma_start; + // nnz+block_dc may be one more than the actual last index, but we don't care + s->non_zero_count_cache[y][x] = nnz + block_dc; t_nnz[x] = l_nnz[y] = !!nnz; nnz_total += nnz; } |