| @@ -426,6 +426,9 @@ int ff_h264_alloc_tables(H264Context *h) | |||||
| 16 * row_mb_num * sizeof(uint8_t), fail); | 16 * row_mb_num * sizeof(uint8_t), fail); | ||||
| FF_ALLOCZ_OR_GOTO(h->avctx, h->mvd_table[1], | FF_ALLOCZ_OR_GOTO(h->avctx, h->mvd_table[1], | ||||
| 16 * row_mb_num * sizeof(uint8_t), fail); | 16 * row_mb_num * sizeof(uint8_t), fail); | ||||
| h->slice_ctx[0].mvd_table[0] = h->mvd_table[0]; | |||||
| h->slice_ctx[0].mvd_table[1] = h->mvd_table[1]; | |||||
| FF_ALLOCZ_OR_GOTO(h->avctx, h->direct_table, | FF_ALLOCZ_OR_GOTO(h->avctx, h->direct_table, | ||||
| 4 * big_mb_num * sizeof(uint8_t), fail); | 4 * big_mb_num * sizeof(uint8_t), fail); | ||||
| FF_ALLOCZ_OR_GOTO(h->avctx, h->list_counts, | FF_ALLOCZ_OR_GOTO(h->avctx, h->list_counts, | ||||
| @@ -402,6 +402,8 @@ typedef struct H264SliceContext { | |||||
| ///< check that i is not too large or ensure that there is some unused stuff after mb | ///< check that i is not too large or ensure that there is some unused stuff after mb | ||||
| int16_t mb_padding[256 * 2]; | int16_t mb_padding[256 * 2]; | ||||
| uint8_t (*mvd_table[2])[2]; | |||||
| /** | /** | ||||
| * Cabac | * Cabac | ||||
| */ | */ | ||||
| @@ -991,7 +993,7 @@ static av_always_inline void write_back_motion_list(H264Context *h, | |||||
| AV_COPY128(mv_dst + 2 * b_stride, mv_src + 8 * 2); | AV_COPY128(mv_dst + 2 * b_stride, mv_src + 8 * 2); | ||||
| AV_COPY128(mv_dst + 3 * b_stride, mv_src + 8 * 3); | AV_COPY128(mv_dst + 3 * b_stride, mv_src + 8 * 3); | ||||
| if (CABAC(h)) { | if (CABAC(h)) { | ||||
| uint8_t (*mvd_dst)[2] = &h->mvd_table[list][FMO ? 8 * h->mb_xy | |||||
| uint8_t (*mvd_dst)[2] = &sl->mvd_table[list][FMO ? 8 * h->mb_xy | |||||
| : h->mb2br_xy[h->mb_xy]]; | : h->mb2br_xy[h->mb_xy]]; | ||||
| uint8_t(*mvd_src)[2] = &h->mvd_cache[list][scan8[0]]; | uint8_t(*mvd_src)[2] = &h->mvd_cache[list][scan8[0]]; | ||||
| if (IS_SKIP(mb_type)) { | if (IS_SKIP(mb_type)) { | ||||
| @@ -689,7 +689,7 @@ static void fill_decode_caches(H264Context *h, H264SliceContext *sl, int mb_type | |||||
| if (!(mb_type & (MB_TYPE_SKIP | MB_TYPE_DIRECT2))) { | if (!(mb_type & (MB_TYPE_SKIP | MB_TYPE_DIRECT2))) { | ||||
| uint8_t(*mvd_cache)[2] = &h->mvd_cache[list][scan8[0]]; | uint8_t(*mvd_cache)[2] = &h->mvd_cache[list][scan8[0]]; | ||||
| uint8_t(*mvd)[2] = h->mvd_table[list]; | |||||
| uint8_t(*mvd)[2] = sl->mvd_table[list]; | |||||
| ref_cache[2 + 8 * 0] = | ref_cache[2 + 8 * 0] = | ||||
| ref_cache[2 + 8 * 2] = PART_NOT_AVAILABLE; | ref_cache[2 + 8 * 2] = PART_NOT_AVAILABLE; | ||||
| AV_ZERO32(mv_cache[2 + 8 * 0]); | AV_ZERO32(mv_cache[2 + 8 * 0]); | ||||
| @@ -367,6 +367,8 @@ static void clone_tables(H264Context *dst, H264SliceContext *sl, | |||||
| H264Context *src, int i) | H264Context *src, int i) | ||||
| { | { | ||||
| sl->intra4x4_pred_mode = src->intra4x4_pred_mode + i * 8 * 2 * src->mb_stride; | sl->intra4x4_pred_mode = src->intra4x4_pred_mode + i * 8 * 2 * src->mb_stride; | ||||
| sl->mvd_table[0] = src->mvd_table[0] + i * 8 * 2 * src->mb_stride; | |||||
| sl->mvd_table[1] = src->mvd_table[1] + i * 8 * 2 * src->mb_stride; | |||||
| dst->non_zero_count = src->non_zero_count; | dst->non_zero_count = src->non_zero_count; | ||||
| dst->slice_table = src->slice_table; | dst->slice_table = src->slice_table; | ||||
| @@ -374,8 +376,6 @@ static void clone_tables(H264Context *dst, H264SliceContext *sl, | |||||
| dst->mb2b_xy = src->mb2b_xy; | dst->mb2b_xy = src->mb2b_xy; | ||||
| dst->mb2br_xy = src->mb2br_xy; | dst->mb2br_xy = src->mb2br_xy; | ||||
| dst->chroma_pred_mode_table = src->chroma_pred_mode_table; | dst->chroma_pred_mode_table = src->chroma_pred_mode_table; | ||||
| dst->mvd_table[0] = src->mvd_table[0] + i * 8 * 2 * src->mb_stride; | |||||
| dst->mvd_table[1] = src->mvd_table[1] + i * 8 * 2 * src->mb_stride; | |||||
| dst->direct_table = src->direct_table; | dst->direct_table = src->direct_table; | ||||
| dst->list_counts = src->list_counts; | dst->list_counts = src->list_counts; | ||||
| dst->DPB = src->DPB; | dst->DPB = src->DPB; | ||||