OSDN Git Service

genX_mfd: no need for loop filtering for skipped pictures
authorcarpalis <jerome.borsboom@carpalis.nl>
Mon, 23 Oct 2017 09:02:35 +0000 (11:02 +0200)
committerXiang, Haihao <haihao.xiang@intel.com>
Fri, 5 Jan 2018 06:57:31 +0000 (14:57 +0800)
Skipped pictures are equal to their reference frame and, therefore,
should not pass the loop filter. Although the loop filter was already
a null operation as all transform coefficients are zero for skipped
pictures, this may save some cyles in the decoder hardware.

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

index e2c3b1f..bea39e6 100644 (file)
@@ -1243,12 +1243,18 @@ gen6_mfd_vc1_decode_init(VADriverContextP ctx,
     dri_bo_unreference(gen6_mfd_context->post_deblocking_output.bo);
     gen6_mfd_context->post_deblocking_output.bo = obj_surface->bo;
     dri_bo_reference(gen6_mfd_context->post_deblocking_output.bo);
-    gen6_mfd_context->post_deblocking_output.valid = pic_param->entrypoint_fields.bits.loopfilter;
 
     dri_bo_unreference(gen6_mfd_context->pre_deblocking_output.bo);
     gen6_mfd_context->pre_deblocking_output.bo = obj_surface->bo;
     dri_bo_reference(gen6_mfd_context->pre_deblocking_output.bo);
-    gen6_mfd_context->pre_deblocking_output.valid = !pic_param->entrypoint_fields.bits.loopfilter;
+
+    if (picture_type == GEN6_VC1_SKIPPED_PICTURE) {
+        gen6_mfd_context->post_deblocking_output.valid = 0;
+        gen6_mfd_context->pre_deblocking_output.valid = 1;
+    } else {
+        gen6_mfd_context->post_deblocking_output.valid = pic_param->entrypoint_fields.bits.loopfilter;
+        gen6_mfd_context->pre_deblocking_output.valid = !pic_param->entrypoint_fields.bits.loopfilter;
+    }
 
     dri_bo_unreference(gen6_mfd_context->intra_row_store_scratch_buffer.bo);
     bo = dri_bo_alloc(i965->intel.bufmgr,
@@ -1369,6 +1375,7 @@ gen6_mfd_vc1_pic_state(VADriverContextP ctx,
     int ptype;
     int profile;
     int overlap = 0;
+    int loopfilter = 0;
 
     assert(decode_state->pic_param && decode_state->pic_param->buffer);
     pic_param = (VAPictureParameterBufferVC1 *)decode_state->pic_param->buffer;
@@ -1454,8 +1461,10 @@ gen6_mfd_vc1_pic_state(VADriverContextP ctx,
 
     if (picture_type == GEN6_VC1_SKIPPED_PICTURE)
         ptype = GEN6_VC1_P_PICTURE;
-    else
+    else {
         ptype = pic_param->picture_fields.bits.picture_type;
+        loopfilter = pic_param->entrypoint_fields.bits.loopfilter;
+    }
 
     if (picture_type == GEN6_VC1_I_PICTURE || picture_type == GEN6_VC1_BI_PICTURE) /* I picture */
         trans_ac_y = pic_param->transform_fields.bits.transform_ac_codingset_idx2;
@@ -1544,7 +1553,7 @@ gen6_mfd_vc1_pic_state(VADriverContextP ctx,
                   pic_param->sequence_fields.bits.syncmarker << 31 |
                   1 << 29 | /* concealment */
                   alt_pq << 24 |
-                  pic_param->entrypoint_fields.bits.loopfilter << 23 |
+                  loopfilter << 23 |
                   overlap << 22 |
                   (pic_param->pic_quantizer_fields.bits.quantizer == 0) << 21 | /* implicit quantizer */
                   pic_param->pic_quantizer_fields.bits.pic_quantizer_scale << 16 |
index 896a615..418cb60 100644 (file)
@@ -1567,12 +1567,18 @@ gen75_mfd_vc1_decode_init(VADriverContextP ctx,
     dri_bo_unreference(gen7_mfd_context->post_deblocking_output.bo);
     gen7_mfd_context->post_deblocking_output.bo = obj_surface->bo;
     dri_bo_reference(gen7_mfd_context->post_deblocking_output.bo);
-    gen7_mfd_context->post_deblocking_output.valid = pic_param->entrypoint_fields.bits.loopfilter;
 
     dri_bo_unreference(gen7_mfd_context->pre_deblocking_output.bo);
     gen7_mfd_context->pre_deblocking_output.bo = obj_surface->bo;
     dri_bo_reference(gen7_mfd_context->pre_deblocking_output.bo);
-    gen7_mfd_context->pre_deblocking_output.valid = !pic_param->entrypoint_fields.bits.loopfilter;
+
+    if (picture_type == GEN7_VC1_SKIPPED_PICTURE) {
+        gen7_mfd_context->post_deblocking_output.valid = 0;
+        gen7_mfd_context->pre_deblocking_output.valid = 1;
+    } else {
+        gen7_mfd_context->post_deblocking_output.valid = pic_param->entrypoint_fields.bits.loopfilter;
+        gen7_mfd_context->pre_deblocking_output.valid = !pic_param->entrypoint_fields.bits.loopfilter;
+    }
 
     dri_bo_unreference(gen7_mfd_context->intra_row_store_scratch_buffer.bo);
     bo = dri_bo_alloc(i965->intel.bufmgr,
@@ -1694,6 +1700,7 @@ gen75_mfd_vc1_pic_state(VADriverContextP ctx,
     int profile;
     int overlap = 0;
     int interpolation_mode = 0;
+    int loopfilter = 0;
 
     assert(decode_state->pic_param && decode_state->pic_param->buffer);
     pic_param = (VAPictureParameterBufferVC1 *)decode_state->pic_param->buffer;
@@ -1779,8 +1786,10 @@ gen75_mfd_vc1_pic_state(VADriverContextP ctx,
 
     if (picture_type == GEN7_VC1_SKIPPED_PICTURE)
         ptype = GEN7_VC1_P_PICTURE;
-    else
+    else {
         ptype = pic_param->picture_fields.bits.picture_type;
+        loopfilter = pic_param->entrypoint_fields.bits.loopfilter;
+    }
 
     if (picture_type == GEN7_VC1_I_PICTURE || picture_type == GEN7_VC1_BI_PICTURE) /* I picture */
         trans_ac_y = pic_param->transform_fields.bits.transform_ac_codingset_idx2;
@@ -1886,7 +1895,7 @@ gen75_mfd_vc1_pic_state(VADriverContextP ctx,
                   interpolation_mode << 8 |
                   0 << 7 | /* FIXME: scale up or down ??? */
                   pic_param->range_reduction_frame << 6 |
-                  pic_param->entrypoint_fields.bits.loopfilter << 5 |
+                  loopfilter << 5 |
                   overlap << 4 |
                   !pic_param->picture_fields.bits.is_first_field << 3 |
                   (pic_param->sequence_fields.bits.profile == 3) << 0);
index cb23379..61bab22 100644 (file)
@@ -1302,12 +1302,18 @@ gen7_mfd_vc1_decode_init(VADriverContextP ctx,
     dri_bo_unreference(gen7_mfd_context->post_deblocking_output.bo);
     gen7_mfd_context->post_deblocking_output.bo = obj_surface->bo;
     dri_bo_reference(gen7_mfd_context->post_deblocking_output.bo);
-    gen7_mfd_context->post_deblocking_output.valid = pic_param->entrypoint_fields.bits.loopfilter;
 
     dri_bo_unreference(gen7_mfd_context->pre_deblocking_output.bo);
     gen7_mfd_context->pre_deblocking_output.bo = obj_surface->bo;
     dri_bo_reference(gen7_mfd_context->pre_deblocking_output.bo);
-    gen7_mfd_context->pre_deblocking_output.valid = !pic_param->entrypoint_fields.bits.loopfilter;
+
+    if (picture_type == GEN7_VC1_SKIPPED_PICTURE) {
+        gen7_mfd_context->post_deblocking_output.valid = 0;
+        gen7_mfd_context->pre_deblocking_output.valid = 1;
+    } else {
+        gen7_mfd_context->post_deblocking_output.valid = pic_param->entrypoint_fields.bits.loopfilter;
+        gen7_mfd_context->pre_deblocking_output.valid = !pic_param->entrypoint_fields.bits.loopfilter;
+    }
 
     dri_bo_unreference(gen7_mfd_context->intra_row_store_scratch_buffer.bo);
     bo = dri_bo_alloc(i965->intel.bufmgr,
@@ -1429,6 +1435,7 @@ gen7_mfd_vc1_pic_state(VADriverContextP ctx,
     int profile;
     int overlap = 0;
     int interpolation_mode = 0;
+    int loopfilter = 0;
 
     assert(decode_state->pic_param && decode_state->pic_param->buffer);
     pic_param = (VAPictureParameterBufferVC1 *)decode_state->pic_param->buffer;
@@ -1514,8 +1521,10 @@ gen7_mfd_vc1_pic_state(VADriverContextP ctx,
 
     if (picture_type == GEN7_VC1_SKIPPED_PICTURE)
         ptype = GEN7_VC1_P_PICTURE;
-    else
+    else {
         ptype = pic_param->picture_fields.bits.picture_type;
+        loopfilter = pic_param->entrypoint_fields.bits.loopfilter;
+    }
 
     if (picture_type == GEN7_VC1_I_PICTURE || picture_type == GEN7_VC1_BI_PICTURE) /* I picture */
         trans_ac_y = pic_param->transform_fields.bits.transform_ac_codingset_idx2;
@@ -1621,7 +1630,7 @@ gen7_mfd_vc1_pic_state(VADriverContextP ctx,
                   interpolation_mode << 8 |
                   0 << 7 | /* FIXME: scale up or down ??? */
                   pic_param->range_reduction_frame << 6 |
-                  pic_param->entrypoint_fields.bits.loopfilter << 5 |
+                  loopfilter << 5 |
                   overlap << 4 |
                   !pic_param->picture_fields.bits.is_first_field << 3 |
                   (pic_param->sequence_fields.bits.profile == 3) << 0);
index 5dcccb7..d5c76a1 100644 (file)
@@ -1346,12 +1346,18 @@ gen8_mfd_vc1_decode_init(VADriverContextP ctx,
     dri_bo_unreference(gen7_mfd_context->post_deblocking_output.bo);
     gen7_mfd_context->post_deblocking_output.bo = obj_surface->bo;
     dri_bo_reference(gen7_mfd_context->post_deblocking_output.bo);
-    gen7_mfd_context->post_deblocking_output.valid = pic_param->entrypoint_fields.bits.loopfilter;
 
     dri_bo_unreference(gen7_mfd_context->pre_deblocking_output.bo);
     gen7_mfd_context->pre_deblocking_output.bo = obj_surface->bo;
     dri_bo_reference(gen7_mfd_context->pre_deblocking_output.bo);
-    gen7_mfd_context->pre_deblocking_output.valid = !pic_param->entrypoint_fields.bits.loopfilter;
+
+    if (picture_type == GEN7_VC1_SKIPPED_PICTURE) {
+        gen7_mfd_context->post_deblocking_output.valid = 0;
+        gen7_mfd_context->pre_deblocking_output.valid = 1;
+    } else {
+        gen7_mfd_context->post_deblocking_output.valid = pic_param->entrypoint_fields.bits.loopfilter;
+        gen7_mfd_context->pre_deblocking_output.valid = !pic_param->entrypoint_fields.bits.loopfilter;
+    }
 
     dri_bo_unreference(gen7_mfd_context->intra_row_store_scratch_buffer.bo);
     bo = dri_bo_alloc(i965->intel.bufmgr,
@@ -1473,6 +1479,7 @@ gen8_mfd_vc1_pic_state(VADriverContextP ctx,
     int profile;
     int overlap = 0;
     int interpolation_mode = 0;
+    int loopfilter = 0;
 
     assert(decode_state->pic_param && decode_state->pic_param->buffer);
     pic_param = (VAPictureParameterBufferVC1 *)decode_state->pic_param->buffer;
@@ -1558,8 +1565,10 @@ gen8_mfd_vc1_pic_state(VADriverContextP ctx,
 
     if (picture_type == GEN7_VC1_SKIPPED_PICTURE)
         ptype = GEN7_VC1_P_PICTURE;
-    else
+    else {
         ptype = pic_param->picture_fields.bits.picture_type;
+        loopfilter = pic_param->entrypoint_fields.bits.loopfilter;
+    }
 
     if (picture_type == GEN7_VC1_I_PICTURE || picture_type == GEN7_VC1_BI_PICTURE) /* I picture */
         trans_ac_y = pic_param->transform_fields.bits.transform_ac_codingset_idx2;
@@ -1665,7 +1674,7 @@ gen8_mfd_vc1_pic_state(VADriverContextP ctx,
                   interpolation_mode << 8 |
                   0 << 7 | /* FIXME: scale up or down ??? */
                   pic_param->range_reduction_frame << 6 |
-                  pic_param->entrypoint_fields.bits.loopfilter << 5 |
+                  loopfilter << 5 |
                   overlap << 4 |
                   !pic_param->picture_fields.bits.is_first_field << 3 |
                   (pic_param->sequence_fields.bits.profile == 3) << 0);