Commit 29d92d6f authored by melanson's avatar melanson

Perform the DC prediction reversal immediately after decoding all of

the DC coefficients. This has a greater probability of leveraging the 
coefficients while they are still cached.

When testing with the Big Buck Bunny 1080p video, I consistently saw 
improvements of 500k-600k dezicycles per run (through 
reverse_dc_prediction()) thanks to this move.


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@19966 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 41cbba5c
...@@ -1099,6 +1099,10 @@ static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb, ...@@ -1099,6 +1099,10 @@ static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb,
return eob_run; return eob_run;
} }
static void reverse_dc_prediction(Vp3DecodeContext *s,
int first_fragment,
int fragment_width,
int fragment_height);
/* /*
* This function unpacks all of the DCT coefficient data from the * This function unpacks all of the DCT coefficient data from the
* bitstream. * bitstream.
...@@ -1120,10 +1124,22 @@ static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -1120,10 +1124,22 @@ static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_y_table], 0, residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_y_table], 0,
s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run); s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run);
/* reverse prediction of the Y-plane DC coefficients */
reverse_dc_prediction(s, 0, s->fragment_width, s->fragment_height);
/* unpack the C plane DC coefficients */ /* unpack the C plane DC coefficients */
residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_c_table], 0, residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_c_table], 0,
s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run); s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run);
/* reverse prediction of the C-plane DC coefficients */
if (!(s->avctx->flags & CODEC_FLAG_GRAY))
{
reverse_dc_prediction(s, s->fragment_start[1],
s->fragment_width / 2, s->fragment_height / 2);
reverse_dc_prediction(s, s->fragment_start[2],
s->fragment_width / 2, s->fragment_height / 2);
}
/* fetch the AC table indexes */ /* fetch the AC table indexes */
ac_y_table = get_bits(gb, 4); ac_y_table = get_bits(gb, 4);
ac_c_table = get_bits(gb, 4); ac_c_table = get_bits(gb, 4);
...@@ -1996,14 +2012,6 @@ static int vp3_decode_frame(AVCodecContext *avctx, ...@@ -1996,14 +2012,6 @@ static int vp3_decode_frame(AVCodecContext *avctx,
return -1; return -1;
} }
reverse_dc_prediction(s, 0, s->fragment_width, s->fragment_height);
if ((avctx->flags & CODEC_FLAG_GRAY) == 0) {
reverse_dc_prediction(s, s->fragment_start[1],
s->fragment_width / 2, s->fragment_height / 2);
reverse_dc_prediction(s, s->fragment_start[2],
s->fragment_width / 2, s->fragment_height / 2);
}
for (i = 0; i < s->macroblock_height; i++) for (i = 0; i < s->macroblock_height; i++)
render_slice(s, i); render_slice(s, i);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment