[FFmpeg-cvslog] hevc: reduce code duplication in hls_prediction_unit()

Anton Khirnov git at videolan.org
Mon Nov 17 12:00:32 CET 2014


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Sun Nov 16 08:02:18 2014 +0100| [a7b365ae191f45a0d7ed7b34033d5d0cbdd47139] | committer: Anton Khirnov

hevc: reduce code duplication in hls_prediction_unit()

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

 libavcodec/hevc.c |  117 +++++++++++++++++++++++------------------------------
 1 file changed, 51 insertions(+), 66 deletions(-)

diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c
index e4e0b4b..674d64c 100644
--- a/libavcodec/hevc.c
+++ b/libavcodec/hevc.c
@@ -1652,88 +1652,73 @@ static void hls_prediction_unit(HEVCContext *s, int x0, int y0,
     int x_pu, y_pu;
     int i, j;
 
-    if (SAMPLE_CTB(s->skip_flag, x_cb, y_cb)) {
+    int skip_flag = SAMPLE_CTB(s->skip_flag, x_cb, y_cb);
+
+    if (!skip_flag)
+        lc->pu.merge_flag = ff_hevc_merge_flag_decode(s);
+
+    if (skip_flag || lc->pu.merge_flag) {
         if (s->sh.max_num_merge_cand > 1)
             merge_idx = ff_hevc_merge_idx_decode(s);
         else
             merge_idx = 0;
 
-        ff_hevc_luma_mv_merge_mode(s, x0, y0,
-                                   1 << log2_cb_size,
-                                   1 << log2_cb_size,
-                                   log2_cb_size, partIdx,
-                                   merge_idx, &current_mv);
+        ff_hevc_luma_mv_merge_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
+                                   partIdx, merge_idx, &current_mv);
         x_pu = x0 >> s->sps->log2_min_pu_size;
         y_pu = y0 >> s->sps->log2_min_pu_size;
 
         for (j = 0; j < nPbH >> s->sps->log2_min_pu_size; j++)
             for (i = 0; i < nPbW >> s->sps->log2_min_pu_size; i++)
                 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
-    } else { /* MODE_INTER */
-        lc->pu.merge_flag = ff_hevc_merge_flag_decode(s);
-        if (lc->pu.merge_flag) {
-            if (s->sh.max_num_merge_cand > 1)
-                merge_idx = ff_hevc_merge_idx_decode(s);
-            else
-                merge_idx = 0;
-
-            ff_hevc_luma_mv_merge_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
-                                       partIdx, merge_idx, &current_mv);
-            x_pu = x0 >> s->sps->log2_min_pu_size;
-            y_pu = y0 >> s->sps->log2_min_pu_size;
-
-            for (j = 0; j < nPbH >> s->sps->log2_min_pu_size; j++)
-                for (i = 0; i < nPbW >> s->sps->log2_min_pu_size; i++)
-                    tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
-        } else {
-            enum InterPredIdc inter_pred_idc = PRED_L0;
-            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]) {
-                    ref_idx[0] = ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L0]);
-                    current_mv.ref_idx[0] = ref_idx[0];
-                }
-                current_mv.pred_flag[0] = 1;
-                hls_mvd_coding(s, x0, y0, 0);
-                mvp_flag[0] = 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], 0);
-                current_mv.mv[0].x += lc->pu.mvd.x;
-                current_mv.mv[0].y += lc->pu.mvd.y;
+    } else {
+        enum InterPredIdc inter_pred_idc = PRED_L0;
+        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]) {
+                ref_idx[0] = ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L0]);
+                current_mv.ref_idx[0] = ref_idx[0];
             }
-
-            if (inter_pred_idc != PRED_L0) {
-                if (s->sh.nb_refs[L1]) {
-                    ref_idx[1] = ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L1]);
-                    current_mv.ref_idx[1] = ref_idx[1];
-                }
-
-                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[1] = 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], 1);
-                current_mv.mv[1].x += lc->pu.mvd.x;
-                current_mv.mv[1].y += lc->pu.mvd.y;
+            current_mv.pred_flag[0] = 1;
+            hls_mvd_coding(s, x0, y0, 0);
+            mvp_flag[0] = 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], 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]) {
+                ref_idx[1] = ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L1]);
+                current_mv.ref_idx[1] = ref_idx[1];
             }
 
-            x_pu = x0 >> s->sps->log2_min_pu_size;
-            y_pu = y0 >> s->sps->log2_min_pu_size;
+            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);
+            }
 
-            for(j = 0; j < nPbH >> s->sps->log2_min_pu_size; j++)
-                for (i = 0; i < nPbW >> s->sps->log2_min_pu_size; i++)
-                    tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
+            current_mv.pred_flag[1] = 1;
+            mvp_flag[1] = 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], 1);
+            current_mv.mv[1].x += lc->pu.mvd.x;
+            current_mv.mv[1].y += lc->pu.mvd.y;
         }
+
+        x_pu = x0 >> s->sps->log2_min_pu_size;
+        y_pu = y0 >> s->sps->log2_min_pu_size;
+
+        for(j = 0; j < nPbH >> s->sps->log2_min_pu_size; j++)
+            for (i = 0; i < nPbW >> s->sps->log2_min_pu_size; i++)
+                tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
     }
 
     if (current_mv.pred_flag[0]) {



More information about the ffmpeg-cvslog mailing list