]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/hevc_mvs.c
avcodec/mpeg12dec: fix support for interlaced mpeg2 with missing last slice
[ffmpeg] / libavcodec / hevc_mvs.c
index 5c777df79596227653243268345ac1a35f0e99c9..1d4c002a1c452bce9c3d6f9da25a2bd46992b594 100644 (file)
@@ -60,7 +60,7 @@ void ff_hevc_set_neighbour_available(HEVCContext *s, int x0, int y0,
 /*
  * 6.4.1 Derivation process for z-scan order block availability
  */
-static int z_scan_block_avail(HEVCContext *s, int xCurr, int yCurr,
+static av_always_inline int z_scan_block_avail(HEVCContext *s, int xCurr, int yCurr,
                               int xN, int yN)
 {
 #define MIN_TB_ADDR_ZS(x, y)                                            \
@@ -82,7 +82,7 @@ static int z_scan_block_avail(HEVCContext *s, int xCurr, int yCurr,
 }
 
 //check if the two luma locations belong to the same mostion estimation region
-static int isDiffMER(HEVCContext *s, int xN, int yN, int xP, int yP)
+static av_always_inline int is_diff_mer(HEVCContext *s, int xN, int yN, int xP, int yP)
 {
     uint8_t plevel = s->pps->log2_parallel_merge_level;
 
@@ -94,7 +94,7 @@ static int isDiffMER(HEVCContext *s, int xN, int yN, int xP, int yP)
 #define MATCH(x) (A.x == B.x)
 
 // check if the mv's and refidx are the same between A and B
-static int compareMVrefidx(struct MvField A, struct MvField B)
+static av_always_inline int compare_mv_ref_idx(struct MvField A, struct MvField B)
 {
     int a_pf = A.pred_flag;
     int b_pf = B.pred_flag;
@@ -237,14 +237,14 @@ static int temporal_luma_motion_vector(HEVCContext *s, int x0, int y0,
     x = x0 + nPbW;
     y = y0 + nPbH;
 
-    if (s->threads_type == FF_THREAD_FRAME )
-        ff_thread_await_progress(&ref->tf, y, 0);
     if (tab_mvf &&
         (y0 >> s->sps->log2_ctb_size) == (y >> s->sps->log2_ctb_size) &&
         y < s->sps->height &&
         x < s->sps->width) {
         x                 &= -16;
         y                 &= -16;
+        if (s->threads_type == FF_THREAD_FRAME)
+            ff_thread_await_progress(&ref->tf, y, 0);
         x_pu               = x >> s->sps->log2_min_pu_size;
         y_pu               = y >> s->sps->log2_min_pu_size;
         temp_col           = TAB_MVF(x_pu, y_pu);
@@ -257,6 +257,8 @@ static int temporal_luma_motion_vector(HEVCContext *s, int x0, int y0,
         y                  = y0 + (nPbH >> 1);
         x                 &= -16;
         y                 &= -16;
+        if (s->threads_type == FF_THREAD_FRAME)
+            ff_thread_await_progress(&ref->tf, y, 0);
         x_pu               = x >> s->sps->log2_min_pu_size;
         y_pu               = y >> s->sps->log2_min_pu_size;
         temp_col           = TAB_MVF(x_pu, y_pu);
@@ -272,7 +274,7 @@ static int temporal_luma_motion_vector(HEVCContext *s, int x0, int y0,
     z_scan_block_avail(s, x0, y0, x ## v, y ## v)
 
 #define COMPARE_MV_REFIDX(a, b)                                 \
-    compareMVrefidx(TAB_MVF_PU(a), TAB_MVF_PU(b))
+    compare_mv_ref_idx(TAB_MVF_PU(a), TAB_MVF_PU(b))
 
 /*
  * 8.5.3.1.2  Derivation process for spatial merging candidates
@@ -330,7 +332,7 @@ static void derive_spatial_merge_candidates(HEVCContext *s, int x0, int y0,
         (lc->cu.part_mode == PART_Nx2N ||
          lc->cu.part_mode == PART_nLx2N ||
          lc->cu.part_mode == PART_nRx2N) ||
-        isDiffMER(s, xA1, yA1, x0, y0)) {
+        is_diff_mer(s, xA1, yA1, x0, y0)) {
         is_available_a1 = 0;
     } else {
         is_available_a1 = AVAILABLE(cand_left, A1);
@@ -345,7 +347,7 @@ static void derive_spatial_merge_candidates(HEVCContext *s, int x0, int y0,
         (lc->cu.part_mode == PART_2NxN ||
          lc->cu.part_mode == PART_2NxnU ||
          lc->cu.part_mode == PART_2NxnD) ||
-        isDiffMER(s, xB1, yB1, x0, y0)) {
+        is_diff_mer(s, xB1, yB1, x0, y0)) {
         is_available_b1 = 0;
     } else {
         is_available_b1 = AVAILABLE(cand_up, B1);
@@ -361,7 +363,7 @@ static void derive_spatial_merge_candidates(HEVCContext *s, int x0, int y0,
     is_available_b0 = AVAILABLE(cand_up_right, B0) &&
                       xB0 < s->sps->width &&
                       PRED_BLOCK_AVAILABLE(B0) &&
-                      !isDiffMER(s, xB0, yB0, x0, y0);
+                      !is_diff_mer(s, xB0, yB0, x0, y0);
 
     if (is_available_b0 &&
         !(is_available_b1 && COMPARE_MV_REFIDX(B0, B1))) {
@@ -374,7 +376,7 @@ static void derive_spatial_merge_candidates(HEVCContext *s, int x0, int y0,
     is_available_a0 = AVAILABLE(cand_bottom_left, A0) &&
                       yA0 < s->sps->height &&
                       PRED_BLOCK_AVAILABLE(A0) &&
-                      !isDiffMER(s, xA0, yA0, x0, y0);
+                      !is_diff_mer(s, xA0, yA0, x0, y0);
 
     if (is_available_a0 &&
         !(is_available_a1 && COMPARE_MV_REFIDX(A0, A1))) {
@@ -385,7 +387,7 @@ static void derive_spatial_merge_candidates(HEVCContext *s, int x0, int y0,
 
     // above left spatial merge candidate
     is_available_b2 = AVAILABLE(cand_up_left, B2) &&
-                      !isDiffMER(s, xB2, yB2, x0, y0);
+                      !is_diff_mer(s, xB2, yB2, x0, y0);
 
     if (is_available_b2 &&
         !(is_available_a1 && COMPARE_MV_REFIDX(B2, A1)) &&
@@ -749,7 +751,8 @@ scalef:
         mvpcand_list[numMVPCandLX++] = mxB;
 
     //temporal motion vector prediction candidate
-    if (numMVPCandLX < 2 && s->sh.slice_temporal_mvp_enabled_flag) {
+    if (numMVPCandLX < 2 && s->sh.slice_temporal_mvp_enabled_flag &&
+        mvp_lx_flag == numMVPCandLX) {
         Mv mv_col;
         int available_col = temporal_luma_motion_vector(s, x0, y0, nPbW,
                                                         nPbH, ref_idx,