OSDN Git Service

genX_mfd: ignore FASTUVMC for interlace frame P and B pictures
authorcarpalis <jerome.borsboom@carpalis.nl>
Thu, 29 Mar 2018 07:37:44 +0000 (09:37 +0200)
committerXiang, Haihao <haihao.xiang@intel.com>
Fri, 20 Apr 2018 08:22:52 +0000 (16:22 +0800)
Interlace frame P and B pictures should ignore the FASTUVMC syntax element, as
stated in section 10.7.3.7 of VC-1 spec. Furthermore, prevent using the MVMODE
syntax element for interlace frame P and B pictures, as these picture types do
not include MVMODE or MVMODE2.

Signed-off-by: Jerome Borsboom <jerome.borsboom@carpalis.nl>
src/gen75_mfd.c
src/gen7_mfd.c
src/gen8_mfd.c

index aa3aa4c..bd461a8 100644 (file)
@@ -2140,12 +2140,17 @@ gen75_mfd_vc1_pic_state(VADriverContextP ctx,
         }
     }
 
-    if (pic_param->mv_fields.bits.mv_mode == VAMvMode1MvHalfPelBilinear ||
-        (pic_param->mv_fields.bits.mv_mode == VAMvModeIntensityCompensation &&
-         pic_param->mv_fields.bits.mv_mode2 == VAMvMode1MvHalfPelBilinear))
-        interpolation_mode = 8 | pic_param->fast_uvmc_flag;
-    else
-        interpolation_mode = 0 | pic_param->fast_uvmc_flag;
+    if ((!pic_param->sequence_fields.bits.interlace ||
+         pic_param->picture_fields.bits.frame_coding_mode != 1) && /* Progressive or Field-Interlace */
+        (picture_type == GEN7_VC1_P_PICTURE ||
+         picture_type == GEN7_VC1_B_PICTURE)) {
+        if (pic_param->mv_fields.bits.mv_mode == VAMvMode1MvHalfPelBilinear ||
+            (pic_param->mv_fields.bits.mv_mode == VAMvModeIntensityCompensation &&
+             pic_param->mv_fields.bits.mv_mode2 == VAMvMode1MvHalfPelBilinear))
+            interpolation_mode = 8 | pic_param->fast_uvmc_flag;
+        else
+            interpolation_mode = 0 | pic_param->fast_uvmc_flag;
+    }
 
     BEGIN_BCS_BATCH(batch, 6);
     OUT_BCS_BATCH(batch, MFD_VC1_LONG_PIC_STATE | (6 - 2));
index 48b0c26..facdee5 100644 (file)
@@ -1874,12 +1874,17 @@ gen7_mfd_vc1_pic_state(VADriverContextP ctx,
         }
     }
 
-    if (pic_param->mv_fields.bits.mv_mode == VAMvMode1MvHalfPelBilinear ||
-        (pic_param->mv_fields.bits.mv_mode == VAMvModeIntensityCompensation &&
-         pic_param->mv_fields.bits.mv_mode2 == VAMvMode1MvHalfPelBilinear))
-        interpolation_mode = 8 | pic_param->fast_uvmc_flag;
-    else
-        interpolation_mode = 0 | pic_param->fast_uvmc_flag;
+    if ((!pic_param->sequence_fields.bits.interlace ||
+         pic_param->picture_fields.bits.frame_coding_mode != 1) && /* Progressive or Field-Interlace */
+        (picture_type == GEN7_VC1_P_PICTURE ||
+         picture_type == GEN7_VC1_B_PICTURE)) {
+        if (pic_param->mv_fields.bits.mv_mode == VAMvMode1MvHalfPelBilinear ||
+            (pic_param->mv_fields.bits.mv_mode == VAMvModeIntensityCompensation &&
+             pic_param->mv_fields.bits.mv_mode2 == VAMvMode1MvHalfPelBilinear))
+            interpolation_mode = 8 | pic_param->fast_uvmc_flag;
+        else
+            interpolation_mode = 0 | pic_param->fast_uvmc_flag;
+    }
 
     BEGIN_BCS_BATCH(batch, 6);
     OUT_BCS_BATCH(batch, MFD_VC1_LONG_PIC_STATE | (6 - 2));
index 2bc97cf..c9c0698 100644 (file)
@@ -1919,12 +1919,17 @@ gen8_mfd_vc1_pic_state(VADriverContextP ctx,
         }
     }
 
-    if (pic_param->mv_fields.bits.mv_mode == VAMvMode1MvHalfPelBilinear ||
-        (pic_param->mv_fields.bits.mv_mode == VAMvModeIntensityCompensation &&
-         pic_param->mv_fields.bits.mv_mode2 == VAMvMode1MvHalfPelBilinear))
-        interpolation_mode = 8 | pic_param->fast_uvmc_flag;
-    else
-        interpolation_mode = 0 | pic_param->fast_uvmc_flag;
+    if ((!pic_param->sequence_fields.bits.interlace ||
+         pic_param->picture_fields.bits.frame_coding_mode != 1) && /* Progressive or Field-Interlace */
+        (picture_type == GEN7_VC1_P_PICTURE ||
+         picture_type == GEN7_VC1_B_PICTURE)) {
+        if (pic_param->mv_fields.bits.mv_mode == VAMvMode1MvHalfPelBilinear ||
+            (pic_param->mv_fields.bits.mv_mode == VAMvModeIntensityCompensation &&
+             pic_param->mv_fields.bits.mv_mode2 == VAMvMode1MvHalfPelBilinear))
+            interpolation_mode = 8 | pic_param->fast_uvmc_flag;
+        else
+            interpolation_mode = 0 | pic_param->fast_uvmc_flag;
+    }
 
     BEGIN_BCS_BATCH(batch, 6);
     OUT_BCS_BATCH(batch, MFD_VC1_LONG_PIC_STATE | (6 - 2));