Commit ec908ce4 authored by zhaoxiu.zeng's avatar zhaoxiu.zeng Committed by Michael Niedermayer

avcodec/vc1_block: Optimize vc1_decode_ac_coeff()

Avoid branches in sign handling
Move local variables to where they are used
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent ccad34e3
...@@ -487,17 +487,16 @@ static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip, ...@@ -487,17 +487,16 @@ static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip,
int *value, int codingset) int *value, int codingset)
{ {
GetBitContext *gb = &v->s.gb; GetBitContext *gb = &v->s.gb;
int index, escape, run = 0, level = 0, lst = 0; int index, run, level, lst, sign;
index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3); index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
if (index != ff_vc1_ac_sizes[codingset] - 1) { if (index != ff_vc1_ac_sizes[codingset] - 1) {
run = vc1_index_decode_table[codingset][index][0]; run = vc1_index_decode_table[codingset][index][0];
level = vc1_index_decode_table[codingset][index][1]; level = vc1_index_decode_table[codingset][index][1];
lst = index >= vc1_last_decode_table[codingset] || get_bits_left(gb) < 0; lst = index >= vc1_last_decode_table[codingset] || get_bits_left(gb) < 0;
if (get_bits1(gb)) sign = get_bits1(gb);
level = -level;
} else { } else {
escape = decode210(gb); int escape = decode210(gb);
if (escape != 2) { if (escape != 2) {
index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3); index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
run = vc1_index_decode_table[codingset][index][0]; run = vc1_index_decode_table[codingset][index][0];
...@@ -514,10 +513,8 @@ static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip, ...@@ -514,10 +513,8 @@ static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip,
else else
run += vc1_delta_run_table[codingset][level] + 1; run += vc1_delta_run_table[codingset][level] + 1;
} }
if (get_bits1(gb)) sign = get_bits1(gb);
level = -level;
} else { } else {
int sign;
lst = get_bits1(gb); lst = get_bits1(gb);
if (v->s.esc3_level_length == 0) { if (v->s.esc3_level_length == 0) {
if (v->pq < 8 || v->dquantfrm) { // table 59 if (v->pq < 8 || v->dquantfrm) { // table 59
...@@ -532,14 +529,12 @@ static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip, ...@@ -532,14 +529,12 @@ static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip,
run = get_bits(gb, v->s.esc3_run_length); run = get_bits(gb, v->s.esc3_run_length);
sign = get_bits1(gb); sign = get_bits1(gb);
level = get_bits(gb, v->s.esc3_level_length); level = get_bits(gb, v->s.esc3_level_length);
if (sign)
level = -level;
} }
} }
*last = lst; *last = lst;
*skip = run; *skip = run;
*value = level; *value = (level ^ -sign) + sign;
} }
/** Decode intra block in intra frames - should be faster than decode_intra_block /** Decode intra block in intra frames - should be faster than decode_intra_block
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment