decoder: h264: fix submission of AVC_REF_IDX_STATE command.
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>
Sun, 4 May 2014 22:05:06 +0000 (00:05 +0200)
committerXiang, Haihao <haihao.xiang@intel.com>
Mon, 16 Jun 2014 03:53:35 +0000 (11:53 +0800)
If the RefPicListX[] entry has no valid picture_id associated to it,
then set the resulting state to 0xff. If that entry has no surface
buffer storage either, then compose a valid state that maps to the
first item in the reference frames list, as mandated by the PRM.

v2: dropped the superfluous "found" variable [Yakui]

Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
(cherry picked from commit 151b8851c3a9309e87712651a3697e20a7bdb6c9)

src/i965_decoder_utils.c

index c779152..ae17bd5 100644 (file)
@@ -336,34 +336,35 @@ gen5_fill_avc_ref_idx_state(
     const GenFrameStore frame_store[MAX_GEN_REFERENCE_FRAMES]
 )
 {
-    unsigned int i, n, frame_idx;
-    int found;
+    int i, j;
 
-    for (i = 0, n = 0; i < ref_list_count; i++) {
+    for (i = 0; i < ref_list_count; i++) {
         const VAPictureH264 * const va_pic = &ref_list[i];
 
-        if (va_pic->flags & VA_PICTURE_H264_INVALID)
+        if ((va_pic->flags & VA_PICTURE_H264_INVALID) ||
+            va_pic->picture_id == VA_INVALID_ID) {
+            state[i] = 0xff;
             continue;
+        }
 
-        found = 0;
-        for (frame_idx = 0; frame_idx < MAX_GEN_REFERENCE_FRAMES; frame_idx++) {
-            const GenFrameStore * const fs = &frame_store[frame_idx];
-            if (fs->surface_id != VA_INVALID_ID &&
-                fs->surface_id == va_pic->picture_id) {
-                found = 1;
+        for (j = 0; j < MAX_GEN_REFERENCE_FRAMES; j++) {
+            if (frame_store[j].surface_id == va_pic->picture_id)
                 break;
-            }
         }
 
-        if (found) {
-            state[n++] = get_ref_idx_state_1(va_pic, frame_idx);
-        } else {
-            WARN_ONCE("Invalid Slice reference frame list !!!. It is not included in DPB \n");
+        if (j != MAX_GEN_REFERENCE_FRAMES) { // Found picture in the Frame Store
+            const GenFrameStore * const fs = &frame_store[j];
+            assert(fs->frame_store_id == j); // Current architecture/assumption
+            state[i] = get_ref_idx_state_1(va_pic, fs->frame_store_id);
+        }
+        else {
+            WARN_ONCE("Invalid RefPicListX[] entry!!! It is not included in DPB\n");
+            state[i] = get_ref_idx_state_1(va_pic, 0) | 0x80;
         }
     }
 
-    for (; n < 32; n++)
-        state[n] = 0xff;
+    for (; i < 32; i++)
+        state[i] = 0xff;
 }
 
 /* Emit Reference List Entries (Gen6+: SNB, IVB) */