Mercurial > libavcodec.hg
comparison h264.c @ 7225:f8b6ec3e5538 libavcodec
fix IPCM_decode_error.h264
author | michael |
---|---|
date | Wed, 09 Jul 2008 06:03:59 +0000 |
parents | 82ab987bca8a |
children | 9a5cdba22eeb |
comparison
equal
deleted
inserted
replaced
7224:d5a52b28c9de | 7225:f8b6ec3e5538 |
---|---|
4350 }else if(prefix==14){ | 4350 }else if(prefix==14){ |
4351 if(suffix_length) | 4351 if(suffix_length) |
4352 level_code= (prefix<<suffix_length) + get_bits(gb, suffix_length); //part | 4352 level_code= (prefix<<suffix_length) + get_bits(gb, suffix_length); //part |
4353 else | 4353 else |
4354 level_code= prefix + get_bits(gb, 4); //part | 4354 level_code= prefix + get_bits(gb, 4); //part |
4355 }else if(prefix==15){ | 4355 }else{ |
4356 level_code= (prefix<<suffix_length) + get_bits(gb, 12); //part | 4356 level_code= (15<<suffix_length) + get_bits(gb, prefix-3); //part |
4357 if(suffix_length==0) level_code+=15; //FIXME doesn't make (much)sense | 4357 if(suffix_length==0) level_code+=15; //FIXME doesn't make (much)sense |
4358 }else{ | 4358 if(prefix>=16) |
4359 av_log(h->s.avctx, AV_LOG_ERROR, "prefix too large at %d %d\n", s->mb_x, s->mb_y); | 4359 level_code += (1<<(prefix-3))-4096; |
4360 return -1; | |
4361 } | 4360 } |
4362 | 4361 |
4363 if(trailing_ones < 3) level_code += 2; | 4362 if(trailing_ones < 3) level_code += 2; |
4364 | 4363 |
4365 suffix_length = 1; | 4364 suffix_length = 1; |
4373 for(;i<total_coeff;i++) { | 4372 for(;i<total_coeff;i++) { |
4374 static const int suffix_limit[7] = {0,5,11,23,47,95,INT_MAX }; | 4373 static const int suffix_limit[7] = {0,5,11,23,47,95,INT_MAX }; |
4375 prefix = get_level_prefix(gb); | 4374 prefix = get_level_prefix(gb); |
4376 if(prefix<15){ | 4375 if(prefix<15){ |
4377 level_code = (prefix<<suffix_length) + get_bits(gb, suffix_length); | 4376 level_code = (prefix<<suffix_length) + get_bits(gb, suffix_length); |
4378 }else if(prefix==15){ | |
4379 level_code = (prefix<<suffix_length) + get_bits(gb, 12); | |
4380 }else{ | 4377 }else{ |
4381 av_log(h->s.avctx, AV_LOG_ERROR, "prefix too large at %d %d\n", s->mb_x, s->mb_y); | 4378 level_code = (15<<suffix_length) + get_bits(gb, prefix-3); |
4382 return -1; | 4379 if(prefix>=16) |
4380 level_code += (1<<(prefix-3))-4096; | |
4383 } | 4381 } |
4384 mask= -(level_code&1); | 4382 mask= -(level_code&1); |
4385 level[i]= (((2+level_code)>>1) ^ mask) - mask; | 4383 level[i]= (((2+level_code)>>1) ^ mask) - mask; |
4386 if(level_code > suffix_limit[suffix_length]) | 4384 if(level_code > suffix_limit[suffix_length]) |
4387 suffix_length++; | 4385 suffix_length++; |