diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c index b7aed7a9b7e..7570a7f036b 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c @@ -1793,15 +1793,22 @@ static struct pb_buffer_lean *rvcn_dec_message_decode(struct radeon_decoder *dec return NULL; } int ss_length = MIN2(secure_buf->desc.subsamples_length, MAX_SUBSAMPLES); + int total_ss_size = 0; uint32_t *ss_ptr = dec->ws->buffer_map(dec->ws, dec->subsample.res->buf, &dec->cs, PIPE_MAP_WRITE | RADEON_MAP_TEMPORARY); if (!ss_ptr) { RADEON_DEC_ERR("Failed to map subsample buffer memory.\n"); return NULL; } - for (int i = 0; i < ss_length; i++) + for (int i = 0; i < ss_length; i++) { memcpy(&ss_ptr[i * 2], &secure_buf->desc.subsamples[i].num_bytes_clear, 8); - ss_ptr[ss_length * 2 - 1] = align(ss_ptr[ss_length * 2 - 1], 256); + total_ss_size += ss_ptr[i * 2] + ss_ptr[i * 2 + 1]; + } + assert(total_ss_size <= decode->bsd_size); + if (ss_ptr[ss_length * 2 - 1] != 0) + ss_ptr[ss_length * 2 - 1] += (decode->bsd_size - total_ss_size); + else + ss_ptr[ss_length * 2 - 2] += (decode->bsd_size - total_ss_size); dec->ws->buffer_unmap(dec->ws, dec->subsample.res->buf); }