Mercurial > libavcodec.hg
comparison h264.c @ 11558:44c5c540722c libavcodec
Fix implicit weight for b frames in mbaff.
author | michael |
---|---|
date | Tue, 30 Mar 2010 21:05:11 +0000 |
parents | e603f624b03f |
children | 8a4984c5cacc |
comparison
equal
deleted
inserted
replaced
11557:53822d92c3f7 | 11558:44c5c540722c |
---|---|
486 mc_dir_part(h, &h->ref_list[1][refn1], n, square, chroma_height, delta, 1, | 486 mc_dir_part(h, &h->ref_list[1][refn1], n, square, chroma_height, delta, 1, |
487 tmp_y, tmp_cb, tmp_cr, | 487 tmp_y, tmp_cb, tmp_cr, |
488 x_offset, y_offset, qpix_put, chroma_put); | 488 x_offset, y_offset, qpix_put, chroma_put); |
489 | 489 |
490 if(h->use_weight == 2){ | 490 if(h->use_weight == 2){ |
491 int weight0 = h->implicit_weight[refn0][refn1]; | 491 int weight0 = h->implicit_weight[refn0][refn1][s->mb_y&1]; |
492 int weight1 = 64 - weight0; | 492 int weight1 = 64 - weight0; |
493 luma_weight_avg( dest_y, tmp_y, h-> mb_linesize, 5, weight0, weight1, 0); | 493 luma_weight_avg( dest_y, tmp_y, h-> mb_linesize, 5, weight0, weight1, 0); |
494 chroma_weight_avg(dest_cb, tmp_cb, h->mb_uvlinesize, 5, weight0, weight1, 0); | 494 chroma_weight_avg(dest_cb, tmp_cb, h->mb_uvlinesize, 5, weight0, weight1, 0); |
495 chroma_weight_avg(dest_cr, tmp_cr, h->mb_uvlinesize, 5, weight0, weight1, 0); | 495 chroma_weight_avg(dest_cr, tmp_cr, h->mb_uvlinesize, 5, weight0, weight1, 0); |
496 }else{ | 496 }else{ |
529 qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_put, | 529 qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_put, |
530 qpel_mc_func *qpix_avg, h264_chroma_mc_func chroma_avg, | 530 qpel_mc_func *qpix_avg, h264_chroma_mc_func chroma_avg, |
531 h264_weight_func *weight_op, h264_biweight_func *weight_avg, | 531 h264_weight_func *weight_op, h264_biweight_func *weight_avg, |
532 int list0, int list1){ | 532 int list0, int list1){ |
533 if((h->use_weight==2 && list0 && list1 | 533 if((h->use_weight==2 && list0 && list1 |
534 && (h->implicit_weight[ h->ref_cache[0][scan8[n]] ][ h->ref_cache[1][scan8[n]] ] != 32)) | 534 && (h->implicit_weight[ h->ref_cache[0][scan8[n]] ][ h->ref_cache[1][scan8[n]] ][h->s.mb_y&1] != 32)) |
535 || h->use_weight==1) | 535 || h->use_weight==1) |
536 mc_part_weighted(h, n, square, chroma_height, delta, dest_y, dest_cb, dest_cr, | 536 mc_part_weighted(h, n, square, chroma_height, delta, dest_y, dest_cb, dest_cr, |
537 x_offset, y_offset, qpix_put, chroma_put, | 537 x_offset, y_offset, qpix_put, chroma_put, |
538 weight_op[0], weight_op[3], weight_avg[0], weight_avg[3], list0, list1); | 538 weight_op[0], weight_op[3], weight_avg[0], weight_avg[3], list0, list1); |
539 else | 539 else |
1406 } | 1406 } |
1407 h->use_weight= h->use_weight || h->use_weight_chroma; | 1407 h->use_weight= h->use_weight || h->use_weight_chroma; |
1408 return 0; | 1408 return 0; |
1409 } | 1409 } |
1410 | 1410 |
1411 static void implicit_weight_table(H264Context *h){ | 1411 /** |
1412 * Initialize implicit_weight table. | |
1413 * @param field, 0/1 initialize the weight for interlaced MBAFF | |
1414 * -1 initializes the rest | |
1415 */ | |
1416 static void implicit_weight_table(H264Context *h, int field){ | |
1412 MpegEncContext * const s = &h->s; | 1417 MpegEncContext * const s = &h->s; |
1413 int ref0, ref1, i; | 1418 int ref0, ref1, i, cur_poc, ref_start, ref_count0, ref_count1; |
1414 int cur_poc = s->current_picture_ptr->poc; | |
1415 | 1419 |
1416 for (i = 0; i < 2; i++) { | 1420 for (i = 0; i < 2; i++) { |
1417 h->luma_weight_flag[i] = 0; | 1421 h->luma_weight_flag[i] = 0; |
1418 h->chroma_weight_flag[i] = 0; | 1422 h->chroma_weight_flag[i] = 0; |
1419 } | 1423 } |
1420 | 1424 |
1421 if( h->ref_count[0] == 1 && h->ref_count[1] == 1 | 1425 if(field < 0){ |
1426 cur_poc = s->current_picture_ptr->poc; | |
1427 if( h->ref_count[0] == 1 && h->ref_count[1] == 1 && !FRAME_MBAFF | |
1422 && h->ref_list[0][0].poc + h->ref_list[1][0].poc == 2*cur_poc){ | 1428 && h->ref_list[0][0].poc + h->ref_list[1][0].poc == 2*cur_poc){ |
1423 h->use_weight= 0; | 1429 h->use_weight= 0; |
1424 h->use_weight_chroma= 0; | 1430 h->use_weight_chroma= 0; |
1425 return; | 1431 return; |
1426 } | 1432 } |
1433 ref_start= 0; | |
1434 ref_count0= h->ref_count[0]; | |
1435 ref_count1= h->ref_count[1]; | |
1436 }else{ | |
1437 cur_poc = s->current_picture_ptr->field_poc[field]; | |
1438 ref_start= 16; | |
1439 ref_count0= 16+2*h->ref_count[0]; | |
1440 ref_count1= 16+2*h->ref_count[1]; | |
1441 } | |
1427 | 1442 |
1428 h->use_weight= 2; | 1443 h->use_weight= 2; |
1429 h->use_weight_chroma= 2; | 1444 h->use_weight_chroma= 2; |
1430 h->luma_log2_weight_denom= 5; | 1445 h->luma_log2_weight_denom= 5; |
1431 h->chroma_log2_weight_denom= 5; | 1446 h->chroma_log2_weight_denom= 5; |
1432 | 1447 |
1433 for(ref0=0; ref0 < h->ref_count[0]; ref0++){ | 1448 for(ref0=ref_start; ref0 < ref_count0; ref0++){ |
1434 int poc0 = h->ref_list[0][ref0].poc; | 1449 int poc0 = h->ref_list[0][ref0].poc; |
1435 for(ref1=0; ref1 < h->ref_count[1]; ref1++){ | 1450 for(ref1=ref_start; ref1 < ref_count1; ref1++){ |
1436 int poc1 = h->ref_list[1][ref1].poc; | 1451 int poc1 = h->ref_list[1][ref1].poc; |
1437 int td = av_clip(poc1 - poc0, -128, 127); | 1452 int td = av_clip(poc1 - poc0, -128, 127); |
1438 h->implicit_weight[ref0][ref1] = 32; | 1453 int w= 32; |
1439 if(td){ | 1454 if(td){ |
1440 int tb = av_clip(cur_poc - poc0, -128, 127); | 1455 int tb = av_clip(cur_poc - poc0, -128, 127); |
1441 int tx = (16384 + (FFABS(td) >> 1)) / td; | 1456 int tx = (16384 + (FFABS(td) >> 1)) / td; |
1442 int dist_scale_factor = (tb*tx + 32) >> 8; | 1457 int dist_scale_factor = (tb*tx + 32) >> 8; |
1443 if(dist_scale_factor >= -64 && dist_scale_factor <= 128) | 1458 if(dist_scale_factor >= -64 && dist_scale_factor <= 128) |
1444 h->implicit_weight[ref0][ref1] = 64 - dist_scale_factor; | 1459 w = 64 - dist_scale_factor; |
1460 } | |
1461 if(field<0){ | |
1462 h->implicit_weight[ref0][ref1][0]= | |
1463 h->implicit_weight[ref0][ref1][1]= w; | |
1464 }else{ | |
1465 h->implicit_weight[ref0][ref1][field]=w; | |
1445 } | 1466 } |
1446 } | 1467 } |
1447 } | 1468 } |
1448 } | 1469 } |
1449 | 1470 |
2003 | 2024 |
2004 if( (h->pps.weighted_pred && h->slice_type_nos == FF_P_TYPE ) | 2025 if( (h->pps.weighted_pred && h->slice_type_nos == FF_P_TYPE ) |
2005 || (h->pps.weighted_bipred_idc==1 && h->slice_type_nos== FF_B_TYPE ) ) | 2026 || (h->pps.weighted_bipred_idc==1 && h->slice_type_nos== FF_B_TYPE ) ) |
2006 pred_weight_table(h); | 2027 pred_weight_table(h); |
2007 else if(h->pps.weighted_bipred_idc==2 && h->slice_type_nos== FF_B_TYPE){ | 2028 else if(h->pps.weighted_bipred_idc==2 && h->slice_type_nos== FF_B_TYPE){ |
2008 implicit_weight_table(h); | 2029 implicit_weight_table(h, -1); |
2009 }else { | 2030 }else { |
2010 h->use_weight = 0; | 2031 h->use_weight = 0; |
2011 for (i = 0; i < 2; i++) { | 2032 for (i = 0; i < 2; i++) { |
2012 h->luma_weight_flag[i] = 0; | 2033 h->luma_weight_flag[i] = 0; |
2013 h->chroma_weight_flag[i] = 0; | 2034 h->chroma_weight_flag[i] = 0; |
2015 } | 2036 } |
2016 | 2037 |
2017 if(h->nal_ref_idc) | 2038 if(h->nal_ref_idc) |
2018 ff_h264_decode_ref_pic_marking(h0, &s->gb); | 2039 ff_h264_decode_ref_pic_marking(h0, &s->gb); |
2019 | 2040 |
2020 if(FRAME_MBAFF) | 2041 if(FRAME_MBAFF){ |
2021 ff_h264_fill_mbaff_ref_list(h); | 2042 ff_h264_fill_mbaff_ref_list(h); |
2043 | |
2044 if(h->pps.weighted_bipred_idc==2 && h->slice_type_nos== FF_B_TYPE){ | |
2045 implicit_weight_table(h, 0); | |
2046 implicit_weight_table(h, 1); | |
2047 } | |
2048 } | |
2022 | 2049 |
2023 if(h->slice_type_nos==FF_B_TYPE && !h->direct_spatial_mv_pred) | 2050 if(h->slice_type_nos==FF_B_TYPE && !h->direct_spatial_mv_pred) |
2024 ff_h264_direct_dist_scale_factor(h); | 2051 ff_h264_direct_dist_scale_factor(h); |
2025 ff_h264_direct_ref_list_init(h); | 2052 ff_h264_direct_ref_list_init(h); |
2026 | 2053 |