Mercurial > libavcodec.hg
comparison h264.c @ 2313:b5376aef1fe0 libavcodec
cleanup of decode_cabac_residual()
author | michael |
---|---|
date | Sat, 23 Oct 2004 15:59:01 +0000 |
parents | cb958ec6dfee |
children | 9db5a4aab7e4 |
comparison
equal
deleted
inserted
replaced
2312:cb958ec6dfee | 2313:b5376aef1fe0 |
---|---|
4262 | 4262 |
4263 static int decode_cabac_residual( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, int qp, int max_coeff) { | 4263 static int decode_cabac_residual( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, int qp, int max_coeff) { |
4264 const int mb_xy = h->s.mb_x + h->s.mb_y*h->s.mb_stride; | 4264 const int mb_xy = h->s.mb_x + h->s.mb_y*h->s.mb_stride; |
4265 const uint16_t *qmul= dequant_coeff[qp]; | 4265 const uint16_t *qmul= dequant_coeff[qp]; |
4266 static const int significant_coeff_flag_offset[5] = { 0, 15, 29, 44, 47 }; | 4266 static const int significant_coeff_flag_offset[5] = { 0, 15, 29, 44, 47 }; |
4267 static const int last_significant_coeff_flag_offset[5] = { 0, 15, 29, 44, 47 }; | 4267 static const int coeff_abs_level_m1_offset[5] = {227+ 0, 227+10, 227+20, 227+30, 227+39 }; |
4268 static const int coeff_abs_level_m1_offset[5] = { 0, 10, 20, 30, 39 }; | |
4269 | 4268 |
4270 int coeff[16]; | 4269 int coeff[16]; |
4271 | 4270 int index[16]; |
4272 int last = 0; | 4271 |
4272 int i, last; | |
4273 int coeff_count = 0; | 4273 int coeff_count = 0; |
4274 int nz[16] = {0}; | |
4275 int i; | |
4276 | 4274 |
4277 int abslevel1 = 0; | 4275 int abslevel1 = 0; |
4278 int abslevelgt1 = 0; | 4276 int abslevelgt1 = 0; |
4279 | 4277 |
4280 /* cat: 0-> DC 16x16 n = 0 | 4278 /* cat: 0-> DC 16x16 n = 0 |
4292 h->non_zero_count_cache[scan8[16+n]] = 0; | 4290 h->non_zero_count_cache[scan8[16+n]] = 0; |
4293 | 4291 |
4294 return 0; | 4292 return 0; |
4295 } | 4293 } |
4296 | 4294 |
4297 while( last < max_coeff - 1 ) { | 4295 for(last= 0; last < max_coeff - 1; last++) { |
4298 int ctx = FFMIN( last, max_coeff - 2 ); | 4296 if( get_cabac( &h->cabac, &h->cabac_state[105+significant_coeff_flag_offset[cat]+last] )) { |
4299 | 4297 index[coeff_count++] = last; |
4300 if( get_cabac( &h->cabac, &h->cabac_state[105+significant_coeff_flag_offset[cat]+ctx] ) == 0 ) { | 4298 if( get_cabac( &h->cabac, &h->cabac_state[166+significant_coeff_flag_offset[cat]+last] ) ) { |
4301 nz[last++] = 0; | 4299 last= max_coeff; |
4302 } | |
4303 else { | |
4304 nz[last++] = 1; | |
4305 coeff_count++; | |
4306 if( get_cabac( &h->cabac, &h->cabac_state[166+last_significant_coeff_flag_offset[cat]+ctx] ) ) { | |
4307 while( last < max_coeff ) { | |
4308 nz[last++] = 0; | |
4309 } | |
4310 break; | 4300 break; |
4311 } | 4301 } |
4312 } | 4302 } |
4313 } | 4303 } |
4314 if( last == max_coeff -1 ) { | 4304 if( last == max_coeff -1 ) { |
4315 nz[last++] = 1; | 4305 index[coeff_count++] = last; |
4316 coeff_count++; | |
4317 } | 4306 } |
4318 | 4307 |
4319 if( cat == 0 && coeff_count > 0 ) | 4308 if( cat == 0 && coeff_count > 0 ) |
4320 h->cbp_table[mb_xy] |= 0x100; | 4309 h->cbp_table[mb_xy] |= 0x100; |
4321 else if( cat == 1 || cat == 2 ) | 4310 else if( cat == 1 || cat == 2 ) |
4324 h->cbp_table[mb_xy] |= 0x40 << n; | 4313 h->cbp_table[mb_xy] |= 0x40 << n; |
4325 else if( cat == 4 ) | 4314 else if( cat == 4 ) |
4326 h->non_zero_count_cache[scan8[16+n]] = coeff_count; | 4315 h->non_zero_count_cache[scan8[16+n]] = coeff_count; |
4327 | 4316 |
4328 for( i = coeff_count - 1; i >= 0; i-- ) { | 4317 for( i = coeff_count - 1; i >= 0; i-- ) { |
4329 int coeff_abs_m1; | |
4330 | |
4331 int ctx = (abslevelgt1 != 0 ? 0 : FFMIN( 4, abslevel1 + 1 )) + coeff_abs_level_m1_offset[cat]; | 4318 int ctx = (abslevelgt1 != 0 ? 0 : FFMIN( 4, abslevel1 + 1 )) + coeff_abs_level_m1_offset[cat]; |
4332 | 4319 |
4333 if( get_cabac( &h->cabac, &h->cabac_state[227+ctx] ) == 0 ) { | 4320 if( get_cabac( &h->cabac, &h->cabac_state[ctx] ) == 0 ) { |
4334 coeff_abs_m1 = 0; | 4321 if( get_cabac_bypass( &h->cabac ) ) |
4322 coeff[i] = -1; | |
4323 else | |
4324 coeff[i] = 1; | |
4325 | |
4326 abslevel1++; | |
4335 } else { | 4327 } else { |
4336 coeff_abs_m1 = 1; | 4328 int coeff_abs = 2; |
4337 ctx = 5 + FFMIN( 4, abslevelgt1 ) + coeff_abs_level_m1_offset[cat]; | 4329 ctx = 5 + FFMIN( 4, abslevelgt1 ) + coeff_abs_level_m1_offset[cat]; |
4338 while( coeff_abs_m1 < 14 && get_cabac( &h->cabac, &h->cabac_state[227+ctx] ) ) { | 4330 while( coeff_abs < 15 && get_cabac( &h->cabac, &h->cabac_state[ctx] ) ) { |
4339 coeff_abs_m1++; | 4331 coeff_abs++; |
4340 } | 4332 } |
4341 } | 4333 |
4342 | 4334 if( coeff_abs >= 15 ) { |
4343 if( coeff_abs_m1 >= 14 ) { | 4335 int j = 0; |
4344 int j = 0; | 4336 while( get_cabac_bypass( &h->cabac ) ) { |
4345 while( get_cabac_bypass( &h->cabac ) ) { | 4337 coeff_abs += 1 << j; |
4346 coeff_abs_m1 += 1 << j; | 4338 j++; |
4347 j++; | 4339 } |
4348 } | 4340 |
4349 | 4341 while( j-- ) { |
4350 while( j-- ) { | 4342 if( get_cabac_bypass( &h->cabac ) ) |
4351 if( get_cabac_bypass( &h->cabac ) ) | 4343 coeff_abs += 1 << j ; |
4352 coeff_abs_m1 += 1 << j ; | 4344 } |
4353 } | 4345 } |
4354 } | 4346 |
4355 if( get_cabac_bypass( &h->cabac ) ) | 4347 if( get_cabac_bypass( &h->cabac ) ) |
4356 coeff[i] = -1 *( coeff_abs_m1 + 1 ); | 4348 coeff[i] = -coeff_abs; |
4357 else | 4349 else |
4358 coeff[i] = coeff_abs_m1 + 1; | 4350 coeff[i] = coeff_abs; |
4359 | 4351 |
4360 if( coeff_abs_m1 == 0 ) | |
4361 abslevel1++; | |
4362 else | |
4363 abslevelgt1++; | 4352 abslevelgt1++; |
4353 } | |
4364 } | 4354 } |
4365 | 4355 |
4366 if( cat == 0 || cat == 3 ) { /* DC */ | 4356 if( cat == 0 || cat == 3 ) { /* DC */ |
4367 int j; | 4357 for(i = 0; i < coeff_count; i++) { |
4368 for( i = 0, j = 0; j < coeff_count; i++ ) { | 4358 block[scantable[ index[i] ]] = coeff[i]; |
4369 if( nz[i] ) { | |
4370 block[scantable[i]] = coeff[j]; | |
4371 | |
4372 j++; | |
4373 } | |
4374 } | 4359 } |
4375 | 4360 |
4376 } else { /* AC */ | 4361 } else { /* AC */ |
4377 int j; | 4362 for(i = 0; i < coeff_count; i++) { |
4378 for( i = 0, j = 0; j < coeff_count; i++ ) { | 4363 int j= scantable[index[i]]; |
4379 if( nz[i] ) { | 4364 block[j] = coeff[i] * qmul[j]; |
4380 block[scantable[i]] = coeff[j] * qmul[scantable[i]]; | |
4381 | |
4382 j++; | |
4383 } | |
4384 } | 4365 } |
4385 } | 4366 } |
4386 return 0; | 4367 return 0; |
4387 } | 4368 } |
4388 | 4369 |