h264: move col_{parity,fieldoff} into the per-slice context

This commit is contained in:
Anton Khirnov 2015-01-17 22:28:46 +01:00
parent 066aafced4
commit be69f0a800
2 changed files with 15 additions and 15 deletions

View File

@ -356,6 +356,8 @@ typedef struct H264SliceContext {
int neighbor_transform_size;
int direct_spatial_mv_pred;
int col_parity;
int col_fieldoff;
/**
* non zero coeff count cache.
@ -442,8 +444,6 @@ typedef struct H264Context {
int picture_structure;
int first_field;
int col_parity;
int col_fieldoff;
int dist_scale_factor[32];
int dist_scale_factor_field[2][32];
int map_col_to_list0[2][16 + 32];

View File

@ -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