summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/radeon/radeon_vcn_dec.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/src/gallium/drivers/radeon/radeon_vcn_dec.c b/src/gallium/drivers/radeon/radeon_vcn_dec.c
index 8ef797e6809..849270a3df9 100644
--- a/src/gallium/drivers/radeon/radeon_vcn_dec.c
+++ b/src/gallium/drivers/radeon/radeon_vcn_dec.c
@@ -371,7 +371,7 @@ static rvcn_dec_message_vp9_t get_vp9_msg(struct radeon_decoder *dec,
struct pipe_vp9_picture_desc *pic)
{
rvcn_dec_message_vp9_t result;
- unsigned i;
+ unsigned i ,j;
memset(&result, 0, sizeof(result));
@@ -486,14 +486,32 @@ static rvcn_dec_message_vp9_t get_vp9_msg(struct radeon_decoder *dec,
assert(dec->base.max_references + 1 <= ARRAY_SIZE(dec->render_pic_list));
+ //clear the dec->render list if it is not used as a reference
+ for (i = 0; i < ARRAY_SIZE(dec->render_pic_list); i++) {
+ if (dec->render_pic_list[i]) {
+ for (j=0;j<8;j++) {
+ if (dec->render_pic_list[i] == pic->ref[j])
+ break;
+ }
+ if(j == 8)
+ dec->render_pic_list[i] = NULL;
+ }
+ }
+
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;
+ 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 = dec->ref_idx;
- vl_video_buffer_set_associated_data(target, &dec->base, (void *)(uintptr_t)dec->ref_idx++,
+ result.curr_pic_idx = i;
+ vl_video_buffer_set_associated_data(target, &dec->base, (void *)(uintptr_t)i,
&radeon_dec_destroy_associated_data);
break;
}