Mercurial > libavcodec.hg
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 ); |