mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 15:58:05 +02:00
ac/vcn_dec: Fix AV1 film grain on VCN5
Cc: mesa-stable
Reviewed-by: Ruijing Dong <ruijing.dong@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33376>
(cherry picked from commit 62b0f84981)
This commit is contained in:
parent
741763f32c
commit
19f1546fb3
5 changed files with 38 additions and 22 deletions
|
|
@ -694,7 +694,7 @@
|
|||
"description": "ac/vcn_dec: Fix AV1 film grain on VCN5",
|
||||
"nominated": true,
|
||||
"nomination_type": 1,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"main_sha": null,
|
||||
"because_sha": null,
|
||||
"notes": null
|
||||
|
|
|
|||
|
|
@ -412,7 +412,7 @@ radv_vcn_av1_film_grain_init_scaling(uint8_t scaling_points[][2], uint8_t num, s
|
|||
}
|
||||
|
||||
void
|
||||
ac_vcn_av1_init_film_grain_buffer(rvcn_dec_film_grain_params_t *fg_params, rvcn_dec_av1_fg_init_buf_t *fg_buf)
|
||||
ac_vcn_av1_init_film_grain_buffer(unsigned av1_version, rvcn_dec_film_grain_params_t *fg_params, rvcn_dec_av1_fg_init_buf_t *fg_buf)
|
||||
{
|
||||
const int32_t luma_block_size_y = LUMA_BLOCK_SIZE_Y;
|
||||
const int32_t luma_block_size_x = LUMA_BLOCK_SIZE_X;
|
||||
|
|
@ -542,24 +542,38 @@ ac_vcn_av1_init_film_grain_buffer(rvcn_dec_film_grain_params_t *fg_params, rvcn_
|
|||
}
|
||||
|
||||
align_ptr = &fg_buf->luma_grain_block[0][0];
|
||||
for (i = 0; i < 64; i++) {
|
||||
for (j = 0; j < 80; j++)
|
||||
*align_ptr++ = luma_grain_block_tmp[i][j];
|
||||
|
||||
if (((i + 1) % 4) == 0)
|
||||
align_ptr += 64;
|
||||
}
|
||||
|
||||
align_ptr0 = &fg_buf->cb_grain_block[0][0];
|
||||
align_ptr1 = &fg_buf->cr_grain_block[0][0];
|
||||
for (i = 0; i < 32; i++) {
|
||||
for (j = 0; j < 40; j++) {
|
||||
*align_ptr0++ = cb_grain_block_tmp[i][j];
|
||||
*align_ptr1++ = cr_grain_block_tmp[i][j];
|
||||
|
||||
if (av1_version == RDECODE_AV1_VER_2) {
|
||||
for (i = 0; i < 64; i++)
|
||||
for (j = 0; j < 64; j++)
|
||||
*align_ptr++ = luma_grain_block_tmp[i][j];
|
||||
|
||||
for (i = 0; i < 32; i++) {
|
||||
for (j = 0; j < 32; j++) {
|
||||
*align_ptr0++ = cb_grain_block_tmp[i][j];
|
||||
*align_ptr1++ = cr_grain_block_tmp[i][j];
|
||||
}
|
||||
}
|
||||
if (((i + 1) % 8) == 0) {
|
||||
align_ptr0 += 64;
|
||||
align_ptr1 += 64;
|
||||
} else {
|
||||
for (i = 0; i < 64; i++) {
|
||||
for (j = 0; j < 80; j++)
|
||||
*align_ptr++ = luma_grain_block_tmp[i][j];
|
||||
|
||||
if (((i + 1) % 4) == 0)
|
||||
align_ptr += 64;
|
||||
}
|
||||
|
||||
for (i = 0; i < 32; i++) {
|
||||
for (j = 0; j < 40; j++) {
|
||||
*align_ptr0++ = cb_grain_block_tmp[i][j];
|
||||
*align_ptr1++ = cr_grain_block_tmp[i][j];
|
||||
}
|
||||
if (((i + 1) % 8) == 0) {
|
||||
align_ptr0 += 64;
|
||||
align_ptr1 += 64;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -433,6 +433,7 @@
|
|||
|
||||
#define RDECODE_AV1_VER_0 0
|
||||
#define RDECODE_AV1_VER_1 1
|
||||
#define RDECODE_AV1_VER_2 2
|
||||
|
||||
typedef struct rvcn_decode_buffer_s {
|
||||
unsigned int valid_buf_flag;
|
||||
|
|
@ -1216,6 +1217,6 @@ struct jpeg_params {
|
|||
|
||||
unsigned ac_vcn_dec_calc_ctx_size_av1(unsigned av1_version);
|
||||
void ac_vcn_av1_init_probs(unsigned av1_version, uint8_t *prob);
|
||||
void ac_vcn_av1_init_film_grain_buffer(rvcn_dec_film_grain_params_t *fg_params, rvcn_dec_av1_fg_init_buf_t *fg_buf);
|
||||
void ac_vcn_av1_init_film_grain_buffer(unsigned av1_version, rvcn_dec_film_grain_params_t *fg_params, rvcn_dec_av1_fg_init_buf_t *fg_buf);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1523,6 +1523,7 @@ static rvcn_dec_message_av1_t
|
|||
get_av1_msg(struct radv_device *device, struct radv_video_session *vid, struct radv_video_session_params *params,
|
||||
const struct VkVideoDecodeInfoKHR *frame_info, void *probs_ptr, int *update_reference_slot)
|
||||
{
|
||||
const struct radv_physical_device *pdev = radv_device_physical(device);
|
||||
rvcn_dec_message_av1_t result;
|
||||
unsigned i, j;
|
||||
const struct VkVideoDecodeAV1PictureInfoKHR *av1_pic_info =
|
||||
|
|
@ -1879,7 +1880,7 @@ get_av1_msg(struct radv_device *device, struct radv_video_session *vid, struct r
|
|||
|
||||
fg_params->overlap_flag = pi->pFilmGrain->flags.overlap_flag;
|
||||
fg_params->clip_to_restricted_range = pi->pFilmGrain->flags.clip_to_restricted_range;
|
||||
ac_vcn_av1_init_film_grain_buffer(fg_params, fg_buf);
|
||||
ac_vcn_av1_init_film_grain_buffer(pdev->av1_version, fg_params, fg_buf);
|
||||
}
|
||||
|
||||
result.uncompressed_header_size = 0;
|
||||
|
|
|
|||
|
|
@ -1092,7 +1092,7 @@ static rvcn_dec_message_av1_t get_av1_msg(struct radeon_decoder *dec,
|
|||
fg_params->clip_to_restricted_range =
|
||||
pic->picture_parameter.film_grain_info.film_grain_info_fields.clip_to_restricted_range;
|
||||
|
||||
ac_vcn_av1_init_film_grain_buffer(fg_params, fg_buf);
|
||||
ac_vcn_av1_init_film_grain_buffer(dec->av1_version, fg_params, fg_buf);
|
||||
}
|
||||
|
||||
result.uncompressed_header_size = 0;
|
||||
|
|
@ -2952,12 +2952,12 @@ struct pipe_video_codec *radeon_create_decoder(struct pipe_context *context,
|
|||
case VCN_5_0_0:
|
||||
dec->jpg_reg.version = RDECODE_JPEG_REG_VER_V3;
|
||||
dec->addr_gfx_mode = RDECODE_ARRAY_MODE_ADDRLIB_SEL_GFX11;
|
||||
dec->av1_version = RDECODE_AV1_VER_1;
|
||||
dec->av1_version = RDECODE_AV1_VER_2;
|
||||
break;
|
||||
case VCN_5_0_1:
|
||||
dec->jpg_reg.version = RDECODE_JPEG_REG_VER_V3;
|
||||
dec->addr_gfx_mode = RDECODE_ARRAY_MODE_ADDRLIB_SEL_GFX9;
|
||||
dec->av1_version = RDECODE_AV1_VER_1;
|
||||
dec->av1_version = RDECODE_AV1_VER_2;
|
||||
break;
|
||||
default:
|
||||
RADEON_DEC_ERR("VCN is not supported.\n");
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue