changeset 10223:b08865f6d4e3 libavcodec

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.
author melanson
date Tue, 22 Sep 2009 15:58:08 +0000
parents 4ce0bf184aa3
children 47f2b03e0c62
files vp3.c
diffstat 1 files changed, 16 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/vp3.c	Tue Sep 22 01:34:42 2009 +0000
+++ b/vp3.c	Tue Sep 22 15:58:08 2009 +0000
@@ -1099,6 +1099,10 @@
     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
  * bitstream.
@@ -1120,10 +1124,22 @@
     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);
 
+    /* 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 */
     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);
 
+    /* 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 */
     ac_y_table = get_bits(gb, 4);
     ac_c_table = get_bits(gb, 4);
@@ -1996,14 +2012,6 @@
         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++)
         render_slice(s, i);