From e8aededfe71a693ef8a19ce77798048c498d10ef 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 d7a227ab071..69b4cc3a659 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -220,7 +220,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 af6f983de1f..cb83185cc19 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;