FFmpeg
vulkan_prores.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #include "proresdec.h"
20 #include "vulkan_decode.h"
21 #include "hwaccel_internal.h"
22 #include "libavutil/mem.h"
23 #include "libavutil/vulkan.h"
24 #include "libavutil/vulkan_spirv.h"
25 
26 extern const char *ff_source_common_comp;
27 extern const char *ff_source_dct_comp;
28 extern const char *ff_source_prores_vld_comp;
29 extern const char *ff_source_prores_idct_comp;
30 
33  .queue_flags = VK_QUEUE_COMPUTE_BIT,
34 };
35 
36 typedef struct ProresVulkanDecodePicture {
38 
40 
41  uint32_t bitstream_start;
42  uint32_t bitstream_size;
43  uint32_t slice_num;
44 
47 
48 typedef struct ProresVulkanDecodeContext {
51 
54 
55 typedef struct ProresVkParameters {
56  VkDeviceAddress slice_data;
57  uint32_t bitstream_size;
58 
59  uint16_t width;
60  uint16_t height;
61  uint16_t mb_width;
62  uint16_t mb_height;
63  uint16_t slice_width;
64  uint16_t slice_height;
66  uint8_t log2_chroma_w;
67  uint8_t depth;
68  uint8_t alpha_info;
69  uint8_t bottom_field;
70 
71  uint8_t qmat_luma [64];
72  uint8_t qmat_chroma[64];
74 
76  const AVBufferRef *buffer_ref,
77  av_unused const uint8_t *buffer,
78  av_unused uint32_t size)
79 {
80  ProresContext *pr = avctx->priv_data;
83  ProresVulkanDecodeContext *pv = ctx->sd_ctx;
85  FFVulkanDecodePicture *vp = &pp->vp;
86 
87  int err;
88 
89  pp->slice_offsets_sz = (pr->slice_count + 1) * sizeof(uint32_t);
90  pp->mb_params_sz = pr->mb_width * pr->mb_height * sizeof(uint8_t);
91 
92  /* Host map the input slices data if supported */
93  if (!vp->slices_buf && ctx->s.extensions & FF_VK_EXT_EXTERNAL_HOST_MEMORY)
94  RET(ff_vk_host_map_buffer(&ctx->s, &vp->slices_buf, buffer_ref->data,
95  buffer_ref,
96  VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
97  VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT));
98 
99  /* Allocate slice offsets buffer */
101  &pp->metadata_buf,
102  VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
104  VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
105  VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
106 
107  /* Prepare frame to be used */
108  RET(ff_vk_decode_prepare_frame_sdr(dec, pr->frame, vp, 1,
109  FF_VK_REP_NATIVE, 0));
110 
111  pp->slice_num = 0;
112  pp->bitstream_start = pp->bitstream_size = 0;
113 
114 fail:
115  return err;
116 }
117 
119  const uint8_t *data,
120  uint32_t size)
121 {
122  ProresContext *pr = avctx->priv_data;
124  FFVulkanDecodePicture *vp = &pp->vp;
125 
126  FFVkBuffer *slice_offset = (FFVkBuffer *)pp->metadata_buf->data;
127  FFVkBuffer *slices_buf = vp->slices_buf ? (FFVkBuffer *)vp->slices_buf->data : NULL;
128 
129  /* Skip picture header */
130  if (slices_buf && slices_buf->host_ref && !pp->slice_num)
131  pp->bitstream_size = data - slices_buf->mapped_mem;
132 
133  AV_WN32(slice_offset->mapped_mem + (pp->slice_num + 0) * sizeof(uint32_t),
134  pp->bitstream_size);
135  AV_WN32(slice_offset->mapped_mem + (pp->slice_num + 1) * sizeof(uint32_t),
136  pp->bitstream_size += size);
137 
138  if (!slices_buf || !slices_buf->host_ref) {
139  int err = ff_vk_decode_add_slice(avctx, vp, data, size, 0,
140  &pp->slice_num, NULL);
141  if (err < 0)
142  return err;
143  } else {
144  pp->slice_num++;
145  }
146 
147  return 0;
148 }
149 
151 {
152  ProresContext *pr = avctx->priv_data;
155  FFVulkanFunctions *vk = &ctx->s.vkfn;
156  ProresVulkanDecodeContext *pv = ctx->sd_ctx;
158  FFVulkanDecodePicture *vp = &pp->vp;
159  AVFrame *f = pr->frame;
160  AVVkFrame *vkf = (AVVkFrame *)f->data[0];
161 
163  FFVkBuffer *slice_data, *metadata;
164  VkImageMemoryBarrier2 img_bar[AV_NUM_DATA_POINTERS];
165  VkBufferMemoryBarrier2 buf_bar[2];
166  int nb_img_bar = 0, nb_buf_bar = 0, nb_imgs, i, err;
167  const AVPixFmtDescriptor *pix_desc;
168 
169  if (!pp->slice_num)
170  return 0;
171 
172  pix_desc = av_pix_fmt_desc_get(avctx->sw_pix_fmt);
173  if (!pix_desc)
174  return AVERROR(EINVAL);
175 
176  slice_data = (FFVkBuffer *)vp->slices_buf->data;
178 
179  pd = (ProresVkParameters) {
180  .slice_data = slice_data->address,
181  .bitstream_size = pp->bitstream_size,
182 
183  .width = avctx->width,
184  .height = avctx->height,
185  .mb_width = pr->mb_width,
186  .mb_height = pr->mb_height,
187  .slice_width = pr->slice_count / pr->mb_height,
188  .slice_height = pr->mb_height,
189  .log2_slice_width = av_log2(pr->slice_mb_width),
190  .log2_chroma_w = pix_desc->log2_chroma_w,
191  .depth = avctx->bits_per_raw_sample,
192  .alpha_info = pr->alpha_info,
193  .bottom_field = pr->first_field ^ (pr->frame_type == 1),
194  };
195 
196  memcpy(pd.qmat_luma, pr->qmat_luma, sizeof(pd.qmat_luma ));
197  memcpy(pd.qmat_chroma, pr->qmat_chroma, sizeof(pd.qmat_chroma));
198 
199  FFVkExecContext *exec = ff_vk_exec_get(&ctx->s, &ctx->exec_pool);
200  RET(ff_vk_exec_start(&ctx->s, exec));
201 
202  /* Prepare deps */
203  RET(ff_vk_exec_add_dep_frame(&ctx->s, exec, f,
204  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
205  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
206 
207  RET(ff_vk_exec_mirror_sem_value(&ctx->s, exec, &vp->sem, &vp->sem_value, f));
208 
209  /* Transfer ownership to the exec context */
210  RET(ff_vk_exec_add_dep_buf(&ctx->s, exec, &vp->slices_buf, 1, 0));
211  vp->slices_buf = NULL;
212  RET(ff_vk_exec_add_dep_buf(&ctx->s, exec, &pp->metadata_buf, 1, 0));
213  pp->metadata_buf = NULL;
214 
215  vkf->layout[0] = VK_IMAGE_LAYOUT_UNDEFINED;
216  vkf->access[0] = VK_ACCESS_2_NONE;
217 
218  nb_imgs = ff_vk_count_images(vkf);
219 
220  if (pr->first_field) {
221  /* Input barrier */
222  ff_vk_frame_barrier(&ctx->s, exec, f, img_bar, &nb_img_bar,
223  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
224  VK_PIPELINE_STAGE_2_CLEAR_BIT,
225  VK_ACCESS_2_TRANSFER_WRITE_BIT,
226  VK_IMAGE_LAYOUT_GENERAL,
227  VK_QUEUE_FAMILY_IGNORED);
228 
229  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
230  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
231  .pBufferMemoryBarriers = buf_bar,
232  .bufferMemoryBarrierCount = nb_buf_bar,
233  .pImageMemoryBarriers = img_bar,
234  .imageMemoryBarrierCount = nb_img_bar,
235  });
236  nb_img_bar = nb_buf_bar = 0;
237 
238  /* Clear the input image since the vld shader does sparse writes, except for alpha */
239  for (i = 0; i < FFMIN(nb_imgs, 3); ++i) {
240  vk->CmdClearColorImage(exec->buf, vkf->img[i],
241  VK_IMAGE_LAYOUT_GENERAL,
242  &((VkClearColorValue) { 0 }),
243  1, &((VkImageSubresourceRange) {
244  .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
245  .levelCount = 1,
246  .layerCount = 1,
247  }));
248  }
249  }
250 
251  /* Input barrier, or synchronization between clear and vld shader */
252  ff_vk_frame_barrier(&ctx->s, exec, f, img_bar, &nb_img_bar,
253  pr->first_field ? VK_PIPELINE_STAGE_2_CLEAR_BIT :
254  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
255  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
256  VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
257  VK_IMAGE_LAYOUT_GENERAL,
258  VK_QUEUE_FAMILY_IGNORED);
259 
260  ff_vk_buf_barrier(buf_bar[nb_buf_bar++], metadata,
261  ALL_COMMANDS_BIT, NONE_KHR, NONE_KHR,
262  COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
263  pp->slice_offsets_sz, pp->mb_params_sz);
264  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
265  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
266  .pBufferMemoryBarriers = buf_bar,
267  .bufferMemoryBarrierCount = nb_buf_bar,
268  .pImageMemoryBarriers = img_bar,
269  .imageMemoryBarrierCount = nb_img_bar,
270  });
271  nb_img_bar = nb_buf_bar = 0;
272 
273  /* Entropy decode */
274  ff_vk_shader_update_desc_buffer(&ctx->s, exec, &pv->vld,
275  0, 0, 0,
276  metadata, 0,
277  pp->slice_offsets_sz,
278  VK_FORMAT_UNDEFINED);
279  ff_vk_shader_update_desc_buffer(&ctx->s, exec, &pv->vld,
280  0, 1, 0,
282  pp->mb_params_sz,
283  VK_FORMAT_UNDEFINED);
284  ff_vk_shader_update_img_array(&ctx->s, exec, &pv->vld,
285  f, vp->view.out,
286  0, 2,
287  VK_IMAGE_LAYOUT_GENERAL,
288  VK_NULL_HANDLE);
289 
290  ff_vk_exec_bind_shader(&ctx->s, exec, &pv->vld);
291  ff_vk_shader_update_push_const(&ctx->s, exec, &pv->vld,
292  VK_SHADER_STAGE_COMPUTE_BIT,
293  0, sizeof(pd), &pd);
294 
295  vk->CmdDispatch(exec->buf, AV_CEIL_RSHIFT(pr->slice_count / pr->mb_height, 3),
296  AV_CEIL_RSHIFT(pr->mb_height, 3),
297  3 + !!pr->alpha_info);
298 
299  /* Synchronize vld and idct shaders */
300  ff_vk_frame_barrier(&ctx->s, exec, f, img_bar, &nb_img_bar,
301  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
302  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
303  VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
304  VK_IMAGE_LAYOUT_GENERAL,
305  VK_QUEUE_FAMILY_IGNORED);
306 
307  ff_vk_buf_barrier(buf_bar[nb_buf_bar++], metadata,
308  COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
309  COMPUTE_SHADER_BIT, SHADER_READ_BIT, NONE_KHR,
310  pp->slice_offsets_sz, pp->mb_params_sz);
311  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
312  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
313  .pBufferMemoryBarriers = buf_bar,
314  .bufferMemoryBarrierCount = nb_buf_bar,
315  .pImageMemoryBarriers = img_bar,
316  .imageMemoryBarrierCount = nb_img_bar,
317  });
318  nb_img_bar = nb_buf_bar = 0;
319 
320  /* Inverse transform */
321  ff_vk_shader_update_desc_buffer(&ctx->s, exec, &pv->idct,
322  0, 0, 0,
324  pp->mb_params_sz,
325  VK_FORMAT_UNDEFINED);
326  ff_vk_shader_update_img_array(&ctx->s, exec, &pv->idct,
327  f, vp->view.out,
328  0, 1,
329  VK_IMAGE_LAYOUT_GENERAL,
330  VK_NULL_HANDLE);
331 
332  ff_vk_exec_bind_shader(&ctx->s, exec, &pv->idct);
333  ff_vk_shader_update_push_const(&ctx->s, exec, &pv->idct,
334  VK_SHADER_STAGE_COMPUTE_BIT,
335  0, sizeof(pd), &pd);
336 
337  vk->CmdDispatch(exec->buf, AV_CEIL_RSHIFT(pr->mb_width, 1), pr->mb_height, 3);
338 
339  RET(ff_vk_exec_submit(&ctx->s, exec));
340 
341 fail:
342  return err;
343 }
344 
346 {
347  GLSLC(0, layout(push_constant, scalar) uniform pushConstants { );
348  GLSLC(1, u8buf slice_data; );
349  GLSLC(1, uint bitstream_size; );
350  GLSLC(0, );
351  GLSLC(1, uint16_t width; );
352  GLSLC(1, uint16_t height; );
353  GLSLC(1, uint16_t mb_width; );
354  GLSLC(1, uint16_t mb_height; );
355  GLSLC(1, uint16_t slice_width; );
356  GLSLC(1, uint16_t slice_height; );
357  GLSLC(1, uint8_t log2_slice_width; );
358  GLSLC(1, uint8_t log2_chroma_w; );
359  GLSLC(1, uint8_t depth; );
360  GLSLC(1, uint8_t alpha_info; );
361  GLSLC(1, uint8_t bottom_field; );
362  GLSLC(0, );
363  GLSLC(1, uint8_t qmat_luma [8*8]; );
364  GLSLC(1, uint8_t qmat_chroma[8*8]; );
365  GLSLC(0, }; );
366 
367  return ff_vk_shader_add_push_const(shd, 0, sizeof(ProresVkParameters),
368  VK_SHADER_STAGE_COMPUTE_BIT);
369 }
370 
372  FFVkExecPool *pool, FFVkSPIRVCompiler *spv,
373  FFVulkanShader *shd, int max_num_mbs,
374  int interlaced)
375 {
376  int err;
377  AVHWFramesContext *dec_frames_ctx;
378  dec_frames_ctx = (AVHWFramesContext *)avctx->hw_frames_ctx->data;
379 
380  uint8_t *spv_data;
381  size_t spv_len;
382  void *spv_opaque = NULL;
383 
384  RET(ff_vk_shader_init(s, shd, "prores_vld",
385  VK_SHADER_STAGE_COMPUTE_BIT,
386  (const char *[]) { "GL_EXT_buffer_reference",
387  "GL_EXT_buffer_reference2" }, 2,
388  8, 8, 1,
389  0));
390 
391  av_bprintf(&shd->src, "#define GET_BITS_SMEM %d\n", 4);
392 
393  if (interlaced)
394  av_bprintf(&shd->src, "#define INTERLACED\n");
395 
396  /* Common codec header */
398 
399  RET(add_push_data(shd));
400 
401  FFVulkanDescriptorSetBinding desc_set[] = {
402  {
403  .name = "slice_offsets_buf",
404  .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
405  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
406  .mem_quali = "readonly",
407  .buf_content = "uint32_t slice_offsets",
408  .buf_elems = max_num_mbs + 1,
409  },
410  {
411  .name = "quant_idx_buf",
412  .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
413  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
414  .mem_quali = "writeonly",
415  .buf_content = "uint8_t quant_idx",
416  .buf_elems = max_num_mbs,
417  },
418  {
419  .name = "dst",
420  .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
421  .dimensions = 2,
422  .mem_layout = ff_vk_shader_rep_fmt(dec_frames_ctx->sw_format,
424  .mem_quali = "writeonly",
425  .elems = av_pix_fmt_count_planes(dec_frames_ctx->sw_format),
426  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
427  },
428  };
429  RET(ff_vk_shader_add_descriptor_set(s, shd, desc_set, 3, 0, 0));
430 
432 
433  RET(spv->compile_shader(s, spv, shd, &spv_data, &spv_len, "main",
434  &spv_opaque));
435  RET(ff_vk_shader_link(s, shd, spv_data, spv_len, "main"));
436 
437  RET(ff_vk_shader_register_exec(s, pool, shd));
438 
439 fail:
440  if (spv_opaque)
441  spv->free_shader(spv, &spv_opaque);
442 
443  return 0;
444 }
445 
447  FFVkExecPool *pool, FFVkSPIRVCompiler *spv,
448  FFVulkanShader *shd, int max_num_mbs,
449  int interlaced)
450 {
451  int err;
452  AVHWFramesContext *dec_frames_ctx;
453  dec_frames_ctx = (AVHWFramesContext *)avctx->hw_frames_ctx->data;
454 
455  uint8_t *spv_data;
456  size_t spv_len;
457  void *spv_opaque = NULL;
458 
459  RET(ff_vk_shader_init(s, shd, "prores_idct",
460  VK_SHADER_STAGE_COMPUTE_BIT,
461  (const char *[]) { "GL_EXT_buffer_reference",
462  "GL_EXT_buffer_reference2" }, 2,
463  32, 2, 1,
464  0));
465 
466  if (interlaced)
467  av_bprintf(&shd->src, "#define INTERLACED\n");
468 
469  /* Common codec header */
471 
472  RET(add_push_data(shd));
473 
474  FFVulkanDescriptorSetBinding desc_set[] = {
475  {
476  .name = "quant_idx_buf",
477  .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
478  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
479  .mem_quali = "readonly",
480  .buf_content = "uint8_t quant_idx",
481  .buf_elems = max_num_mbs,
482  },
483  {
484  .name = "dst",
485  .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
486  .dimensions = 2,
487  .mem_layout = ff_vk_shader_rep_fmt(dec_frames_ctx->sw_format,
489  .elems = av_pix_fmt_count_planes(dec_frames_ctx->sw_format),
490  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
491  },
492  };
493  RET(ff_vk_shader_add_descriptor_set(s, shd, desc_set, 2, 0, 0));
494 
495  GLSLC(0, #define NB_BLOCKS 4*2);
497 
499 
500  RET(spv->compile_shader(s, spv, shd, &spv_data, &spv_len, "main",
501  &spv_opaque));
502  RET(ff_vk_shader_link(s, shd, spv_data, spv_len, "main"));
503 
504  RET(ff_vk_shader_register_exec(s, pool, shd));
505 
506 fail:
507  if (spv_opaque)
508  spv->free_shader(spv, &spv_opaque);
509 
510  return 0;
511 }
512 
514 {
515  ProresVulkanDecodeContext *pv = ctx->sd_ctx;
516 
517  ff_vk_shader_free(&ctx->s, &pv->vld);
518  ff_vk_shader_free(&ctx->s, &pv->idct);
519 
521 
522  av_freep(&pv);
523 }
524 
526 {
529  ProresContext *pr = avctx->priv_data;
530 
532  FFVkSPIRVCompiler *spv;
533  int max_num_mbs, err;
534 
535  max_num_mbs = (avctx->coded_width >> 4) * (avctx->coded_height >> 4);
536 
537  spv = ff_vk_spirv_init();
538  if (!spv) {
539  av_log(avctx, AV_LOG_ERROR, "Unable to initialize SPIR-V compiler!\n");
540  return AVERROR_EXTERNAL;
541  }
542 
543  err = ff_vk_decode_init(avctx);
544  if (err < 0)
545  return err;
546  ctx = dec->shared_ctx;
547 
548  pv = ctx->sd_ctx = av_mallocz(sizeof(*pv));
549  if (!pv) {
550  err = AVERROR(ENOMEM);
551  goto fail;
552  }
553 
554  ctx->sd_ctx_free = vk_decode_prores_uninit;
555 
556  RET(init_decode_shader(avctx, &ctx->s, &ctx->exec_pool,
557  spv, &pv->vld, max_num_mbs, pr->frame_type != 0));
558  RET(init_idct_shader(avctx, &ctx->s, &ctx->exec_pool,
559  spv, &pv->idct, max_num_mbs, pr->frame_type != 0));
560 
561  err = 0;
562 
563 fail:
564  spv->uninit(&spv);
565 
566  return err;
567 }
568 
570 {
571  AVHWDeviceContext *dev_ctx = _hwctx.nc;
573 
574  ff_vk_decode_free_frame(dev_ctx, &pp->vp);
575 
577 }
578 
580  .p.name = "prores_vulkan",
581  .p.type = AVMEDIA_TYPE_VIDEO,
582  .p.id = AV_CODEC_ID_PRORES,
583  .p.pix_fmt = AV_PIX_FMT_VULKAN,
584  .start_frame = &vk_prores_start_frame,
585  .decode_slice = &vk_prores_decode_slice,
586  .end_frame = &vk_prores_end_frame,
587  .free_frame_priv = &vk_prores_free_frame_priv,
588  .frame_priv_data_size = sizeof(ProresVulkanDecodePicture),
592  .frame_params = &ff_vk_frame_params,
593  .priv_data_size = sizeof(FFVulkanDecodeContext),
595 };
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
ProresVkParameters::bottom_field
uint8_t bottom_field
Definition: vulkan_prores.c:69
ProresVkParameters::qmat_luma
uint8_t qmat_luma[64]
Definition: vulkan_prores.c:71
ff_vk_shader_free
void ff_vk_shader_free(FFVulkanContext *s, FFVulkanShader *shd)
Free a shader.
Definition: vulkan.c:2963
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:2095
init_decode_shader
static int init_decode_shader(AVCodecContext *avctx, FFVulkanContext *s, FFVkExecPool *pool, FFVkSPIRVCompiler *spv, FFVulkanShader *shd, int max_num_mbs, int interlaced)
Definition: vulkan_prores.c:371
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
ProresContext::hwaccel_picture_private
void * hwaccel_picture_private
Definition: proresdec.h:47
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3456
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:66
ProresVulkanDecodePicture::slice_num
uint32_t slice_num
Definition: vulkan_prores.c:43
AVRefStructOpaque
RefStruct is an API for creating reference-counted objects with minimal overhead.
Definition: refstruct.h:58
ProresVkParameters::bitstream_size
uint32_t bitstream_size
Definition: vulkan_prores.c:57
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
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:427
vk_prores_free_frame_priv
static void vk_prores_free_frame_priv(AVRefStructOpaque _hwctx, void *data)
Definition: vulkan_prores.c:569
ProresVkParameters::log2_slice_width
uint8_t log2_slice_width
Definition: vulkan_prores.c:65
FFVulkanShader::src
AVBPrint src
Definition: vulkan.h:191
data
const char data[16]
Definition: mxf.c:149
FFVulkanDecodeDescriptor::codec_id
enum AVCodecID codec_id
Definition: vulkan_decode.h:30
ProresContext
Definition: proresdec.h:43
vk_prores_end_frame
static int vk_prores_end_frame(AVCodecContext *avctx)
Definition: vulkan_prores.c:150
ProresVkParameters
Definition: vulkan_prores.c:55
ProresVulkanDecodeContext::vld
FFVulkanShader vld
Definition: vulkan_prores.c:49
ff_source_prores_vld_comp
const char * ff_source_prores_vld_comp
ff_vk_exec_get
FFVkExecContext * ff_vk_exec_get(FFVulkanContext *s, FFVkExecPool *pool)
Retrieve an execution pool.
Definition: vulkan.c:551
FF_VK_REP_NATIVE
@ FF_VK_REP_NATIVE
Definition: vulkan.h:404
FFVkSPIRVCompiler::uninit
void(* uninit)(struct FFVkSPIRVCompiler **ctx)
Definition: vulkan_spirv.h:32
FFVulkanDecodeContext
Definition: vulkan_decode.h:54
ProresContext::slice_count
int slice_count
number of slices in the current picture
Definition: proresdec.h:52
ProresVkParameters::alpha_info
uint8_t alpha_info
Definition: vulkan_prores.c:68
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:783
ProresContext::slice_mb_width
unsigned slice_mb_width
maximum width of a slice in mb
Definition: proresdec.h:55
ProresVkParameters::slice_height
uint16_t slice_height
Definition: vulkan_prores.c:64
av_pix_fmt_count_planes
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3496
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:307
fail
#define fail()
Definition: checkasm.h:214
FFVulkanDecodePicture::sem_value
uint64_t sem_value
Definition: vulkan_decode.h:85
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:2840
ProresVulkanDecodePicture::bitstream_start
uint32_t bitstream_start
Definition: vulkan_prores.c:41
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:2052
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:2603
proresdec.h
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:1394
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:2467
ProresVulkanDecodePicture
Definition: vulkan_prores.c:36
AVCodecContext::coded_height
int coded_height
Definition: avcodec.h:615
FFVulkanDecodeShared
Definition: vulkan_decode.h:38
ProresVulkanDecodeContext
Definition: vulkan_prores.c:48
AVHWDeviceContext
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition: hwcontext.h:63
GLSLC
#define GLSLC(N, S)
Definition: vulkan.h:43
ProresContext::first_field
int first_field
Definition: proresdec.h:60
init_idct_shader
static int init_idct_shader(AVCodecContext *avctx, FFVulkanContext *s, FFVkExecPool *pool, FFVkSPIRVCompiler *spv, FFVulkanShader *shd, int max_num_mbs, int interlaced)
Definition: vulkan_prores.c:446
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
vk_prores_start_frame
static int vk_prores_start_frame(AVCodecContext *avctx, const AVBufferRef *buffer_ref, av_unused const uint8_t *buffer, av_unused uint32_t size)
Definition: vulkan_prores.c:75
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:882
ProresVulkanDecodeContext::idct
FFVulkanShader idct
Definition: vulkan_prores.c:50
AV_CEIL_RSHIFT
#define AV_CEIL_RSHIFT(a, b)
Definition: common.h:60
ProresContext::qmat_luma
uint8_t qmat_luma[64]
Definition: proresdec.h:49
ProresVkParameters::width
uint16_t width
Definition: vulkan_prores.c:59
ProresVkParameters::height
uint16_t height
Definition: vulkan_prores.c:60
vk_prores_decode_slice
static int vk_prores_decode_slice(AVCodecContext *avctx, const uint8_t *data, uint32_t size)
Definition: vulkan_prores.c:118
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
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:623
GLSLD
#define GLSLD(D)
Definition: vulkan.h:58
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
if
if(ret)
Definition: filter_design.txt:179
vk_decode_prores_init
static int vk_decode_prores_init(AVCodecContext *avctx)
Definition: vulkan_prores.c:525
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:1628
ProresVulkanDecodePicture::mb_params_sz
uint32_t mb_params_sz
Definition: vulkan_prores.c:45
metadata
Stream codec metadata
Definition: ogg-flac-chained-meta.txt:2
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:676
ProresVkParameters::mb_width
uint16_t mb_width
Definition: vulkan_prores.c:61
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
ProresVulkanDecodePicture::bitstream_size
uint32_t bitstream_size
Definition: vulkan_prores.c:42
FFVkBuffer::mapped_mem
uint8_t * mapped_mem
Definition: vulkan.h:96
FFVulkanContext
Definition: vulkan.h:270
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
f
f
Definition: af_crystalizer.c:122
ff_vk_buf_barrier
#define ff_vk_buf_barrier(dst, vkb, s_stage, s_access, s_access2, d_stage, d_access, d_access2, offs, bsz)
Definition: vulkan.h:506
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:2919
FFVulkanDescriptorSetBinding
Definition: vulkan.h:74
height
#define height
Definition: dsp.h:89
ProresVulkanDecodePicture::slice_offsets_sz
uint32_t slice_offsets_sz
Definition: vulkan_prores.c:45
AV_WN32
#define AV_WN32(p, v)
Definition: intreadwrite.h:372
AVCodecInternal::hwaccel_priv_data
void * hwaccel_priv_data
hwaccel-specific private data
Definition: internal.h:130
AVVkFrame
Definition: hwcontext_vulkan.h:302
vulkan.h
size
int size
Definition: twinvq_data.h:10344
AV_NUM_DATA_POINTERS
#define AV_NUM_DATA_POINTERS
Definition: frame.h:428
FFVulkanShader
Definition: vulkan.h:186
ff_source_dct_comp
const char * ff_source_dct_comp
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
FFVkExecContext
Definition: vulkan.h:107
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:2853
FFVulkanDescriptorSetBinding::name
const char * name
Definition: vulkan.h:75
ProresVkParameters::log2_chroma_w
uint8_t log2_chroma_w
Definition: vulkan_prores.c:66
ff_prores_vulkan_hwaccel
const FFHWAccel ff_prores_vulkan_hwaccel
Definition: vulkan_prores.c:579
FFVkSPIRVCompiler
Definition: vulkan_spirv.h:26
AVHWAccel::name
const char * name
Name of the hardware accelerated codec.
Definition: avcodec.h:1957
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
ProresContext::mb_width
unsigned mb_width
width of the current picture in mb
Definition: proresdec.h:53
FF_VK_EXT_EXTERNAL_HOST_MEMORY
#define FF_VK_EXT_EXTERNAL_HOST_MEMORY
Definition: vulkan_functions.h:36
interlaced
uint8_t interlaced
Definition: mxfenc.c:2334
uninit
static void uninit(AVBSFContext *ctx)
Definition: pcm_rechunk.c:68
FFVulkanDecodePicture::view
struct FFVulkanDecodePicture::@328 view
FFVulkanDecodePicture::out
VkImageView out[AV_NUM_DATA_POINTERS]
Definition: vulkan_decode.h:78
ProresVkParameters::depth
uint8_t depth
Definition: vulkan_prores.c:67
ff_vk_exec_start
int ff_vk_exec_start(FFVulkanContext *s, FFVkExecContext *e)
Start/submit/wait an execution.
Definition: vulkan.c:563
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
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:2392
FFVulkanDecodePicture::sem
VkSemaphore sem
Definition: vulkan_decode.h:84
vulkan_spirv.h
AVCodecContext::height
int height
Definition: avcodec.h:600
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:2929
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
ff_source_common_comp
const char * ff_source_common_comp
ff_vk_dec_prores_desc
const FFVulkanDecodeDescriptor ff_vk_dec_prores_desc
Definition: vulkan_prores.c:31
FFVkExecPool
Definition: vulkan.h:248
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
av_bprintf
void av_bprintf(AVBPrint *buf, const char *fmt,...)
Definition: bprint.c:122
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:1492
FFVkExecContext::buf
VkCommandBuffer buf
Definition: vulkan.h:118
ProresContext::frame_type
int frame_type
0 = progressive, 1 = tff, 2 = bff
Definition: proresdec.h:48
AVCodecContext
main external API structure.
Definition: avcodec.h:439
ProresContext::qmat_chroma
uint8_t qmat_chroma[64]
Definition: proresdec.h:50
add_push_data
static int add_push_data(FFVulkanShader *shd)
Definition: vulkan_prores.c:345
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
ProresVkParameters::slice_width
uint16_t slice_width
Definition: vulkan_prores.c:63
FFVulkanDecodeDescriptor
Definition: vulkan_decode.h:29
ProresVulkanDecodePicture::metadata_buf
AVBufferRef * metadata_buf
Definition: vulkan_prores.c:39
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
AVCodecContext::coded_width
int coded_width
Bitstream width / height, may be different from width/height e.g.
Definition: avcodec.h:615
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
ProresVkParameters::mb_height
uint16_t mb_height
Definition: vulkan_prores.c:62
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
ProresVulkanDecodePicture::vp
FFVulkanDecodePicture vp
Definition: vulkan_prores.c:37
ff_source_prores_idct_comp
const char * ff_source_prores_idct_comp
ProresVulkanDecodeContext::metadata_pool
AVBufferPool * metadata_pool
Definition: vulkan_prores.c:52
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
vulkan_decode.h
ProresVkParameters::qmat_chroma
uint8_t qmat_chroma[64]
Definition: vulkan_prores.c:72
ff_vk_count_images
static int ff_vk_count_images(AVVkFrame *f)
Definition: vulkan.h:321
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:466
ProresVkParameters::slice_data
VkDeviceAddress slice_data
Definition: vulkan_prores.c:56
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
FFVkBuffer
Definition: vulkan.h:87
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:600
ff_vk_exec_submit
int ff_vk_exec_submit(FFVulkanContext *s, FFVkExecContext *e)
Definition: vulkan.c:908
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:1290
ProresContext::frame
AVFrame * frame
Definition: proresdec.h:46
AVCodecContext::sw_pix_fmt
enum AVPixelFormat sw_pix_fmt
Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:646
width
#define width
Definition: dsp.h:89
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
FFVulkanFunctions
Definition: vulkan_functions.h:280
vk_decode_prores_uninit
static void vk_decode_prores_uninit(FFVulkanDecodeShared *ctx)
Definition: vulkan_prores.c:513
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:1289
ProresContext::alpha_info
int alpha_info
Definition: proresdec.h:61
AV_CODEC_ID_PRORES
@ AV_CODEC_ID_PRORES
Definition: codec_id.h:200
ProresContext::mb_height
unsigned mb_height
height of the current picture in mb
Definition: proresdec.h:54