[FFmpeg-cvslog] r21927 - trunk/libavcodec/vp3.c

conrad subversion
Sun Feb 21 01:10:47 CET 2010


Author: conrad
Date: Sun Feb 21 01:10:47 2010
New Revision: 21927

Log:
Use memset to set the runs partially coded superblocks

Much faster for long runs (e.g. nearly uncoded frames), slightly faster
for the general case.

Modified:
   trunk/libavcodec/vp3.c

Modified: trunk/libavcodec/vp3.c
==============================================================================
--- trunk/libavcodec/vp3.c	Sat Feb 20 23:57:23 2010	(r21926)
+++ trunk/libavcodec/vp3.c	Sun Feb 21 01:10:47 2010	(r21927)
@@ -461,17 +461,21 @@ static int unpack_superblocks(Vp3DecodeC
 
         /* unpack the list of partially-coded superblocks */
         bit = get_bits1(gb);
-        /* toggle the bit because as soon as the first run length is
-         * fetched the bit will be toggled again */
-        bit ^= 1;
         while (current_superblock < s->superblock_count) {
-            if (current_run-- == 0) {
-                bit ^= 1;
                 current_run = get_vlc2(gb,
-                    s->superblock_run_length_vlc.table, 6, 2);
-                if (current_run == 33)
+                    s->superblock_run_length_vlc.table, 6, 2) + 1;
+                if (current_run == 34)
                     current_run += get_bits(gb, 12);
 
+            if (current_superblock + current_run > s->superblock_count) {
+                av_log(s->avctx, AV_LOG_ERROR, "Invalid partially coded superblock run length\n");
+                return -1;
+            }
+
+            memset(s->superblock_coding + current_superblock, bit, current_run);
+
+            current_superblock += current_run;
+
                 /* if any of the superblocks are not partially coded, flag
                  * a boolean to decode the list of fully-coded superblocks */
                 if (bit == 0) {
@@ -482,8 +486,8 @@ static int unpack_superblocks(Vp3DecodeC
                      * superblocks */
                     decode_partial_blocks = 1;
                 }
-            }
-            s->superblock_coding[current_superblock++] = bit;
+
+                bit ^= 1;
         }
 
         /* unpack the list of fully coded superblocks if any of the blocks were



More information about the ffmpeg-cvslog mailing list