]> git.sesse.net Git - ffmpeg/commitdiff
hevc: Spin the mv_mpv_mode calls in a stand alone function
authorLuca Barbato <lu_zero@gentoo.org>
Sun, 16 Nov 2014 10:29:41 +0000 (11:29 +0100)
committerLuca Barbato <lu_zero@gentoo.org>
Fri, 21 Nov 2014 22:17:37 +0000 (23:17 +0100)
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
libavcodec/hevc.c

index 3dcbe607dda18f3c628b322e0c85af4ff85b194e..08bed862252599eb86989dbaba589db2e6b1cdb3 100644 (file)
@@ -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;