vulkan: replace gst_vulkan_queue_create_decoder() with gst_vulkan_decoder_new_from_queue()

The purpose of this refactor is to hide decoding code from public API.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6723>
This commit is contained in:
Víctor Manuel Jáquez Leal 2024-04-25 14:13:30 +02:00 committed by GStreamer Marge Bot
parent 18c32272bd
commit 1f080391ed
10 changed files with 79 additions and 111 deletions

View file

@ -1314,12 +1314,6 @@ need to use this function.</doc>
<record name="VulkanCommandPoolPrivate" c:type="GstVulkanCommandPoolPrivate" disguised="1"> <record name="VulkanCommandPoolPrivate" c:type="GstVulkanCommandPoolPrivate" disguised="1">
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/vulkan_fwd.h"/> <source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/vulkan_fwd.h"/>
</record> </record>
<record name="VulkanDecoder" c:type="GstVulkanDecoder" disguised="1">
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/vulkan_fwd.h"/>
</record>
<record name="VulkanDecoderClass" c:type="GstVulkanDecoderClass" disguised="1">
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/vulkan_fwd.h"/>
</record>
<class name="VulkanDescriptorCache" c:symbol-prefix="vulkan_descriptor_cache" c:type="GstVulkanDescriptorCache" version="1.18" parent="VulkanHandlePool" glib:type-name="GstVulkanDescriptorCache" glib:get-type="gst_vulkan_descriptor_cache_get_type" glib:type-struct="VulkanDescriptorCacheClass"> <class name="VulkanDescriptorCache" c:symbol-prefix="vulkan_descriptor_cache" c:type="GstVulkanDescriptorCache" version="1.18" parent="VulkanHandlePool" glib:type-name="GstVulkanDescriptorCache" glib:get-type="gst_vulkan_descriptor_cache_get_type" glib:type-struct="VulkanDescriptorCacheClass">
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkdescriptorcache.h"/> <source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkdescriptorcache.h"/>
<constructor name="new" c:identifier="gst_vulkan_descriptor_cache_new" version="1.18"> <constructor name="new" c:identifier="gst_vulkan_descriptor_cache_new" version="1.18">
@ -5169,24 +5163,6 @@ surrounding elements of @element.</doc>
</instance-parameter> </instance-parameter>
</parameters> </parameters>
</method> </method>
<method name="create_decoder" c:identifier="gst_vulkan_queue_create_decoder" version="1.24" introspectable="0">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkqueue.c">Creates a #GstVulkanDecoder object if @codec decoding is supported by @queue</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkqueue.h"/>
<return-value transfer-ownership="full" nullable="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkqueue.c">the #GstVulkanDecoder object</doc>
<type name="VulkanDecoder" c:type="GstVulkanDecoder*"/>
</return-value>
<parameters>
<instance-parameter name="queue" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkqueue.c">a #GstVulkanQueue</doc>
<type name="VulkanQueue" c:type="GstVulkanQueue*"/>
</instance-parameter>
<parameter name="codec" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkqueue.c">the VkVideoCodecOperationFlagBitsKHR to decode</doc>
<type name="guint" c:type="guint"/>
</parameter>
</parameters>
</method>
<method name="get_device" c:identifier="gst_vulkan_queue_get_device" version="1.18"> <method name="get_device" c:identifier="gst_vulkan_queue_get_device" version="1.18">
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkqueue.h"/> <source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkqueue.h"/>
<return-value transfer-ownership="full" nullable="1"> <return-value transfer-ownership="full" nullable="1">

View file

@ -44932,7 +44932,6 @@
"gst_vulkan_physical_device_type_to_string", "gst_vulkan_physical_device_type_to_string",
"gst_vulkan_present_mode_to_string", "gst_vulkan_present_mode_to_string",
"gst_vulkan_queue_create_command_pool", "gst_vulkan_queue_create_command_pool",
"gst_vulkan_queue_create_decoder",
"gst_vulkan_queue_flags_to_string", "gst_vulkan_queue_flags_to_string",
"gst_vulkan_queue_get_device", "gst_vulkan_queue_get_device",
"gst_vulkan_queue_handle_context_query", "gst_vulkan_queue_handle_context_query",

View file

