comparison h264.c @ 4534:a856fe4b80f0 libavcodec

factorize fill_rectangle() remove more silly ref_count checks use list_count where appropriate
author michael
date Fri, 16 Feb 2007 21:50:37 +0000
parents dca590e16c43
children d81e41071424
comparison
equal deleted inserted replaced
4533:dca590e16c43 4534:a856fe4b80f0
5326 dct8x8_allowed &= h->sps.direct_8x8_inference_flag; 5326 dct8x8_allowed &= h->sps.direct_8x8_inference_flag;
5327 }else{ 5327 }else{
5328 int list, mx, my, i; 5328 int list, mx, my, i;
5329 //FIXME we should set ref_idx_l? to 0 if we use that later ... 5329 //FIXME we should set ref_idx_l? to 0 if we use that later ...
5330 if(IS_16X16(mb_type)){ 5330 if(IS_16X16(mb_type)){
5331 for(list=0; list<2; list++){ 5331 for(list=0; list<h->list_count; list++){
5332 if(h->ref_count[list]>0){ 5332 unsigned int val;
5333 if(IS_DIR(mb_type, 0, list)){ 5333 if(IS_DIR(mb_type, 0, list)){
5334 unsigned int val= get_te0_golomb(&s->gb, h->ref_count[list]); 5334 val= get_te0_golomb(&s->gb, h->ref_count[list]);
5335 if(val >= h->ref_count[list]){ 5335 if(val >= h->ref_count[list]){
5336 av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val); 5336 av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
5337 return -1; 5337 return -1;
5338 } 5338 }
5339 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, val, 1);
5340 }else 5339 }else
5341 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, (LIST_NOT_USED&0xFF), 1); 5340 val= LIST_NOT_USED&0xFF;
5342 } 5341 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, val, 1);
5343 } 5342 }
5344 for(list=0; list<2; list++){ 5343 for(list=0; list<h->list_count; list++){
5344 unsigned int val;
5345 if(IS_DIR(mb_type, 0, list)){ 5345 if(IS_DIR(mb_type, 0, list)){
5346 pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mx, &my); 5346 pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mx, &my);
5347 mx += get_se_golomb(&s->gb); 5347 mx += get_se_golomb(&s->gb);
5348 my += get_se_golomb(&s->gb); 5348 my += get_se_golomb(&s->gb);
5349 tprintf("final mv:%d %d\n", mx, my); 5349 tprintf("final mv:%d %d\n", mx, my);
5350 5350
5351 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4); 5351 val= pack16to32(mx,my);
5352 }else 5352 }else
5353 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, 0, 4); 5353 val=0;
5354 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, val, 4);
5354 } 5355 }
5355 } 5356 }
5356 else if(IS_16X8(mb_type)){ 5357 else if(IS_16X8(mb_type)){
5357 for(list=0; list<2; list++){ 5358 for(list=0; list<h->list_count; list++){
5358 if(h->ref_count[list]>0){
5359 for(i=0; i<2; i++){ 5359 for(i=0; i<2; i++){
5360 unsigned int val;
5360 if(IS_DIR(mb_type, i, list)){ 5361 if(IS_DIR(mb_type, i, list)){
5361 unsigned int val= get_te0_golomb(&s->gb, h->ref_count[list]); 5362 val= get_te0_golomb(&s->gb, h->ref_count[list]);
5362 if(val >= h->ref_count[list]){ 5363 if(val >= h->ref_count[list]){
5363 av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val); 5364 av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
5364 return -1; 5365 return -1;
5365 } 5366 }
5366 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 1);
5367 }else 5367 }else
5368 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1); 5368 val= LIST_NOT_USED&0xFF;
5369 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 1);
5369 } 5370 }
5370 } 5371 }
5371 } 5372 for(list=0; list<h->list_count; list++){
5372 for(list=0; list<2; list++){
5373 for(i=0; i<2; i++){ 5373 for(i=0; i<2; i++){
5374 unsigned int val;
5374 if(IS_DIR(mb_type, i, list)){ 5375 if(IS_DIR(mb_type, i, list)){
5375 pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mx, &my); 5376 pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mx, &my);
5376 mx += get_se_golomb(&s->gb); 5377 mx += get_se_golomb(&s->gb);
5377 my += get_se_golomb(&s->gb); 5378 my += get_se_golomb(&s->gb);
5378 tprintf("final mv:%d %d\n", mx, my); 5379 tprintf("final mv:%d %d\n", mx, my);
5379 5380
5380 fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4); 5381 val= pack16to32(mx,my);
5381 }else 5382 }else
5382 fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4); 5383 val=0;
5384 fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 4);
5383 } 5385 }
5384 } 5386 }
5385 }else{ 5387 }else{
5386 assert(IS_8X16(mb_type)); 5388 assert(IS_8X16(mb_type));
5387 for(list=0; list<2; list++){ 5389 for(list=0; list<h->list_count; list++){
5388 if(h->ref_count[list]>0){
5389 for(i=0; i<2; i++){ 5390 for(i=0; i<2; i++){
5391 unsigned int val;
5390 if(IS_DIR(mb_type, i, list)){ //FIXME optimize 5392 if(IS_DIR(mb_type, i, list)){ //FIXME optimize
5391 unsigned int val= get_te0_golomb(&s->gb, h->ref_count[list]); 5393 val= get_te0_golomb(&s->gb, h->ref_count[list]);
5392 if(val >= h->ref_count[list]){ 5394 if(val >= h->ref_count[list]){
5393 av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val); 5395 av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
5394 return -1; 5396 return -1;
5395 } 5397 }
5396 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 1);
5397 }else 5398 }else
5398 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (LIST_NOT_USED&0xFF), 1); 5399 val= LIST_NOT_USED&0xFF;
5400 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 1);
5399 } 5401 }
5400 } 5402 }
5401 } 5403 for(list=0; list<h->list_count; list++){
5402 for(list=0; list<2; list++){
5403 for(i=0; i<2; i++){ 5404 for(i=0; i<2; i++){
5405 unsigned int val;
5404 if(IS_DIR(mb_type, i, list)){ 5406 if(IS_DIR(mb_type, i, list)){
5405 pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mx, &my); 5407 pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
5406 mx += get_se_golomb(&s->gb); 5408 mx += get_se_golomb(&s->gb);
5407 my += get_se_golomb(&s->gb); 5409 my += get_se_golomb(&s->gb);
5408 tprintf("final mv:%d %d\n", mx, my); 5410 tprintf("final mv:%d %d\n", mx, my);
5409 5411
5410 fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4); 5412 val= pack16to32(mx,my);
5411 }else 5413 }else
5412 fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4); 5414 val=0;
5415 fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 4);
5413 } 5416 }
5414 } 5417 }
5415 } 5418 }
5416 } 5419 }
5417 5420
6473 fill_rectangle(h->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 4); 6476 fill_rectangle(h->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 4);
6474 dct8x8_allowed &= h->sps.direct_8x8_inference_flag; 6477 dct8x8_allowed &= h->sps.direct_8x8_inference_flag;
6475 } else { 6478 } else {
6476 int list, mx, my, i, mpx, mpy; 6479 int list, mx, my, i, mpx, mpy;
6477 if(IS_16X16(mb_type)){ 6480 if(IS_16X16(mb_type)){
6478 for(list=0; list<2; list++){ 6481 for(list=0; list<h->list_count; list++){
6479 if(IS_DIR(mb_type, 0, list)){ 6482 if(IS_DIR(mb_type, 0, list)){
6480 if(h->ref_count[list] > 0 ){
6481 const int ref = h->ref_count[list] > 1 ? decode_cabac_mb_ref( h, list, 0 ) : 0; 6483 const int ref = h->ref_count[list] > 1 ? decode_cabac_mb_ref( h, list, 0 ) : 0;
6482 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1); 6484 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1);
6483 }
6484 }else 6485 }else
6485 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, (uint8_t)LIST_NOT_USED, 1); 6486 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, (uint8_t)LIST_NOT_USED, 1); //FIXME factorize and the other fill_rect below too
6486 } 6487 }
6487 for(list=0; list<2; list++){ 6488 for(list=0; list<h->list_count; list++){
6488 if(IS_DIR(mb_type, 0, list)){ 6489 if(IS_DIR(mb_type, 0, list)){
6489 pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mpx, &mpy); 6490 pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mpx, &mpy);
6490 6491
6491 mx = mpx + decode_cabac_mb_mvd( h, list, 0, 0 ); 6492 mx = mpx + decode_cabac_mb_mvd( h, list, 0, 0 );
6492 my = mpy + decode_cabac_mb_mvd( h, list, 0, 1 ); 6493 my = mpy + decode_cabac_mb_mvd( h, list, 0, 1 );