]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/hevc.c
avcodec/mjpegdec: Fix context fields becoming inconsistent
[ffmpeg] / libavcodec / hevc.c
index dda54e8f91e9cff182a89a030d9f062108fa4257..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)
@@ -1616,47 +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]) {
-                current_mv.ref_idx[0]= ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L0]);
-            }
-            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]) {
-                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 {
-                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;