From 12f60c1cd125658ee1c1abfbdd334c8e664218c1 Mon Sep 17 00:00:00 2001 From: David Rosca Date: Fri, 23 Aug 2024 11:56:58 +0200 Subject: [PATCH] frontends/va: Allow multiple NALUs in coded buffer segments Add PIPE_VIDEO_CODEC_UNIT_LOCATION_FLAG_SINGLE_NALU to set VA_CODED_BUF_STATUS_SINGLE_NALU for each segment. Always set this flag in d3d12 to keep the old behavior. Reviewed-By: Sil Vilerino Reviewed-by: Ruijing Dong Part-of: --- src/gallium/drivers/d3d12/d3d12_video_enc.cpp | 1 + src/gallium/frontends/va/buffer.c | 3 ++- src/gallium/include/pipe/p_video_enums.h | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/d3d12/d3d12_video_enc.cpp b/src/gallium/drivers/d3d12/d3d12_video_enc.cpp index 7129d0dfe0e..0b18fc8c876 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_enc.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_enc.cpp @@ -2481,6 +2481,7 @@ d3d12_video_encoder_get_feedback(struct pipe_video_codec *codec, { uint64_t unpadded_slice_size = pSubregionsMetadata[i].bSize - pSubregionsMetadata[i].bStartOffset; unpadded_frame_size += unpadded_slice_size; + opt_metadata.codec_unit_metadata[opt_metadata.codec_unit_metadata_count].flags = PIPE_VIDEO_CODEC_UNIT_LOCATION_FLAG_SINGLE_NALU; opt_metadata.codec_unit_metadata[opt_metadata.codec_unit_metadata_count].size = unpadded_slice_size; opt_metadata.codec_unit_metadata[opt_metadata.codec_unit_metadata_count].offset = *output_buffer_size; *output_buffer_size += pSubregionsMetadata[i].bSize; diff --git a/src/gallium/frontends/va/buffer.c b/src/gallium/frontends/va/buffer.c index f8b379fd271..2d6f1eee17c 100644 --- a/src/gallium/frontends/va/buffer.c +++ b/src/gallium/frontends/va/buffer.c @@ -234,11 +234,12 @@ VAStatus vlVaMapBuffer2(VADriverContextP ctx, VABufferID buf_id, curr_buf_ptr = buf->data; for (size_t i = 0; i < buf->extended_metadata.codec_unit_metadata_count; i++) { - curr_buf_ptr->status |= VA_CODED_BUF_STATUS_SINGLE_NALU; curr_buf_ptr->size = buf->extended_metadata.codec_unit_metadata[i].size; curr_buf_ptr->buf = compressed_bitstream_data + buf->extended_metadata.codec_unit_metadata[i].offset; if (buf->extended_metadata.codec_unit_metadata[i].flags & PIPE_VIDEO_CODEC_UNIT_LOCATION_FLAG_MAX_SLICE_SIZE_OVERFLOW) curr_buf_ptr->status |= VA_CODED_BUF_STATUS_SLICE_OVERFLOW_MASK; + if (buf->extended_metadata.codec_unit_metadata[i].flags & PIPE_VIDEO_CODEC_UNIT_LOCATION_FLAG_SINGLE_NALU) + curr_buf_ptr->status |= VA_CODED_BUF_STATUS_SINGLE_NALU; curr_buf_ptr = curr_buf_ptr->next; } diff --git a/src/gallium/include/pipe/p_video_enums.h b/src/gallium/include/pipe/p_video_enums.h index dd8f9011a88..b3a87056ba7 100644 --- a/src/gallium/include/pipe/p_video_enums.h +++ b/src/gallium/include/pipe/p_video_enums.h @@ -192,6 +192,7 @@ enum codec_unit_location_flags PIPE_VIDEO_CODEC_UNIT_LOCATION_FLAG_NONE = 0x0, /* Requires PIPE_VIDEO_FEEDBACK_METADATA_TYPE_MAX_SLICE_SIZE_OVERFLOW */ PIPE_VIDEO_CODEC_UNIT_LOCATION_FLAG_MAX_SLICE_SIZE_OVERFLOW = 0x1, + PIPE_VIDEO_CODEC_UNIT_LOCATION_FLAG_SINGLE_NALU = 0x2, }; /* To be used with PIPE_VIDEO_CAP_ENC_SUPPORTS_FEEDBACK_METADATA