@ -162,7 +162,7 @@ gst_vulkan_h264_decoder_open (GstVideoDecoder * decoder)
return FALSE; return FALSE;
} }
self->decoder = gst_vulkan_queue_create_decoder (self->decode_queue, self->decoder = gst_vulkan_decoder_new_from_queue (self->decode_queue,
VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR); VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR);
if (!self->decoder) { if (!self->decoder) {
GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND, GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND,

View file

@ -220,7 +220,7 @@ gst_vulkan_h265_decoder_open (GstVideoDecoder * decoder)
return FALSE; return FALSE;
} }
self->decoder = gst_vulkan_queue_create_decoder (self->decode_queue, self->decoder = gst_vulkan_decoder_new_from_queue (self->decode_queue,
VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR); VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR);
if (!self->decoder) { if (!self->decoder) {
GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND, GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND,

View file

@ -1310,3 +1310,72 @@ gst_vulkan_decoder_wait (GstVulkanDecoder * self)
return TRUE; return TRUE;
} }
/**
* gst_vulkan_decoder_new_from_queue:
* @queue: a #GstVulkanQueue
* @codec: (type guint): the VkVideoCodecOperationFlagBitsKHR to decode
*
* Creates a #GstVulkanDecoder object if @codec decoding is supported by @queue
*
* Returns: (transfer full) (nullable): the #GstVulkanDecoder object
*/
GstVulkanDecoder *
gst_vulkan_decoder_new_from_queue (GstVulkanQueue * queue, guint codec)
{
GstVulkanPhysicalDevice *device;
GstVulkanDecoder *decoder;
guint flags, expected_flag, supported_video_ops;
const char *extension;
g_return_val_if_fail (GST_IS_VULKAN_QUEUE (queue), NULL);
device = queue->device->physical_device;
expected_flag = VK_QUEUE_VIDEO_DECODE_BIT_KHR;
flags = device->queue_family_props[queue->family].queueFlags;
supported_video_ops = device->queue_family_ops[queue->family].video;
if (device->properties.apiVersion < VK_MAKE_VERSION (1, 3, 238)) {
GST_WARNING_OBJECT (queue,
"Driver API version [%d.%d.%d] doesn't support Video extensions",
VK_VERSION_MAJOR (device->properties.apiVersion),
VK_VERSION_MINOR (device->properties.apiVersion),
VK_VERSION_PATCH (device->properties.apiVersion));
return NULL;
}
switch (codec) {
case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR:
extension = VK_KHR_VIDEO_DECODE_H264_EXTENSION_NAME;
break;
case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR:
extension = VK_KHR_VIDEO_DECODE_H265_EXTENSION_NAME;
break;
default:
GST_WARNING_OBJECT (queue, "Unsupported codec %u", codec);
return NULL;
}
if ((flags & expected_flag) != expected_flag) {
GST_WARNING_OBJECT (queue, "Queue doesn't support decoding");
return NULL;
}
if ((supported_video_ops & codec) != codec) {
GST_WARNING_OBJECT (queue, "Queue doesn't support codec %u decoding",
codec);
return NULL;
}
if (!(gst_vulkan_device_is_extension_enabled (queue->device,
VK_KHR_VIDEO_QUEUE_EXTENSION_NAME)
&& gst_vulkan_device_is_extension_enabled (queue->device,
VK_KHR_VIDEO_DECODE_QUEUE_EXTENSION_NAME)
&& gst_vulkan_device_is_extension_enabled (queue->device, extension)))
return NULL;
decoder = g_object_new (GST_TYPE_VULKAN_DECODER, NULL);
gst_object_ref_sink (decoder);
decoder->queue = gst_object_ref (queue);
decoder->codec = codec;
return decoder;
}

View file

