|
|
|
@ -126,18 +126,18 @@ void ff_h264_direct_ref_list_init(H264Context *const h, H264SliceContext *sl) |
|
|
|
|
|
|
|
|
|
cur->mbaff = FRAME_MBAFF(h); |
|
|
|
|
|
|
|
|
|
h->col_fieldoff = 0; |
|
|
|
|
sl->col_fieldoff = 0; |
|
|
|
|
if (h->picture_structure == PICT_FRAME) { |
|
|
|
|
int cur_poc = h->cur_pic_ptr->poc; |
|
|
|
|
int *col_poc = h->ref_list[1]->field_poc; |
|
|
|
|
h->col_parity = (FFABS(col_poc[0] - cur_poc) >= |
|
|
|
|
FFABS(col_poc[1] - cur_poc)); |
|
|
|
|
sl->col_parity = (FFABS(col_poc[0] - cur_poc) >= |
|
|
|
|
FFABS(col_poc[1] - cur_poc)); |
|
|
|
|
ref1sidx = |
|
|
|
|
sidx = h->col_parity; |
|
|
|
|
sidx = sl->col_parity; |
|
|
|
|
// FL -> FL & differ parity
|
|
|
|
|
} else if (!(h->picture_structure & h->ref_list[1][0].reference) && |
|
|
|
|
!h->ref_list[1][0].mbaff) { |
|
|
|
|
h->col_fieldoff = 2 * h->ref_list[1][0].reference - 3; |
|
|
|
|
sl->col_fieldoff = 2 * h->ref_list[1][0].reference - 3; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (sl->slice_type_nos != AV_PICTURE_TYPE_B || sl->direct_spatial_mv_pred) |
|
|
|
@ -259,13 +259,13 @@ static void pred_spatial_direct_motion(H264Context *const h, H264SliceContext *s |
|
|
|
|
|
|
|
|
|
if (IS_INTERLACED(h->ref_list[1][0].mb_type[mb_xy])) { // AFL/AFR/FR/FL -> AFL/FL
|
|
|
|
|
if (!IS_INTERLACED(*mb_type)) { // AFR/FR -> AFL/FL
|
|
|
|
|
mb_y = (h->mb_y & ~1) + h->col_parity; |
|
|
|
|
mb_y = (h->mb_y & ~1) + sl->col_parity; |
|
|
|
|
mb_xy = h->mb_x + |
|
|
|
|
((h->mb_y & ~1) + h->col_parity) * h->mb_stride; |
|
|
|
|
((h->mb_y & ~1) + sl->col_parity) * h->mb_stride; |
|
|
|
|
b8_stride = 0; |
|
|
|
|
} else { |
|
|
|
|
mb_y += h->col_fieldoff; |
|
|
|
|
mb_xy += h->mb_stride * h->col_fieldoff; // non-zero for FL -> FL & differ parity
|
|
|
|
|
mb_y += sl->col_fieldoff; |
|
|
|
|
mb_xy += h->mb_stride * sl->col_fieldoff; // non-zero for FL -> FL & differ parity
|
|
|
|
|
} |
|
|
|
|
goto single_col; |
|
|
|
|
} else { // AFL/AFR/FR/FL -> AFR/FR
|
|
|
|
@ -477,13 +477,13 @@ static void pred_temp_direct_motion(H264Context *const h, H264SliceContext *sl, |
|
|
|
|
|
|
|
|
|
if (IS_INTERLACED(h->ref_list[1][0].mb_type[mb_xy])) { // AFL/AFR/FR/FL -> AFL/FL
|
|
|
|
|
if (!IS_INTERLACED(*mb_type)) { // AFR/FR -> AFL/FL
|
|
|
|
|
mb_y = (h->mb_y & ~1) + h->col_parity; |
|
|
|
|
mb_y = (h->mb_y & ~1) + sl->col_parity; |
|
|
|
|
mb_xy = h->mb_x + |
|
|
|
|
((h->mb_y & ~1) + h->col_parity) * h->mb_stride; |
|
|
|
|
((h->mb_y & ~1) + sl->col_parity) * h->mb_stride; |
|
|
|
|
b8_stride = 0; |
|
|
|
|
} else { |
|
|
|
|
mb_y += h->col_fieldoff; |
|
|
|
|
mb_xy += h->mb_stride * h->col_fieldoff; // non-zero for FL -> FL & differ parity
|
|
|
|
|
mb_y += sl->col_fieldoff; |
|
|
|
|
mb_xy += h->mb_stride * sl->col_fieldoff; // non-zero for FL -> FL & differ parity
|
|
|
|
|
} |
|
|
|
|
goto single_col; |
|
|
|
|
} else { // AFL/AFR/FR/FL -> AFR/FR
|
|
|
|
|