Module: Mesa
Branch: staging/22.2
Commit: f73fc14febefc29b5aa3b3d70bbd8c2184405159
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=f73fc14febefc29b5aa3b3d70bbd8c2184405159

Author: Sajeesh Sidharthan <[email protected]>
Date:   Thu Nov 24 13:59:46 2022 -0800

radeonsi/vcn: set current pic index correctly

video corruption observed while running decode test for av1
content in chromeos.

solution is when target buffer is found in render pic list and when
target codec is null, set curr_pic_indx as index to the
pic in render pic list.

Cc: mesa-stable
Signed-off-by: Sajeesh Sidharthan <[email protected]>
Reviewed-by: Boyuan Zhang <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20000>
(cherry picked from commit 8b99e96dc8b44a747824b9d227a72e68012ec520)

---

 .pick_status.json                             |  2 +-
 src/gallium/drivers/radeonsi/radeon_vcn_dec.c | 57 +++++++++++++--------------
 2 files changed, 28 insertions(+), 31 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index eafae483fe4..358dfc9c23d 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -175,7 +175,7 @@
         "description": "radeonsi/vcn: set current pic index correctly",
         "nominated": true,
         "nomination_type": 0,
-        "resolution": 0,
+        "resolution": 1,
         "main_sha": null,
         "because_sha": null
     },
diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c 
b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c
index d57d0bbdbb1..1745d652c25 100644
--- a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c
+++ b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c
@@ -63,6 +63,30 @@ static void radeon_dec_destroy_associated_data(void *data)
    /* NOOP, since we only use an intptr */
 }
 
+static void get_current_pic_index(struct radeon_decoder *dec,
+                                    struct pipe_video_buffer *target,
+                                    unsigned char *curr_pic_idx)
+{
+   for (int i = 0; i < ARRAY_SIZE(dec->render_pic_list); ++i) {
+      if (dec->render_pic_list[i] && dec->render_pic_list[i] == target) {
+         if (target->codec != NULL)
+            *curr_pic_idx = 
(uintptr_t)vl_video_buffer_get_associated_data(target, &dec->base);
+         else {
+            *curr_pic_idx = i;
+            vl_video_buffer_set_associated_data(target, &dec->base, (void 
*)(uintptr_t)i,
+                                                
&radeon_dec_destroy_associated_data);
+         }
+         break;
+      } else if (!dec->render_pic_list[i]) {
+         dec->render_pic_list[i] = target;
+         *curr_pic_idx = i;
+         vl_video_buffer_set_associated_data(target, &dec->base, (void 
*)(uintptr_t)i,
+                                             
&radeon_dec_destroy_associated_data);
+         break;
+      }
+   }
+}
+
 static rvcn_dec_message_avc_t get_h264_msg(struct radeon_decoder *dec,
                                            struct pipe_video_buffer *target,
                                            struct pipe_h264_picture_desc *pic)
@@ -637,24 +661,7 @@ static rvcn_dec_message_vp9_t get_vp9_msg(struct 
radeon_decoder *dec,
       }
    }
 
-   for (i = 0; i < ARRAY_SIZE(dec->render_pic_list); ++i) {
-      if (dec->render_pic_list[i] && dec->render_pic_list[i] == target) {
-         if (target->codec != NULL) {
-            result.curr_pic_idx 
=(uintptr_t)vl_video_buffer_get_associated_data(target, &dec->base);
-         } else {
-            result.curr_pic_idx = i;
-            vl_video_buffer_set_associated_data(target, &dec->base, (void 
*)(uintptr_t)i,
-            &radeon_dec_destroy_associated_data);
-         }
-         break;
-      } else if (!dec->render_pic_list[i]) {
-         dec->render_pic_list[i] = target;
-         result.curr_pic_idx = i;
-         vl_video_buffer_set_associated_data(target, &dec->base, (void 
*)(uintptr_t)i,
-                                             
&radeon_dec_destroy_associated_data);
-         break;
-      }
-   }
+   get_current_pic_index(dec, target, &result.curr_pic_idx);
 
    for (i = 0; i < 8; i++) {
       result.ref_frame_map[i] =
@@ -880,18 +887,8 @@ static rvcn_dec_message_av1_t get_av1_msg(struct 
radeon_decoder *dec,
    result.is_annexb = 0;
    result.frame_type = pic->picture_parameter.pic_info_fields.frame_type;
    result.primary_ref_frame = pic->picture_parameter.primary_ref_frame;
-   for (i = 0; i < ARRAY_SIZE(dec->render_pic_list); ++i) {
-      if (dec->render_pic_list[i] && dec->render_pic_list[i] == target) {
-         result.curr_pic_idx = 
(uintptr_t)vl_video_buffer_get_associated_data(target, &dec->base);
-         break;
-      } else if (!dec->render_pic_list[i]) {
-         dec->render_pic_list[i] = target;
-         result.curr_pic_idx = dec->ref_idx;
-         vl_video_buffer_set_associated_data(target, &dec->base, (void 
*)(uintptr_t)dec->ref_idx++,
-                                             
&radeon_dec_destroy_associated_data);
-         break;
-      }
-   }
+
+   get_current_pic_index(dec, target, &result.curr_pic_idx);
 
    result.sb_size = 
pic->picture_parameter.seq_info_fields.use_128x128_superblock;
    result.interp_filter = pic->picture_parameter.interp_filter;

Reply via email to