aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/vulkan_decode.h
diff options
context:
space:
mode:
authorLynne <dev@lynne.ee>2023-01-16 07:23:27 +0100
committerLynne <dev@lynne.ee>2023-05-29 00:41:57 +0200
commit1e8fefff936d10a6126070382059daf668d5f5d5 (patch)
tree012f0fd279777211394588db2749017667ba1bf8 /libavcodec/vulkan_decode.h
parent023ae6103f0e0db1610ef3988290e37fea47661d (diff)
downloadffmpeg-1e8fefff936d10a6126070382059daf668d5f5d5.tar.gz
libavcodec: add Vulkan common video decoding code
Diffstat (limited to 'libavcodec/vulkan_decode.h')
-rw-r--r--libavcodec/vulkan_decode.h176
1 files changed, 176 insertions, 0 deletions
diff --git a/libavcodec/vulkan_decode.h b/libavcodec/vulkan_decode.h
new file mode 100644
index 0000000000..bfde86e45f
--- /dev/null
+++ b/libavcodec/vulkan_decode.h
@@ -0,0 +1,176 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_VULKAN_DECODE_H
+#define AVCODEC_VULKAN_DECODE_H
+
+#include "decode.h"
+#include "hwconfig.h"
+#include "internal.h"
+
+#include "vulkan_video.h"
+
+typedef struct FFVulkanDecodeProfileData {
+ VkVideoCapabilitiesKHR caps;
+ VkVideoDecodeCapabilitiesKHR dec_caps;
+ VkVideoDecodeH264ProfileInfoKHR h264_profile;
+ VkVideoDecodeH264ProfileInfoKHR h265_profile;
+ VkVideoDecodeAV1ProfileInfoMESA av1_profile;
+ VkVideoDecodeUsageInfoKHR usage;
+ VkVideoProfileInfoKHR profile;
+ VkVideoProfileListInfoKHR profile_list;
+} FFVulkanDecodeProfileData;
+
+typedef struct FFVulkanDecodeShared {
+ FFVulkanContext s;
+ FFVkVideoCommon common;
+ FFVkExecPool exec_pool;
+ FFVulkanDecodeProfileData profile_data;
+
+ AVBufferRef *dpb_hwfc_ref; /* Only used for dedicated_dpb */
+
+ AVFrame *layered_frame; /* Only used for layered_dpb */
+ VkImageView layered_view;
+ VkImageAspectFlags layered_aspect;
+
+ VkVideoSessionParametersKHR empty_session_params;
+
+ VkSamplerYcbcrConversion yuv_sampler;
+} FFVulkanDecodeShared;
+
+typedef struct FFVulkanDecodeContext {
+ AVBufferRef *shared_ref;
+ AVBufferRef *session_params;
+
+ int dedicated_dpb; /* Oddity #1 - separate DPB images */
+ int layered_dpb; /* Madness #1 - layered DPB images */
+
+ /* Thread-local state below */
+ AVBufferPool *tmp_pool; /* Pool for temporary data, if needed (HEVC) */
+ size_t tmp_pool_ele_size;
+ int params_changed;
+} FFVulkanDecodeContext;
+
+typedef struct FFVulkanDecodePicture {
+ AVFrame *dpb_frame; /* Only used for out-of-place decoding. */
+
+ VkImageView img_view_ref; /* Image representation view (reference) */
+ VkImageView img_view_out; /* Image representation view (output-only) */
+ VkImageView img_view_dest; /* Set to img_view_out if no layered refs are used */
+ VkImageAspectFlags img_aspect; /* Image plane mask bits */
+ VkImageAspectFlags img_aspect_ref; /* Only used for out-of-place decoding */
+
+ VkSemaphore sem;
+ uint64_t sem_value;
+
+ /* State */
+ int update_params;
+ AVBufferRef *session_params;
+
+ /* Current picture */
+ VkVideoPictureResourceInfoKHR ref;
+ VkVideoReferenceSlotInfoKHR ref_slot;
+
+ /* Picture refs. H264 has the maximum number of refs (36) of any supported codec. */
+ VkVideoPictureResourceInfoKHR refs [36];
+ VkVideoReferenceSlotInfoKHR ref_slots[36];
+
+ /* Main decoding struct */
+ AVBufferRef *params_buf;
+ VkVideoDecodeInfoKHR decode_info;
+
+ /* Slice data */
+ AVBufferRef *slices_buf;
+ size_t slices_size;
+ uint32_t *slice_off;
+ unsigned int slice_off_max;
+ uint32_t nb_slices;
+} FFVulkanDecodePicture;
+
+/**
+ * Initialize decoder.
+ */
+int ff_vk_decode_init(AVCodecContext *avctx);
+
+/**
+ * Synchronize the contexts between 2 threads.
+ */
+int ff_vk_update_thread_context(AVCodecContext *dst, const AVCodecContext *src);
+
+/**
+ * Initialize hw_frames_ctx with the parameters needed to decode the stream
+ * using the parameters from avctx.
+ *
+ * NOTE: if avctx->internal->hwaccel_priv_data exists, will partially initialize
+ * the context.
+ */
+int ff_vk_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx);
+
+/**
+ * Sets FFVulkanDecodeContext.params_changed to 1.
+ */
+int ff_vk_params_changed(AVCodecContext *avctx, int t, const uint8_t *b, uint32_t s);
+
+/**
+ * Prepare a frame, creates the image view, and sets up the dpb fields.
+ */
+int ff_vk_decode_prepare_frame(FFVulkanDecodeContext *dec, AVFrame *pic,
+ FFVulkanDecodePicture *vkpic, int is_current,
+ int alloc_dpb);
+
+/**
+ * Add slice data to frame.
+ */
+int ff_vk_decode_add_slice(AVCodecContext *avctx, FFVulkanDecodePicture *vp,
+ const uint8_t *data, size_t size, int add_startcode,
+ uint32_t *nb_slices, const uint32_t **offsets);
+
+/**
+ * Decode a frame.
+ */
+int ff_vk_decode_frame(AVCodecContext *avctx,
+ AVFrame *pic, FFVulkanDecodePicture *vp,
+ AVFrame *rpic[], FFVulkanDecodePicture *rvkp[]);
+
+/**
+ * Free a frame and its state.
+ */
+void ff_vk_decode_free_frame(AVHWDeviceContext *dev_ctx, FFVulkanDecodePicture *vp);
+
+/**
+ * Get an FFVkBuffer suitable for decoding from.
+ */
+int ff_vk_get_decode_buffer(FFVulkanDecodeContext *ctx, AVBufferRef **buf,
+ void *create_pNext, size_t size);
+
+/**
+ * Free VkVideoSessionParametersKHR.
+ */
+void ff_vk_decode_free_params(void *opaque, uint8_t *data);
+
+/**
+ * Flush decoder.
+ */
+void ff_vk_decode_flush(AVCodecContext *avctx);
+
+/**
+ * Free decoder.
+ */
+int ff_vk_decode_uninit(AVCodecContext *avctx);
+
+#endif /* AVCODEC_VULKAN_DECODE_H */