vkencoder-private: replace packed headers with offset handling

Instead of holding all headers in an external array and add them into the
bitstream buffer before the encoding operation, adding extra memory and extra
copy operations, the encoder picture should specify the offset where the Vulkan
will start to add the bitstream slices/frame, because the element has written
already the headers until that offset.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8007>
This commit is contained in:
Víctor Manuel Jáquez Leal 2024-11-26 20:10:15 +01:00 committed by GStreamer Marge Bot
parent 48b2c3cf74
commit eef9717478
2 changed files with 12 additions and 29 deletions

View file

@ -421,9 +421,8 @@ gst_vulkan_encoder_picture_new (GstVulkanEncoder * self, GstBuffer * in_buffer,
VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR, size_aligned); VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR, size_aligned);
pic->width = width; pic->width = width;
pic->height = height; pic->height = height;
pic->packed_headers =
g_ptr_array_new_with_free_func ((GDestroyNotify) gst_buffer_unref);
pic->slotIndex = -1; pic->slotIndex = -1;
pic->offset = 0;
pic->img_view = gst_vulkan_video_image_create_view (pic->in_buffer, pic->img_view = gst_vulkan_video_image_create_view (pic->in_buffer,
priv->layered_dpb, TRUE, NULL); priv->layered_dpb, TRUE, NULL);
@ -460,8 +459,6 @@ gst_vulkan_encoder_picture_free (GstVulkanEncoderPicture * pic)
gst_vulkan_image_view_unref (pic->dpb_view); gst_vulkan_image_view_unref (pic->dpb_view);
pic->dpb_view = NULL; pic->dpb_view = NULL;
g_clear_pointer (&pic->packed_headers, g_ptr_array_unref);
g_free (pic); g_free (pic);
} }
@ -1080,8 +1077,6 @@ gst_vulkan_encoder_encode (GstVulkanEncoder * self,
GstMemory *mem; GstMemory *mem;
int i; int i;
GstVulkanEncodeQueryResult *encode_res; GstVulkanEncodeQueryResult *encode_res;
guint n_mems = 0;
gsize params_size = 0;
VkVideoEncodeRateControlLayerInfoKHR rate_control_layer; VkVideoEncodeRateControlLayerInfoKHR rate_control_layer;
VkVideoEncodeQualityLevelInfoKHR quality_level_info; VkVideoEncodeQualityLevelInfoKHR quality_level_info;
VkVideoCodingControlInfoKHR coding_ctrl; VkVideoCodingControlInfoKHR coding_ctrl;
@ -1249,22 +1244,8 @@ gst_vulkan_encoder_encode (GstVulkanEncoder * self,
priv->first_encode_cmd = TRUE; priv->first_encode_cmd = TRUE;
} }
/* Add the packed headers if present on head of the output buffer */
for (i = 0; pic->packed_headers && i < pic->packed_headers->len; i++) {
GstBuffer *buffer;
GstMapInfo info;
buffer = g_ptr_array_index (pic->packed_headers, i);
gst_buffer_map (buffer, &info, GST_MAP_READ);
GST_MEMDUMP ("params buffer", info.data, info.size);
gst_buffer_unmap (buffer, &info);
params_size += gst_buffer_get_size (buffer);
mem = gst_memory_copy (gst_buffer_peek_memory (buffer, 0), 0, -1);
gst_buffer_insert_memory (pic->out_buffer, i, mem);
n_mems++;
}
g_clear_pointer (&pic->packed_headers, g_ptr_array_unref);
/* Peek the output memory to be used by VkVideoEncodeInfoKHR.dstBuffer */ /* Peek the output memory to be used by VkVideoEncodeInfoKHR.dstBuffer */
mem = gst_buffer_peek_memory (pic->out_buffer, n_mems); mem = gst_buffer_peek_memory (pic->out_buffer, 0);
/* Attribute a free slot index to the picture to be used later as a reference. /* Attribute a free slot index to the picture to be used later as a reference.
* The picture is kept until it remains useful to the encoding process.*/ * The picture is kept until it remains useful to the encoding process.*/
@ -1281,7 +1262,7 @@ gst_vulkan_encoder_encode (GstVulkanEncoder * self,
.pNext = pic->codec_pic_info, .pNext = pic->codec_pic_info,
.flags = 0x0, .flags = 0x0,
.dstBuffer = ((GstVulkanBufferMemory *) mem)->buffer, .dstBuffer = ((GstVulkanBufferMemory *) mem)->buffer,
.dstBufferOffset = 0, .dstBufferOffset = pic->offset,
.dstBufferRange = gst_memory_get_sizes (mem, NULL, NULL), .dstBufferRange = gst_memory_get_sizes (mem, NULL, NULL),
.srcPictureResource = (VkVideoPictureResourceInfoKHR) { // SPEC: this should be separate .srcPictureResource = (VkVideoPictureResourceInfoKHR) { // SPEC: this should be separate
.sType = VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR, .sType = VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR,
@ -1301,6 +1282,10 @@ gst_vulkan_encoder_encode (GstVulkanEncoder * self,
}; };
/* *INDENT-ON* */ /* *INDENT-ON* */
encode_info.dstBufferRange -= encode_info.dstBufferOffset;
encode_info.dstBufferRange = GST_ROUND_DOWN_N (encode_info.dstBufferRange,
priv->caps.caps.minBitstreamBufferSizeAlignment);
gst_vulkan_operation_add_dependency_frame (priv->exec, pic->in_buffer, gst_vulkan_operation_add_dependency_frame (priv->exec, pic->in_buffer,
VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR); VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR);
@ -1355,10 +1340,9 @@ gst_vulkan_encoder_encode (GstVulkanEncoder * self,
gst_vulkan_operation_get_query (priv->exec, (gpointer *) & encode_res, &err); gst_vulkan_operation_get_query (priv->exec, (gpointer *) & encode_res, &err);
if (encode_res->status == VK_QUERY_RESULT_STATUS_COMPLETE_KHR) { if (encode_res->status == VK_QUERY_RESULT_STATUS_COMPLETE_KHR) {
GST_INFO_OBJECT (self, "The frame %p has been encoded with size %lu", GST_INFO_OBJECT (self, "The frame %p has been encoded with size %"
pic, encode_res->data_size + params_size); G_GUINT64_FORMAT, pic, encode_res->data_size + pic->offset);
gst_buffer_resize (pic->out_buffer, encode_res->offset, gst_buffer_set_size (pic->out_buffer, encode_res->data_size + pic->offset);
encode_res->data_size + params_size);
} else { } else {
GST_ERROR_OBJECT (self, GST_ERROR_OBJECT (self,
"The operation did not complete properly, query status = %d", "The operation did not complete properly, query status = %d",

View file

@ -41,7 +41,7 @@ typedef struct _GstVulkanEncoderPicture GstVulkanEncoderPicture;
/** /**
* GstVulkanEncoderPicture: * GstVulkanEncoderPicture:
* @slotIndex: slot index * @slotIndex: slot index
* @packed_headers: packed headers * @offset: headers offset
* @width: picture width * @width: picture width
* @height: picture height * @height: picture height
* @fps_n: fps numerator * @fps_n: fps numerator
@ -57,8 +57,7 @@ struct _GstVulkanEncoderPicture
{ {
gint slotIndex; gint slotIndex;
/* picture parameters */ guint64 offset;
GPtrArray *packed_headers;
gint width; gint width;
gint height; gint height;