OSDN Git Service

genX_mfd: fix bitplane encoding for skipped pictures
authorcarpalis <jerome.borsboom@carpalis.nl>
Sat, 21 Oct 2017 14:53:16 +0000 (16:53 +0200)
committerXiang, Haihao <haihao.xiang@intel.com>
Fri, 5 Jan 2018 06:57:31 +0000 (14:57 +0800)
VC-1 skipped pictures do not encode a slice or MB layer, nor do they
encode any bitplanes. For a skipped picture, we should unconditionally
encode the bitplane buffer with only the SKIPMB bit set. Furthermore,
we optimize the static picture_type comparison out of the double loop.

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 44c9717..f0d8c99 100644 (file)
@@ -1287,7 +1287,10 @@ gen6_mfd_vc1_decode_init(VADriverContextP ctx,
 
     gen6_mfd_context->mpr_row_store_scratch_buffer.valid = 0;
 
-    gen6_mfd_context->bitplane_read_buffer.valid = !!pic_param->bitplane_present.value;
+    if (picture_type == GEN6_VC1_SKIPPED_PICTURE)
+        gen6_mfd_context->bitplane_read_buffer.valid = 1;
+    else
+        gen6_mfd_context->bitplane_read_buffer.valid = !!pic_param->bitplane_present.value;
     dri_bo_unreference(gen6_mfd_context->bitplane_read_buffer.bo);
 
     if (gen6_mfd_context->bitplane_read_buffer.valid) {
@@ -1297,9 +1300,6 @@ gen6_mfd_vc1_decode_init(VADriverContextP ctx,
         int src_w, src_h;
         uint8_t *src = NULL, *dst = NULL;
 
-        assert(decode_state->bit_plane->buffer);
-        src = decode_state->bit_plane->buffer;
-
         bo = dri_bo_alloc(i965->intel.bufmgr,
                           "VC-1 Bitplane",
                           bitplane_width * height_in_mbs,
@@ -1311,28 +1311,44 @@ gen6_mfd_vc1_decode_init(VADriverContextP ctx,
         assert(bo->virtual);
         dst = bo->virtual;
 
-        for (src_h = 0; src_h < height_in_mbs; src_h++) {
-            for (src_w = 0; src_w < width_in_mbs; src_w++) {
-                int src_index, dst_index;
-                int src_shift;
-                uint8_t src_value;
-
-                src_index = (src_h * width_in_mbs + src_w) / 2;
-                src_shift = !((src_h * width_in_mbs + src_w) & 1) * 4;
-                src_value = ((src[src_index] >> src_shift) & 0xf);
+        if (picture_type == GEN6_VC1_SKIPPED_PICTURE) {
+            for (src_h = 0; src_h < height_in_mbs; src_h++) {
+                for (src_w = 0; src_w < width_in_mbs; src_w++) {
+                    int dst_index;
+                    uint8_t src_value = 0x2;
 
-                if (picture_type == GEN6_VC1_SKIPPED_PICTURE) {
-                    src_value |= 0x2;
+                    dst_index = src_w / 2;
+                    dst[dst_index] = ((dst[dst_index] >> 4) | (src_value << 4));
                 }
 
-                dst_index = src_w / 2;
-                dst[dst_index] = ((dst[dst_index] >> 4) | (src_value << 4));
+                if (src_w & 1)
+                    dst[src_w / 2] >>= 4;
+
+                dst += bitplane_width;
             }
+        } else {
+            assert(decode_state->bit_plane->buffer);
+            src = decode_state->bit_plane->buffer;
 
-            if (src_w & 1)
-                dst[src_w / 2] >>= 4;
+            for (src_h = 0; src_h < height_in_mbs; src_h++) {
+                for (src_w = 0; src_w < width_in_mbs; src_w++) {
+                    int src_index, dst_index;
+                    int src_shift;
+                    uint8_t src_value;
 
-            dst += bitplane_width;
+                    src_index = (src_h * width_in_mbs + src_w) / 2;
+                    src_shift = !((src_h * width_in_mbs + src_w) & 1) * 4;
+                    src_value = ((src[src_index] >> src_shift) & 0xf);
+
+                    dst_index = src_w / 2;
+                    dst[dst_index] = ((dst[dst_index] >> 4) | (src_value << 4));
+                }
+
+                if (src_w & 1)
+                    dst[src_w / 2] >>= 4;
+
+                dst += bitplane_width;
+            }
         }
 
         dri_bo_unmap(bo);
index 3f31d5e..a27bf18 100644 (file)
@@ -1612,7 +1612,10 @@ gen75_mfd_vc1_decode_init(VADriverContextP ctx,
 
     gen7_mfd_context->mpr_row_store_scratch_buffer.valid = 0;
 
-    gen7_mfd_context->bitplane_read_buffer.valid = !!pic_param->bitplane_present.value;
+    if (picture_type == GEN7_VC1_SKIPPED_PICTURE)
+        gen7_mfd_context->bitplane_read_buffer.valid = 1;
+    else
+        gen7_mfd_context->bitplane_read_buffer.valid = !!pic_param->bitplane_present.value;
     dri_bo_unreference(gen7_mfd_context->bitplane_read_buffer.bo);
 
     if (gen7_mfd_context->bitplane_read_buffer.valid) {
@@ -1622,9 +1625,6 @@ gen75_mfd_vc1_decode_init(VADriverContextP ctx,
         int src_w, src_h;
         uint8_t *src = NULL, *dst = NULL;
 
-        assert(decode_state->bit_plane->buffer);
-        src = decode_state->bit_plane->buffer;
-
         bo = dri_bo_alloc(i965->intel.bufmgr,
                           "VC-1 Bitplane",
                           bitplane_width * height_in_mbs,
@@ -1636,28 +1636,44 @@ gen75_mfd_vc1_decode_init(VADriverContextP ctx,
         assert(bo->virtual);
         dst = bo->virtual;
 
-        for (src_h = 0; src_h < height_in_mbs; src_h++) {
-            for (src_w = 0; src_w < width_in_mbs; src_w++) {
-                int src_index, dst_index;
-                int src_shift;
-                uint8_t src_value;
-
-                src_index = (src_h * width_in_mbs + src_w) / 2;
-                src_shift = !((src_h * width_in_mbs + src_w) & 1) * 4;
-                src_value = ((src[src_index] >> src_shift) & 0xf);
+        if (picture_type == GEN7_VC1_SKIPPED_PICTURE) {
+            for (src_h = 0; src_h < height_in_mbs; src_h++) {
+                for (src_w = 0; src_w < width_in_mbs; src_w++) {
+                    int dst_index;
+                    uint8_t src_value = 0x2;
 
-                if (picture_type == GEN7_VC1_SKIPPED_PICTURE) {
-                    src_value |= 0x2;
+                    dst_index = src_w / 2;
+                    dst[dst_index] = ((dst[dst_index] >> 4) | (src_value << 4));
                 }
 
-                dst_index = src_w / 2;
-                dst[dst_index] = ((dst[dst_index] >> 4) | (src_value << 4));
+                if (src_w & 1)
+                    dst[src_w / 2] >>= 4;
+
+                dst += bitplane_width;
             }
+        } else {
+            assert(decode_state->bit_plane->buffer);
+            src = decode_state->bit_plane->buffer;
 
-            if (src_w & 1)
-                dst[src_w / 2] >>= 4;
+            for (src_h = 0; src_h < height_in_mbs; src_h++) {
+                for (src_w = 0; src_w < width_in_mbs; src_w++) {
+                    int src_index, dst_index;
+                    int src_shift;
+                    uint8_t src_value;
 
-            dst += bitplane_width;
+                    src_index = (src_h * width_in_mbs + src_w) / 2;
+                    src_shift = !((src_h * width_in_mbs + src_w) & 1) * 4;
+                    src_value = ((src[src_index] >> src_shift) & 0xf);
+
+                    dst_index = src_w / 2;
+                    dst[dst_index] = ((dst[dst_index] >> 4) | (src_value << 4));
+                }
+
+                if (src_w & 1)
+                    dst[src_w / 2] >>= 4;
+
+                dst += bitplane_width;
+            }
         }
 
         dri_bo_unmap(bo);
index 1bf6500..1358db6 100644 (file)
@@ -1347,7 +1347,10 @@ gen7_mfd_vc1_decode_init(VADriverContextP ctx,
 
     gen7_mfd_context->mpr_row_store_scratch_buffer.valid = 0;
 
-    gen7_mfd_context->bitplane_read_buffer.valid = !!pic_param->bitplane_present.value;
+    if (picture_type == GEN7_VC1_SKIPPED_PICTURE)
+        gen7_mfd_context->bitplane_read_buffer.valid = 1;
+    else
+        gen7_mfd_context->bitplane_read_buffer.valid = !!pic_param->bitplane_present.value;
     dri_bo_unreference(gen7_mfd_context->bitplane_read_buffer.bo);
 
     if (gen7_mfd_context->bitplane_read_buffer.valid) {
@@ -1357,9 +1360,6 @@ gen7_mfd_vc1_decode_init(VADriverContextP ctx,
         int src_w, src_h;
         uint8_t *src = NULL, *dst = NULL;
 
-        assert(decode_state->bit_plane->buffer);
-        src = decode_state->bit_plane->buffer;
-
         bo = dri_bo_alloc(i965->intel.bufmgr,
                           "VC-1 Bitplane",
                           bitplane_width * height_in_mbs,
@@ -1371,28 +1371,44 @@ gen7_mfd_vc1_decode_init(VADriverContextP ctx,
         assert(bo->virtual);
         dst = bo->virtual;
 
-        for (src_h = 0; src_h < height_in_mbs; src_h++) {
-            for (src_w = 0; src_w < width_in_mbs; src_w++) {
-                int src_index, dst_index;
-                int src_shift;
-                uint8_t src_value;
-
-                src_index = (src_h * width_in_mbs + src_w) / 2;
-                src_shift = !((src_h * width_in_mbs + src_w) & 1) * 4;
-                src_value = ((src[src_index] >> src_shift) & 0xf);
+        if (picture_type == GEN7_VC1_SKIPPED_PICTURE) {
+            for (src_h = 0; src_h < height_in_mbs; src_h++) {
+                for (src_w = 0; src_w < width_in_mbs; src_w++) {
+                    int dst_index;
+                    uint8_t src_value = 0x2;
 
-                if (picture_type == GEN7_VC1_SKIPPED_PICTURE) {
-                    src_value |= 0x2;
+                    dst_index = src_w / 2;
+                    dst[dst_index] = ((dst[dst_index] >> 4) | (src_value << 4));
                 }
 
-                dst_index = src_w / 2;
-                dst[dst_index] = ((dst[dst_index] >> 4) | (src_value << 4));
+                if (src_w & 1)
+                    dst[src_w / 2] >>= 4;
+
+                dst += bitplane_width;
             }
+        } else {
+            assert(decode_state->bit_plane->buffer);
+            src = decode_state->bit_plane->buffer;
 
-            if (src_w & 1)
-                dst[src_w / 2] >>= 4;
+            for (src_h = 0; src_h < height_in_mbs; src_h++) {
+                for (src_w = 0; src_w < width_in_mbs; src_w++) {
+                    int src_index, dst_index;
+                    int src_shift;
+                    uint8_t src_value;
 
-            dst += bitplane_width;
+                    src_index = (src_h * width_in_mbs + src_w) / 2;
+                    src_shift = !((src_h * width_in_mbs + src_w) & 1) * 4;
+                    src_value = ((src[src_index] >> src_shift) & 0xf);
+
+                    dst_index = src_w / 2;
+                    dst[dst_index] = ((dst[dst_index] >> 4) | (src_value << 4));
+                }
+
+                if (src_w & 1)
+                    dst[src_w / 2] >>= 4;
+
+                dst += bitplane_width;
+            }
         }
 
         dri_bo_unmap(bo);
index 124f72e..1ef2525 100644 (file)
@@ -1391,7 +1391,10 @@ gen8_mfd_vc1_decode_init(VADriverContextP ctx,
 
     gen7_mfd_context->mpr_row_store_scratch_buffer.valid = 0;
 
-    gen7_mfd_context->bitplane_read_buffer.valid = !!pic_param->bitplane_present.value;
+    if (picture_type == GEN7_VC1_SKIPPED_PICTURE)
+        gen7_mfd_context->bitplane_read_buffer.valid = 1;
+    else
+        gen7_mfd_context->bitplane_read_buffer.valid = !!pic_param->bitplane_present.value;
     dri_bo_unreference(gen7_mfd_context->bitplane_read_buffer.bo);
 
     if (gen7_mfd_context->bitplane_read_buffer.valid) {
@@ -1401,9 +1404,6 @@ gen8_mfd_vc1_decode_init(VADriverContextP ctx,
         int src_w, src_h;
         uint8_t *src = NULL, *dst = NULL;
 
-        assert(decode_state->bit_plane->buffer);
-        src = decode_state->bit_plane->buffer;
-
         bo = dri_bo_alloc(i965->intel.bufmgr,
                           "VC-1 Bitplane",
                           bitplane_width * height_in_mbs,
@@ -1415,28 +1415,44 @@ gen8_mfd_vc1_decode_init(VADriverContextP ctx,
         assert(bo->virtual);
         dst = bo->virtual;
 
-        for (src_h = 0; src_h < height_in_mbs; src_h++) {
-            for (src_w = 0; src_w < width_in_mbs; src_w++) {
-                int src_index, dst_index;
-                int src_shift;
-                uint8_t src_value;
-
-                src_index = (src_h * width_in_mbs + src_w) / 2;
-                src_shift = !((src_h * width_in_mbs + src_w) & 1) * 4;
-                src_value = ((src[src_index] >> src_shift) & 0xf);
+        if (picture_type == GEN7_VC1_SKIPPED_PICTURE) {
+            for (src_h = 0; src_h < height_in_mbs; src_h++) {
+                for (src_w = 0; src_w < width_in_mbs; src_w++) {
+                    int dst_index;
+                    uint8_t src_value = 0x2;
 
-                if (picture_type == GEN7_VC1_SKIPPED_PICTURE) {
-                    src_value |= 0x2;
+                    dst_index = src_w / 2;
+                    dst[dst_index] = ((dst[dst_index] >> 4) | (src_value << 4));
                 }
 
-                dst_index = src_w / 2;
-                dst[dst_index] = ((dst[dst_index] >> 4) | (src_value << 4));
+                if (src_w & 1)
+                    dst[src_w / 2] >>= 4;
+
+                dst += bitplane_width;
             }
+        } else {
+            assert(decode_state->bit_plane->buffer);
+            src = decode_state->bit_plane->buffer;
 
-            if (src_w & 1)
-                dst[src_w / 2] >>= 4;
+            for (src_h = 0; src_h < height_in_mbs; src_h++) {
+                for (src_w = 0; src_w < width_in_mbs; src_w++) {
+                    int src_index, dst_index;
+                    int src_shift;
+                    uint8_t src_value;
 
-            dst += bitplane_width;
+                    src_index = (src_h * width_in_mbs + src_w) / 2;
+                    src_shift = !((src_h * width_in_mbs + src_w) & 1) * 4;
+                    src_value = ((src[src_index] >> src_shift) & 0xf);
+
+                    dst_index = src_w / 2;
+                    dst[dst_index] = ((dst[dst_index] >> 4) | (src_value << 4));
+                }
+
+                if (src_w & 1)
+                    dst[src_w / 2] >>= 4;
+
+                dst += bitplane_width;
+            }
         }
 
         dri_bo_unmap(bo);