gstreamer/subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkdecoder-private.h
Víctor Manuel Jáquez Leal 1f080391ed 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>
2024-04-26 16:24:22 +00:00

202 lines
7.9 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/vulkan/gstvkqueue.h>
G_BEGIN_DECLS
#define GST_TYPE_VULKAN_DECODER (gst_vulkan_decoder_get_type())
#define GST_VULKAN_DECODER(o) (G_TYPE_CHECK_INSTANCE_CAST((o), GST_TYPE_VULKAN_DECODER, GstVulkanDecoder))
#define GST_VULKAN_DECODER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GST_TYPE_VULKAN_DECODER, GstVulkanDecoderClass))
#define GST_IS_VULKAN_DECODER(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_TYPE_VULKAN_DECODER))
#define GST_IS_VULKAN_DECODER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE((k), GST_TYPE_VULKAN_DECODER))
#define GST_VULKAN_DECODER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_TYPE_VULKAN_DECODER, GstVulkanDecoderClass))
GST_VULKAN_API
GType gst_vulkan_decoder_get_type (void);
typedef struct _GstVulkanDecoder GstVulkanDecoder;
typedef struct _GstVulkanDecoderClass GstVulkanDecoderClass;
typedef struct _GstVulkanDecoderPicture GstVulkanDecoderPicture;
typedef union _GstVulkanDecoderParameters GstVulkanDecoderParameters;
/**
* GstVulkanDecoderPicture:
* @out: output buffer
* @dpb: DPB representation of @out if needed by driver
* @img_view_ref: image view for reference
* @img_view_out: image view for output
* @slice_offs: array of offsets of each uploaded slice
* @refs: references required to decode current pictures
*
* It contains the whole state for decoding a single picture.
*
* Since: 1.24
*/
struct _GstVulkanDecoderPicture
{
GstBuffer *out;
GstBuffer *dpb; /* only used for out-of-place decoding */
GstVulkanImageView *img_view_ref; /* Image representation view (reference) */
GstVulkanImageView *img_view_out; /* Image representation view (output-only) */
GArray *slice_offs;
/* Picture refs. H264 has the maximum number of refs (36) of any supported
* codec. */
GstVulkanDecoderPicture *refs[36];
/*< private >*/
VkVideoPictureResourceInfoKHR pics_res[36];
VkVideoReferenceSlotInfoKHR slots[36];
/* Current picture */
VkVideoPictureResourceInfoKHR pic_res;
VkVideoReferenceSlotInfoKHR slot;
/* Main decoding struct */
VkVideoDecodeInfoKHR decode_info;
};
/**
* GstVulkanDecoder:
* @parent: the parent #GstObject
* @queue: the #GstVulkanQueue to command buffers will be allocated from
* @codec: the configured video codec operation
* @profile: the configured #GstVulkanVideoProfile
* @input_buffer: the buffer to upload the bitstream to decode
* @dedicated_dpb: if decoder needs a dedicated DPB
* @layered_dpb: if decoder's dedicated DPB has to be a layered image
*
* Since: 1.24
**/
struct _GstVulkanDecoder
{
GstObject parent;
GstVulkanQueue *queue;
guint codec;
GstVulkanVideoProfile profile;
GstBuffer *input_buffer;
GstBuffer *layered_buffer;
gboolean dedicated_dpb;
gboolean layered_dpb;
/*< private >*/
gpointer _reserved [GST_PADDING];
};
/**
* GstVulkanDecoderClass:
* @parent_class: the parent #GstObjectClass
*
* Since: 1.24
*/
struct _GstVulkanDecoderClass
{
GstObjectClass parent;
/*< private >*/
gpointer _reserved [GST_PADDING];
};
/**
* GstVulkanDecoderParameters:
*
* Codec specific parameters.
*
* Since: 1.24
*/
union _GstVulkanDecoderParameters
{
/*< private >*/
VkVideoDecodeH264SessionParametersCreateInfoKHR h264;
VkVideoDecodeH265SessionParametersCreateInfoKHR h265;
};
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
gboolean gst_vulkan_decoder_start (GstVulkanDecoder * self,
GstVulkanVideoProfile * profile,
GError ** error);
GST_VULKAN_API
gboolean gst_vulkan_decoder_stop (GstVulkanDecoder * self);
GST_VULKAN_API
gboolean gst_vulkan_decoder_update_video_session_parameters
(GstVulkanDecoder * self,
GstVulkanDecoderParameters * params,
GError ** error);
GST_VULKAN_API
gboolean gst_vulkan_decoder_create_dpb_pool (GstVulkanDecoder * self,
GstCaps * caps);
GST_VULKAN_API
gboolean gst_vulkan_decoder_flush (GstVulkanDecoder * self,
GError ** error);
GST_VULKAN_API
gboolean gst_vulkan_decoder_decode (GstVulkanDecoder * self,
GstVulkanDecoderPicture * pic,
GError ** error);
GST_VULKAN_API
gboolean gst_vulkan_decoder_is_started (GstVulkanDecoder * self);
GST_VULKAN_API
gboolean gst_vulkan_decoder_caps (GstVulkanDecoder * self,
GstVulkanVideoCapabilities * caps);
GST_VULKAN_API
gboolean gst_vulkan_decoder_out_format (GstVulkanDecoder * self,
VkVideoFormatPropertiesKHR * format);
GST_VULKAN_API
GstCaps * gst_vulkan_decoder_profile_caps (GstVulkanDecoder * self);
GST_VULKAN_API
gboolean gst_vulkan_decoder_update_ycbcr_sampler (GstVulkanDecoder * self,
VkSamplerYcbcrRange range,
VkChromaLocation xloc,
VkChromaLocation yloc,
GError ** error);
GST_VULKAN_API
GstVulkanImageView * gst_vulkan_decoder_picture_create_view (GstVulkanDecoder * self,
GstBuffer * buf,
gboolean is_out);
GST_VULKAN_API
gboolean gst_vulkan_decoder_picture_init (GstVulkanDecoder * self,
GstVulkanDecoderPicture * pic,
GstBuffer * out);
GST_VULKAN_API
void gst_vulkan_decoder_picture_release (GstVulkanDecoderPicture * pic);
GST_VULKAN_API
gboolean gst_vulkan_decoder_append_slice (GstVulkanDecoder * self,
GstVulkanDecoderPicture * pic,
const guint8 * data,
size_t size,
gboolean add_startcode);
GST_VULKAN_API
gboolean gst_vulkan_decoder_wait (GstVulkanDecoder * self);
G_END_DECLS