summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2015-01-17 22:28:46 +0100
committerAnton Khirnov <anton@khirnov.net>2015-03-21 11:27:14 +0100
commita67f8ae9a2c8529bf6a635e8ca4e3483592708b1 (patch)
tree795c7ce7355345c1163ef0bf37291e1840b46b85 /libavcodec
parent5c8280c3075dd54f26752c3a1185647578421703 (diff)
h264: move mvd_table into the per-slice context
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/h264.c3
-rw-r--r--libavcodec/h264.h4
-rw-r--r--libavcodec/h264_mvpred.h2
-rw-r--r--libavcodec/h264_slice.c4
4 files changed, 9 insertions, 4 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index 4a3ee34a63..cc3af6f039 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -426,6 +426,9 @@ int ff_h264_alloc_tables(H264Context *h)
16 * row_mb_num * sizeof(uint8_t), fail);
FF_ALLOCZ_OR_GOTO(h->avctx, h->mvd_table[1],
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,
4 * big_mb_num * sizeof(uint8_t), fail);
FF_ALLOCZ_OR_GOTO(h->avctx, h->list_counts,
diff --git a/libavcodec/h264.h b/libavcodec/h264.h
index 7ced3b58e0..cd5788a0aa 100644
--- a/libavcodec/h264.h
+++ b/libavcodec/h264.h
@@ -402,6 +402,8 @@ typedef struct H264SliceContext {
///< check that i is not too large or ensure that there is some unused stuff after mb
int16_t mb_padding[256 * 2];
+ uint8_t (*mvd_table[2])[2];
+
/**
* 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 + 3 * b_stride, mv_src + 8 * 3);
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]];
uint8_t(*mvd_src)[2] = &h->mvd_cache[list][scan8[0]];
if (IS_SKIP(mb_type)) {
diff --git a/libavcodec/h264_mvpred.h b/libavcodec/h264_mvpred.h
index 5666871f5f..9c2e1ac514 100644
--- a/libavcodec/h264_mvpred.h
+++ b/libavcodec/h264_mvpred.h
@@ -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))) {
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 * 2] = PART_NOT_AVAILABLE;
AV_ZERO32(mv_cache[2 + 8 * 0]);
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index a32882eeec..d883f6b0e8 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -367,6 +367,8 @@ static void clone_tables(H264Context *dst, H264SliceContext *sl,
H264Context *src, int i)
{
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->slice_table = src->slice_table;
@@ -374,8 +376,6 @@ static void clone_tables(H264Context *dst, H264SliceContext *sl,
dst->mb2b_xy = src->mb2b_xy;
dst->mb2br_xy = src->mb2br_xy;
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->list_counts = src->list_counts;
dst->DPB = src->DPB;