diff --git a/libavcodec/h264.h b/libavcodec/h264.h index a259a97ca575d374a9630b26f5779c3d343e236d..3d8f6247133734a368fde7bb75a149c145e96073 100644 --- a/libavcodec/h264.h +++ b/libavcodec/h264.h @@ -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]; diff --git a/libavcodec/h264_direct.c b/libavcodec/h264_direct.c index cd30dd33f20f1682b560e959c82ebfd485dc5ba3..989c64a6b7511b08619972ffd9a11b90e6e4e2c7 100644 --- a/libavcodec/h264_direct.c +++ b/libavcodec/h264_direct.c @@ -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