@ -33,6 +33,8 @@ G_BEGIN_DECLS
GST_VULKAN_API GST_VULKAN_API
GType gst_vulkan_decoder_get_type (void); GType gst_vulkan_decoder_get_type (void);
typedef struct _GstVulkanDecoder GstVulkanDecoder;
typedef struct _GstVulkanDecoderClass GstVulkanDecoderClass;
typedef struct _GstVulkanDecoderPicture GstVulkanDecoderPicture; typedef struct _GstVulkanDecoderPicture GstVulkanDecoderPicture;
typedef union _GstVulkanDecoderParameters GstVulkanDecoderParameters; typedef union _GstVulkanDecoderParameters GstVulkanDecoderParameters;
@ -134,6 +136,9 @@ union _GstVulkanDecoderParameters
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GstVulkanDecoder, gst_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (GstVulkanDecoder, gst_object_unref)
GST_VULKAN_API
GstVulkanDecoder * gst_vulkan_decoder_new_from_queue (GstVulkanQueue * queue,
guint codec);
GST_VULKAN_API GST_VULKAN_API
gboolean gst_vulkan_decoder_start (GstVulkanDecoder * self, gboolean gst_vulkan_decoder_start (GstVulkanDecoder * self,
GstVulkanVideoProfile * profile, GstVulkanVideoProfile * profile,

View file

@ -157,81 +157,6 @@ error:
return NULL; return NULL;
} }
/**
* gst_vulkan_queue_create_decoder:
* @queue: a #GstVulkanQueue
* @codec: (type guint): the VkVideoCodecOperationFlagBitsKHR to decode
*
* Creates a #GstVulkanDecoder object if @codec decoding is supported by @queue
*
* Returns: (transfer full) (nullable): the #GstVulkanDecoder object
*
* Since: 1.24
*/
GstVulkanDecoder *
gst_vulkan_queue_create_decoder (GstVulkanQueue * queue, guint codec)
{
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
GstVulkanPhysicalDevice *device;
GstVulkanDecoder *decoder;
guint flags, expected_flag, supported_video_ops;
const char *extension;
g_return_val_if_fail (GST_IS_VULKAN_QUEUE (queue), NULL);
device = queue->device->physical_device;
expected_flag = VK_QUEUE_VIDEO_DECODE_BIT_KHR;
flags = device->queue_family_props[queue->family].queueFlags;
supported_video_ops = device->queue_family_ops[queue->family].video;
if (device->properties.apiVersion < VK_MAKE_VERSION (1, 3, 238)) {
GST_WARNING_OBJECT (queue,
"Driver API version [%d.%d.%d] doesn't support Video extensions",
VK_VERSION_MAJOR (device->properties.apiVersion),
VK_VERSION_MINOR (device->properties.apiVersion),
VK_VERSION_PATCH (device->properties.apiVersion));
return NULL;
}
switch (codec) {
case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR:
extension = VK_KHR_VIDEO_DECODE_H264_EXTENSION_NAME;
break;
case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR:
extension = VK_KHR_VIDEO_DECODE_H265_EXTENSION_NAME;
break;
default:
GST_WARNING_OBJECT (queue, "Unsupported codec %u", codec);
return NULL;
}
if ((flags & expected_flag) != expected_flag) {
GST_WARNING_OBJECT (queue, "Queue doesn't support decoding");
return NULL;
}
if ((supported_video_ops & codec) != codec) {
GST_WARNING_OBJECT (queue, "Queue doesn't support codec %u decoding",
codec);
return NULL;
}
if (!(gst_vulkan_device_is_extension_enabled (queue->device,
VK_KHR_VIDEO_QUEUE_EXTENSION_NAME)
&& gst_vulkan_device_is_extension_enabled (queue->device,
VK_KHR_VIDEO_DECODE_QUEUE_EXTENSION_NAME)
&& gst_vulkan_device_is_extension_enabled (queue->device, extension)))
return NULL;
decoder = g_object_new (GST_TYPE_VULKAN_DECODER, NULL);
gst_object_ref_sink (decoder);
decoder->queue = gst_object_ref (queue);
decoder->codec = codec;
return decoder;
#else
return NULL;
#endif
}
/** /**
* gst_context_set_vulkan_queue: * gst_context_set_vulkan_queue:
* @context: a #GstContext * @context: a #GstContext

View file

@ -80,15 +80,12 @@ struct _GstVulkanQueueClass
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GstVulkanQueue, gst_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (GstVulkanQueue, gst_object_unref)
GST_VULKAN_API GST_VULKAN_API
GstVulkanDevice * gst_vulkan_queue_get_device (GstVulkanQueue * queue); GstVulkanDevice * gst_vulkan_queue_get_device (GstVulkanQueue * queue);
GST_VULKAN_API GST_VULKAN_API
GstVulkanCommandPool * gst_vulkan_queue_create_command_pool (GstVulkanQueue * queue, GstVulkanCommandPool * gst_vulkan_queue_create_command_pool (GstVulkanQueue * queue,
GError ** error); GError ** error);
GST_VULKAN_API
GstVulkanDecoder * gst_vulkan_queue_create_decoder (GstVulkanQueue * queue,
guint codec);
GST_VULKAN_API GST_VULKAN_API
void gst_vulkan_queue_submit_lock (GstVulkanQueue * queue); void gst_vulkan_queue_submit_lock (GstVulkanQueue * queue);

View file

@ -119,9 +119,6 @@ typedef struct _GstVulkanOperation GstVulkanOperation;
typedef struct _GstVulkanOperationClass GstVulkanOperationClass; typedef struct _GstVulkanOperationClass GstVulkanOperationClass;
typedef struct _GstVulkanOperationPrivate GstVulkanOperationPrivate; typedef struct _GstVulkanOperationPrivate GstVulkanOperationPrivate;
typedef struct _GstVulkanDecoder GstVulkanDecoder;
typedef struct _GstVulkanDecoderClass GstVulkanDecoderClass;
G_END_DECLS G_END_DECLS
#endif /* __GST_VULKAN_FWD_H__ */ #endif /* __GST_VULKAN_FWD_H__ */

View file

@ -329,7 +329,7 @@ GST_START_TEST (test_h264_decoder)
return; return;
} }
dec = gst_vulkan_queue_create_decoder (video_queue, dec = gst_vulkan_decoder_new_from_queue (video_queue,
VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR); VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR);
if (!dec) { if (!dec) {
GST_WARNING ("Unable to create a vulkan decoder"); GST_WARNING ("Unable to create a vulkan decoder");
@ -497,7 +497,7 @@ GST_START_TEST (test_h265_decoder)
return; return;
} }
dec = gst_vulkan_queue_create_decoder (video_queue, dec = gst_vulkan_decoder_new_from_queue (video_queue,
VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR); VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR);
if (!dec) { if (!dec) {
GST_WARNING ("Unable to create a vulkan decoder"); GST_WARNING ("Unable to create a vulkan decoder");