[Libva] [PATCH] H264: Use macroblock pair to calculate H264 decoding parameter under MBAFF flag

Zhao Yakui yakui.zhao at intel.com
Mon Jul 6 10:49:14 PDT 2015


Based on the H264 spec the macroblock pair should be used to calculate
the corresponding parameters under MBAFF.(mb-adaptive frame-field).
Otherwise the wrong parameter is sent to GPU HW.

Fix the GPU hang issue in https://bugs.freedesktop.org/show_bug.cgi?id=91207

Signed-off-by: Zhao Yakui <yakui.zhao at intel.com>
---
 src/gen6_mfd.c  |   10 ++++++++--
 src/gen75_mfd.c |   10 ++++++++--
 src/gen7_mfd.c  |   10 ++++++++--
 src/gen8_mfd.c  |    9 +++++++--
 4 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/src/gen6_mfd.c b/src/gen6_mfd.c
index 95a8e92..2dd05a1 100755
--- a/src/gen6_mfd.c
+++ b/src/gen6_mfd.c
@@ -551,14 +551,20 @@ gen6_mfd_avc_slice_state(VADriverContextP ctx,
         }
     }
 
-    first_mb_in_slice = slice_param->first_mb_in_slice << mbaff_picture;
+    first_mb_in_slice = slice_param->first_mb_in_slice;
     slice_hor_pos = first_mb_in_slice % width_in_mbs; 
     slice_ver_pos = first_mb_in_slice / width_in_mbs;
 
+    if (mbaff_picture)
+        slice_ver_pos = slice_ver_pos << 1;
+
     if (next_slice_param) {
-        first_mb_in_next_slice = next_slice_param->first_mb_in_slice << mbaff_picture;
+        first_mb_in_next_slice = next_slice_param->first_mb_in_slice;
         next_slice_hor_pos = first_mb_in_next_slice % width_in_mbs; 
         next_slice_ver_pos = first_mb_in_next_slice / width_in_mbs;
+
+        if (mbaff_picture)
+            next_slice_ver_pos = next_slice_ver_pos << 1;
     } else {
         next_slice_hor_pos = 0;
         next_slice_ver_pos = height_in_mbs;
diff --git a/src/gen75_mfd.c b/src/gen75_mfd.c
index 5171bd9..11cde1f 100644
--- a/src/gen75_mfd.c
+++ b/src/gen75_mfd.c
@@ -862,14 +862,20 @@ gen75_mfd_avc_slice_state(VADriverContextP ctx,
         num_ref_idx_l1 = slice_param->num_ref_idx_l1_active_minus1 + 1;
     }
 
-    first_mb_in_slice = slice_param->first_mb_in_slice << mbaff_picture;
+    first_mb_in_slice = slice_param->first_mb_in_slice;
     slice_hor_pos = first_mb_in_slice % width_in_mbs; 
     slice_ver_pos = first_mb_in_slice / width_in_mbs;
 
+    if (mbaff_picture)
+        slice_ver_pos = slice_ver_pos << 1;
+
     if (next_slice_param) {
-        first_mb_in_next_slice = next_slice_param->first_mb_in_slice << mbaff_picture;
+        first_mb_in_next_slice = next_slice_param->first_mb_in_slice;
         next_slice_hor_pos = first_mb_in_next_slice % width_in_mbs; 
         next_slice_ver_pos = first_mb_in_next_slice / width_in_mbs;
+
+        if (mbaff_picture)
+            next_slice_ver_pos = next_slice_ver_pos << 1;
     } else {
         next_slice_hor_pos = 0;
         next_slice_ver_pos = height_in_mbs / (1 + !!pic_param->pic_fields.bits.field_pic_flag);
diff --git a/src/gen7_mfd.c b/src/gen7_mfd.c
index 40a6db4..1d04ed4 100755
--- a/src/gen7_mfd.c
+++ b/src/gen7_mfd.c
@@ -556,14 +556,20 @@ gen7_mfd_avc_slice_state(VADriverContextP ctx,
         num_ref_idx_l1 = slice_param->num_ref_idx_l1_active_minus1 + 1;
     }
 
-    first_mb_in_slice = slice_param->first_mb_in_slice << mbaff_picture;
+    first_mb_in_slice = slice_param->first_mb_in_slice;
     slice_hor_pos = first_mb_in_slice % width_in_mbs; 
     slice_ver_pos = first_mb_in_slice / width_in_mbs;
 
+    if (mbaff_picture)
+        slice_ver_pos = slice_ver_pos << 1;
+
     if (next_slice_param) {
-        first_mb_in_next_slice = next_slice_param->first_mb_in_slice << mbaff_picture;
+        first_mb_in_next_slice = next_slice_param->first_mb_in_slice;
         next_slice_hor_pos = first_mb_in_next_slice % width_in_mbs; 
         next_slice_ver_pos = first_mb_in_next_slice / width_in_mbs;
+
+        if (mbaff_picture)
+            next_slice_ver_pos = next_slice_ver_pos << 1;
     } else {
         next_slice_hor_pos = 0;
         next_slice_ver_pos = height_in_mbs / (1 + !!pic_param->pic_fields.bits.field_pic_flag);
diff --git a/src/gen8_mfd.c b/src/gen8_mfd.c
index c15184d..c55cb4e 100644
--- a/src/gen8_mfd.c
+++ b/src/gen8_mfd.c
@@ -625,14 +625,19 @@ gen8_mfd_avc_slice_state(VADriverContextP ctx,
         num_ref_idx_l1 = slice_param->num_ref_idx_l1_active_minus1 + 1;
     }
 
-    first_mb_in_slice = slice_param->first_mb_in_slice << mbaff_picture;
+    first_mb_in_slice = slice_param->first_mb_in_slice;
     slice_hor_pos = first_mb_in_slice % width_in_mbs; 
     slice_ver_pos = first_mb_in_slice / width_in_mbs;
 
+    if (mbaff_picture)
+        slice_ver_pos = slice_ver_pos << 1;
     if (next_slice_param) {
-        first_mb_in_next_slice = next_slice_param->first_mb_in_slice << mbaff_picture;
+        first_mb_in_next_slice = next_slice_param->first_mb_in_slice;
         next_slice_hor_pos = first_mb_in_next_slice % width_in_mbs; 
         next_slice_ver_pos = first_mb_in_next_slice / width_in_mbs;
+
+        if (mbaff_picture)
+            next_slice_ver_pos = next_slice_ver_pos << 1;
     } else {
         next_slice_hor_pos = 0;
         next_slice_ver_pos = height_in_mbs / (1 + !!pic_param->pic_fields.bits.field_pic_flag);
-- 
1.7.10.1



More information about the Libva mailing list