aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorLuca Barbato <lu_zero@gentoo.org>2014-11-16 11:29:41 +0100
committerLuca Barbato <lu_zero@gentoo.org>2014-11-21 23:17:37 +0100
commitcd975d5658a1cbe99939df75db59d5ae9fbcb4e0 (patch)
tree379ab832cecbdf08650ab9a94f767d07d38d77ad /libavcodec
parent1f80742f49a9a4e846c9f099387881abc87150b2 (diff)
downloadffmpeg-cd975d5658a1cbe99939df75db59d5ae9fbcb4e0.tar.gz
hevc: Spin the mv_mpv_mode calls in a stand alone function
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/hevc.c86
1 files changed, 46 insertions, 40 deletions
diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c
index 3dcbe607dd..08bed86225 100644
--- a/libavcodec/hevc.c
+++ b/libavcodec/hevc.c
@@ -1621,6 +1621,50 @@ static void hevc_await_progress(HEVCContext *s, HEVCFrame *ref,
ff_thread_await_progress(&ref->tf, y, 0);
}
+static void hevc_luma_mv_mpv_mode(HEVCContext *s, int x0, int y0, int nPbW,
+ int nPbH, int log2_cb_size, int part_idx,
+ int merge_idx, MvField *mv)
+{
+ HEVCLocalContext *lc = &s->HEVClc;
+ enum InterPredIdc inter_pred_idc = PRED_L0;
+ int mvp_flag;
+
+ ff_hevc_set_neighbour_available(s, x0, y0, nPbW, nPbH);
+ if (s->sh.slice_type == B_SLICE)
+ inter_pred_idc = ff_hevc_inter_pred_idc_decode(s, nPbW, nPbH);
+
+ if (inter_pred_idc != PRED_L1) {
+ if (s->sh.nb_refs[L0])
+ mv->ref_idx[0]= ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L0]);
+
+ mv->pred_flag[0] = 1;
+ hls_mvd_coding(s, x0, y0, 0);
+ mvp_flag = ff_hevc_mvp_lx_flag_decode(s);
+ ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
+ part_idx, merge_idx, mv, mvp_flag, 0);
+ mv->mv[0].x += lc->pu.mvd.x;
+ mv->mv[0].y += lc->pu.mvd.y;
+ }
+
+ if (inter_pred_idc != PRED_L0) {
+ if (s->sh.nb_refs[L1])
+ mv->ref_idx[1]= ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L1]);
+
+ if (s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc == PRED_BI) {
+ AV_ZERO32(&lc->pu.mvd);
+ } else {
+ hls_mvd_coding(s, x0, y0, 1);
+ }
+
+ mv->pred_flag[1] = 1;
+ mvp_flag = ff_hevc_mvp_lx_flag_decode(s);
+ ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
+ part_idx, merge_idx, mv, mvp_flag, 1);
+ mv->mv[1].x += lc->pu.mvd.x;
+ mv->mv[1].y += lc->pu.mvd.y;
+ }
+}
+
static void hls_prediction_unit(HEVCContext *s, int x0, int y0,
int nPbW, int nPbH,
int log2_cb_size, int partIdx)
@@ -1664,46 +1708,8 @@ static void hls_prediction_unit(HEVCContext *s, int x0, int y0,
ff_hevc_luma_mv_merge_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
partIdx, merge_idx, &current_mv);
} else {
- enum InterPredIdc inter_pred_idc = PRED_L0;
- int mvp_flag;
-
- ff_hevc_set_neighbour_available(s, x0, y0, nPbW, nPbH);
- if (s->sh.slice_type == B_SLICE)
- inter_pred_idc = ff_hevc_inter_pred_idc_decode(s, nPbW, nPbH);
-
- if (inter_pred_idc != PRED_L1) {
- if (s->sh.nb_refs[L0]) {
- current_mv.ref_idx[0]= ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L0]);
- }
- current_mv.pred_flag[0] = 1;
- hls_mvd_coding(s, x0, y0, 0);
- mvp_flag = ff_hevc_mvp_lx_flag_decode(s);
- ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
- partIdx, merge_idx, &current_mv,
- mvp_flag, 0);
- current_mv.mv[0].x += lc->pu.mvd.x;
- current_mv.mv[0].y += lc->pu.mvd.y;
- }
-
- if (inter_pred_idc != PRED_L0) {
- if (s->sh.nb_refs[L1]) {
- current_mv.ref_idx[1]= ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L1]);
- }
-
- if (s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc == PRED_BI) {
- AV_ZERO32(&lc->pu.mvd);
- } else {
- hls_mvd_coding(s, x0, y0, 1);
- }
-
- current_mv.pred_flag[1] = 1;
- mvp_flag = ff_hevc_mvp_lx_flag_decode(s);
- ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
- partIdx, merge_idx, &current_mv,
- mvp_flag, 1);
- current_mv.mv[1].x += lc->pu.mvd.x;
- current_mv.mv[1].y += lc->pu.mvd.y;
- }
+ hevc_luma_mv_mpv_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
+ partIdx, merge_idx, &current_mv);
}
x_pu = x0 >> s->sps->log2_min_pu_size;