[FFmpeg-cvslog] hevc: Spin the mv_mpv_mode calls in a stand alone function

Luca Barbato git at videolan.org
Sat Nov 22 01:53:24 CET 2014


ffmpeg | branch: master | Luca Barbato <lu_zero at gentoo.org> | Sun Nov 16 11:29:41 2014 +0100| [cd975d5658a1cbe99939df75db59d5ae9fbcb4e0] | committer: Luca Barbato

hevc: Spin the mv_mpv_mode calls in a stand alone function

Signed-off-by: Luca Barbato <lu_zero at gentoo.org>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=cd975d5658a1cbe99939df75db59d5ae9fbcb4e0
---

 libavcodec/hevc.c |   86 ++++++++++++++++++++++++++++-------------------------
 1 file changed, 46 insertions(+), 40 deletions(-)

diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c
index 3dcbe60..08bed86 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;



More information about the ffmpeg-cvslog mailing list