| 
									
										
										
										
											2023-01-16 07:23:27 +01:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * 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
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-07 01:29:18 +01:00
										 |  |  | #include "codec_id.h"
 | 
					
						
							| 
									
										
										
										
											2023-01-16 07:23:27 +01:00
										 |  |  | #include "decode.h"
 | 
					
						
							| 
									
										
										
										
											2023-07-17 21:41:45 +02:00
										 |  |  | #include "hwaccel_internal.h"
 | 
					
						
							| 
									
										
										
										
											2023-01-16 07:23:27 +01:00
										 |  |  | #include "internal.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "vulkan_video.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-07 01:08:16 +01:00
										 |  |  | typedef struct FFVulkanDecodeDescriptor { | 
					
						
							| 
									
										
										
										
											2024-03-07 01:29:18 +01:00
										 |  |  |     enum AVCodecID                   codec_id; | 
					
						
							| 
									
										
										
										
											2024-03-07 01:08:16 +01:00
										 |  |  |     FFVulkanExtensions               decode_extension; | 
					
						
							|  |  |  |     VkVideoCodecOperationFlagBitsKHR decode_op; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     VkExtensionProperties ext_props; | 
					
						
							|  |  |  | } FFVulkanDecodeDescriptor; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-16 07:23:27 +01:00
										 |  |  | typedef struct FFVulkanDecodeProfileData { | 
					
						
							|  |  |  |     VkVideoDecodeH264ProfileInfoKHR h264_profile; | 
					
						
							| 
									
										
										
										
											2023-08-23 22:05:58 +02:00
										 |  |  |     VkVideoDecodeH265ProfileInfoKHR h265_profile; | 
					
						
							| 
									
										
										
										
											2024-01-19 10:49:02 +10:00
										 |  |  |     VkVideoDecodeAV1ProfileInfoKHR av1_profile; | 
					
						
							| 
									
										
										
										
											2023-01-16 07:23:27 +01:00
										 |  |  |     VkVideoDecodeUsageInfoKHR usage; | 
					
						
							|  |  |  |     VkVideoProfileInfoKHR profile; | 
					
						
							|  |  |  |     VkVideoProfileListInfoKHR profile_list; | 
					
						
							|  |  |  | } FFVulkanDecodeProfileData; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct FFVulkanDecodeShared { | 
					
						
							|  |  |  |     FFVulkanContext s; | 
					
						
							|  |  |  |     FFVkVideoCommon common; | 
					
						
							| 
									
										
										
										
											2023-07-19 05:39:07 +02:00
										 |  |  |     FFVkQueueFamilyCtx qf; | 
					
						
							| 
									
										
										
										
											2023-06-13 06:10:20 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     VkVideoCapabilitiesKHR caps; | 
					
						
							|  |  |  |     VkVideoDecodeCapabilitiesKHR dec_caps; | 
					
						
							| 
									
										
										
										
											2023-01-16 07:23:27 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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 { | 
					
						
							| 
									
										
										
										
											2023-09-13 02:04:09 +02:00
										 |  |  |     FFVulkanDecodeShared *shared_ctx; | 
					
						
							| 
									
										
										
										
											2023-01-16 07:23:27 +01:00
										 |  |  |     AVBufferRef *session_params; | 
					
						
							| 
									
										
										
										
											2023-07-19 05:39:07 +02:00
										 |  |  |     FFVkExecPool exec_pool; | 
					
						
							| 
									
										
										
										
											2023-01-16 07:23:27 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     int dedicated_dpb; /* Oddity  #1 - separate DPB images */ | 
					
						
							|  |  |  |     int layered_dpb;   /* Madness #1 - layered  DPB images */ | 
					
						
							| 
									
										
										
										
											2023-02-17 04:09:16 +01:00
										 |  |  |     int external_fg;   /* Oddity  #2 - hardware can't apply film grain */ | 
					
						
							|  |  |  |     uint32_t frame_id_alloc_mask; /* For AV1 only */ | 
					
						
							| 
									
										
										
										
											2023-01-16 07:23:27 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* Thread-local state below */ | 
					
						
							| 
									
										
										
										
											2023-09-15 01:51:49 +02:00
										 |  |  |     struct HEVCHeaderSet *hevc_headers; | 
					
						
							|  |  |  |     size_t hevc_headers_size; | 
					
						
							| 
									
										
										
										
											2023-06-20 03:37:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     uint32_t                       *slice_off; | 
					
						
							|  |  |  |     unsigned int                    slice_off_max; | 
					
						
							| 
									
										
										
										
											2023-01-16 07:23:27 +01:00
										 |  |  | } 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; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* 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 */ | 
					
						
							|  |  |  |     VkVideoDecodeInfoKHR            decode_info; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Slice data */ | 
					
						
							|  |  |  |     AVBufferRef                    *slices_buf; | 
					
						
							|  |  |  |     size_t                          slices_size; | 
					
						
							| 
									
										
										
										
											2023-09-15 02:22:00 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* Vulkan functions needed for destruction, as no other context is guaranteed to exist */ | 
					
						
							|  |  |  |     PFN_vkWaitSemaphores            wait_semaphores; | 
					
						
							|  |  |  |     PFN_vkDestroyImageView          destroy_image_view; | 
					
						
							| 
									
										
										
										
											2023-01-16 07:23:27 +01:00
										 |  |  | } 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); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2023-06-21 18:24:55 +02:00
										 |  |  |  * Removes current session parameters to recreate them | 
					
						
							| 
									
										
										
										
											2023-01-16 07:23:27 +01:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2023-06-21 18:24:55 +02:00
										 |  |  | int ff_vk_params_invalidate(AVCodecContext *avctx, int t, const uint8_t *b, uint32_t s); | 
					
						
							| 
									
										
										
										
											2023-01-16 07:23:27 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * 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); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2023-09-15 00:29:58 +02:00
										 |  |  |  * Create VkVideoSessionParametersKHR wrapped in an AVBufferRef. | 
					
						
							| 
									
										
										
										
											2023-01-16 07:23:27 +01:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2023-09-15 00:29:58 +02:00
										 |  |  | int ff_vk_decode_create_params(AVBufferRef **par_ref, void *logctx, FFVulkanDecodeShared *ctx, | 
					
						
							|  |  |  |                                const VkVideoSessionParametersCreateInfoKHR *session_params_create); | 
					
						
							| 
									
										
										
										
											2023-01-16 07:23:27 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * Flush decoder. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | void ff_vk_decode_flush(AVCodecContext *avctx); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * Free decoder. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | int ff_vk_decode_uninit(AVCodecContext *avctx); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* AVCODEC_VULKAN_DECODE_H */
 |