gstreamer/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkvideoutils.h
Víctor Manuel Jáquez Leal 1df99ec0d4 vulkan: store in GstVulkanVideoCapabilities encoder and decoder caps
The structure already stored the generic video capabilities and the specific
codec capabilities both for encoding an decoding. The generic decoder
capabilities weren't stored because it was only used internally in the decoder
helper object. Nonetheless, for the encoder, the elements will need the generic
encoder capabilities to configure the encoding. That's why it's required to
expose it as part of GstVulkanVideoCapabilities. And the generic decoder is
included for the sake of symmetry.

While updating the API vkvideoencodeh265 test got some code-style fixes.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8007>
2024-12-04 02:17:44 +00:00

140 lines
3.7 KiB
C

/*
* 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/gst.h>
#include <gst/vulkan/gstvkapi.h>
G_BEGIN_DECLS
/**
* GstVulkanVideoProfile:
* @profile: the generic vulkan video profile
* @codec: the specific codec profile
*
* Since: 1.24
*/
struct _GstVulkanVideoProfile
{
/*< private >*/
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
VkVideoProfileInfoKHR profile;
union {
VkVideoDecodeUsageInfoKHR decode;
/**
* GstVulkanVideoProfile.usage.encode:
*
* Since: 1.26
**/
VkVideoEncodeUsageInfoKHR encode;
} usage;
union {
VkBaseInStructure base;
VkVideoDecodeH264ProfileInfoKHR h264dec;
VkVideoDecodeH265ProfileInfoKHR h265dec;
/**
* GstVulkanVideoProfile.usage.codec.h264enc:
*
* Since: 1.26
**/
VkVideoEncodeH264ProfileInfoKHR h264enc;
/**
* GstVulkanVideoProfile.usage.codec.h265enc:
*
* Since: 1.26
**/
VkVideoEncodeH265ProfileInfoKHR h265enc;
} codec;
#endif
gpointer _reserved[GST_PADDING];
};
/**
* GstVulkanVideoCapabilities:
*
* Since: 1.24
*/
struct _GstVulkanVideoCapabilities
{
/*< private >*/
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
VkVideoCapabilitiesKHR caps;
union
{
struct
{
/*< private >*/
VkVideoDecodeCapabilitiesKHR caps;
union
{
/*< private >*/
VkVideoDecodeH264CapabilitiesKHR h264;
VkVideoDecodeH265CapabilitiesKHR h265;
} codec;
} decoder;
struct
{
/*< private >*/
VkVideoEncodeCapabilitiesKHR caps;
union
{
/*< private >*/
VkVideoEncodeH264CapabilitiesKHR h264;
VkVideoEncodeH265CapabilitiesKHR h265;
} codec;
} encoder;
};
#endif
/*< private >*/
gpointer _reserved[GST_PADDING];
};
/**
* GstVulkanVideoOperation:
* @GST_VULKAN_VIDEO_OPERATION_DECODE: decode operation
* @GST_VULKAN_VIDEO_OPERATION_ENCODE: encode operation
* @GST_VULKAN_VIDEO_OPERATION_UNKNOWN: unknown
*
* The type of video operation.
*
* Since: 1.24
*/
typedef enum {
GST_VULKAN_VIDEO_OPERATION_DECODE = 0,
GST_VULKAN_VIDEO_OPERATION_ENCODE,
GST_VULKAN_VIDEO_OPERATION_UNKNOWN,
} GstVulkanVideoOperation;
GST_VULKAN_API
GstCaps * gst_vulkan_video_profile_to_caps (const GstVulkanVideoProfile * profile);
GST_VULKAN_API
gboolean gst_vulkan_video_profile_from_caps (GstVulkanVideoProfile * profile,
GstCaps * caps,
GstVulkanVideoOperation video_operation);
GST_VULKAN_API
gboolean gst_vulkan_video_profile_is_valid (GstVulkanVideoProfile * profile,
guint codec);
GST_VULKAN_API
gboolean gst_vulkan_video_profile_is_equal (const GstVulkanVideoProfile * a,
const GstVulkanVideoProfile * b);
G_END_DECLS