aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/h264_cavlc.c
diff options
context:
space:
mode:
authorMans Rullgard <mans@mansr.com>2011-10-11 12:58:31 +0100
committerMans Rullgard <mans@mansr.com>2011-10-11 15:00:56 +0100
commit8babfc033ecb6332155c1f8879e54dee41d16952 (patch)
tree763df742c177a25a0404f72ddf343771bf4b48d2 /libavcodec/h264_cavlc.c
parent88d1e2b2b0a129365a62efd666db0394e8ffbe08 (diff)
downloadffmpeg-8babfc033ecb6332155c1f8879e54dee41d16952.tar.gz
h264: fix invalid shifts in init_cavlc_level_tab()
The level_code expression includes a shift which is invalid in those cases where the value is not used. Moving the calculation to the branch where the result is used avoids these. Signed-off-by: Mans Rullgard <mans@mansr.com>
Diffstat (limited to 'libavcodec/h264_cavlc.c')
-rw-r--r--libavcodec/h264_cavlc.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/libavcodec/h264_cavlc.c b/libavcodec/h264_cavlc.c
index 9e7c182f18..ca7b9399d3 100644
--- a/libavcodec/h264_cavlc.c
+++ b/libavcodec/h264_cavlc.c
@@ -238,17 +238,18 @@ static inline int pred_non_zero_count(H264Context *h, int n){
}
static av_cold void init_cavlc_level_tab(void){
- int suffix_length, mask;
+ int suffix_length;
unsigned int i;
for(suffix_length=0; suffix_length<7; suffix_length++){
for(i=0; i<(1<<LEVEL_TAB_BITS); i++){
int prefix= LEVEL_TAB_BITS - av_log2(2*i);
- int level_code= (prefix<<suffix_length) + (i>>(LEVEL_TAB_BITS-prefix-1-suffix_length)) - (1<<suffix_length);
- mask= -(level_code&1);
- level_code= (((2+level_code)>>1) ^ mask) - mask;
if(prefix + 1 + suffix_length <= LEVEL_TAB_BITS){
+ int level_code = (prefix << suffix_length) +
+ (i >> (av_log2(i) - suffix_length)) - (1 << suffix_length);
+ int mask = -(level_code&1);
+ level_code = (((2 + level_code) >> 1) ^ mask) - mask;
cavlc_level_tab[suffix_length][i][0]= level_code;
cavlc_level_tab[suffix_length][i][1]= prefix + 1 + suffix_length;
}else if(prefix + 1 <= LEVEL_TAB_BITS){