radeonsi/vcn: Fix decode target index for H264 interlaced streams

With H264 the target surface can also be in the reference list for
current frame, so it can only be inserted into the DPB list after
iterating over all references.

Fixes: 0e68a2655f ("radeonsi/vcn: Rework decode ref handling")
Reviewed-by: Ruijing Dong <ruijing.dong@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34527>
(cherry picked from commit b0b52d4922c5d1cd818461801506a0bd6593643d)
This commit is contained in:
David Rosca
2025-04-15 17:11:51 +02:00
committed by Eric Engestrom
parent 39e4fe7ab4
commit 5bae75e3a0
2 changed files with 12 additions and 5 deletions

View File

@@ -224,7 +224,7 @@
"description": "radeonsi/vcn: Fix decode target index for H264 interlaced streams",
"nominated": true,
"nomination_type": 2,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": "0e68a2655f46b2a1d2ce969cf18fbababa09a099",
"notes": null

View File

@@ -155,11 +155,18 @@ static rvcn_dec_message_avc_t get_h264_msg(struct radeon_decoder *dec,
if (!found)
dec->render_pic_list[i] = NULL;
}
if (dec->render_pic_list[i] == target) {
result.decoded_pic_idx = i;
} else if (result.decoded_pic_idx == 0xff && !dec->render_pic_list[i]) {
dec->render_pic_list[i] = target;
if (dec->render_pic_list[i] == target)
result.decoded_pic_idx = i;
}
/* Target surface can also be a reference (other field) */
if (result.decoded_pic_idx == 0xff) {
for (i = 0; i < ARRAY_SIZE(pic->ref) + 1; i++) {
if (!dec->render_pic_list[i]) {
dec->render_pic_list[i] = target;
result.decoded_pic_idx = i;
break;
}
}
}