28#define RGB_LINECACHE 2
65 .queue_flags = VK_QUEUE_COMPUTE_BIT,
126 for (
int i = 0;
i <
f->quant_table_count;
i++)
127 max_contexts =
FFMAX(
f->context_count[
i], max_contexts);
153 VK_WHOLE_SIZE, buffer_ref,
154 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
155 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT);
161 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
163 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
179 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
180 NULL, 5*
f->slice_count*
sizeof(uint32_t),
181 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
182 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
187 if (
f->version >=4 &&
f->micro_version >= 9 &&
191 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
192 NULL, 65536*4*
f->slice_count*
sizeof(uint32_t),
193 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
194 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
199 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
200 NULL, 65536*4*
f->slice_count*
sizeof(uint32_t),
201 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
236 if (slices_buf && slices_buf->
host_ref) {
261 uint64_t x = *(
const uint64_t *)
a, y = *(
const uint64_t *)
b;
262 return (x < y) - (x > y);
295 VkImageMemoryBarrier2 img_bar[37];
297 VkBufferMemoryBarrier2 buf_bar[8];
307 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
308 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
324 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
325 VK_PIPELINE_STAGE_2_CLEAR_BIT));
335 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT);
347 vkf->
layout[
i] = VK_IMAGE_LAYOUT_UNDEFINED;
348 vkf->
access[
i] = VK_ACCESS_2_NONE;
356 VK_FORMAT_UNDEFINED);
360 0, 2*
f->slice_count*
sizeof(uint32_t),
361 VK_FORMAT_UNDEFINED);
365 2*
f->slice_count*
sizeof(uint32_t),
367 VK_FORMAT_UNDEFINED);
372 fltmap_buf ? fltmap_buf : slice_feedback,
375 VK_FORMAT_UNDEFINED);
380 .slice_data = slices_buf->
address,
382 .img_size[0] =
f->picture.f->width,
383 .img_size[1] =
f->picture.f->height,
388 .micro_version =
f->micro_version,
389 .remap_allowed = !!fltmap_buf,
392 for (
int i = 0;
i <
f->quant_table_count;
i++) {
395 f->quant_tables[
i][4][127];
401 memcpy(pd.
fmt_lut, (
int [4]) { 2, 1, 0, 3 }, 4*
sizeof(
int));
406 VK_SHADER_STAGE_COMPUTE_BIT,
409 vk->CmdDispatch(exec->
buf,
f->num_h_slices,
f->num_v_slices, 1);
413 for (
int i = 0;
i < 4;
i++) {
414 vkf->
layout[
i] = VK_IMAGE_LAYOUT_UNDEFINED;
415 vkf->
access[
i] = VK_ACCESS_2_NONE;
419 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
420 VK_PIPELINE_STAGE_2_CLEAR_BIT,
421 VK_ACCESS_2_TRANSFER_WRITE_BIT,
422 VK_IMAGE_LAYOUT_GENERAL,
423 VK_QUEUE_FAMILY_IGNORED);
425 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
426 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
427 .pImageMemoryBarriers = img_bar,
428 .imageMemoryBarrierCount = nb_img_bar,
429 .pBufferMemoryBarriers = buf_bar,
430 .bufferMemoryBarrierCount = nb_buf_bar,
437 int n_dec_planes =
f->bayer ? 4 : color_planes;
438 for (
int i = 0;
i < n_dec_planes;
i++)
439 vk->CmdClearColorImage(exec->
buf, vkf->
img[
i], VK_IMAGE_LAYOUT_GENERAL,
440 &((VkClearColorValue) { 0 }),
441 1, &((VkImageSubresourceRange) {
442 .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
450 COMPUTE_SHADER_BIT, SHADER_STORAGE_READ_BIT,
451 SHADER_STORAGE_WRITE_BIT,
452 COMPUTE_SHADER_BIT, SHADER_STORAGE_READ_BIT, NONE_KHR,
458 COMPUTE_SHADER_BIT, SHADER_STORAGE_READ_BIT,
459 SHADER_STORAGE_WRITE_BIT,
460 COMPUTE_SHADER_BIT, SHADER_STORAGE_WRITE_BIT, NONE_KHR,
463 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
464 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
465 .pImageMemoryBarriers = img_bar,
466 .imageMemoryBarrierCount = nb_img_bar,
467 .pBufferMemoryBarriers = buf_bar,
468 .bufferMemoryBarrierCount = nb_buf_bar,
478 VK_FORMAT_UNDEFINED);
484 VK_FORMAT_UNDEFINED);
488 VK_SHADER_STAGE_COMPUTE_BIT,
491 vk->CmdDispatch(exec->
buf,
f->num_h_slices,
f->num_v_slices,
496 COMPUTE_SHADER_BIT, SHADER_STORAGE_WRITE_BIT, NONE_KHR,
497 COMPUTE_SHADER_BIT, SHADER_STORAGE_READ_BIT,
498 SHADER_STORAGE_WRITE_BIT,
503 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
504 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
505 VK_ACCESS_SHADER_WRITE_BIT |
506 (!is_rgb ? VK_ACCESS_SHADER_READ_BIT : 0),
507 VK_IMAGE_LAYOUT_GENERAL,
508 VK_QUEUE_FAMILY_IGNORED);
511 VK_PIPELINE_STAGE_2_CLEAR_BIT,
512 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
513 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
514 VK_IMAGE_LAYOUT_GENERAL,
515 VK_QUEUE_FAMILY_IGNORED);
517 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
518 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
519 .pImageMemoryBarriers = img_bar,
520 .imageMemoryBarrierCount = nb_img_bar,
521 .pBufferMemoryBarriers = buf_bar,
522 .bufferMemoryBarrierCount = nb_buf_bar,
530 for (
int i = 0;
i <
f->slice_count;
i++)
533 for (
int i = 0;
i <
f->slice_count;
i++)
535 UINT32_MAX - (uint32_t)order[
i]);
542 VK_FORMAT_UNDEFINED);
546 4*
f->slice_count*
sizeof(uint32_t),
547 f->slice_count*
sizeof(uint32_t),
548 VK_FORMAT_UNDEFINED);
552 2*
f->slice_count*
sizeof(uint32_t),
554 VK_FORMAT_UNDEFINED);
560 VK_FORMAT_UNDEFINED);
563 VkImageView *decode_dst_view = is_rgb ? rct_image_views : output_views;
565 decode_dst, decode_dst_view,
567 VK_IMAGE_LAYOUT_GENERAL,
571 f->picture.f, output_views,
573 VK_IMAGE_LAYOUT_GENERAL,
581 VK_FORMAT_UNDEFINED);
585 VK_SHADER_STAGE_COMPUTE_BIT,
588 vk->CmdDispatch(exec->
buf,
f->num_h_slices,
f->num_v_slices, 1);
606 VkSpecializationInfo *sl)
611 (uint32_t []) { 1, 1, 1 }, 0);
614 VK_SHADER_STAGE_COMPUTE_BIT);
618 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
619 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
622 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
623 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
630 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
631 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
634 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
635 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
638 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
639 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
642 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
643 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
660 VkSpecializationInfo *sl,
int ac)
663 int wg_dim =
FFMIN(
s->props.properties.limits.maxComputeWorkGroupSize[0], 1024);
666 (uint32_t []) { wg_dim, 1, 1 }, 0);
669 VK_SHADER_STAGE_COMPUTE_BIT);
673 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
674 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
681 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
682 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
685 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
686 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
710 VkSpecializationInfo *sl,
int ac,
int rgb,
711 int bayer, uint32_t lanes, uint32_t subgroup_size)
720 VK_SHADER_STAGE_COMPUTE_BIT);
724 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
725 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
728 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
729 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
736 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
737 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
740 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
741 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
744 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
745 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
748 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
749 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
752 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
753 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
757 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
758 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
762 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
763 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
775 5 +
rgb + (is_float && !bayer),
787 }
else if (is_float) {
837 frames_ctx->
width =
s->frames->width;
840 vk_frames = frames_ctx->
hwctx;
841 vk_frames->
tiling = VK_IMAGE_TILING_OPTIMAL;
842 vk_frames->
img_flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
843 vk_frames->
usage = VK_IMAGE_USAGE_STORAGE_BIT |
844 VK_IMAGE_USAGE_TRANSFER_DST_BIT;
849 "Unable to initialize frame pool with format %s: %s\n",
891 if (
f->num_h_slices *
f->num_v_slices < 16)
893 "decoding may be very slow\n",
f->num_h_slices *
f->num_v_slices);
930 uint32_t subgroup_size;
949 dctx, hwfc, sl,
f->ac, is_rgb,
f->bayer,
950 lanes, subgroup_size));
959 256*
sizeof(uint32_t), 512*
sizeof(uint8_t),
960 VK_FORMAT_UNDEFINED));
964 0, 256*
sizeof(uint32_t),
965 VK_FORMAT_UNDEFINED));
971 256*
sizeof(uint32_t), 512*
sizeof(uint8_t),
972 VK_FORMAT_UNDEFINED));
976 256*
sizeof(uint32_t) + 512*
sizeof(uint8_t),
980 VK_FORMAT_UNDEFINED));
998 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO,
999 .pSemaphores = &vp->
sem,
1001 .semaphoreCount = 1,
1014 if (!(slice_feedback->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
1015 VkMappedMemoryRange invalidate_data = {
1016 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
1017 .memory = slice_feedback->
mem,
1019 .size = 2*fp->
slice_num*
sizeof(uint32_t),
1022 1, &invalidate_data);
1025 int slice_error_cnt = 0;
1026 int crc_mismatch_cnt = 0;
1027 uint32_t max_overread = 0;
1029 uint32_t crc_res = 0;
1031 crc_res =
AV_RN32(ssp + 2*
i*
sizeof(uint32_t) + 0);
1032 uint32_t overread =
AV_RN32(ssp + 2*
i*
sizeof(uint32_t) + 4);
1033 max_overread =
FFMAX(overread, max_overread);
1034 slice_error_cnt += !!overread;
1035 crc_mismatch_cnt += !!crc_res;
1037 if (slice_error_cnt || crc_mismatch_cnt)
1039 "%i CRCs mismatched\n",
1040 slice_error_cnt, max_overread, crc_mismatch_cnt);
1048 .p.name =
"ffv1_vulkan",
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
static AVFormatContext * ctx
#define flags(name, subs,...)
#define i(width, name, range_min, range_max)
#define AV_EF_CRCCHECK
Verify checksums embedded in the bitstream (could be of either encoded or decoded data,...
int(* init)(AVBSFContext *ctx)
FF Video Codec 1 (a lossless codec)
#define MAX_QUANT_TABLE_SIZE
#define MAX_CONTEXT_INPUTS
int ff_ffv1_vk_quant_ballot(const FFV1Context *f, FFv1QuantBallot *qb)
Fill in the ballot quantizers of all quant tables.
int ff_ffv1_vk_init_consts(FFVulkanContext *s, FFVkBuffer *vkb, FFV1Context *f)
uint32_t ff_ffv1_vk_rc_lanes(const FFVulkanContext *s, uint32_t *required)
Number of invocations that range code a slice together, as a single subgroup.
void ff_ffv1_vk_set_common_sl(AVCodecContext *avctx, FFV1Context *f, VkSpecializationInfo *sl, enum AVPixelFormat sw_format)
static int cmp_slice_order(const void *a, const void *b)
#define AV_NUM_DATA_POINTERS
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define HWACCEL_CAP_ASYNC_SAFE
Header providing the internals of AVHWAccel.
#define HWACCEL_CAP_THREAD_SAFE
const struct FFHWAccel ff_ffv1_vulkan_hwaccel
int av_hwframe_ctx_init(AVBufferRef *ref)
Finalize the context before use.
AVBufferRef * av_hwframe_ctx_alloc(AVBufferRef *device_ref_in)
Allocate an AVHWFramesContext tied to a given device context.
int av_hwframe_get_buffer(AVBufferRef *hwframe_ref, AVFrame *frame, int flags)
Allocate a new frame attached to the given AVHWFramesContext.
static av_cold void uninit(AVBitStreamFilterContext *ctx)
void ff_vk_set_perm(enum AVPixelFormat pix_fmt, int lut[4], int inv)
Since storage images may not be swizzled, we have to do this in the shader itself.
void ff_vk_shader_update_img_array(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd, AVFrame *f, VkImageView *views, int set, int binding, VkImageLayout layout, VkSampler sampler)
Update a descriptor in a buffer with an image array.
int ff_vk_shader_load(FFVulkanShader *shd, VkPipelineStageFlags stage, VkSpecializationInfo *spec, uint32_t wg_size[3], uint32_t required_subgroup_size)
Initialize a shader object.
void ff_vk_shader_add_descriptor_set(FFVulkanContext *s, FFVulkanShader *shd, const FFVulkanDescriptorSetBinding *desc, int nb, int singular)
Add descriptor to a shader.
int ff_vk_shader_add_push_const(FFVulkanShader *shd, int offset, int size, VkShaderStageFlagBits stage)
Add/update push constants for execution.
void ff_vk_free_buf(FFVulkanContext *s, FFVkBuffer *buf)
void ff_vk_frame_barrier(FFVulkanContext *s, FFVkExecContext *e, AVFrame *pic, VkImageMemoryBarrier2 *bar, int *nb_bar, VkPipelineStageFlags2 src_stage, VkPipelineStageFlags2 dst_stage, VkAccessFlagBits2 new_access, VkImageLayout new_layout, uint32_t new_qf)
int ff_vk_exec_start(FFVulkanContext *s, FFVkExecContext *e)
Start/submit/wait an execution.
int ff_vk_create_imageviews(FFVulkanContext *s, FFVkExecContext *e, VkImageView views[AV_NUM_DATA_POINTERS], AVFrame *f, enum FFVkShaderRepFormat rep_fmt)
Create an imageview and add it as a dependency to an execution.
void ff_vk_shader_free(FFVulkanContext *s, FFVulkanShader *shd)
Free a shader.
int ff_vk_shader_register_exec(FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd)
Register a shader with an exec pool.
FFVkExecContext * ff_vk_exec_get(FFVulkanContext *s, FFVkExecPool *pool)
Retrieve an execution pool.
int ff_vk_exec_submit(FFVulkanContext *s, FFVkExecContext *e)
void ff_vk_exec_bind_shader(FFVulkanContext *s, FFVkExecContext *e, const FFVulkanShader *shd)
Bind a shader.
void ff_vk_exec_move_dep_refstruct(FFVulkanContext *s, FFVkExecContext *e, void *obj)
int ff_vk_shader_update_desc_buffer(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd, int set, int bind, int elem, FFVkBuffer *buf, VkDeviceSize offset, VkDeviceSize len, VkFormat fmt)
Update a descriptor in a buffer with a buffer.
int ff_vk_host_map_buffer(FFVulkanContext *s, FFVkBuffer **dst, uint8_t *src_data, VkDeviceSize size, const AVBufferRef *src_buf, VkBufferUsageFlags usage)
Maps a system RAM buffer into a Vulkan buffer.
void ff_vk_exec_add_dep_refstruct(FFVulkanContext *s, FFVkExecContext *e, void *obj)
Execution dependency management.
int ff_vk_get_pooled_buffer(FFVulkanContext *ctx, AVRefStructPool **buf_pool, FFVkBuffer **buf, VkBufferUsageFlags usage, void *create_pNext, size_t size, VkMemoryPropertyFlagBits mem_props)
Initialize a pool and create AVBufferRefs containing FFVkBuffer.
int ff_vk_exec_mirror_sem_value(FFVulkanContext *s, FFVkExecContext *e, VkSemaphore *dst, uint64_t *dst_val, AVFrame *f)
void ff_vk_exec_discard(FFVulkanContext *s, FFVkExecContext *e)
int ff_vk_shader_link(FFVulkanContext *s, FFVulkanShader *shd, const char *spirv, size_t spirv_len, const char *entrypoint)
Link a shader into an executable.
int ff_vk_exec_add_dep_frame(FFVulkanContext *s, FFVkExecContext *e, AVFrame *f, VkPipelineStageFlagBits2 wait_stage, VkPipelineStageFlagBits2 signal_stage)
void ff_vk_shader_update_push_const(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd, VkShaderStageFlagBits stage, int offset, size_t size, void *src)
Update push constant in a shader.
void ff_vk_exec_add_dep_wait_sem(FFVulkanContext *s, FFVkExecContext *e, VkSemaphore sem, uint64_t val, VkPipelineStageFlagBits2 stage)
Memory handling functions.
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
#define AV_PIX_FMT_FLAG_FLOAT
The pixel format contains IEEE-754 floating point values.
#define AV_PIX_FMT_GBRAP16
#define AV_PIX_FMT_GBRAP32
#define AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_GBRP12
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
@ AV_PIX_FMT_YA8
8 bits gray, 8 bits alpha
#define AV_PIX_FMT_GBRP14
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
void * av_refstruct_ref(void *obj)
Create a new reference to an object managed via this API, i.e.
static void av_refstruct_pool_uninit(AVRefStructPool **poolp)
Mark the pool as being available for freeing.
A reference to a data buffer.
uint8_t * data
The data buffer.
main external API structure.
enum AVPixelFormat sw_pix_fmt
Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
AVBufferRef * hw_frames_ctx
A reference to the AVHWFramesContext describing the input (for encoding) or output (decoding) frames.
struct AVCodecInternal * internal
Private context used for internal data.
int err_recognition
Error recognition; may misdetect some more or less valid parts as errors.
void * hwaccel_priv_data
hwaccel-specific private data
This structure describes decoded (raw) audio or video data.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
void * hwctx
The format-specific data, allocated and freed by libavutil along with this context.
This struct describes a set or pool of "hardware" frames (i.e.
enum AVPixelFormat format
The pixel format identifying the underlying HW surface type.
void * hwctx
The format-specific data, allocated and freed automatically along with this context.
enum AVPixelFormat sw_format
The pixel format identifying the actual data layout of the hardware frames.
int width
The allocated dimensions of the frames in this pool.
uint64_t flags
Combination of AV_PIX_FMT_FLAG_... flags.
uint8_t nb_components
The number of components each pixel has, (1-4)
AVRefStructPool is an API for a thread-safe pool of objects managed via the RefStruct API.
VkImageLayout layout[AV_NUM_DATA_POINTERS]
VkAccessFlagBits2 access[AV_NUM_DATA_POINTERS]
Updated after every barrier.
VkImage img[AV_NUM_DATA_POINTERS]
Vulkan images to which the memory is bound to.
Main Vulkan context, allocated as AVHWDeviceContext.hwctx.
VkDevice act_dev
Active device.
Allocated as AVHWFramesContext.hwctx, used to set pool-specific options.
VkImageTiling tiling
Controls the tiling of allocated frames.
VkImageCreateFlags img_flags
Flags to set during image creation.
VkImageUsageFlagBits usage
Defines extra usage of output frames.
VkMemoryPropertyFlagBits flags
FFVulkanDecodeShared * shared_ctx
PFN_vkInvalidateMappedMemoryRanges invalidate_memory_ranges
uint16_t context_count[8]
uint32_t extend_lookup[8]
AVRefStructPool * slice_fltmap_pool
AVRefStructPool * slice_feedback_pool
AVBufferRef * intermediate_frames_ref
AVRefStructPool * slice_state_pool
uint32_t slice_state_size
uint32_t plane_state_size
FFVkBuffer * slice_fltmap_buf
PFN_vkWaitSemaphores wait_semaphores
FFVkBuffer * slice_feedback_buf
uint32_t slice_size[MAX_SLICES]
RefStruct is an API for creating reference-counted objects with minimal overhead.
#define ff_vk_buf_barrier(dst, vkb, s_stage, s_access, s_access2, d_stage, d_access, d_access2, offs, bsz)
#define SPEC_LIST_ADD(name, idx, val_bits, val)
#define SPEC_LIST_CREATE(name, max_length, max_size)
static int ff_vk_count_images(AVVkFrame *f)
int ff_vk_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
Synchronize the contexts between 2 threads.
int ff_vk_decode_init(AVCodecContext *avctx)
Initialize decoder.
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...
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.
void ff_vk_decode_free_frame(AVHWDeviceContext *dev_ctx, FFVulkanDecodePicture *vp)
Free a frame and its state.
int ff_vk_decode_uninit(AVCodecContext *avctx)
Free decoder.
static int vk_ffv1_end_frame(AVCodecContext *avctx)
const unsigned int ff_ffv1_dec_rgb_golomb_comp_spv_len
static int vk_ffv1_start_frame(AVCodecContext *avctx, const AVBufferRef *buffer_ref, av_unused const uint8_t *buffer, av_unused uint32_t size)
static int vk_decode_ffv1_init(AVCodecContext *avctx)
static int cmp_slice_order(const void *a, const void *b)
const unsigned char ff_ffv1_dec_setup_comp_spv_data[]
const unsigned int ff_ffv1_dec_bayer_golomb_comp_spv_len
static int init_decode_shader(FFV1Context *f, FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd, AVHWFramesContext *dec_frames_ctx, AVHWFramesContext *out_frames_ctx, VkSpecializationInfo *sl, int ac, int rgb, int bayer, uint32_t lanes, uint32_t subgroup_size)
const unsigned char ff_ffv1_dec_comp_spv_data[]
const unsigned char ff_ffv1_dec_golomb_comp_spv_data[]
const unsigned int ff_ffv1_dec_comp_spv_len
static void vk_ffv1_free_frame_priv(AVRefStructOpaque _hwctx, void *data)
const unsigned int ff_ffv1_dec_rgb_float_comp_spv_len
const unsigned int ff_ffv1_dec_reset_golomb_comp_spv_len
const unsigned char ff_ffv1_dec_bayer_golomb_comp_spv_data[]
static int vk_ffv1_decode_slice(AVCodecContext *avctx, const uint8_t *data, uint32_t size)
const unsigned int ff_ffv1_dec_bayer_comp_spv_len
const FFVulkanDecodeDescriptor ff_vk_dec_ffv1_desc
const unsigned int ff_ffv1_dec_reset_comp_spv_len
const unsigned int ff_ffv1_dec_setup_comp_spv_len
const unsigned char ff_ffv1_dec_reset_comp_spv_data[]
static void vk_decode_ffv1_uninit(FFVulkanDecodeShared *ctx)
const unsigned int ff_ffv1_dec_golomb_comp_spv_len
static int init_reset_shader(FFV1Context *f, FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd, VkSpecializationInfo *sl, int ac)
const unsigned char ff_ffv1_dec_bayer_comp_spv_data[]
const unsigned char ff_ffv1_dec_reset_golomb_comp_spv_data[]
const unsigned int ff_ffv1_dec_rgb_float_golomb_comp_spv_len
const unsigned char ff_ffv1_dec_rgb_comp_spv_data[]
const unsigned char ff_ffv1_dec_rgb_float_comp_spv_data[]
const unsigned char ff_ffv1_dec_rgb_float_golomb_comp_spv_data[]
static int init_indirect(AVCodecContext *avctx, FFVulkanContext *s, AVBufferRef **dst, enum AVPixelFormat sw_format)
const unsigned int ff_ffv1_dec_rgb_comp_spv_len
const unsigned char ff_ffv1_dec_rgb_golomb_comp_spv_data[]
static int init_setup_shader(FFV1Context *f, FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd, VkSpecializationInfo *sl)
#define FF_VK_EXT_EXTERNAL_HOST_MEMORY