FFmpeg
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
vulkan_decode.h
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #ifndef AVCODEC_VULKAN_DECODE_H
20 #define AVCODEC_VULKAN_DECODE_H
21 
22 #include "codec_id.h"
23 #include "decode.h"
24 #include "hwaccel_internal.h"
25 #include "internal.h"
26 
27 #include "vulkan_video.h"
28 
29 typedef struct FFVulkanDecodeDescriptor {
32  VkQueueFlagBits queue_flags;
33  VkVideoCodecOperationFlagBitsKHR decode_op;
34 
35  VkExtensionProperties ext_props;
37 
38 typedef struct FFVulkanDecodeProfileData {
39  VkVideoDecodeH264ProfileInfoKHR h264_profile;
40  VkVideoDecodeH265ProfileInfoKHR h265_profile;
41  VkVideoDecodeAV1ProfileInfoKHR av1_profile;
42  VkVideoDecodeUsageInfoKHR usage;
43  VkVideoProfileInfoKHR profile;
44  VkVideoProfileListInfoKHR profile_list;
46 
47 typedef struct FFVulkanDecodeShared {
49  FFVkVideoCommon common;
52 
54 
55  VkVideoCapabilitiesKHR caps;
56  VkVideoDecodeCapabilitiesKHR dec_caps;
57 
58  VkVideoSessionParametersKHR empty_session_params;
59 
60  /* Software-defined decoder context */
61  void *sd_ctx;
64 
65 typedef struct FFVulkanDecodeContext {
68 
69  int dedicated_dpb; /* Oddity #1 - separate DPB images */
70  int external_fg; /* Oddity #2 - hardware can't apply film grain */
71  uint32_t frame_id_alloc_mask; /* For AV1 only */
72 
73  /* Workaround for NVIDIA drivers tested with CTS version 1.3.8 for AV1.
74  * The tests were incorrect as the OrderHints were offset by 1. */
76 
77  /* Thread-local state below */
80 
81  uint32_t *slice_off;
82  unsigned int slice_off_max;
84 
85 typedef struct FFVulkanDecodePicture {
86  AVFrame *dpb_frame; /* Only used for out-of-place decoding. */
87 
88  struct {
89  VkImageView ref[AV_NUM_DATA_POINTERS]; /* Image representation view (reference) */
90  VkImageView out[AV_NUM_DATA_POINTERS]; /* Image representation view (output-only) */
91  VkImageView dst[AV_NUM_DATA_POINTERS]; /* Set to img_view_out if no layered refs are used */
92  VkImageAspectFlags aspect[AV_NUM_DATA_POINTERS]; /* Image plane mask bits */
93  VkImageAspectFlags aspect_ref[AV_NUM_DATA_POINTERS]; /* Only used for out-of-place decoding */
94  } view;
95 
96  VkSemaphore sem;
97  uint64_t sem_value;
98 
99  /* Current picture */
100  VkVideoPictureResourceInfoKHR ref;
101  VkVideoReferenceSlotInfoKHR ref_slot;
102 
103  /* Picture refs. H264 has the maximum number of refs (36) of any supported codec. */
104  VkVideoPictureResourceInfoKHR refs [36];
105  VkVideoReferenceSlotInfoKHR ref_slots[36];
106 
107  /* Main decoding struct */
108  VkVideoDecodeInfoKHR decode_info;
109 
110  /* Slice data */
112  size_t slices_size;
113 
114  /* Vulkan functions needed for destruction, as no other context is guaranteed to exist */
115  PFN_vkWaitSemaphores wait_semaphores;
116  PFN_vkDestroyImageView destroy_image_view;
118 
119 /**
120  * Initialize decoder.
121  */
123 
124 /**
125  * Synchronize the contexts between 2 threads.
126  */
128 
129 /**
130  * Initialize hw_frames_ctx with the parameters needed to decode the stream
131  * using the parameters from avctx.
132  *
133  * NOTE: if avctx->internal->hwaccel_priv_data exists, will partially initialize
134  * the context.
135  */
136 int ff_vk_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx);
137 
138 /**
139  * Removes current session parameters to recreate them
140  */
141 int ff_vk_params_invalidate(AVCodecContext *avctx, int t, const uint8_t *b, uint32_t s);
142 
143 /**
144  * Prepare a frame, creates the image view, and sets up the dpb fields.
145  */
147  FFVulkanDecodePicture *vkpic, int is_current,
148  int alloc_dpb);
149 
150 /**
151  * Software-defined decoder version of ff_vk_decode_prepare_frame.
152  */
154  FFVulkanDecodePicture *vkpic, int is_current,
155  enum FFVkShaderRepFormat rep_fmt, int alloc_dpb);
156 
157 /**
158  * Add slice data to frame.
159  */
161  const uint8_t *data, size_t size, int add_startcode,
162  uint32_t *nb_slices, const uint32_t **offsets);
163 
164 /**
165  * Decode a frame.
166  */
168  AVFrame *pic, FFVulkanDecodePicture *vp,
169  AVFrame *rpic[], FFVulkanDecodePicture *rvkp[]);
170 
171 /**
172  * Free a frame and its state.
173  */
175 
176 /**
177  * Get an FFVkBuffer suitable for decoding from.
178  */
180  void *create_pNext, size_t size);
181 
182 /**
183  * Create VkVideoSessionParametersKHR wrapped in an AVBufferRef.
184  */
185 int ff_vk_decode_create_params(AVBufferRef **par_ref, void *logctx, FFVulkanDecodeShared *ctx,
186  const VkVideoSessionParametersCreateInfoKHR *session_params_create);
187 
188 /**
189  * Flush decoder.
190  */
192 
193 /**
194  * Free decoder.
195  */
197 
198 #endif /* AVCODEC_VULKAN_DECODE_H */
FFVulkanDecodePicture::slices_size
size_t slices_size
Definition: vulkan_decode.h:112
FFVulkanDecodeShared::s
FFVulkanContext s
Definition: vulkan_decode.h:48
FFVulkanDecodeProfileData::profile
VkVideoProfileInfoKHR profile
Definition: vulkan_decode.h:43
FFVulkanDecodeProfileData::h265_profile
VkVideoDecodeH265ProfileInfoKHR h265_profile
Definition: vulkan_decode.h:40
FFVulkanExtensions
uint64_t FFVulkanExtensions
Definition: vulkan_functions.h:29
AVBufferPool
The buffer pool.
Definition: buffer_internal.h:88
FFVulkanDecodeContext::shared_ctx
FFVulkanDecodeShared * shared_ctx
Definition: vulkan_decode.h:66
ff_vk_decode_uninit
int ff_vk_decode_uninit(AVCodecContext *avctx)
Free decoder.
Definition: vulkan_decode.c:1133
FFVulkanDecodeShared::sd_ctx_free
void(* sd_ctx_free)(struct FFVulkanDecodeShared *ctx)
Definition: vulkan_decode.h:62
FFVulkanDecodeContext::hevc_headers_size
size_t hevc_headers_size
Definition: vulkan_decode.h:79
FFVulkanDecodeShared::common
FFVkVideoCommon common
Definition: vulkan_decode.h:49
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:410
internal.h
FFVulkanDecodeShared::buf_pool
AVBufferPool * buf_pool
Definition: vulkan_decode.h:53
b
#define b
Definition: input.c:42
data
const char data[16]
Definition: mxf.c:149
FFVulkanDecodeDescriptor::codec_id
enum AVCodecID codec_id
Definition: vulkan_decode.h:30
FFVulkanDecodeContext::frame_id_alloc_mask
uint32_t frame_id_alloc_mask
Definition: vulkan_decode.h:71
FFVulkanDecodePicture::dst
VkImageView dst[AV_NUM_DATA_POINTERS]
Definition: vulkan_decode.h:91
ff_vk_get_decode_buffer
int ff_vk_get_decode_buffer(FFVulkanDecodeContext *ctx, AVBufferRef **buf, void *create_pNext, size_t size)
Get an FFVkBuffer suitable for decoding from.
FFVulkanDecodeProfileData::av1_profile
VkVideoDecodeAV1ProfileInfoKHR av1_profile
Definition: vulkan_decode.h:41
ff_vk_decode_add_slice
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)
Add slice data to frame.
Definition: vulkan_decode.c:251
FFVulkanDecodeContext
Definition: vulkan_decode.h:65
FFVulkanDecodePicture::ref
VkVideoPictureResourceInfoKHR ref
Definition: vulkan_decode.h:100
FFVkShaderRepFormat
FFVkShaderRepFormat
Returns the format to use for images in shaders.
Definition: vulkan.h:388
FFVulkanDecodeContext::session_params
AVBufferRef * session_params
Definition: vulkan_decode.h:67
ff_vk_decode_create_params
int ff_vk_decode_create_params(AVBufferRef **par_ref, void *logctx, FFVulkanDecodeShared *ctx, const VkVideoSessionParametersCreateInfoKHR *session_params_create)
Create VkVideoSessionParametersKHR wrapped in an AVBufferRef.
Definition: vulkan_decode.c:1104
FFVulkanDecodeDescriptor::decode_op
VkVideoCodecOperationFlagBitsKHR decode_op
Definition: vulkan_decode.h:33
FFVulkanDecodePicture::sem_value
uint64_t sem_value
Definition: vulkan_decode.h:97
FFVulkanDecodePicture::view
struct FFVulkanDecodePicture::@298 view
FFVulkanDecodeShared
Definition: vulkan_decode.h:47
AVHWDeviceContext
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition: hwcontext.h:61
FFVulkanDecodeContext::slice_off
uint32_t * slice_off
Definition: vulkan_decode.h:81
FFVulkanDecodeProfileData::h264_profile
VkVideoDecodeH264ProfileInfoKHR h264_profile
Definition: vulkan_decode.h:39
codec_id.h
FFVulkanDecodePicture::refs
VkVideoPictureResourceInfoKHR refs[36]
Definition: vulkan_decode.h:104
FFVulkanDecodeProfileData::profile_list
VkVideoProfileListInfoKHR profile_list
Definition: vulkan_decode.h:44
FFVulkanDecodePicture::wait_semaphores
PFN_vkWaitSemaphores wait_semaphores
Definition: vulkan_decode.h:115
s
#define s(width, name)
Definition: cbs_vp9.c:198
FFVulkanDecodePicture
Definition: vulkan_decode.h:85
offsets
static const int offsets[]
Definition: hevc_pel.c:34
ctx
AVFormatContext * ctx
Definition: movenc.c:49
decode.h
ff_vk_params_invalidate
int ff_vk_params_invalidate(AVCodecContext *avctx, int t, const uint8_t *b, uint32_t s)
Removes current session parameters to recreate them.
Definition: vulkan_decode.c:110
ff_vk_update_thread_context
int ff_vk_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
Synchronize the contexts between 2 threads.
Definition: vulkan_decode.c:91
hwaccel_internal.h
FFVulkanDecodeProfileData::usage
VkVideoDecodeUsageInfoKHR usage
Definition: vulkan_decode.h:42
FFVulkanDecodeDescriptor::decode_extension
FFVulkanExtensions decode_extension
Definition: vulkan_decode.h:31
ff_vk_decode_free_frame
void ff_vk_decode_free_frame(AVHWDeviceContext *dev_ctx, FFVulkanDecodePicture *vp)
Free a frame and its state.
Definition: vulkan_decode.c:574
FFVulkanDecodePicture::aspect
VkImageAspectFlags aspect[AV_NUM_DATA_POINTERS]
Definition: vulkan_decode.h:92
FFVulkanDecodePicture::aspect_ref
VkImageAspectFlags aspect_ref[AV_NUM_DATA_POINTERS]
Definition: vulkan_decode.h:93
ff_vk_decode_frame
int ff_vk_decode_frame(AVCodecContext *avctx, AVFrame *pic, FFVulkanDecodePicture *vp, AVFrame *rpic[], FFVulkanDecodePicture *rvkp[])
Decode a frame.
Definition: vulkan_decode.c:368
FFVulkanContext
Definition: vulkan.h:276
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
FFVulkanDecodeShared::caps
VkVideoCapabilitiesKHR caps
Definition: vulkan_decode.h:55
FFVulkanDecodePicture::ref
VkImageView ref[AV_NUM_DATA_POINTERS]
Definition: vulkan_decode.h:89
size
int size
Definition: twinvq_data.h:10344
AV_NUM_DATA_POINTERS
#define AV_NUM_DATA_POINTERS
Definition: frame.h:411
FFVulkanDecodeShared::sd_ctx
void * sd_ctx
Definition: vulkan_decode.h:61
FFVulkanDecodeShared::empty_session_params
VkVideoSessionParametersKHR empty_session_params
Definition: vulkan_decode.h:58
FFVulkanDecodeShared::qf
AVVulkanDeviceQueueFamily * qf
Definition: vulkan_decode.h:50
FFVulkanDecodeContext::slice_off_max
unsigned int slice_off_max
Definition: vulkan_decode.h:82
HEVCHeaderSet
Definition: vulkan_hevc.c:67
ff_vk_frame_params
int ff_vk_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx)
Initialize hw_frames_ctx with the parameters needed to decode the stream using the parameters from av...
Definition: vulkan_decode.c:1016
FFVulkanDecodeProfileData
Definition: vulkan_decode.h:38
FFVulkanDecodePicture::out
VkImageView out[AV_NUM_DATA_POINTERS]
Definition: vulkan_decode.h:90
FFVulkanDecodeDescriptor::ext_props
VkExtensionProperties ext_props
Definition: vulkan_decode.h:35
FFVulkanDecodePicture::ref_slot
VkVideoReferenceSlotInfoKHR ref_slot
Definition: vulkan_decode.h:101
FFVulkanDecodePicture::sem
VkSemaphore sem
Definition: vulkan_decode.h:96
FFVulkanDecodeContext::external_fg
int external_fg
Definition: vulkan_decode.h:70
FFVulkanDecodePicture::ref_slots
VkVideoReferenceSlotInfoKHR ref_slots[36]
Definition: vulkan_decode.h:105
FFVkExecPool
Definition: vulkan.h:254
FFVulkanDecodeContext::hevc_headers
struct HEVCHeaderSet * hevc_headers
Definition: vulkan_decode.h:78
ff_vk_decode_prepare_frame
int ff_vk_decode_prepare_frame(FFVulkanDecodeContext *dec, AVFrame *pic, FFVulkanDecodePicture *vkpic, int is_current, int alloc_dpb)
Prepare a frame, creates the image view, and sets up the dpb fields.
Definition: vulkan_decode.c:147
AVCodecContext
main external API structure.
Definition: avcodec.h:431
FFVulkanDecodeContext::dedicated_dpb
int dedicated_dpb
Definition: vulkan_decode.h:69
FFVulkanDecodeDescriptor
Definition: vulkan_decode.h:29
ff_vk_decode_prepare_frame_sdr
int ff_vk_decode_prepare_frame_sdr(FFVulkanDecodeContext *dec, AVFrame *pic, FFVulkanDecodePicture *vkpic, int is_current, enum FFVkShaderRepFormat rep_fmt, int alloc_dpb)
Software-defined decoder version of ff_vk_decode_prepare_frame.
Definition: vulkan_decode.c:204
FFVulkanDecodePicture::dpb_frame
AVFrame * dpb_frame
Definition: vulkan_decode.h:86
vulkan_video.h
FFVulkanDecodePicture::slices_buf
AVBufferRef * slices_buf
Definition: vulkan_decode.h:111
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
FFVulkanDecodeDescriptor::queue_flags
VkQueueFlagBits queue_flags
Definition: vulkan_decode.h:32
ff_vk_decode_init
int ff_vk_decode_init(AVCodecContext *avctx)
Initialize decoder.
Definition: vulkan_decode.c:1182
ff_vk_decode_flush
void ff_vk_decode_flush(AVCodecContext *avctx)
Flush decoder.
Definition: vulkan_decode.c:332
FFVulkanDecodePicture::destroy_image_view
PFN_vkDestroyImageView destroy_image_view
Definition: vulkan_decode.h:116
AVVulkanDeviceQueueFamily
Definition: hwcontext_vulkan.h:33
FFVulkanDecodePicture::decode_info
VkVideoDecodeInfoKHR decode_info
Definition: vulkan_decode.h:108
FFVulkanDecodeContext::quirk_av1_offset
int quirk_av1_offset
Definition: vulkan_decode.h:75
src
#define src
Definition: vp8dsp.c:248
FFVulkanDecodeShared::dec_caps
VkVideoDecodeCapabilitiesKHR dec_caps
Definition: vulkan_decode.h:56
FFVulkanDecodeShared::exec_pool
FFVkExecPool exec_pool
Definition: vulkan_decode.h:51