# HG changeset patch # User conrad # Date 1266711047 0 # Node ID 5811a86f55f1d0465176ee8286b7122629bc90be # Parent dd2b69794909316a389efe84929977ddf62490c0 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. diff -r dd2b69794909 -r 5811a86f55f1 vp3.c --- a/vp3.c Sat Feb 20 20:13:48 2010 +0000 +++ b/vp3.c Sun Feb 21 00:10:47 2010 +0000 @@ -461,17 +461,21 @@ /* 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 @@ * 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