From f73fc14febefc29b5aa3b3d70bbd8c2184405159 Mon Sep 17 00:00:00 2001 From: Sajeesh Sidharthan Date: Thu, 24 Nov 2022 13:59:46 -0800 Subject: [PATCH] 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 Reviewed-by: Boyuan Zhang Part-of: (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;