FFmpeg
vulkan_dpx.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2025 Lynne <dev@lynne.ee>
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include "vulkan_decode.h"
22 #include "hwaccel_internal.h"
23 
24 #include "dpx.h"
25 #include "libavutil/mem.h"
26 
27 extern const unsigned char ff_dpx_unpack_comp_spv_data[];
28 extern const unsigned int ff_dpx_unpack_comp_spv_len;
29 
30 extern const unsigned char ff_dpx_copy_comp_spv_data[];
31 extern const unsigned int ff_dpx_copy_comp_spv_len;
32 
35  .queue_flags = VK_QUEUE_COMPUTE_BIT,
36 };
37 
38 typedef struct DPXVulkanDecodePicture {
41 
42 typedef struct DPXVulkanDecodeContext {
46 
47 typedef struct DecodePushData {
49  int nb_comp;
50  int nb_images;
51  int stride;
54  int shift;
56 
59  const uint8_t *src, uint32_t size)
60 {
61  int err;
62  VkImage temp;
63 
65  DPXVulkanDecodeContext *dxv = ctx->sd_ctx;
66  VkPhysicalDeviceLimits *limits = &ctx->s.props.properties.limits;
67  FFVulkanFunctions *vk = &ctx->s.vkfn;
68 
70  FFVulkanDecodePicture *vp = &pp->vp;
71 
72  int unpack = (avctx->bits_per_raw_sample == 12 && !dpx->packing) ||
73  avctx->bits_per_raw_sample == 10;
74  if (unpack)
75  return 0;
76 
77  VkImageCreateInfo create_info = {
78  .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
79  .imageType = VK_IMAGE_TYPE_2D,
80  .format = avctx->bits_per_raw_sample == 8 ? VK_FORMAT_R8_UINT :
81  avctx->bits_per_raw_sample == 32 ? VK_FORMAT_R32_UINT :
82  VK_FORMAT_R16_UINT,
83  .extent.width = dpx->frame->width*dpx->components,
84  .extent.height = dpx->frame->height,
85  .extent.depth = 1,
86  .mipLevels = 1,
87  .arrayLayers = 1,
88  .tiling = VK_IMAGE_TILING_LINEAR,
89  .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,
90  .usage = VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT,
91  .samples = VK_SAMPLE_COUNT_1_BIT,
92  .pQueueFamilyIndices = &ctx->qf[0].idx,
93  .queueFamilyIndexCount = 1,
94  .sharingMode = VK_SHARING_MODE_EXCLUSIVE,
95  };
96 
97  if (create_info.extent.width >= limits->maxImageDimension2D ||
98  create_info.extent.height >= limits->maxImageDimension2D)
99  return 0;
100 
101  vk->CreateImage(ctx->s.hwctx->act_dev, &create_info, ctx->s.hwctx->alloc,
102  &temp);
103 
105  &vp->slices_buf,
106  VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
107  VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
108  NULL, size,
109  VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
110  VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
111  if (err < 0)
112  return err;
113 
114  FFVkBuffer *vkb = (FFVkBuffer *)vp->slices_buf->data;
115  VkBindImageMemoryInfo bind_info = {
116  .sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO,
117  .image = temp,
118  .memory = vkb->mem,
119  };
120  vk->BindImageMemory2(ctx->s.hwctx->act_dev, 1, &bind_info);
121 
122  VkHostImageLayoutTransitionInfo layout_change = {
123  .sType = VK_STRUCTURE_TYPE_HOST_IMAGE_LAYOUT_TRANSITION_INFO,
124  .image = temp,
125  .oldLayout = VK_IMAGE_LAYOUT_UNDEFINED,
126  .newLayout = VK_IMAGE_LAYOUT_GENERAL,
127  .subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
128  .subresourceRange.layerCount = 1,
129  .subresourceRange.levelCount = 1,
130  };
131  vk->TransitionImageLayoutEXT(ctx->s.hwctx->act_dev, 1, &layout_change);
132 
133  VkMemoryToImageCopy copy_region = {
134  .sType = VK_STRUCTURE_TYPE_MEMORY_TO_IMAGE_COPY,
135  .pHostPointer = src,
136  .imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
137  .imageSubresource.layerCount = 1,
138  .imageExtent = (VkExtent3D){ dpx->frame->width*dpx->components,
139  dpx->frame->height,
140  1 },
141  };
142  VkCopyMemoryToImageInfo copy_info = {
143  .sType = VK_STRUCTURE_TYPE_COPY_MEMORY_TO_IMAGE_INFO,
144  .flags = VK_HOST_IMAGE_COPY_MEMCPY_EXT,
145  .dstImage = temp,
146  .dstImageLayout = VK_IMAGE_LAYOUT_GENERAL,
147  .regionCount = 1,
148  .pRegions = &copy_region,
149  };
150  vk->CopyMemoryToImageEXT(ctx->s.hwctx->act_dev, &copy_info);
151 
152  vk->DestroyImage(ctx->s.hwctx->act_dev, temp, ctx->s.hwctx->alloc);
153 
154  return 0;
155 }
156 
158  const AVBufferRef *buffer_ref,
159  av_unused const uint8_t *buffer,
160  av_unused uint32_t size)
161 {
162  int err;
165  DPXDecContext *dpx = avctx->priv_data;
166 
168  FFVulkanDecodePicture *vp = &pp->vp;
169 
170  if (ctx->s.extensions & FF_VK_EXT_HOST_IMAGE_COPY)
171  host_upload_image(avctx, dec, dpx, buffer, size);
172 
173  /* Host map the frame data if supported */
174  if (!vp->slices_buf &&
175  ctx->s.extensions & FF_VK_EXT_EXTERNAL_HOST_MEMORY)
176  ff_vk_host_map_buffer(&ctx->s, &vp->slices_buf, (uint8_t *)buffer,
177  buffer_ref,
178  VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
179  VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT);
180 
181  /* Prepare frame to be used */
182  err = ff_vk_decode_prepare_frame_sdr(dec, dpx->frame, vp, 1,
183  FF_VK_REP_NATIVE, 0);
184  if (err < 0)
185  return err;
186 
187  return 0;
188 }
189 
191  const uint8_t *data,
192  uint32_t size)
193 {
194  DPXDecContext *dpx = avctx->priv_data;
195 
197  FFVulkanDecodePicture *vp = &pp->vp;
198 
199  if (!vp->slices_buf) {
200  int err = ff_vk_decode_add_slice(avctx, vp, data, size, 0,
201  NULL, NULL);
202  if (err < 0)
203  return err;
204  }
205 
206  return 0;
207 }
208 
210 {
211  int err;
214  FFVulkanFunctions *vk = &ctx->s.vkfn;
215 
216  DPXDecContext *dpx = avctx->priv_data;
217  DPXVulkanDecodeContext *dxv = ctx->sd_ctx;
218 
220  FFVulkanDecodePicture *vp = &pp->vp;
221 
222  int unpack = (avctx->bits_per_raw_sample == 12 && !dpx->packing) ||
223  avctx->bits_per_raw_sample == 10;
224 
225  FFVkBuffer *slices_buf = (FFVkBuffer *)vp->slices_buf->data;
226 
227  VkImageMemoryBarrier2 img_bar[8];
228  int nb_img_bar = 0;
229 
230  FFVkExecContext *exec = ff_vk_exec_get(&ctx->s, &ctx->exec_pool);
231  ff_vk_exec_start(&ctx->s, exec);
232 
233  /* Prepare deps */
234  RET(ff_vk_exec_add_dep_frame(&ctx->s, exec, dpx->frame,
235  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
236  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
237 
238  err = ff_vk_exec_mirror_sem_value(&ctx->s, exec, &vp->sem, &vp->sem_value,
239  dpx->frame);
240  if (err < 0)
241  return err;
242 
243  RET(ff_vk_exec_add_dep_buf(&ctx->s, exec, &vp->slices_buf, 1, 0));
244  vp->slices_buf = NULL;
245 
246  AVVkFrame *vkf = (AVVkFrame *)dpx->frame->data[0];
247  for (int i = 0; i < 4; i++) {
248  vkf->layout[i] = VK_IMAGE_LAYOUT_UNDEFINED;
249  vkf->access[i] = VK_ACCESS_2_NONE;
250  }
251 
252  ff_vk_frame_barrier(&ctx->s, exec, dpx->frame, img_bar, &nb_img_bar,
253  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
254  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
255  VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
256  VK_IMAGE_LAYOUT_GENERAL,
257  VK_QUEUE_FAMILY_IGNORED);
258 
259  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
260  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
261  .pImageMemoryBarriers = img_bar,
262  .imageMemoryBarrierCount = nb_img_bar,
263  });
264  nb_img_bar = 0;
265 
266  FFVulkanShader *shd = &dxv->shader;
267  ff_vk_shader_update_img_array(&ctx->s, exec, shd,
268  dpx->frame, vp->view.out,
269  0, 0,
270  VK_IMAGE_LAYOUT_GENERAL,
271  VK_NULL_HANDLE);
272  ff_vk_shader_update_desc_buffer(&ctx->s, exec, shd,
273  0, 1, 0,
274  slices_buf,
275  0, slices_buf->size,
276  VK_FORMAT_UNDEFINED);
277  if (!unpack) {
278  ff_vk_shader_update_desc_buffer(&ctx->s, exec, shd,
279  0, 2, 0,
280  slices_buf,
281  0, slices_buf->size,
282  VK_FORMAT_UNDEFINED);
283  ff_vk_shader_update_desc_buffer(&ctx->s, exec, shd,
284  0, 3, 0,
285  slices_buf,
286  0, slices_buf->size,
287  VK_FORMAT_UNDEFINED);
288  }
289 
290  ff_vk_exec_bind_shader(&ctx->s, exec, shd);
291 
292  /* Update push data */
295  .nb_comp = dpx->components,
296  .nb_images = ff_vk_count_images(vkf),
297  .stride = dpx->stride,
298  .need_align = dpx->need_align,
299  .padded_10bit = !dpx->unpadded_10bit,
300  .shift = FFALIGN(avctx->bits_per_raw_sample, 8) -
301  avctx->bits_per_raw_sample,
302  };
303 
304  ff_vk_shader_update_push_const(&ctx->s, exec, shd,
305  VK_SHADER_STAGE_COMPUTE_BIT,
306  0, sizeof(pd), &pd);
307 
308  vk->CmdDispatch(exec->buf,
309  FFALIGN(dpx->frame->width, shd->lg_size[0])/shd->lg_size[0],
310  FFALIGN(dpx->frame->height, shd->lg_size[1])/shd->lg_size[1],
311  1);
312 
313  err = ff_vk_exec_submit(&ctx->s, exec);
314  if (err < 0)
315  return err;
316 
317 fail:
318  return 0;
319 }
320 
322  FFVkExecPool *pool, FFVulkanShader *shd, int bits)
323 {
324  int err;
325  DPXDecContext *dpx = avctx->priv_data;
326  AVHWFramesContext *dec_frames_ctx;
327  dec_frames_ctx = (AVHWFramesContext *)avctx->hw_frames_ctx->data;
328 
329  int unpack = (avctx->bits_per_raw_sample == 12 && !dpx->packing) ||
330  avctx->bits_per_raw_sample == 10;
331 
332  SPEC_LIST_CREATE(sl, 2, 2*sizeof(uint32_t))
333  SPEC_LIST_ADD(sl, 0, 32, dpx->endian && bits > 8); /* big endian */
334  if (unpack)
335  SPEC_LIST_ADD(sl, 1, 32, bits == 10); /* packed_10bit */
336  else
337  SPEC_LIST_ADD(sl, 1, 32, FFALIGN(bits, 8)); /* type_bits */
338 
339  ff_vk_shader_load(shd, VK_SHADER_STAGE_COMPUTE_BIT, sl,
340  (uint32_t []) { 512, 1, 1 }, 0);
341 
343  VK_SHADER_STAGE_COMPUTE_BIT);
344 
345  const FFVulkanDescriptorSetBinding desc_set[] = {
346  {
347  .name = "dst",
348  .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
349  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
350  .elems = av_pix_fmt_count_planes(dec_frames_ctx->sw_format),
351  },
352  {
353  .name = "data_buf",
354  .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
355  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
356  },
357  {
358  .name = "data_buf16",
359  .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
360  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
361  },
362  {
363  .name = "data_buf32",
364  .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
365  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
366  },
367  };
368  ff_vk_shader_add_descriptor_set(s, shd, desc_set, 2 + (2*!unpack), 0, 0);
369 
370  const unsigned char *src = ff_dpx_copy_comp_spv_data;
371  size_t src_len = ff_dpx_copy_comp_spv_len;
372  if (unpack) {
374  src_len = ff_dpx_unpack_comp_spv_len;
375  }
376  RET(ff_vk_shader_link(s, shd, src, src_len, "main"));
377 
378  RET(ff_vk_shader_register_exec(s, pool, shd));
379 
380 fail:
381  return err;
382 }
383 
385 {
386  DPXVulkanDecodeContext *fv = ctx->sd_ctx;
387 
388  ff_vk_shader_free(&ctx->s, &fv->shader);
389 
391 
392  av_freep(&fv);
393 }
394 
396 {
397  int err;
398  DPXDecContext *dpx = avctx->priv_data;
400 
401  switch (dpx->pix_fmt) {
402  case AV_PIX_FMT_GRAY10:
403  case AV_PIX_FMT_GBRAP10:
404  case AV_PIX_FMT_UYVY422:
405  case AV_PIX_FMT_YUV444P:
406  case AV_PIX_FMT_YUVA444P:
407  return AVERROR(ENOTSUP);
408  case AV_PIX_FMT_GBRP10:
409  if (dpx->unpadded_10bit)
410  return AVERROR(ENOTSUP);
411  /* fallthrough */
412  default:
413  break;
414  }
415 
416  err = ff_vk_decode_init(avctx);
417  if (err < 0)
418  return err;
419 
421  DPXVulkanDecodeContext *dxv = ctx->sd_ctx = av_mallocz(sizeof(*dxv));
422  if (!dxv)
423  return AVERROR(ENOMEM);
424 
425  ctx->sd_ctx_free = &vk_decode_dpx_uninit;
426 
427  RET(init_shader(avctx, &ctx->s, &ctx->exec_pool,
428  &dxv->shader, avctx->bits_per_raw_sample));
429 
430 fail:
431  return err;
432 }
433 
435 {
436  AVHWDeviceContext *dev_ctx = _hwctx.nc;
437 
439  FFVulkanDecodePicture *vp = &pp->vp;
440 
441  ff_vk_decode_free_frame(dev_ctx, vp);
442 }
443 
445  .p.name = "dpx_vulkan",
446  .p.type = AVMEDIA_TYPE_VIDEO,
447  .p.id = AV_CODEC_ID_DPX,
448  .p.pix_fmt = AV_PIX_FMT_VULKAN,
449  .start_frame = &vk_dpx_start_frame,
450  .decode_slice = &vk_dpx_decode_slice,
451  .end_frame = &vk_dpx_end_frame,
452  .free_frame_priv = &vk_dpx_free_frame_priv,
453  .frame_priv_data_size = sizeof(DPXVulkanDecodePicture),
457  .frame_params = &ff_vk_frame_params,
458  .priv_data_size = sizeof(FFVulkanDecodeContext),
460 };
AV_CODEC_ID_DPX
@ AV_CODEC_ID_DPX
Definition: codec_id.h:180
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
DPXVulkanDecodePicture::vp
FFVulkanDecodePicture vp
Definition: vulkan_dpx.c:39
ff_vk_shader_free
void ff_vk_shader_free(FFVulkanContext *s, FFVulkanShader *shd)
Free a shader.
Definition: vulkan.c:2984
DPXDecContext::packing
int packing
Definition: dpx.h:65
AVBufferPool
The buffer pool.
Definition: buffer_internal.h:88
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:249
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:90
FFVulkanDecodeContext::shared_ctx
FFVulkanDecodeShared * shared_ctx
Definition: vulkan_decode.h:55
RET
#define RET(x)
Definition: vulkan.h:68
AVRefStructOpaque
RefStruct is an API for creating reference-counted objects with minimal overhead.
Definition: refstruct.h:58
DPXDecContext::hwaccel_picture_private
void * hwaccel_picture_private
Definition: dpx.h:62
AVRefStructOpaque::nc
void * nc
Definition: refstruct.h:59
dpx.h
av_unused
#define av_unused
Definition: attributes.h:151
FFHWAccel::p
AVHWAccel p
The public AVHWAccel.
Definition: hwaccel_internal.h:38
AVFrame::width
int width
Definition: frame.h:499
data
const char data[16]
Definition: mxf.c:149
FFVulkanDecodeDescriptor::codec_id
enum AVCodecID codec_id
Definition: vulkan_decode.h:30
ff_dpx_unpack_comp_spv_data
const unsigned char ff_dpx_unpack_comp_spv_data[]
ff_vk_exec_get
FFVkExecContext * ff_vk_exec_get(FFVulkanContext *s, FFVkExecPool *pool)
Retrieve an execution pool.
Definition: vulkan.c:557
FF_VK_REP_NATIVE
@ FF_VK_REP_NATIVE
Definition: vulkan.h:450
SPEC_LIST_ADD
#define SPEC_LIST_ADD(name, idx, val_bits, val)
Definition: vulkan.h:86
FFVulkanDecodeContext
Definition: vulkan_decode.h:54
AV_PIX_FMT_VULKAN
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
Definition: pixfmt.h:379
ff_vk_exec_add_dep_frame
int ff_vk_exec_add_dep_frame(FFVulkanContext *s, FFVkExecContext *e, AVFrame *f, VkPipelineStageFlagBits2 wait_stage, VkPipelineStageFlagBits2 signal_stage)
Definition: vulkan.c:789
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:448
FF_VK_EXT_HOST_IMAGE_COPY
#define FF_VK_EXT_HOST_IMAGE_COPY
Definition: vulkan_functions.h:52
av_pix_fmt_count_planes
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3496
vk_decode_dpx_uninit
static void vk_decode_dpx_uninit(FFVulkanDecodeShared *ctx)
Definition: vulkan_dpx.c:384
FFHWAccel
Definition: hwaccel_internal.h:34
fail
#define fail()
Definition: checkasm.h:216
FFVulkanDecodePicture::sem_value
uint64_t sem_value
Definition: vulkan_decode.h:85
AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_GBRP10
Definition: pixfmt.h:558
DecodePushData::shift
int shift
Definition: vulkan_dpx.c:54
DPXDecContext::stride
int stride
Definition: dpx.h:66
ff_vk_shader_update_img_array
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.
Definition: vulkan.c:2858
ff_vk_frame_barrier
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)
Definition: vulkan.c:2048
HWACCEL_CAP_THREAD_SAFE
#define HWACCEL_CAP_THREAD_SAFE
Definition: hwaccel_internal.h:32
ff_vk_shader_register_exec
int ff_vk_shader_register_exec(FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd)
Register a shader with an exec pool.
Definition: vulkan.c:2637
ff_vk_host_map_buffer
int ff_vk_host_map_buffer(FFVulkanContext *s, AVBufferRef **dst, uint8_t *src_data, const AVBufferRef *src_buf, VkBufferUsageFlags usage)
Maps a system RAM buffer into a Vulkan buffer.
Definition: vulkan.c:1400
DecodePushData::stride
int stride
Definition: vulkan_dpx.c:51
FFVulkanDecodeShared
Definition: vulkan_decode.h:38
DPXVulkanDecodeContext
Definition: vulkan_dpx.c:42
AVHWDeviceContext
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition: hwcontext.h:63
DecodePushData::bits_per_comp
int bits_per_comp
Definition: vulkan_dpx.c:48
vk_dpx_decode_slice
static int vk_dpx_decode_slice(AVCodecContext *avctx, const uint8_t *data, uint32_t size)
Definition: vulkan_dpx.c:190
AV_PIX_FMT_GBRAP10
#define AV_PIX_FMT_GBRAP10
Definition: pixfmt.h:562
s
#define s(width, name)
Definition: cbs_vp9.c:198
FFVulkanDecodePicture
Definition: vulkan_decode.h:73
ff_vk_exec_mirror_sem_value
int ff_vk_exec_mirror_sem_value(FFVulkanContext *s, FFVkExecContext *e, VkSemaphore *dst, uint64_t *dst_val, AVFrame *f)
Definition: vulkan.c:888
bits
uint8_t bits
Definition: vp3data.h:128
DPXVulkanDecodeContext::shader
FFVulkanShader shader
Definition: vulkan_dpx.c:43
ff_vk_dec_dpx_desc
const FFVulkanDecodeDescriptor ff_vk_dec_dpx_desc
Definition: vulkan_dpx.c:33
AVCodecContext::bits_per_raw_sample
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
Definition: avcodec.h:1561
ctx
AVFormatContext * ctx
Definition: movenc.c:49
DecodePushData
Definition: vulkan_dpx.c:47
ff_vk_exec_add_dep_buf
int ff_vk_exec_add_dep_buf(FFVulkanContext *s, FFVkExecContext *e, AVBufferRef **deps, int nb_deps, int ref)
Execution dependency management.
Definition: vulkan.c:629
DPXDecContext::components
int components
Definition: dpx.h:68
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
DPXDecContext::endian
int endian
Definition: dpx.h:67
AV_PIX_FMT_GRAY10
#define AV_PIX_FMT_GRAY10
Definition: pixfmt.h:519
if
if(ret)
Definition: filter_design.txt:179
HWACCEL_CAP_ASYNC_SAFE
#define HWACCEL_CAP_ASYNC_SAFE
Header providing the internals of AVHWAccel.
Definition: hwaccel_internal.h:31
NULL
#define NULL
Definition: coverity.c:32
AVHWFramesContext::sw_format
enum AVPixelFormat sw_format
The pixel format identifying the actual data layout of the hardware frames.
Definition: hwcontext.h:213
hwaccel_internal.h
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:676
vk_dpx_free_frame_priv
static void vk_dpx_free_frame_priv(AVRefStructOpaque _hwctx, void *data)
Definition: vulkan_dpx.c:434
AVCodecContext::internal
struct AVCodecInternal * internal
Private context used for internal data.
Definition: avcodec.h:474
av_buffer_pool_uninit
void av_buffer_pool_uninit(AVBufferPool **ppool)
Mark the pool as being available for freeing.
Definition: buffer.c:328
ff_vk_decode_uninit
int ff_vk_decode_uninit(AVCodecContext *avctx)
Free decoder.
Definition: vulkan_decode.c:1279
ff_vk_shader_link
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.
Definition: vulkan.c:2393
SPEC_LIST_CREATE
#define SPEC_LIST_CREATE(name, max_length, max_size)
Definition: vulkan.h:76
FFVulkanContext
Definition: vulkan.h:313
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:1141
DecodePushData::padded_10bit
int padded_10bit
Definition: vulkan_dpx.c:53
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:550
AVVkFrame::access
VkAccessFlagBits access[AV_NUM_DATA_POINTERS]
Updated after every barrier.
Definition: hwcontext_vulkan.h:331
ff_vk_shader_update_push_const
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.
Definition: vulkan.c:2937
FFVulkanDescriptorSetBinding
Definition: vulkan.h:112
ff_dpx_unpack_comp_spv_len
const unsigned int ff_dpx_unpack_comp_spv_len
AVCodecInternal::hwaccel_priv_data
void * hwaccel_priv_data
hwaccel-specific private data
Definition: internal.h:130
init_shader
static int init_shader(AVCodecContext *avctx, FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd, int bits)
Definition: vulkan_dpx.c:321
AVVkFrame
Definition: hwcontext_vulkan.h:302
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:424
size
int size
Definition: twinvq_data.h:10344
FFVulkanShader
Definition: vulkan.h:225
ff_dpx_copy_comp_spv_len
const unsigned int ff_dpx_copy_comp_spv_len
AV_PIX_FMT_YUVA444P
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
Definition: pixfmt.h:174
FFVkExecContext
Definition: vulkan.h:145
ff_vk_shader_update_desc_buffer
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.
Definition: vulkan.c:2871
FFVulkanDescriptorSetBinding::name
const char * name
Definition: vulkan.h:113
AVHWAccel::name
const char * name
Name of the hardware accelerated codec.
Definition: avcodec.h:1957
FF_VK_EXT_EXTERNAL_HOST_MEMORY
#define FF_VK_EXT_EXTERNAL_HOST_MEMORY
Definition: vulkan_functions.h:36
DPXDecContext::need_align
int need_align
Definition: dpx.h:70
uninit
static void uninit(AVBSFContext *ctx)
Definition: pcm_rechunk.c:68
unpack
static int unpack(const uint8_t *src, const uint8_t *src_end, uint8_t *dst, int width, int height)
Unpack buffer.
Definition: eatgv.c:73
FFVulkanDecodePicture::view
struct FFVulkanDecodePicture::@328 view
FFVulkanDecodePicture::out
VkImageView out[AV_NUM_DATA_POINTERS]
Definition: vulkan_decode.h:78
ff_vk_exec_start
int ff_vk_exec_start(FFVulkanContext *s, FFVkExecContext *e)
Start/submit/wait an execution.
Definition: vulkan.c:569
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
vk_decode_dpx_init
static int vk_decode_dpx_init(AVCodecContext *avctx)
Definition: vulkan_dpx.c:395
ff_dpx_copy_comp_spv_data
const unsigned char ff_dpx_copy_comp_spv_data[]
DecodePushData::nb_comp
int nb_comp
Definition: vulkan_dpx.c:49
DPXVulkanDecodeContext::frame_data_pool
AVBufferPool * frame_data_pool
Definition: vulkan_dpx.c:44
FFVkBuffer::mem
VkDeviceMemory mem
Definition: vulkan.h:127
FFVulkanDecodePicture::sem
VkSemaphore sem
Definition: vulkan_decode.h:84
ff_dpx_vulkan_hwaccel
const FFHWAccel ff_dpx_vulkan_hwaccel
Definition: vulkan_dpx.c:444
ff_vk_exec_bind_shader
void ff_vk_exec_bind_shader(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd)
Bind a shader.
Definition: vulkan.c:2947
AVCodecContext::hw_frames_ctx
AVBufferRef * hw_frames_ctx
A reference to the AVHWFramesContext describing the input (for encoding) or output (decoding) frames.
Definition: avcodec.h:1461
AVHWFramesContext
This struct describes a set or pool of "hardware" frames (i.e.
Definition: hwcontext.h:118
DecodePushData::need_align
int need_align
Definition: vulkan_dpx.c:52
FFVkExecPool
Definition: vulkan.h:291
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:296
ff_vk_shader_add_push_const
int ff_vk_shader_add_push_const(FFVulkanShader *shd, int offset, int size, VkShaderStageFlagBits stage)
Add/update push constants for execution.
Definition: vulkan.c:1498
AV_PIX_FMT_UYVY422
@ AV_PIX_FMT_UYVY422
packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
Definition: pixfmt.h:88
FFVkExecContext::buf
VkCommandBuffer buf
Definition: vulkan.h:156
DecodePushData::nb_images
int nb_images
Definition: vulkan_dpx.c:50
DPXDecContext::pix_fmt
enum AVPixelFormat pix_fmt
Definition: dpx.h:63
AVCodecContext
main external API structure.
Definition: avcodec.h:439
AVFrame::height
int height
Definition: frame.h:499
ff_vk_shader_add_descriptor_set
int ff_vk_shader_add_descriptor_set(FFVulkanContext *s, FFVulkanShader *shd, const FFVulkanDescriptorSetBinding *desc, int nb, int singular, int print_to_shader_only)
Add descriptor to a shader.
Definition: vulkan.c:2525
DPXDecContext::unpadded_10bit
int unpadded_10bit
Definition: dpx.h:69
buffer
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
Definition: filter_design.txt:49
update_thread_context
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before as well as code calling up to before the decode process starts Call have update_thread_context() run it in the next thread. Add AV_CODEC_CAP_FRAME_THREADS to the codec capabilities. There will be very little speed gain at this point but it should work. Use ff_thread_get_buffer()(or ff_progress_frame_get_buffer() in case you have inter-frame dependencies and use the ProgressFrame API) to allocate frame buffers. Call ff_progress_frame_report() after some part of the current picture has decoded. A good place to put this is where draw_horiz_band() is called - add this if it isn 't called anywhere
FFVulkanDecodeDescriptor
Definition: vulkan_decode.h:29
FFVulkanShader::lg_size
uint32_t lg_size[3]
Definition: vulkan.h:237
temp
else temp
Definition: vf_mcdeint.c:271
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:134
AV_PIX_FMT_YUV444P
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:78
DPXVulkanDecodePicture
Definition: vulkan_dpx.c:38
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
FFVulkanDecodePicture::slices_buf
AVBufferRef * slices_buf
Definition: vulkan_decode.h:99
mem.h
AVVkFrame::layout
VkImageLayout layout[AV_NUM_DATA_POINTERS]
Definition: hwcontext_vulkan.h:332
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
DPXDecContext
Definition: dpx.h:60
vulkan_decode.h
ff_vk_count_images
static int ff_vk_count_images(AVVkFrame *f)
Definition: vulkan.h:367
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
vk_dpx_end_frame
static int vk_dpx_end_frame(AVCodecContext *avctx)
Definition: vulkan_dpx.c:209
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:466
DPXDecContext::frame
AVFrame * frame
Definition: dpx.h:61
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
FFVkBuffer
Definition: vulkan.h:125
ff_vk_exec_submit
int ff_vk_exec_submit(FFVulkanContext *s, FFVkExecContext *e)
Definition: vulkan.c:914
ff_vk_decode_init
int ff_vk_decode_init(AVCodecContext *avctx)
Initialize decoder.
Definition: vulkan_decode.c:1290
host_upload_image
static int host_upload_image(AVCodecContext *avctx, FFVulkanDecodeContext *dec, DPXDecContext *dpx, const uint8_t *src, uint32_t size)
Definition: vulkan_dpx.c:57
FFVulkanFunctions
Definition: vulkan_functions.h:282
ff_vk_shader_load
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.
Definition: vulkan.c:2091
ff_vk_get_pooled_buffer
int ff_vk_get_pooled_buffer(FFVulkanContext *ctx, AVBufferPool **buf_pool, AVBufferRef **buf, VkBufferUsageFlags usage, void *create_pNext, size_t size, VkMemoryPropertyFlagBits mem_props)
Initialize a pool and create AVBufferRefs containing FFVkBuffer.
Definition: vulkan.c:1295
src
#define src
Definition: vp8dsp.c:248
vk_dpx_start_frame
static int vk_dpx_start_frame(AVCodecContext *avctx, const AVBufferRef *buffer_ref, av_unused const uint8_t *buffer, av_unused uint32_t size)
Definition: vulkan_dpx.c:157