FFmpeg
vulkan_prores_raw.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 "prores_raw.h"
25 #include "libavutil/vulkan_spirv.h"
26 #include "libavutil/mem.h"
27 
28 extern const char *ff_source_common_comp;
29 extern const char *ff_source_prores_raw_decode_comp;
30 extern const char *ff_source_prores_raw_idct_comp;
31 
34  .decode_extension = FF_VK_EXT_PUSH_DESCRIPTOR,
35  .queue_flags = VK_QUEUE_COMPUTE_BIT,
36 };
37 
40 
42  uint32_t nb_tiles;
44 
48 
51 
52 typedef struct DecodePushData {
53  VkDeviceAddress pkt_data;
56  uint8_t qmat[64];
58 
59 typedef struct TileData {
61  uint32_t offset;
62  uint32_t size;
63 } TileData;
64 
66  const AVBufferRef *buffer_ref,
67  av_unused const uint8_t *buffer,
68  av_unused uint32_t size)
69 {
70  int err;
73  ProResRAWVulkanDecodeContext *prv = ctx->sd_ctx;
74  ProResRAWContext *prr = avctx->priv_data;
75 
77  FFVulkanDecodePicture *vp = &pp->vp;
78 
79  /* Host map the input tile data if supported */
80  if (ctx->s.extensions & FF_VK_EXT_EXTERNAL_HOST_MEMORY)
81  ff_vk_host_map_buffer(&ctx->s, &vp->slices_buf, buffer_ref->data,
82  buffer_ref,
83  VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
84  VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT);
85 
86  /* Allocate tile data */
88  &pp->frame_data_buf,
89  VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
90  VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
91  NULL, prr->nb_tiles*sizeof(TileData),
92  VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
93  VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
94  if (err < 0)
95  return err;
96 
97  /* Prepare frame to be used */
98  err = ff_vk_decode_prepare_frame_sdr(dec, prr->frame, vp, 1,
99  FF_VK_REP_NATIVE, 0);
100  if (err < 0)
101  return err;
102 
103  return 0;
104 }
105 
107  const uint8_t *data,
108  uint32_t size)
109 {
110  ProResRAWContext *prr = avctx->priv_data;
111 
113  FFVulkanDecodePicture *vp = &pp->vp;
114 
115  FFVkBuffer *frame_data_buf = (FFVkBuffer *)pp->frame_data_buf->data;
116  TileData *td = (TileData *)frame_data_buf->mapped_mem;
117  FFVkBuffer *slices_buf = vp->slices_buf ? (FFVkBuffer *)vp->slices_buf->data : NULL;
118 
119  td[pp->nb_tiles].pos[0] = prr->tiles[pp->nb_tiles].x;
120  td[pp->nb_tiles].pos[1] = prr->tiles[pp->nb_tiles].y;
121  td[pp->nb_tiles].size = size;
122 
123  if (vp->slices_buf && slices_buf->host_ref) {
124  td[pp->nb_tiles].offset = data - slices_buf->mapped_mem;
125  pp->nb_tiles++;
126  } else {
127  int err;
128  td[pp->nb_tiles].offset = vp->slices_size;
129  err = ff_vk_decode_add_slice(avctx, vp, data, size, 0,
130  &pp->nb_tiles, NULL);
131  if (err < 0)
132  return err;
133  }
134 
135  return 0;
136 }
137 
139 {
140  int err;
143  FFVulkanFunctions *vk = &ctx->s.vkfn;
144 
145  ProResRAWContext *prr = avctx->priv_data;
146  ProResRAWVulkanDecodeContext *prv = ctx->sd_ctx;
147 
149  FFVulkanDecodePicture *vp = &pp->vp;
150 
151  FFVkBuffer *slices_buf = (FFVkBuffer *)vp->slices_buf->data;
152  FFVkBuffer *frame_data_buf = (FFVkBuffer *)pp->frame_data_buf->data;
153 
154  VkImageMemoryBarrier2 img_bar[8];
155  int nb_img_bar = 0;
156 
157  FFVkExecContext *exec = ff_vk_exec_get(&ctx->s, &ctx->exec_pool);
158  ff_vk_exec_start(&ctx->s, exec);
159 
160  /* Prepare deps */
161  RET(ff_vk_exec_add_dep_frame(&ctx->s, exec, prr->frame,
162  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
163  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
164 
165  err = ff_vk_exec_mirror_sem_value(&ctx->s, exec, &vp->sem, &vp->sem_value,
166  prr->frame);
167  if (err < 0)
168  return err;
169 
170  RET(ff_vk_exec_add_dep_buf(&ctx->s, exec, &pp->frame_data_buf, 1, 0));
171  pp->frame_data_buf = NULL;
172  RET(ff_vk_exec_add_dep_buf(&ctx->s, exec, &vp->slices_buf, 1, 0));
173  vp->slices_buf = NULL;
174 
175  AVVkFrame *vkf = (AVVkFrame *)prr->frame->data[0];
176  vkf->layout[0] = VK_IMAGE_LAYOUT_UNDEFINED;
177  vkf->access[0] = VK_ACCESS_2_NONE;
178 
179  ff_vk_frame_barrier(&ctx->s, exec, prr->frame, img_bar, &nb_img_bar,
180  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
181  VK_PIPELINE_STAGE_2_CLEAR_BIT,
182  VK_ACCESS_2_TRANSFER_WRITE_BIT,
183  VK_IMAGE_LAYOUT_GENERAL,
184  VK_QUEUE_FAMILY_IGNORED);
185 
186  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
187  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
188  .pImageMemoryBarriers = img_bar,
189  .imageMemoryBarrierCount = nb_img_bar,
190  });
191  nb_img_bar = 0;
192 
193  vk->CmdClearColorImage(exec->buf, vkf->img[0],
194  VK_IMAGE_LAYOUT_GENERAL,
195  &((VkClearColorValue) { 0 }),
196  1, &((VkImageSubresourceRange) {
197  .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
198  .levelCount = 1,
199  .layerCount = 1,
200  }));
201 
202  ff_vk_frame_barrier(&ctx->s, exec, prr->frame, img_bar, &nb_img_bar,
203  VK_PIPELINE_STAGE_2_CLEAR_BIT,
204  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
205  VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
206  VK_IMAGE_LAYOUT_GENERAL,
207  VK_QUEUE_FAMILY_IGNORED);
208 
209  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
210  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
211  .pImageMemoryBarriers = img_bar,
212  .imageMemoryBarrierCount = nb_img_bar,
213  });
214  nb_img_bar = 0;
215 
216  FFVulkanShader *decode_shader = &prv->decode;
217  ff_vk_shader_update_img_array(&ctx->s, exec, decode_shader,
218  prr->frame, vp->view.out,
219  0, 0,
220  VK_IMAGE_LAYOUT_GENERAL,
221  VK_NULL_HANDLE);
222  ff_vk_shader_update_desc_buffer(&ctx->s, exec, decode_shader,
223  0, 1, 0,
224  frame_data_buf,
225  0, prr->nb_tiles*sizeof(TileData),
226  VK_FORMAT_UNDEFINED);
227 
228  ff_vk_exec_bind_shader(&ctx->s, exec, decode_shader);
229 
230  /* Update push data */
231  DecodePushData pd_decode = (DecodePushData) {
232  .pkt_data = slices_buf->address,
233  .frame_size[0] = avctx->width,
234  .frame_size[1] = avctx->height,
235  .tile_size[0] = prr->tw,
236  .tile_size[1] = prr->th,
237  };
238  memcpy(pd_decode.qmat, prr->qmat, 64);
239  ff_vk_shader_update_push_const(&ctx->s, exec, decode_shader,
240  VK_SHADER_STAGE_COMPUTE_BIT,
241  0, sizeof(pd_decode), &pd_decode);
242 
243  vk->CmdDispatch(exec->buf, prr->nb_tw, prr->nb_th, 1);
244 
245  ff_vk_frame_barrier(&ctx->s, exec, prr->frame, img_bar, &nb_img_bar,
246  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
247  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
248  VK_ACCESS_2_SHADER_STORAGE_READ_BIT |
249  VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
250  VK_IMAGE_LAYOUT_GENERAL,
251  VK_QUEUE_FAMILY_IGNORED);
252 
253  FFVulkanShader *idct_shader = &prv->idct;
254  ff_vk_shader_update_img_array(&ctx->s, exec, idct_shader,
255  prr->frame, vp->view.out,
256  0, 0,
257  VK_IMAGE_LAYOUT_GENERAL,
258  VK_NULL_HANDLE);
259  ff_vk_shader_update_desc_buffer(&ctx->s, exec, idct_shader,
260  0, 1, 0,
261  frame_data_buf,
262  0, prr->nb_tiles*sizeof(TileData),
263  VK_FORMAT_UNDEFINED);
264  ff_vk_exec_bind_shader(&ctx->s, exec, idct_shader);
265  ff_vk_shader_update_push_const(&ctx->s, exec, idct_shader,
266  VK_SHADER_STAGE_COMPUTE_BIT,
267  0, sizeof(pd_decode), &pd_decode);
268 
269  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
270  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
271  .pImageMemoryBarriers = img_bar,
272  .imageMemoryBarrierCount = nb_img_bar,
273  });
274  nb_img_bar = 0;
275 
276  vk->CmdDispatch(exec->buf, prr->nb_tw, prr->nb_th, 1);
277 
278  err = ff_vk_exec_submit(&ctx->s, exec);
279  if (err < 0)
280  return err;
281 
282 fail:
283  return 0;
284 }
285 
287  FFVulkanShader *shd, int writeonly)
288 {
289  AVHWFramesContext *dec_frames_ctx;
290  dec_frames_ctx = (AVHWFramesContext *)avctx->hw_frames_ctx->data;
291 
292  /* Common codec header */
294 
295  GLSLC(0, struct TileData { );
296  GLSLC(1, ivec2 pos; );
297  GLSLC(1, uint offset; );
298  GLSLC(1, uint size; );
299  GLSLC(0, }; );
300  GLSLC(0, );
301  GLSLC(0, layout(push_constant, scalar) uniform pushConstants { );
302  GLSLC(1, u8buf pkt_data; );
303  GLSLC(1, ivec2 frame_size; );
304  GLSLC(1, ivec2 tile_size; );
305  GLSLC(1, uint8_t qmat[64]; );
306  GLSLC(0, }; );
307  GLSLC(0, );
309  VK_SHADER_STAGE_COMPUTE_BIT);
310 
312  desc_set = (FFVulkanDescriptorSetBinding []) {
313  {
314  .name = "dst",
315  .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
316  .mem_layout = ff_vk_shader_rep_fmt(dec_frames_ctx->sw_format,
318  .mem_quali = writeonly ? "writeonly" : NULL,
319  .dimensions = 2,
320  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
321  },
322  {
323  .name = "frame_data_buf",
324  .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
325  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
326  .mem_layout = "scalar",
327  .mem_quali = "readonly",
328  .buf_content = "TileData tile_data[];",
329  },
330  };
331 
332  return ff_vk_shader_add_descriptor_set(s, shd, desc_set, 2, 0, 0);
333 }
334 
336  FFVkExecPool *pool, FFVkSPIRVCompiler *spv,
337  FFVulkanShader *shd, int version)
338 {
339  int err;
340  uint8_t *spv_data;
341  size_t spv_len;
342  void *spv_opaque = NULL;
343 
344  RET(ff_vk_shader_init(s, shd, "prores_raw",
345  VK_SHADER_STAGE_COMPUTE_BIT,
346  (const char *[]) { "GL_EXT_buffer_reference",
347  "GL_EXT_buffer_reference2",
348  "GL_EXT_null_initializer" }, 3,
349  4, 1, 1, 0));
350 
351  RET(add_common_data(avctx, s, shd, 1));
352 
354 
355  RET(spv->compile_shader(s, spv, shd, &spv_data, &spv_len, "main",
356  &spv_opaque));
357  RET(ff_vk_shader_link(s, shd, spv_data, spv_len, "main"));
358 
359  RET(ff_vk_shader_register_exec(s, pool, shd));
360 
361 fail:
362  if (spv_opaque)
363  spv->free_shader(spv, &spv_opaque);
364 
365  return err;
366 }
367 
369  FFVkExecPool *pool, FFVkSPIRVCompiler *spv,
370  FFVulkanShader *shd, int version)
371 {
372  int err;
373  uint8_t *spv_data;
374  size_t spv_len;
375  void *spv_opaque = NULL;
376 
377  RET(ff_vk_shader_init(s, shd, "prores_raw",
378  VK_SHADER_STAGE_COMPUTE_BIT,
379  (const char *[]) { "GL_EXT_buffer_reference",
380  "GL_EXT_buffer_reference2" }, 2,
381  8,
382  version == 0 ? 8 : 16 /* Horizontal blocks */,
383  4 /* Components */,
384  0));
385 
386  RET(add_common_data(avctx, s, shd, 0));
387 
389 
390  RET(spv->compile_shader(s, spv, shd, &spv_data, &spv_len, "main",
391  &spv_opaque));
392  RET(ff_vk_shader_link(s, shd, spv_data, spv_len, "main"));
393 
394  RET(ff_vk_shader_register_exec(s, pool, shd));
395 
396 fail:
397  if (spv_opaque)
398  spv->free_shader(spv, &spv_opaque);
399 
400  return err;
401 }
402 
404 {
405  ProResRAWVulkanDecodeContext *fv = ctx->sd_ctx;
406 
407  ff_vk_shader_free(&ctx->s, &fv->decode);
408  ff_vk_shader_free(&ctx->s, &fv->idct);
409 
411 
412  av_freep(&fv);
413 }
414 
416 {
417  int err;
419  ProResRAWContext *prr = avctx->priv_data;
420 
421  FFVkSPIRVCompiler *spv = ff_vk_spirv_init();
422  if (!spv) {
423  av_log(avctx, AV_LOG_ERROR, "Unable to initialize SPIR-V compiler!\n");
424  return AVERROR_EXTERNAL;
425  }
426 
427  err = ff_vk_decode_init(avctx);
428  if (err < 0)
429  return err;
430 
432  ProResRAWVulkanDecodeContext *prv = ctx->sd_ctx = av_mallocz(sizeof(*prv));
433  if (!prv) {
434  err = AVERROR(ENOMEM);
435  goto fail;
436  }
437 
438  ctx->sd_ctx_free = &vk_decode_prores_raw_uninit;
439 
440  /* Setup decode shader */
441  RET(init_decode_shader(avctx, &ctx->s, &ctx->exec_pool, spv, &prv->decode,
442  prr->version));
443  RET(init_idct_shader(avctx, &ctx->s, &ctx->exec_pool, spv, &prv->idct,
444  prr->version));
445 
446 fail:
447  spv->uninit(&spv);
448 
449  return err;
450 }
451 
453 {
454  AVHWDeviceContext *dev_ctx = _hwctx.nc;
455 
457  FFVulkanDecodePicture *vp = &pp->vp;
458 
459  ff_vk_decode_free_frame(dev_ctx, vp);
460 
462 }
463 
465  .p.name = "prores_raw_vulkan",
466  .p.type = AVMEDIA_TYPE_VIDEO,
467  .p.id = AV_CODEC_ID_PRORES_RAW,
468  .p.pix_fmt = AV_PIX_FMT_VULKAN,
469  .start_frame = &vk_prores_raw_start_frame,
470  .decode_slice = &vk_prores_raw_decode_slice,
471  .end_frame = &vk_prores_raw_end_frame,
472  .free_frame_priv = &vk_prores_raw_free_frame_priv,
473  .frame_priv_data_size = sizeof(ProResRAWVulkanDecodePicture),
476  .decode_params = &ff_vk_params_invalidate,
479  .frame_params = &ff_vk_frame_params,
480  .priv_data_size = sizeof(FFVulkanDecodeContext),
482 };
FFVulkanDecodePicture::slices_size
size_t slices_size
Definition: vulkan_decode.h:102
DecodePushData::pkt_data
VkDeviceAddress pkt_data
Definition: vulkan_prores_raw.c:53
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
vk_decode_prores_raw_uninit
static void vk_decode_prores_raw_uninit(FFVulkanDecodeShared *ctx)
Definition: vulkan_prores_raw.c:403
ff_vk_shader_free
void ff_vk_shader_free(FFVulkanContext *s, FFVulkanShader *shd)
Free a shader.
Definition: vulkan.c:2961
ff_vk_shader_init
int ff_vk_shader_init(FFVulkanContext *s, FFVulkanShader *shd, const char *name, VkPipelineStageFlags stage, const char *extensions[], int nb_extensions, int lg_x, int lg_y, int lg_z, uint32_t required_subgroup_size)
Initialize a shader object, with a specific set of extensions, type+bind, local group size,...
Definition: vulkan.c:2093
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:247
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:90
FFVulkanDecodeContext::shared_ctx
FFVulkanDecodeShared * shared_ctx
Definition: vulkan_decode.h:57
RET
#define RET(x)
Definition: vulkan.h:66
AVRefStructOpaque
RefStruct is an API for creating reference-counted objects with minimal overhead.
Definition: refstruct.h:58
AVRefStructOpaque::nc
void * nc
Definition: refstruct.h:59
av_unused
#define av_unused
Definition: attributes.h:151
FFHWAccel::p
AVHWAccel p
The public AVHWAccel.
Definition: hwaccel_internal.h:38
FFVkBuffer::host_ref
AVBufferRef * host_ref
Definition: vulkan.h:108
vk_prores_raw_free_frame_priv
static void vk_prores_raw_free_frame_priv(AVRefStructOpaque _hwctx, void *data)
Definition: vulkan_prores_raw.c:452
data
const char data[16]
Definition: mxf.c:149
FFVulkanDecodeDescriptor::codec_id
enum AVCodecID codec_id
Definition: vulkan_decode.h:30
TileContext::y
unsigned y
Definition: prores_raw.h:35
ProResRAWContext::tw
int tw
Definition: prores_raw.h:45
ProResRAWContext::version
int version
Definition: prores_raw.h:52
FFVkBuffer::address
VkDeviceAddress address
Definition: vulkan.h:92
ff_vk_exec_get
FFVkExecContext * ff_vk_exec_get(FFVulkanContext *s, FFVkExecPool *pool)
Retrieve an execution pool.
Definition: vulkan.c:547
FF_VK_REP_NATIVE
@ FF_VK_REP_NATIVE
Definition: vulkan.h:406
FFVkSPIRVCompiler::uninit
void(* uninit)(struct FFVkSPIRVCompiler **ctx)
Definition: vulkan_spirv.h:32
FFVulkanDecodeContext
Definition: vulkan_decode.h:56
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:779
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:448
ProResRAWVulkanDecodeContext::frame_data_pool
AVBufferPool * frame_data_pool
Definition: vulkan_prores_raw.c:49
init_decode_shader
static int init_decode_shader(AVCodecContext *avctx, FFVulkanContext *s, FFVkExecPool *pool, FFVkSPIRVCompiler *spv, FFVulkanShader *shd, int version)
Definition: vulkan_prores_raw.c:335
ProResRAWVulkanDecodeContext::idct
FFVulkanShader idct
Definition: vulkan_prores_raw.c:47
ProResRAWVulkanDecodePicture::nb_tiles
uint32_t nb_tiles
Definition: vulkan_prores_raw.c:42
FFHWAccel
Definition: hwaccel_internal.h:34
AVVkFrame::img
VkImage img[AV_NUM_DATA_POINTERS]
Vulkan images to which the memory is bound to.
Definition: hwcontext_vulkan.h:303
fail
#define fail()
Definition: checkasm.h:208
FFVulkanDecodePicture::sem_value
uint64_t sem_value
Definition: vulkan_decode.h:87
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:2838
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:2050
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:2601
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:1392
ff_vk_shader_add_descriptor_set
int ff_vk_shader_add_descriptor_set(FFVulkanContext *s, FFVulkanShader *shd, FFVulkanDescriptorSetBinding *desc, int nb, int singular, int print_to_shader_only)
Add descriptor to a shader.
Definition: vulkan.c:2465
FFVulkanDecodeShared
Definition: vulkan_decode.h:38
AV_CODEC_ID_PRORES_RAW
@ AV_CODEC_ID_PRORES_RAW
Definition: codec_id.h:333
AVHWDeviceContext
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition: hwcontext.h:63
ProResRAWContext::nb_tiles
int nb_tiles
Definition: prores_raw.h:44
ProResRAWVulkanDecodeContext::decode
FFVulkanShader decode
Definition: vulkan_prores_raw.c:46
GLSLC
#define GLSLC(N, S)
Definition: vulkan.h:43
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
ProResRAWContext::tiles
TileContext * tiles
Definition: prores_raw.h:42
s
#define s(width, name)
Definition: cbs_vp9.c:198
FFVulkanDecodePicture
Definition: vulkan_decode.h:75
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:878
FFVulkanDecodePicture::view
struct FFVulkanDecodePicture::@326 view
ProResRAWVulkanDecodePicture
Definition: vulkan_prores_raw.c:38
frame_size
int frame_size
Definition: mxfenc.c:2487
prores_raw.h
vk_prores_raw_end_frame
static int vk_prores_raw_end_frame(AVCodecContext *avctx)
Definition: vulkan_prores_raw.c:138
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:619
GLSLD
#define GLSLD(D)
Definition: vulkan.h:58
vk_prores_raw_decode_slice
static int vk_prores_raw_decode_slice(AVCodecContext *avctx, const uint8_t *data, uint32_t size)
Definition: vulkan_prores_raw.c:106
ff_source_prores_raw_idct_comp
const char * ff_source_prores_raw_idct_comp
if
if(ret)
Definition: filter_design.txt:179
vk_prores_raw_start_frame
static int vk_prores_raw_start_frame(AVCodecContext *avctx, const AVBufferRef *buffer_ref, av_unused const uint8_t *buffer, av_unused uint32_t size)
Definition: vulkan_prores_raw.c:65
HWACCEL_CAP_ASYNC_SAFE
#define HWACCEL_CAP_ASYNC_SAFE
Header providing the internals of AVHWAccel.
Definition: hwaccel_internal.h:31
ff_vk_shader_rep_fmt
const char * ff_vk_shader_rep_fmt(enum AVPixelFormat pix_fmt, enum FFVkShaderRepFormat rep_fmt)
Definition: vulkan.c:1626
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
av_buffer_unref
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition: buffer.c:139
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:617
AVCodecContext::internal
struct AVCodecInternal * internal
Private context used for internal data.
Definition: avcodec.h:466
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:1215
flush
void(* flush)(AVBSFContext *ctx)
Definition: dts2pts.c:552
ProResRAWContext
Definition: prores_raw.h:38
TileData::size
uint32_t size
Definition: vulkan_prores_raw.c:62
FFVkBuffer::mapped_mem
uint8_t * mapped_mem
Definition: vulkan.h:100
FFVulkanContext
Definition: vulkan.h:274
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:1089
ProResRAWContext::th
int th
Definition: prores_raw.h:45
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:327
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:2917
FFVulkanDescriptorSetBinding
Definition: vulkan.h:74
ProResRAWContext::nb_tw
int nb_tw
Definition: prores_raw.h:46
AVCodecInternal::hwaccel_priv_data
void * hwaccel_priv_data
hwaccel-specific private data
Definition: internal.h:130
AVVkFrame
Definition: hwcontext_vulkan.h:298
size
int size
Definition: twinvq_data.h:10344
FF_VK_EXT_PUSH_DESCRIPTOR
#define FF_VK_EXT_PUSH_DESCRIPTOR
Definition: vulkan_functions.h:48
FFVulkanShader
Definition: vulkan.h:190
FFVkSPIRVCompiler::compile_shader
int(* compile_shader)(FFVulkanContext *s, struct FFVkSPIRVCompiler *ctx, FFVulkanShader *shd, uint8_t **data, size_t *size, const char *entrypoint, void **opaque)
Definition: vulkan_spirv.h:28
AVERROR_EXTERNAL
#define AVERROR_EXTERNAL
Generic error in an external library.
Definition: error.h:59
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
FFVkExecContext
Definition: vulkan.h:111
ProResRAWVulkanDecodeContext
Definition: vulkan_prores_raw.c:45
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:2851
FFVulkanDescriptorSetBinding::name
const char * name
Definition: vulkan.h:75
version
version
Definition: libkvazaar.c:313
FFVkSPIRVCompiler
Definition: vulkan_spirv.h:26
AVHWAccel::name
const char * name
Name of the hardware accelerated codec.
Definition: avcodec.h:1949
DecodePushData::qmat
uint8_t qmat[64]
Definition: vulkan_prores_raw.c:56
layout
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 layout
Definition: filter_design.txt:18
FF_VK_EXT_EXTERNAL_HOST_MEMORY
#define FF_VK_EXT_EXTERNAL_HOST_MEMORY
Definition: vulkan_functions.h:36
TileData::offset
uint32_t offset
Definition: vulkan_prores_raw.c:61
uninit
static void uninit(AVBSFContext *ctx)
Definition: pcm_rechunk.c:68
FFVulkanDecodePicture::out
VkImageView out[AV_NUM_DATA_POINTERS]
Definition: vulkan_decode.h:80
ff_vk_exec_start
int ff_vk_exec_start(FFVulkanContext *s, FFVkExecContext *e)
Start/submit/wait an execution.
Definition: vulkan.c:559
ProResRAWVulkanDecodePicture::vp
FFVulkanDecodePicture vp
Definition: vulkan_prores_raw.c:39
ff_vk_shader_link
int ff_vk_shader_link(FFVulkanContext *s, FFVulkanShader *shd, uint8_t *spirv, size_t spirv_len, const char *entrypoint)
Link a shader into an executable.
Definition: vulkan.c:2390
FFVulkanDecodePicture::sem
VkSemaphore sem
Definition: vulkan_decode.h:86
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:256
vulkan_spirv.h
ff_source_common_comp
const char * ff_source_common_comp
AVCodecContext::height
int height
Definition: avcodec.h:592
ProResRAWContext::frame
AVFrame * frame
Definition: prores_raw.h:49
FFVkSPIRVCompiler::free_shader
void(* free_shader)(struct FFVkSPIRVCompiler *ctx, void **opaque)
Definition: vulkan_spirv.h:31
ff_vk_exec_bind_shader
void ff_vk_exec_bind_shader(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd)
Bind a shader.
Definition: vulkan.c:2927
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:1453
AVHWFramesContext
This struct describes a set or pool of "hardware" frames (i.e.
Definition: hwcontext.h:118
ff_vk_decode_flush
void ff_vk_decode_flush(AVCodecContext *avctx)
Flush decoder.
Definition: vulkan_decode.c:375
FFVkExecPool
Definition: vulkan.h:252
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:294
pos
unsigned int pos
Definition: spdifenc.c:414
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:1490
FFVkExecContext::buf
VkCommandBuffer buf
Definition: vulkan.h:122
ff_vk_dec_prores_raw_desc
const FFVulkanDecodeDescriptor ff_vk_dec_prores_raw_desc
Definition: vulkan_prores_raw.c:32
add_common_data
static int add_common_data(AVCodecContext *avctx, FFVulkanContext *s, FFVulkanShader *shd, int writeonly)
Definition: vulkan_prores_raw.c:286
AVCodecContext
main external API structure.
Definition: avcodec.h:431
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
ff_source_prores_raw_decode_comp
const char * ff_source_prores_raw_decode_comp
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
TileData::pos
int32_t pos[2]
Definition: vulkan_prores_raw.c:60
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:152
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
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
FFVulkanDecodePicture::slices_buf
AVBufferRef * slices_buf
Definition: vulkan_decode.h:101
mem.h
AVVkFrame::layout
VkImageLayout layout[AV_NUM_DATA_POINTERS]
Definition: hwcontext_vulkan.h:328
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
vk_decode_prores_raw_init
static int vk_decode_prores_raw_init(AVCodecContext *avctx)
Definition: vulkan_prores_raw.c:415
vulkan_decode.h
ProResRAWContext::nb_th
int nb_th
Definition: prores_raw.h:46
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:458
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
FFVkBuffer
Definition: vulkan.h:87
TileContext::x
unsigned x
Definition: prores_raw.h:35
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:592
int32_t
int32_t
Definition: audioconvert.c:56
ff_vk_exec_submit
int ff_vk_exec_submit(FFVulkanContext *s, FFVkExecContext *e)
Definition: vulkan.c:904
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
ff_vk_decode_init
int ff_vk_decode_init(AVCodecContext *avctx)
Initialize decoder.
Definition: vulkan_decode.c:1267
ff_prores_raw_vulkan_hwaccel
const FFHWAccel ff_prores_raw_vulkan_hwaccel
Definition: vulkan_prores_raw.c:464
DecodePushData::tile_size
int32_t tile_size[2]
Definition: vulkan_prores_raw.c:55
init_idct_shader
static int init_idct_shader(AVCodecContext *avctx, FFVulkanContext *s, FFVkExecPool *pool, FFVkSPIRVCompiler *spv, FFVulkanShader *shd, int version)
Definition: vulkan_prores_raw.c:368
ProResRAWVulkanDecodePicture::frame_data_buf
AVBufferRef * frame_data_buf
Definition: vulkan_prores_raw.c:41
DecodePushData::frame_size
int32_t frame_size[2]
Definition: vulkan_prores_raw.c:54
ProResRAWContext::hwaccel_picture_private
void * hwaccel_picture_private
Definition: prores_raw.h:50
FFVulkanFunctions
Definition: vulkan_functions.h:277
TileData
Definition: vulkan_prores_raw.c:59
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:1285
ProResRAWContext::qmat
uint8_t qmat[64]
Definition: prores_raw.h:55