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