diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c index ad72965e4c07a8937d783d3bcfd9c04c106cbed1..9e9939abb9fc3a981d5c0148aaaf5640a31a4d25 100644 --- a/libavcodec/vp3.c +++ b/libavcodec/vp3.c @@ -1182,7 +1182,14 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) while (current_superblock < s->superblock_count) { if (current_run == 0) { bit ^= 1; +#if 1 + current_run = get_vlc2(gb, + s->superblock_run_length_vlc.table, 6, 2) + 1; + if (current_run == 34) + current_run += get_bits(gb, 12); +#else current_run = get_superblock_run_length(gb); +#endif debug_block_coding(" setting superblocks %d..%d to %s\n", current_superblock, current_superblock + current_run - 1, @@ -1221,7 +1228,14 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) if (current_run == 0) { bit ^= 1; +#if 1 + current_run = get_vlc2(gb, + s->superblock_run_length_vlc.table, 6, 2) + 1; + if (current_run == 34) + current_run += get_bits(gb, 12); +#else current_run = get_superblock_run_length(gb); +#endif } debug_block_coding(" setting superblock %d to %s\n", @@ -2630,6 +2644,10 @@ static int vp3_decode_init(AVCodecContext *avctx) &ac_bias_3[i][0][0], 4, 2, 0); } + init_vlc(&s->superblock_run_length_vlc, 6, 34, + &superblock_run_length_vlc_table[0][1], 4, 2, + &superblock_run_length_vlc_table[0][0], 4, 2, 0); + init_vlc(&s->fragment_run_length_vlc, 5, 31, &fragment_run_length_vlc_table[0][1], 4, 2, &fragment_run_length_vlc_table[0][0], 4, 2, 0); diff --git a/libavcodec/vp3data.h b/libavcodec/vp3data.h index 5a5ff9cac50d23fe2c23d63822781be8dd5149af..893a5873a04a3c75b1e49a7b95792d4ec3b1f5f8 100644 --- a/libavcodec/vp3data.h +++ b/libavcodec/vp3data.h @@ -72,6 +72,27 @@ static const uint32_t vp31_filter_limit_values[64] = 0, 0, 0, 0, 0, 0, 0, 0 }; +static const uint16_t superblock_run_length_vlc_table[34][2] = { + { 0, 1 }, + + { 4, 3 }, { 5, 3 }, + + { 0xC, 4 }, { 0xD, 4 }, + + { 0x38, 6 }, { 0x39, 6 }, { 0x3A, 6 }, { 0x3B, 6 }, + + { 0xF0, 8 }, { 0xF1, 8 }, { 0xF2, 8 }, { 0xF3, 8 }, + { 0xF4, 8 }, { 0xF5, 8 }, { 0xF6, 8 }, { 0xF7, 8 }, + + { 0x3E0, 10 }, { 0x3E1, 10 }, { 0x3E2, 10 }, { 0x3E3, 10 }, + { 0x3E4, 10 }, { 0x3E5, 10 }, { 0x3E6, 10 }, { 0x3E7, 10 }, + { 0x3E8, 10 }, { 0x3E9, 10 }, { 0x3EA, 10 }, { 0x3EB, 10 }, + { 0x3EC, 10 }, { 0x3ED, 10 }, { 0x3EE, 10 }, { 0x3EF, 10 }, + + { 0x3F, 6 } /* this last VLC is a special case for reading 12 more + bits from stream and adding the value 34 */ +}; + static const uint16_t fragment_run_length_vlc_table[30][2] = { /* 1 -> 2 */ { 0x0, 2 }, { 0x1, 2 },