mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
vkencoder: add gstvkencoder helper object
Add a gstvkencoder class to support Vulkan encoder such as H26X formats. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6676>
This commit is contained in:
parent
66c1383051
commit
1b1593568f
14 changed files with 1822 additions and 34 deletions
|
@ -2269,6 +2269,22 @@ second argument is @data.</doc>
|
||||||
</parameters>
|
</parameters>
|
||||||
</function>
|
</function>
|
||||||
</bitfield>
|
</bitfield>
|
||||||
|
<record name="VulkanEncodeQueryResult" c:type="GstVulkanEncodeQueryResult" version="1.26">
|
||||||
|
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkoperation.h">Encoder query result. Expected to be used in gst_vulkan_operation_get_query()</doc>
|
||||||
|
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkoperation.h"/>
|
||||||
|
<field name="offset" writable="1">
|
||||||
|
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkoperation.h">buffer offset</doc>
|
||||||
|
<type name="guint32" c:type="guint32"/>
|
||||||
|
</field>
|
||||||
|
<field name="data_size" writable="1">
|
||||||
|
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkoperation.h">data size</doc>
|
||||||
|
<type name="guint32" c:type="guint32"/>
|
||||||
|
</field>
|
||||||
|
<field name="status" writable="1">
|
||||||
|
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkoperation.h">status</doc>
|
||||||
|
<type name="guint32" c:type="guint32"/>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
<enumeration name="VulkanError" version="1.18" glib:type-name="GstVulkanError" glib:get-type="gst_vulkan_error_get_type" c:type="GstVulkanError" glib:error-domain="gst-vulkan-error">
|
<enumeration name="VulkanError" version="1.18" glib:type-name="GstVulkanError" glib:get-type="gst_vulkan_error_get_type" c:type="GstVulkanError" glib:error-domain="gst-vulkan-error">
|
||||||
<member name="failed" value="0" c:identifier="GST_VULKAN_FAILED" glib:nick="failed">
|
<member name="failed" value="0" c:identifier="GST_VULKAN_FAILED" glib:nick="failed">
|
||||||
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkerror.h">undetermined error</doc>
|
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkerror.h">undetermined error</doc>
|
||||||
|
@ -3515,6 +3531,24 @@ dest or DPB images.</doc>
|
||||||
</parameter>
|
</parameter>
|
||||||
</parameters>
|
</parameters>
|
||||||
</function>
|
</function>
|
||||||
|
<function name="config_set_encode_caps" c:identifier="gst_vulkan_image_buffer_pool_config_set_encode_caps" version="1.26">
|
||||||
|
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkimagebufferpool.c">Encode @caps are used when the buffers are going to be used either as encoded
|
||||||
|
src or DPB images.</doc>
|
||||||
|
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkimagebufferpool.h"/>
|
||||||
|
<return-value transfer-ownership="none">
|
||||||
|
<type name="none" c:type="void"/>
|
||||||
|
</return-value>
|
||||||
|
<parameters>
|
||||||
|
<parameter name="config" transfer-ownership="none">
|
||||||
|
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkimagebufferpool.c">the #GstStructure with the pool's configuration.</doc>
|
||||||
|
<type name="Gst.Structure" c:type="GstStructure*"/>
|
||||||
|
</parameter>
|
||||||
|
<parameter name="caps" transfer-ownership="none">
|
||||||
|
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkimagebufferpool.c">Upstream encode caps.</doc>
|
||||||
|
<type name="Gst.Caps" c:type="GstCaps*"/>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
</function>
|
||||||
<field name="bufferpool">
|
<field name="bufferpool">
|
||||||
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkimagebufferpool.h">parent #GstBufferPool</doc>
|
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkimagebufferpool.h">parent #GstBufferPool</doc>
|
||||||
<type name="Gst.BufferPool" c:type="GstBufferPool"/>
|
<type name="Gst.BufferPool" c:type="GstBufferPool"/>
|
||||||
|
|
|
@ -17,6 +17,7 @@ G_BEGIN_DECLS
|
||||||
#mesondefine GST_VULKAN_HAVE_WINDOW_WIN32
|
#mesondefine GST_VULKAN_HAVE_WINDOW_WIN32
|
||||||
#mesondefine GST_VULKAN_HAVE_WINDOW_ANDROID
|
#mesondefine GST_VULKAN_HAVE_WINDOW_ANDROID
|
||||||
#mesondefine GST_VULKAN_HAVE_VIDEO_EXTENSIONS
|
#mesondefine GST_VULKAN_HAVE_VIDEO_EXTENSIONS
|
||||||
|
#mesondefine GST_VULKAN_HAVE_VIDEO_ENCODERS
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
|
@ -191,10 +191,10 @@ gst_vulkan_device_constructed (GObject * object)
|
||||||
VK_KHR_VIDEO_DECODE_QUEUE_EXTENSION_NAME,
|
VK_KHR_VIDEO_DECODE_QUEUE_EXTENSION_NAME,
|
||||||
VK_KHR_VIDEO_DECODE_H264_EXTENSION_NAME,
|
VK_KHR_VIDEO_DECODE_H264_EXTENSION_NAME,
|
||||||
VK_KHR_VIDEO_DECODE_H265_EXTENSION_NAME,
|
VK_KHR_VIDEO_DECODE_H265_EXTENSION_NAME,
|
||||||
#ifdef VK_ENABLE_BETA_EXTENSIONS
|
#if GST_VULKAN_HAVE_VIDEO_ENCODERS
|
||||||
VK_KHR_VIDEO_ENCODE_QUEUE_EXTENSION_NAME,
|
VK_KHR_VIDEO_ENCODE_QUEUE_EXTENSION_NAME,
|
||||||
VK_EXT_VIDEO_ENCODE_H264_EXTENSION_NAME,
|
VK_KHR_VIDEO_ENCODE_H264_EXTENSION_NAME,
|
||||||
VK_EXT_VIDEO_ENCODE_H265_EXTENSION_NAME,
|
VK_KHR_VIDEO_ENCODE_H265_EXTENSION_NAME,
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
@ -375,7 +375,7 @@ gst_vulkan_device_choose_queues (GstVulkanDevice * device)
|
||||||
int graph_index, comp_index, tx_index;
|
int graph_index, comp_index, tx_index;
|
||||||
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
|
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
|
||||||
int dec_index = -1;
|
int dec_index = -1;
|
||||||
#ifdef VK_ENABLE_BETA_EXTENSIONS
|
#if GST_VULKAN_HAVE_VIDEO_ENCODERS
|
||||||
int enc_index = -1;
|
int enc_index = -1;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
@ -401,7 +401,7 @@ gst_vulkan_device_choose_queues (GstVulkanDevice * device)
|
||||||
dec_index = _pick_queue_family (queue_family_props, n_queue_families,
|
dec_index = _pick_queue_family (queue_family_props, n_queue_families,
|
||||||
VK_QUEUE_VIDEO_DECODE_BIT_KHR, family_scores);
|
VK_QUEUE_VIDEO_DECODE_BIT_KHR, family_scores);
|
||||||
array = _append_queue_create_info (array, dec_index, queue_family_props);
|
array = _append_queue_create_info (array, dec_index, queue_family_props);
|
||||||
#ifdef VK_ENABLE_BETA_EXTENSIONS
|
#if GST_VULKAN_HAVE_VIDEO_ENCODERS
|
||||||
enc_index = _pick_queue_family (queue_family_props, n_queue_families,
|
enc_index = _pick_queue_family (queue_family_props, n_queue_families,
|
||||||
VK_QUEUE_VIDEO_ENCODE_BIT_KHR, family_scores);
|
VK_QUEUE_VIDEO_ENCODE_BIT_KHR, family_scores);
|
||||||
array = _append_queue_create_info (array, enc_index, queue_family_props);
|
array = _append_queue_create_info (array, enc_index, queue_family_props);
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,193 @@
|
||||||
|
/*
|
||||||
|
* GStreamer
|
||||||
|
* Copyright (C) 2023 Igalia, S.L.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Library General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Library General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Library General Public
|
||||||
|
* License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <gst/vulkan/vulkan.h>
|
||||||
|
|
||||||
|
#define GST_TYPE_VULKAN_ENCODER (gst_vulkan_encoder_get_type())
|
||||||
|
#define GST_VULKAN_ENCODER(o) (G_TYPE_CHECK_INSTANCE_CAST((o), GST_TYPE_VULKAN_ENCODER, GstVulkanEncoder))
|
||||||
|
#define GST_VULKAN_ENCODER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GST_TYPE_VULKAN_ENCODER, GstVulkanEncoderClass))
|
||||||
|
#define GST_IS_VULKAN_ENCODER(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_TYPE_VULKAN_ENCODER))
|
||||||
|
#define GST_IS_VULKAN_ENCODER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE((k), GST_TYPE_VULKAN_ENCODER))
|
||||||
|
#define GST_VULKAN_ENCODER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_TYPE_VULKAN_ENCODER, GstVulkanEncoderClass))
|
||||||
|
GST_VULKAN_API
|
||||||
|
GType gst_vulkan_encoder_get_type (void);
|
||||||
|
|
||||||
|
typedef struct _GstVulkanEncoder GstVulkanEncoder;
|
||||||
|
typedef struct _GstVulkanEncoderClass GstVulkanEncoderClass;
|
||||||
|
typedef union _GstVulkanEncoderParameters GstVulkanEncoderParameters;
|
||||||
|
typedef union _GstVulkanEncoderParametersOverrides GstVulkanEncoderParametersOverrides;
|
||||||
|
typedef union _GstVulkanEncoderParametersFeedback GstVulkanEncoderParametersFeedback;
|
||||||
|
typedef struct _GstVulkanEncodePicture GstVulkanEncodePicture;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GstVulkanEncodePicture:
|
||||||
|
* @is_ref: picture is reference
|
||||||
|
* @nb_refs: number of references
|
||||||
|
* @slotIndex: slot index
|
||||||
|
* @packed_headers: packed headers
|
||||||
|
* @pic_num: picture number
|
||||||
|
* @pic_order_cnt: order count
|
||||||
|
* @width: picture width
|
||||||
|
* @height: picture height
|
||||||
|
* @fps_n: fps numerator
|
||||||
|
* @fps_d: fps denominator
|
||||||
|
* @in_buffer: input buffer
|
||||||
|
* @out_buffer: output buffer
|
||||||
|
*
|
||||||
|
* It contains the whole state for encoding a single picture.
|
||||||
|
*
|
||||||
|
* Since: 1.24
|
||||||
|
*/
|
||||||
|
struct _GstVulkanEncodePicture
|
||||||
|
{
|
||||||
|
gboolean is_ref;
|
||||||
|
gint nb_refs;
|
||||||
|
gint slotIndex;
|
||||||
|
|
||||||
|
/* picture parameters */
|
||||||
|
GPtrArray *packed_headers;
|
||||||
|
|
||||||
|
gint pic_num;
|
||||||
|
gint pic_order_cnt;
|
||||||
|
|
||||||
|
gint width;
|
||||||
|
gint height;
|
||||||
|
|
||||||
|
gint fps_n;
|
||||||
|
gint fps_d;
|
||||||
|
|
||||||
|
GstBuffer *in_buffer;
|
||||||
|
GstBuffer *dpb_buffer;
|
||||||
|
GstBuffer *out_buffer;
|
||||||
|
|
||||||
|
/* Input frame */
|
||||||
|
GstVulkanImageView *img_view;
|
||||||
|
GstVulkanImageView *dpb_view;
|
||||||
|
|
||||||
|
VkVideoPictureResourceInfoKHR dpb;
|
||||||
|
|
||||||
|
void *codec_rc_info;
|
||||||
|
void *codec_pic_info;
|
||||||
|
void *codec_rc_layer_info;
|
||||||
|
void *codec_dpb_slot_info;
|
||||||
|
void *codec_quality_level;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GstVulkanEncoder:
|
||||||
|
* @parent: the parent #GstObject
|
||||||
|
* @queue: the #GstVulkanQueue to command buffers will be allocated from
|
||||||
|
*
|
||||||
|
* Since: 1.24
|
||||||
|
**/
|
||||||
|
struct _GstVulkanEncoder
|
||||||
|
{
|
||||||
|
GstObject parent;
|
||||||
|
|
||||||
|
GstVulkanQueue *queue;
|
||||||
|
|
||||||
|
guint codec;
|
||||||
|
|
||||||
|
/* <private> */
|
||||||
|
gpointer _reserved [GST_PADDING];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GstVulkanEncoderClass:
|
||||||
|
* @parent_class: the parent #GstObjectClass
|
||||||
|
*
|
||||||
|
* Since: 1.24
|
||||||
|
*/
|
||||||
|
struct _GstVulkanEncoderClass
|
||||||
|
{
|
||||||
|
GstObjectClass parent;
|
||||||
|
/* <private> */
|
||||||
|
gpointer _reserved [GST_PADDING];
|
||||||
|
};
|
||||||
|
|
||||||
|
union _GstVulkanEncoderParameters
|
||||||
|
{
|
||||||
|
/*< private >*/
|
||||||
|
VkVideoEncodeH264SessionParametersCreateInfoKHR h264;
|
||||||
|
VkVideoEncodeH265SessionParametersCreateInfoKHR h265;
|
||||||
|
};
|
||||||
|
|
||||||
|
union _GstVulkanEncoderParametersOverrides
|
||||||
|
{
|
||||||
|
/*< private >*/
|
||||||
|
VkVideoEncodeH264SessionParametersGetInfoKHR h264;
|
||||||
|
VkVideoEncodeH265SessionParametersGetInfoKHR h265;
|
||||||
|
};
|
||||||
|
|
||||||
|
union _GstVulkanEncoderParametersFeedback
|
||||||
|
{
|
||||||
|
VkVideoEncodeH264SessionParametersFeedbackInfoKHR h264;
|
||||||
|
VkVideoEncodeH265SessionParametersFeedbackInfoKHR h265;
|
||||||
|
};
|
||||||
|
|
||||||
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GstVulkanEncoder, gst_object_unref)
|
||||||
|
|
||||||
|
GST_VULKAN_API
|
||||||
|
GstVulkanEncoder * gst_vulkan_encoder_create_from_queue (GstVulkanQueue * queue,
|
||||||
|
guint codec);
|
||||||
|
|
||||||
|
GST_VULKAN_API
|
||||||
|
gboolean gst_vulkan_encoder_start (GstVulkanEncoder * self,
|
||||||
|
GstVulkanVideoProfile * profile,
|
||||||
|
guint32 out_buffer_size,
|
||||||
|
GError ** error);
|
||||||
|
GST_VULKAN_API
|
||||||
|
gboolean gst_vulkan_encoder_stop (GstVulkanEncoder * self);
|
||||||
|
GST_VULKAN_API
|
||||||
|
gboolean gst_vulkan_encoder_update_video_session_parameters
|
||||||
|
(GstVulkanEncoder * self,
|
||||||
|
GstVulkanEncoderParameters *enc_params,
|
||||||
|
GError ** error);
|
||||||
|
GST_VULKAN_API
|
||||||
|
gboolean gst_vulkan_encoder_video_session_parameters_overrides
|
||||||
|
(GstVulkanEncoder * self,
|
||||||
|
GstVulkanEncoderParametersOverrides * params,
|
||||||
|
GstVulkanEncoderParametersFeedback * feedback,
|
||||||
|
gsize * data_size,
|
||||||
|
gpointer * data,
|
||||||
|
GError ** error);
|
||||||
|
GST_VULKAN_API
|
||||||
|
gboolean gst_vulkan_encoder_create_dpb_pool (GstVulkanEncoder * self,
|
||||||
|
GstCaps * caps);
|
||||||
|
GST_VULKAN_API
|
||||||
|
gboolean gst_vulkan_encoder_encode (GstVulkanEncoder * self,
|
||||||
|
GstVulkanEncodePicture * pic,
|
||||||
|
GstVulkanEncodePicture ** ref_pics);
|
||||||
|
GST_VULKAN_API
|
||||||
|
gboolean gst_vulkan_encoder_caps (GstVulkanEncoder * self,
|
||||||
|
GstVulkanVideoCapabilities * caps);
|
||||||
|
GST_VULKAN_API
|
||||||
|
GstCaps * gst_vulkan_encoder_profile_caps (GstVulkanEncoder * self);
|
||||||
|
GST_VULKAN_API
|
||||||
|
GstVulkanEncodePicture * gst_vulkan_encode_picture_new (GstVulkanEncoder * self,
|
||||||
|
GstBuffer * in_buffer,
|
||||||
|
gint width,
|
||||||
|
gint height,
|
||||||
|
gboolean is_ref,
|
||||||
|
gint nb_refs);
|
||||||
|
GST_VULKAN_API
|
||||||
|
void gst_vulkan_encode_picture_free (GstVulkanEncodePicture * pic);
|
|
@ -48,8 +48,8 @@ struct _GstVulkanImageBufferPoolPrivate
|
||||||
VkFormat vk_fmts[GST_VIDEO_MAX_PLANES];
|
VkFormat vk_fmts[GST_VIDEO_MAX_PLANES];
|
||||||
int n_imgs;
|
int n_imgs;
|
||||||
guint32 n_layers;
|
guint32 n_layers;
|
||||||
gboolean has_profile;
|
guint32 n_profiles;
|
||||||
GstVulkanVideoProfile profile;
|
GstVulkanVideoProfile profiles[2];
|
||||||
GstVulkanOperation *exec;
|
GstVulkanOperation *exec;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -109,11 +109,30 @@ gst_vulkan_image_buffer_pool_config_set_decode_caps (GstStructure * config,
|
||||||
gst_structure_set (config, "decode-caps", GST_TYPE_CAPS, caps, NULL);
|
gst_structure_set (config, "decode-caps", GST_TYPE_CAPS, caps, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_vulkan_image_buffer_pool_config_set_encode_caps:
|
||||||
|
* @config: the #GstStructure with the pool's configuration.
|
||||||
|
* @caps: Upstream encode caps.
|
||||||
|
*
|
||||||
|
* Encode @caps are used when the buffers are going to be used either as encoded
|
||||||
|
* src or DPB images.
|
||||||
|
*
|
||||||
|
* Since: 1.26
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gst_vulkan_image_buffer_pool_config_set_encode_caps (GstStructure * config,
|
||||||
|
GstCaps * caps)
|
||||||
|
{
|
||||||
|
g_return_if_fail (GST_IS_CAPS (caps));
|
||||||
|
|
||||||
|
gst_structure_set (config, "encode-caps", GST_TYPE_CAPS, caps, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static inline gboolean
|
static inline gboolean
|
||||||
gst_vulkan_image_buffer_pool_config_get_allocation_params (GstStructure *
|
gst_vulkan_image_buffer_pool_config_get_allocation_params (GstStructure *
|
||||||
config, VkImageUsageFlags * usage, VkMemoryPropertyFlags * mem_props,
|
config, VkImageUsageFlags * usage, VkMemoryPropertyFlags * mem_props,
|
||||||
VkImageLayout * initial_layout, guint64 * initial_access,
|
VkImageLayout * initial_layout, guint64 * initial_access,
|
||||||
guint32 * n_layers, GstCaps ** decode_caps)
|
guint32 * n_layers, GstCaps ** decode_caps, GstCaps ** encode_caps)
|
||||||
{
|
{
|
||||||
if (!gst_structure_get_uint (config, "usage", usage)) {
|
if (!gst_structure_get_uint (config, "usage", usage)) {
|
||||||
*usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT
|
*usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT
|
||||||
|
@ -136,6 +155,9 @@ gst_vulkan_image_buffer_pool_config_get_allocation_params (GstStructure *
|
||||||
if (decode_caps)
|
if (decode_caps)
|
||||||
gst_structure_get (config, "decode-caps", GST_TYPE_CAPS, decode_caps, NULL);
|
gst_structure_get (config, "decode-caps", GST_TYPE_CAPS, decode_caps, NULL);
|
||||||
|
|
||||||
|
if (encode_caps)
|
||||||
|
gst_structure_get (config, "encode-caps", GST_TYPE_CAPS, encode_caps, NULL);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -149,7 +171,8 @@ gst_vulkan_image_buffer_pool_set_config (GstBufferPool * pool,
|
||||||
VkImageUsageFlags requested_usage, supported_usage;
|
VkImageUsageFlags requested_usage, supported_usage;
|
||||||
VkImageCreateInfo image_info;
|
VkImageCreateInfo image_info;
|
||||||
guint min_buffers, max_buffers;
|
guint min_buffers, max_buffers;
|
||||||
GstCaps *caps = NULL, *decode_caps = NULL;
|
GstCaps *caps = NULL, *decode_caps = NULL, *encode_caps = NULL;
|
||||||
|
|
||||||
GstCapsFeatures *features;
|
GstCapsFeatures *features;
|
||||||
gboolean found, no_multiplane, ret = TRUE;
|
gboolean found, no_multiplane, ret = TRUE;
|
||||||
guint i;
|
guint i;
|
||||||
|
@ -176,27 +199,37 @@ gst_vulkan_image_buffer_pool_set_config (GstBufferPool * pool,
|
||||||
|
|
||||||
gst_vulkan_image_buffer_pool_config_get_allocation_params (config,
|
gst_vulkan_image_buffer_pool_config_get_allocation_params (config,
|
||||||
&priv->usage, &priv->mem_props, &priv->initial_layout,
|
&priv->usage, &priv->mem_props, &priv->initial_layout,
|
||||||
&priv->initial_access, &priv->n_layers, &decode_caps);
|
&priv->initial_access, &priv->n_layers, &decode_caps, &encode_caps);
|
||||||
|
|
||||||
|
|
||||||
priv->has_profile = FALSE;
|
|
||||||
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
|
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
|
||||||
if (decode_caps && ((priv->usage
|
{
|
||||||
& (VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR
|
guint n = 0;
|
||||||
| VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR)) != 0)) {
|
if (decode_caps && ((priv->usage
|
||||||
priv->has_profile =
|
& (VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR
|
||||||
gst_vulkan_video_profile_from_caps (&priv->profile, decode_caps,
|
| VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR)) != 0)) {
|
||||||
GST_VULKAN_VIDEO_OPERATION_DECODE);
|
n++;
|
||||||
}
|
if (gst_vulkan_video_profile_from_caps (&priv->profiles[priv->n_profiles],
|
||||||
|
decode_caps, GST_VULKAN_VIDEO_OPERATION_DECODE))
|
||||||
|
priv->n_profiles++;
|
||||||
|
}
|
||||||
|
gst_clear_caps (&decode_caps);
|
||||||
|
#if GST_VULKAN_HAVE_VIDEO_ENCODERS
|
||||||
|
if (encode_caps && ((priv->usage
|
||||||
|
& (VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR
|
||||||
|
| VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR)) != 0)) {
|
||||||
|
n++;
|
||||||
|
if (gst_vulkan_video_profile_from_caps (&priv->profiles[priv->n_profiles],
|
||||||
|
encode_caps, GST_VULKAN_VIDEO_OPERATION_ENCODE))
|
||||||
|
priv->n_profiles++;
|
||||||
|
}
|
||||||
|
gst_clear_caps (&encode_caps);
|
||||||
#endif
|
#endif
|
||||||
gst_clear_caps (&decode_caps);
|
|
||||||
|
|
||||||
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
|
if (priv->n_profiles != n)
|
||||||
if (((priv->usage & (VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR
|
goto missing_profile;
|
||||||
| VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR)) != 0)
|
}
|
||||||
&& !priv->has_profile)
|
if (priv->n_profiles > 0) {
|
||||||
goto missing_profile;
|
|
||||||
|
|
||||||
if (priv->has_profile) {
|
|
||||||
no_multiplane = FALSE;
|
no_multiplane = FALSE;
|
||||||
|
|
||||||
/* HACK(victor): NVIDIA & RADV drivers don't report decoding features for
|
/* HACK(victor): NVIDIA & RADV drivers don't report decoding features for
|
||||||
|
@ -249,10 +282,12 @@ gst_vulkan_image_buffer_pool_set_config (GstBufferPool * pool,
|
||||||
GstVulkanImageMemory *img_mem;
|
GstVulkanImageMemory *img_mem;
|
||||||
guint width, height;
|
guint width, height;
|
||||||
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
|
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
|
||||||
|
VkVideoProfileInfoKHR profiles[] =
|
||||||
|
{ priv->profiles[0].profile, priv->profiles[1].profile };
|
||||||
VkVideoProfileListInfoKHR profile_list = {
|
VkVideoProfileListInfoKHR profile_list = {
|
||||||
.sType = VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR,
|
.sType = VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR,
|
||||||
.profileCount = 1,
|
.profileCount = priv->n_profiles,
|
||||||
.pProfiles = &priv->profile.profile,
|
.pProfiles = profiles,
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -269,7 +304,7 @@ gst_vulkan_image_buffer_pool_set_config (GstBufferPool * pool,
|
||||||
image_info.extent = (VkExtent3D) { width, height, 1 };
|
image_info.extent = (VkExtent3D) { width, height, 1 };
|
||||||
/* *INDENT-ON* */
|
/* *INDENT-ON* */
|
||||||
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
|
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
|
||||||
if (priv->has_profile)
|
if (priv->n_profiles > 0)
|
||||||
image_info.pNext = &profile_list;
|
image_info.pNext = &profile_list;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -456,10 +491,12 @@ gst_vulkan_image_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer,
|
||||||
GstMemory *mem;
|
GstMemory *mem;
|
||||||
guint width, height;
|
guint width, height;
|
||||||
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
|
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
|
||||||
|
VkVideoProfileInfoKHR profiles[] =
|
||||||
|
{ priv->profiles[0].profile, priv->profiles[1].profile };
|
||||||
VkVideoProfileListInfoKHR profile_list = {
|
VkVideoProfileListInfoKHR profile_list = {
|
||||||
.sType = VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR,
|
.sType = VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR,
|
||||||
.profileCount = 1,
|
.profileCount = priv->n_profiles,
|
||||||
.pProfiles = &priv->profile.profile,
|
.pProfiles = profiles,
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -476,7 +513,7 @@ gst_vulkan_image_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer,
|
||||||
image_info.extent = (VkExtent3D) { width, height, 1 };
|
image_info.extent = (VkExtent3D) { width, height, 1 };
|
||||||
/* *INDENT-ON* */
|
/* *INDENT-ON* */
|
||||||
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
|
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
|
||||||
if (priv->has_profile)
|
if (priv->n_profiles > 0)
|
||||||
image_info.pNext = &profile_list;
|
image_info.pNext = &profile_list;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -93,6 +93,11 @@ void gst_vulkan_image_buffer_pool_config_set_decode_caps
|
||||||
(GstStructure * config,
|
(GstStructure * config,
|
||||||
GstCaps * caps);
|
GstCaps * caps);
|
||||||
|
|
||||||
|
GST_VULKAN_API
|
||||||
|
void gst_vulkan_image_buffer_pool_config_set_encode_caps
|
||||||
|
(GstStructure * config,
|
||||||
|
GstCaps * caps);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __GST_VULKAN_IMAGE_BUFFER_POOL_H__ */
|
#endif /* __GST_VULKAN_IMAGE_BUFFER_POOL_H__ */
|
||||||
|
|
|
@ -1249,7 +1249,14 @@ gst_vulkan_operation_enable_query (GstVulkanOperation * self,
|
||||||
if (priv->has_video)
|
if (priv->has_video)
|
||||||
stride = sizeof (guint32);
|
stride = sizeof (guint32);
|
||||||
break;
|
break;
|
||||||
|
#if GST_VULKAN_HAVE_VIDEO_ENCODERS
|
||||||
|
case VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR:
|
||||||
|
if (priv->has_video)
|
||||||
|
stride = sizeof (GstVulkanEncodeQueryResult);
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1291,7 +1298,11 @@ gst_vulkan_operation_get_query (GstVulkanOperation * self, gpointer * result,
|
||||||
|
|
||||||
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
|
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
|
||||||
if (priv->has_video
|
if (priv->has_video
|
||||||
&& (priv->query_type == VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR)) {
|
&& (priv->query_type == VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR
|
||||||
|
#if GST_VULKAN_HAVE_VIDEO_ENCODERS
|
||||||
|
|| priv->query_type == VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR
|
||||||
|
#endif
|
||||||
|
)) {
|
||||||
flags |= VK_QUERY_RESULT_WITH_STATUS_BIT_KHR;
|
flags |= VK_QUERY_RESULT_WITH_STATUS_BIT_KHR;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -63,6 +63,23 @@ struct _GstVulkanOperationClass
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GstVulkanEncodeQueryResult:
|
||||||
|
* @offset: buffer offset
|
||||||
|
* @data_size: data size
|
||||||
|
* @status: status
|
||||||
|
*
|
||||||
|
* Encoder query result. Expected to be used in gst_vulkan_operation_get_query()
|
||||||
|
*
|
||||||
|
* Since: 1.26
|
||||||
|
*/
|
||||||
|
struct _GstVulkanEncodeQueryResult
|
||||||
|
{
|
||||||
|
guint32 offset;
|
||||||
|
guint32 data_size;
|
||||||
|
guint32 status;
|
||||||
|
};
|
||||||
|
|
||||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GstVulkanOperation, gst_object_unref)
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GstVulkanOperation, gst_object_unref)
|
||||||
|
|
||||||
GST_VULKAN_API
|
GST_VULKAN_API
|
||||||
|
|
|
@ -37,6 +37,12 @@ const VkExtensionProperties _vk_codec_extensions[] = {
|
||||||
.extensionName = VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_EXTENSION_NAME,
|
.extensionName = VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_EXTENSION_NAME,
|
||||||
.specVersion = VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_SPEC_VERSION,
|
.specVersion = VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_SPEC_VERSION,
|
||||||
},
|
},
|
||||||
|
#if GST_VULKAN_HAVE_VIDEO_ENCODERS
|
||||||
|
[GST_VK_VIDEO_EXTENSION_ENCODE_H264] = {
|
||||||
|
.extensionName = VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_EXTENSION_NAME,
|
||||||
|
.specVersion = VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_SPEC_VERSION,
|
||||||
|
},
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
const VkComponentMapping _vk_identity_component_map = {
|
const VkComponentMapping _vk_identity_component_map = {
|
||||||
|
@ -66,6 +72,9 @@ gst_vulkan_video_get_vk_functions (GstVulkanInstance * instance,
|
||||||
} \
|
} \
|
||||||
} G_STMT_END;
|
} G_STMT_END;
|
||||||
GST_VULKAN_VIDEO_FN_LIST (GET_PROC_ADDRESS_REQUIRED)
|
GST_VULKAN_VIDEO_FN_LIST (GET_PROC_ADDRESS_REQUIRED)
|
||||||
|
#if GST_VULKAN_HAVE_VIDEO_ENCODERS
|
||||||
|
GST_VULKAN_VIDEO_ENCODING_FN_LIST (GET_PROC_ADDRESS_REQUIRED)
|
||||||
|
#endif
|
||||||
#undef GET_PROC_ADDRESS_REQUIRED
|
#undef GET_PROC_ADDRESS_REQUIRED
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,8 @@ struct _GstVulkanVideoSession
|
||||||
typedef enum {
|
typedef enum {
|
||||||
GST_VK_VIDEO_EXTENSION_DECODE_H264,
|
GST_VK_VIDEO_EXTENSION_DECODE_H264,
|
||||||
GST_VK_VIDEO_EXTENSION_DECODE_H265,
|
GST_VK_VIDEO_EXTENSION_DECODE_H265,
|
||||||
|
GST_VK_VIDEO_EXTENSION_ENCODE_H264,
|
||||||
|
GST_VK_VIDEO_EXTENSION_ENCODE_H265,
|
||||||
} GST_VK_VIDEO_EXTENSIONS;
|
} GST_VK_VIDEO_EXTENSIONS;
|
||||||
|
|
||||||
#define GST_VULKAN_VIDEO_FN_LIST(V) \
|
#define GST_VULKAN_VIDEO_FN_LIST(V) \
|
||||||
|
@ -61,14 +63,23 @@ typedef enum {
|
||||||
V(CmdEndVideoCoding) \
|
V(CmdEndVideoCoding) \
|
||||||
V(CmdDecodeVideo)
|
V(CmdDecodeVideo)
|
||||||
|
|
||||||
|
#if GST_VULKAN_HAVE_VIDEO_ENCODERS
|
||||||
|
#define GST_VULKAN_VIDEO_ENCODING_FN_LIST(V) \
|
||||||
|
V(CmdEncodeVideo) \
|
||||||
|
V(GetEncodedVideoSessionParameters)
|
||||||
|
#endif
|
||||||
|
|
||||||
struct _GstVulkanVideoFunctions
|
struct _GstVulkanVideoFunctions
|
||||||
{
|
{
|
||||||
#define DEFINE_FUNCTION(name) G_PASTE(G_PASTE(PFN_vk, name), KHR) name;
|
#define DEFINE_FUNCTION(name) G_PASTE(G_PASTE(PFN_vk, name), KHR) name;
|
||||||
GST_VULKAN_VIDEO_FN_LIST (DEFINE_FUNCTION)
|
GST_VULKAN_VIDEO_FN_LIST (DEFINE_FUNCTION)
|
||||||
|
#if GST_VULKAN_HAVE_VIDEO_ENCODERS
|
||||||
|
GST_VULKAN_VIDEO_ENCODING_FN_LIST (DEFINE_FUNCTION)
|
||||||
|
#endif
|
||||||
#undef DEFINE_FUNCTION
|
#undef DEFINE_FUNCTION
|
||||||
};
|
};
|
||||||
|
|
||||||
extern const VkExtensionProperties _vk_codec_extensions[2];
|
extern const VkExtensionProperties _vk_codec_extensions[3];
|
||||||
extern const VkComponentMapping _vk_identity_component_map;
|
extern const VkComponentMapping _vk_identity_component_map;
|
||||||
|
|
||||||
gboolean gst_vulkan_video_get_vk_functions (GstVulkanInstance * instance,
|
gboolean gst_vulkan_video_get_vk_functions (GstVulkanInstance * instance,
|
||||||
|
|
|
@ -39,6 +39,9 @@ struct _GstVulkanVideoProfile
|
||||||
VkVideoProfileInfoKHR profile;
|
VkVideoProfileInfoKHR profile;
|
||||||
union {
|
union {
|
||||||
VkVideoDecodeUsageInfoKHR decode;
|
VkVideoDecodeUsageInfoKHR decode;
|
||||||
|
#if GST_VULKAN_HAVE_VIDEO_ENCODERS
|
||||||
|
VkVideoEncodeUsageInfoKHR encode;
|
||||||
|
#endif
|
||||||
} usage;
|
} usage;
|
||||||
|
|
||||||
union {
|
union {
|
||||||
|
@ -65,6 +68,10 @@ struct _GstVulkanVideoCapabilities
|
||||||
VkBaseInStructure base;
|
VkBaseInStructure base;
|
||||||
VkVideoDecodeH264CapabilitiesKHR h264dec;
|
VkVideoDecodeH264CapabilitiesKHR h264dec;
|
||||||
VkVideoDecodeH265CapabilitiesKHR h265dec;
|
VkVideoDecodeH265CapabilitiesKHR h265dec;
|
||||||
|
#if GST_VULKAN_HAVE_VIDEO_ENCODERS
|
||||||
|
VkVideoEncodeH264CapabilitiesKHR h264enc;
|
||||||
|
VkVideoEncodeH265CapabilitiesKHR h265enc;
|
||||||
|
#endif
|
||||||
} codec;
|
} codec;
|
||||||
#endif
|
#endif
|
||||||
gpointer _reserved[GST_PADDING];
|
gpointer _reserved[GST_PADDING];
|
||||||
|
|
|
@ -100,6 +100,7 @@ vulkan_conf_options = [
|
||||||
'GST_VULKAN_HAVE_WINDOW_WIN32',
|
'GST_VULKAN_HAVE_WINDOW_WIN32',
|
||||||
'GST_VULKAN_HAVE_WINDOW_ANDROID',
|
'GST_VULKAN_HAVE_WINDOW_ANDROID',
|
||||||
'GST_VULKAN_HAVE_VIDEO_EXTENSIONS',
|
'GST_VULKAN_HAVE_VIDEO_EXTENSIONS',
|
||||||
|
'GST_VULKAN_HAVE_VIDEO_ENCODERS',
|
||||||
]
|
]
|
||||||
|
|
||||||
foreach option : vulkan_conf_options
|
foreach option : vulkan_conf_options
|
||||||
|
@ -337,6 +338,29 @@ static StdVideoH265PictureParameterSet h265_pps;
|
||||||
'gstvkvideo-private.c',
|
'gstvkvideo-private.c',
|
||||||
'gstvkdecoder-private.c',
|
'gstvkdecoder-private.c',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
encoder_test = '''
|
||||||
|
#include <vulkan/vulkan.h>
|
||||||
|
|
||||||
|
#if !(defined(VERSION_1_4) || (defined(VK_VERSION_1_3) && VK_HEADER_VERSION >= 275))
|
||||||
|
#error "Need at least Vulkan 1.3.275"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static VkVideoEncodeH264ProfileInfoKHR h264_profile;
|
||||||
|
static VkVideoEncodeH265ProfileInfoKHR h265_profile;
|
||||||
|
'''
|
||||||
|
if vulkan_inc_dir != ''
|
||||||
|
have_vk_encoder = cc.compiles(encoder_test, dependencies : vulkan_dep, args: '-I' + vulkan_inc_dir)
|
||||||
|
else
|
||||||
|
have_vk_encoder = cc.compiles(encoder_test, dependencies : vulkan_dep)
|
||||||
|
endif
|
||||||
|
if have_vk_encoder
|
||||||
|
vulkan_conf.set('GST_VULKAN_HAVE_VIDEO_ENCODERS', 1)
|
||||||
|
vulkan_sources += files(
|
||||||
|
'gstvkencoder-private.c',
|
||||||
|
)
|
||||||
|
endif
|
||||||
|
|
||||||
elif get_option('vulkan-video').enabled()
|
elif get_option('vulkan-video').enabled()
|
||||||
error('Vulkan Video extensions headers not found')
|
error('Vulkan Video extensions headers not found')
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -118,6 +118,7 @@ typedef struct _GstVulkanVideoCapabilities GstVulkanVideoCapabilities;
|
||||||
typedef struct _GstVulkanOperation GstVulkanOperation;
|
typedef struct _GstVulkanOperation GstVulkanOperation;
|
||||||
typedef struct _GstVulkanOperationClass GstVulkanOperationClass;
|
typedef struct _GstVulkanOperationClass GstVulkanOperationClass;
|
||||||
typedef struct _GstVulkanOperationPrivate GstVulkanOperationPrivate;
|
typedef struct _GstVulkanOperationPrivate GstVulkanOperationPrivate;
|
||||||
|
typedef struct _GstVulkanEncodeQueryResult GstVulkanEncodeQueryResult;
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue