]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/hevc.c
avcodec/mjpegdec: Fix context fields becoming inconsistent
[ffmpeg] / libavcodec / hevc.c
index ead180269d79b47376954efd450601a0f47b8892..d4dc52c9dd837eda39332ad7a989e290eed4a051 100644 (file)
@@ -1576,6 +1576,51 @@ 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);
+    mv->pred_flag = 0;
+    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 = PF_L0;
+        ff_hevc_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 {
+            ff_hevc_hls_mvd_coding(s, x0, y0, 1);
+        }
+
+        mv->pred_flag += PF_L1;
+        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, int idx)
@@ -1599,7 +1644,6 @@ static void hls_prediction_unit(HEVCContext *s, int x0, int y0,
     int min_cb_width     = s->sps->min_cb_width;
     int x_cb             = x0 >> log2_min_cb_size;
     int y_cb             = y0 >> log2_min_cb_size;
-    int ref_idx[2];
     int x_pu, y_pu;
     int i, j;
 
@@ -1617,49 +1661,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);
-        current_mv.pred_flag = 0;
-        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 = PF_L0;
-            ff_hevc_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]) {
-                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 {
-                ff_hevc_hls_mvd_coding(s, x0, y0, 1);
-            }
-
-            current_mv.pred_flag += PF_L1;
-            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;