Avoids allocations, error checks and indirections. Also increases type-safety. Reviewed-by: Lynne <dev@lynne.ee> Tested-by: Lynne <dev@lynne.ee> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
		
			
				
	
	
		
			179 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			179 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * 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 "hwaccel_internal.h"
 | 
						|
#include "internal.h"
 | 
						|
 | 
						|
#include "vulkan_video.h"
 | 
						|
 | 
						|
typedef struct FFVulkanDecodeProfileData {
 | 
						|
    VkVideoDecodeH264ProfileInfoKHR h264_profile;
 | 
						|
    VkVideoDecodeH265ProfileInfoKHR h265_profile;
 | 
						|
    VkVideoDecodeAV1ProfileInfoMESA av1_profile;
 | 
						|
    VkVideoDecodeUsageInfoKHR usage;
 | 
						|
    VkVideoProfileInfoKHR profile;
 | 
						|
    VkVideoProfileListInfoKHR profile_list;
 | 
						|
} FFVulkanDecodeProfileData;
 | 
						|
 | 
						|
typedef struct FFVulkanDecodeShared {
 | 
						|
    FFVulkanContext s;
 | 
						|
    FFVkVideoCommon common;
 | 
						|
    FFVkQueueFamilyCtx qf;
 | 
						|
 | 
						|
    VkVideoCapabilitiesKHR caps;
 | 
						|
    VkVideoDecodeCapabilitiesKHR dec_caps;
 | 
						|
 | 
						|
    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 {
 | 
						|
    FFVulkanDecodeShared *shared_ctx;
 | 
						|
    AVBufferRef *session_params;
 | 
						|
    FFVkExecPool exec_pool;
 | 
						|
 | 
						|
    int dedicated_dpb; /* Oddity  #1 - separate DPB images */
 | 
						|
    int layered_dpb;   /* Madness #1 - layered  DPB images */
 | 
						|
    int external_fg;   /* Oddity  #2 - hardware can't apply film grain */
 | 
						|
    uint32_t frame_id_alloc_mask; /* For AV1 only */
 | 
						|
 | 
						|
    /* Thread-local state below */
 | 
						|
    struct HEVCHeaderSet *hevc_headers;
 | 
						|
    size_t hevc_headers_size;
 | 
						|
 | 
						|
    uint32_t                       *slice_off;
 | 
						|
    unsigned int                    slice_off_max;
 | 
						|
} 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;
 | 
						|
 | 
						|
    /* Vulkan functions needed for destruction, as no other context is guaranteed to exist */
 | 
						|
    PFN_vkWaitSemaphores            wait_semaphores;
 | 
						|
    PFN_vkDestroyImageView          destroy_image_view;
 | 
						|
} 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);
 | 
						|
 | 
						|
/**
 | 
						|
 * Removes current session parameters to recreate them
 | 
						|
 */
 | 
						|
int ff_vk_params_invalidate(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);
 | 
						|
 | 
						|
/**
 | 
						|
 * Create VkVideoSessionParametersKHR wrapped in an AVBufferRef.
 | 
						|
 */
 | 
						|
int ff_vk_decode_create_params(AVBufferRef **par_ref, void *logctx, FFVulkanDecodeShared *ctx,
 | 
						|
                               const VkVideoSessionParametersCreateInfoKHR *session_params_create);
 | 
						|
 | 
						|
/**
 | 
						|
 * Flush decoder.
 | 
						|
 */
 | 
						|
void ff_vk_decode_flush(AVCodecContext *avctx);
 | 
						|
 | 
						|
/**
 | 
						|
 * Free decoder.
 | 
						|
 */
 | 
						|
int ff_vk_decode_uninit(AVCodecContext *avctx);
 | 
						|
 | 
						|
#endif /* AVCODEC_VULKAN_DECODE_H */
 |