Mercurial > libavcodec.hg
changeset 11225:5811a86f55f1 libavcodec
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.
author | conrad |
---|---|
date | Sun, 21 Feb 2010 00:10:47 +0000 |
parents | dd2b69794909 |
children | 386c361bf136 |
files | vp3.c |
diffstat | 1 files changed, 13 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- 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