optimizing rle decoding loops a little

Originally committed as revision 4269 to svn://svn.ffmpeg.org/ffmpeg/trunk
pull/126/head
Michael Niedermayer 20 years ago
parent 8aeadb903a
commit b5da363592
  1. 26
      libavcodec/vp3.c

@ -1180,12 +1180,12 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
* fetched the bit will be toggled again */ * fetched the bit will be toggled again */
bit ^= 1; bit ^= 1;
while (current_superblock < s->superblock_count) { while (current_superblock < s->superblock_count) {
if (current_run == 0) { if (current_run-- == 0) {
bit ^= 1; bit ^= 1;
#if 1 #if 1
current_run = get_vlc2(gb, current_run = get_vlc2(gb,
s->superblock_run_length_vlc.table, 6, 2) + 1; s->superblock_run_length_vlc.table, 6, 2);
if (current_run == 34) if (current_run == 33)
current_run += get_bits(gb, 12); current_run += get_bits(gb, 12);
#else #else
current_run = get_superblock_run_length(gb); current_run = get_superblock_run_length(gb);
@ -1206,9 +1206,7 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
decode_partial_blocks = 1; decode_partial_blocks = 1;
} }
} }
s->superblock_coding[current_superblock++] = s->superblock_coding[current_superblock++] = bit;
(bit) ? SB_PARTIALLY_CODED : SB_NOT_CODED;
current_run--;
} }
/* unpack the list of fully coded superblocks if any of the blocks were /* unpack the list of fully coded superblocks if any of the blocks were
@ -1226,12 +1224,12 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
/* skip any superblocks already marked as partially coded */ /* skip any superblocks already marked as partially coded */
if (s->superblock_coding[current_superblock] == SB_NOT_CODED) { if (s->superblock_coding[current_superblock] == SB_NOT_CODED) {
if (current_run == 0) { if (current_run-- == 0) {
bit ^= 1; bit ^= 1;
#if 1 #if 1
current_run = get_vlc2(gb, current_run = get_vlc2(gb,
s->superblock_run_length_vlc.table, 6, 2) + 1; s->superblock_run_length_vlc.table, 6, 2);
if (current_run == 34) if (current_run == 33)
current_run += get_bits(gb, 12); current_run += get_bits(gb, 12);
#else #else
current_run = get_superblock_run_length(gb); current_run = get_superblock_run_length(gb);
@ -1241,9 +1239,7 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
debug_block_coding(" setting superblock %d to %s\n", debug_block_coding(" setting superblock %d to %s\n",
current_superblock, current_superblock,
(bit) ? "fully coded" : "not coded"); (bit) ? "fully coded" : "not coded");
s->superblock_coding[current_superblock] = s->superblock_coding[current_superblock] = 2*bit;
(bit) ? SB_FULLY_CODED : SB_NOT_CODED;
current_run--;
} }
current_superblock++; current_superblock++;
} }
@ -1291,11 +1287,11 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
/* fragment may or may not be coded; this is the case /* fragment may or may not be coded; this is the case
* that cares about the fragment coding runs */ * that cares about the fragment coding runs */
if (current_run == 0) { if (current_run-- == 0) {
bit ^= 1; bit ^= 1;
#if 1 #if 1
current_run = get_vlc2(gb, current_run = get_vlc2(gb,
s->fragment_run_length_vlc.table, 5, 2) + 1; s->fragment_run_length_vlc.table, 5, 2);
#else #else
current_run = get_fragment_run_length(gb); current_run = get_fragment_run_length(gb);
#endif #endif
@ -1328,8 +1324,6 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
i, current_fragment); i, current_fragment);
} }
current_run--;
} else { } else {
/* fragments are fully coded in this superblock; actual /* fragments are fully coded in this superblock; actual

Loading…
Cancel
Save