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"
25 #include "libavutil/vulkan_spirv.h"
26 
27 extern const char *ff_source_common_comp;
28 extern const char *ff_source_prores_reset_comp;
29 extern const char *ff_source_prores_vld_comp;
30 extern const char *ff_source_prores_idct_comp;
31 
34  .queue_flags = VK_QUEUE_COMPUTE_BIT,
35 };
36 
37 typedef struct ProresVulkanDecodePicture {
39 
41  uint32_t slice_num;
42 
43  uint32_t bitstream_start;
44  uint32_t bitstream_size;
46 
47 typedef struct ProresVulkanDecodeContext {
52  } shaders[2]; /* Progressive/interlaced */
53 
56 
57 typedef struct ProresVkParameters {
58  VkDeviceAddress slice_data;
59  uint32_t bitstream_size;
60 
61  uint16_t width;
62  uint16_t height;
63  uint16_t mb_width;
64  uint16_t mb_height;
65  uint16_t slice_width;
66  uint16_t slice_height;
68  uint8_t log2_chroma_w;
69  uint8_t depth;
70  uint8_t alpha_info;
71  uint8_t bottom_field;
72 
73  uint8_t qmat_luma [64];
74  uint8_t qmat_chroma[64];
76 
78  const AVBufferRef *buffer_ref,
79  av_unused const uint8_t *buffer,
80  av_unused uint32_t size)
81 {
82  ProresContext *pr = avctx->priv_data;
85  ProresVulkanDecodeContext *pv = ctx->sd_ctx;
87  FFVulkanDecodePicture *vp = &pp->vp;
88 
89  int err;
90 
91  /* Host map the input slices data if supported */
92  if (!vp->slices_buf && ctx->s.extensions & FF_VK_EXT_EXTERNAL_HOST_MEMORY)
93  RET(ff_vk_host_map_buffer(&ctx->s, &vp->slices_buf, buffer_ref->data,
94  buffer_ref,
95  VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
96  VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT));
97 
98  /* Allocate slice offsets buffer */
100  &pp->slice_offset_buf,
101  VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
102  VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
103  NULL, (pr->slice_count + 1) * sizeof(uint32_t),
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->slice_offset_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 
161  FFVkBuffer *slice_data, *slice_offsets;
162  struct ProresVulkanShaderVariants *shaders;
163  VkImageMemoryBarrier2 img_bar[AV_NUM_DATA_POINTERS];
164  VkBufferMemoryBarrier2 buf_bar[2];
165  int nb_img_bar = 0, nb_buf_bar = 0, err;
166  const AVPixFmtDescriptor *pix_desc;
167 
168  if (!pp->slice_num)
169  return 0;
170 
171  pix_desc = av_pix_fmt_desc_get(avctx->sw_pix_fmt);
172  if (!pix_desc)
173  return AVERROR(EINVAL);
174 
175  slice_data = (FFVkBuffer *)vp->slices_buf->data;
176  slice_offsets = (FFVkBuffer *)pp->slice_offset_buf->data;
177 
178  shaders = &pv->shaders[pr->frame_type != 0];
179 
180  pd = (ProresVkParameters) {
181  .slice_data = slice_data->address,
182  .bitstream_size = pp->bitstream_size,
183 
184  .width = avctx->width,
185  .height = avctx->height,
186  .mb_width = pr->mb_width,
187  .mb_height = pr->mb_height,
188  .slice_width = pr->slice_count / pr->mb_height,
189  .slice_height = pr->mb_height,
190  .log2_slice_width = av_log2(pr->slice_mb_width),
191  .log2_chroma_w = pix_desc->log2_chroma_w,
192  .depth = avctx->bits_per_raw_sample,
193  .alpha_info = pr->alpha_info,
194  .bottom_field = pr->first_field ^ (pr->frame_type == 1),
195  };
196 
197  memcpy(pd.qmat_luma, pr->qmat_luma, sizeof(pd.qmat_luma ));
198  memcpy(pd.qmat_chroma, pr->qmat_chroma, sizeof(pd.qmat_chroma));
199 
200  FFVkExecContext *exec = ff_vk_exec_get(&ctx->s, &ctx->exec_pool);
201  RET(ff_vk_exec_start(&ctx->s, exec));
202 
203  /* Prepare deps */
204  RET(ff_vk_exec_add_dep_frame(&ctx->s, exec, pr->frame,
205  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
206  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
207 
208  RET(ff_vk_exec_mirror_sem_value(&ctx->s, exec, &vp->sem, &vp->sem_value,
209  pr->frame));
210 
211  RET(ff_vk_exec_add_dep_buf(&ctx->s, exec,
212  (AVBufferRef *[]){ vp->slices_buf, pp->slice_offset_buf },
213  2, 0));
214 
215  /* Transfer ownership to the exec context */
216  vp->slices_buf = pp->slice_offset_buf = NULL;
217 
218  /* Input frame barrier */
219  ff_vk_frame_barrier(&ctx->s, exec, pr->frame, img_bar, &nb_img_bar,
220  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
221  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
222  VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
223  VK_IMAGE_LAYOUT_GENERAL,
224  VK_QUEUE_FAMILY_IGNORED);
225 
226  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
227  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
228  .pBufferMemoryBarriers = buf_bar,
229  .bufferMemoryBarrierCount = nb_buf_bar,
230  .pImageMemoryBarriers = img_bar,
231  .imageMemoryBarrierCount = nb_img_bar,
232  });
233  nb_img_bar = nb_buf_bar = 0;
234 
235  /* Reset */
236  ff_vk_shader_update_img_array(&ctx->s, exec, &shaders->reset,
237  pr->frame, vp->view.out,
238  0, 0,
239  VK_IMAGE_LAYOUT_GENERAL,
240  VK_NULL_HANDLE);
241 
242  ff_vk_shader_update_push_const(&ctx->s, exec, &shaders->reset,
243  VK_SHADER_STAGE_COMPUTE_BIT,
244  0, sizeof(pd), &pd);
245 
246  ff_vk_exec_bind_shader(&ctx->s, exec, &shaders->reset);
247 
248  vk->CmdDispatch(exec->buf, pr->mb_width << 1, pr->mb_height << 1, 1);
249 
250  /* Input frame barrier after reset */
251  ff_vk_frame_barrier(&ctx->s, exec, pr->frame, img_bar, &nb_img_bar,
252  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
253  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
254  VK_ACCESS_SHADER_WRITE_BIT,
255  VK_IMAGE_LAYOUT_GENERAL,
256  VK_QUEUE_FAMILY_IGNORED);
257 
258  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
259  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
260  .pBufferMemoryBarriers = buf_bar,
261  .bufferMemoryBarrierCount = nb_buf_bar,
262  .pImageMemoryBarriers = img_bar,
263  .imageMemoryBarrierCount = nb_img_bar,
264  });
265  nb_img_bar = nb_buf_bar = 0;
266 
267  /* Entropy decode */
268  ff_vk_shader_update_desc_buffer(&ctx->s, exec, &shaders->vld,
269  0, 0, 0,
270  slice_offsets,
271  0, (pp->slice_num + 1) * sizeof(uint32_t),
272  VK_FORMAT_UNDEFINED);
273  ff_vk_shader_update_img_array(&ctx->s, exec, &shaders->vld,
274  pr->frame, vp->view.out,
275  0, 1,
276  VK_IMAGE_LAYOUT_GENERAL,
277  VK_NULL_HANDLE);
278 
279  ff_vk_shader_update_push_const(&ctx->s, exec, &shaders->vld,
280  VK_SHADER_STAGE_COMPUTE_BIT,
281  0, sizeof(pd), &pd);
282 
283  ff_vk_exec_bind_shader(&ctx->s, exec, &shaders->vld);
284 
285  vk->CmdDispatch(exec->buf, AV_CEIL_RSHIFT(pr->slice_count / pr->mb_height, 3), AV_CEIL_RSHIFT(pr->mb_height, 3),
286  3 + !!pr->alpha_info);
287 
288  /* Synchronize vld and idct shaders */
289  nb_img_bar = 0;
290  ff_vk_frame_barrier(&ctx->s, exec, pr->frame, img_bar, &nb_img_bar,
291  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
292  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
293  VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
294  VK_IMAGE_LAYOUT_GENERAL,
295  VK_QUEUE_FAMILY_IGNORED);
296 
297  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
298  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
299  .pBufferMemoryBarriers = buf_bar,
300  .bufferMemoryBarrierCount = nb_buf_bar,
301  .pImageMemoryBarriers = img_bar,
302  .imageMemoryBarrierCount = nb_img_bar,
303  });
304  nb_img_bar = nb_buf_bar = 0;
305 
306  /* Inverse transform */
307  ff_vk_shader_update_img_array(&ctx->s, exec, &shaders->idct,
308  pr->frame, vp->view.out,
309  0, 0,
310  VK_IMAGE_LAYOUT_GENERAL,
311  VK_NULL_HANDLE);
312 
313  ff_vk_exec_bind_shader(&ctx->s, exec, &shaders->idct);
314 
315  ff_vk_shader_update_push_const(&ctx->s, exec, &shaders->idct,
316  VK_SHADER_STAGE_COMPUTE_BIT,
317  0, sizeof(pd), &pd);
318 
319  vk->CmdDispatch(exec->buf, AV_CEIL_RSHIFT(pr->mb_width, 1), pr->mb_height, 3);
320 
321  RET(ff_vk_exec_submit(&ctx->s, exec));
322 
323 fail:
324  return err;
325 }
326 
328 {
329  GLSLC(0, layout(push_constant, scalar) uniform pushConstants { );
330  GLSLC(1, u8buf slice_data; );
331  GLSLC(1, uint bitstream_size; );
332  GLSLC(0, );
333  GLSLC(1, uint16_t width; );
334  GLSLC(1, uint16_t height; );
335  GLSLC(1, uint16_t mb_width; );
336  GLSLC(1, uint16_t mb_height; );
337  GLSLC(1, uint16_t slice_width; );
338  GLSLC(1, uint16_t slice_height; );
339  GLSLC(1, uint8_t log2_slice_width; );
340  GLSLC(1, uint8_t log2_chroma_w; );
341  GLSLC(1, uint8_t depth; );
342  GLSLC(1, uint8_t alpha_info; );
343  GLSLC(1, uint8_t bottom_field; );
344  GLSLC(0, );
345  GLSLC(1, uint8_t qmat_luma [8*8]; );
346  GLSLC(1, uint8_t qmat_chroma[8*8]; );
347  GLSLC(0, }; );
348 
349  return ff_vk_shader_add_push_const(shd, 0, sizeof(ProresVkParameters),
350  VK_SHADER_STAGE_COMPUTE_BIT);
351 }
352 
354  FFVkExecPool *pool, FFVkSPIRVCompiler *spv,
355  FFVulkanShader *shd, const char *name, const char *entrypoint,
356  FFVulkanDescriptorSetBinding *descs, int num_descs,
357  const char *source, int local_size, int interlaced)
358 {
359  uint8_t *spv_data;
360  size_t spv_len;
361  void *spv_opaque = NULL;
362  int err;
363 
364  RET(ff_vk_shader_init(s, shd, name,
365  VK_SHADER_STAGE_COMPUTE_BIT,
366  (const char *[]) { "GL_EXT_buffer_reference",
367  "GL_EXT_buffer_reference2" }, 2,
368  local_size >> 16 & 0xff, local_size >> 8 & 0xff, local_size >> 0 & 0xff,
369  0));
370 
371  /* Common code */
373 
374  /* Push constants layout */
375  RET(add_push_data(shd));
376 
377  RET(ff_vk_shader_add_descriptor_set(s, shd, descs, num_descs, 0, 0));
378 
379  if (interlaced)
380  av_bprintf(&shd->src, "#define INTERLACED\n");
381 
382  /* Main code */
383  GLSLD(source);
384 
385  RET(spv->compile_shader(s, spv, shd, &spv_data, &spv_len, entrypoint,
386  &spv_opaque));
387  RET(ff_vk_shader_link(s, shd, spv_data, spv_len, entrypoint));
388 
389  RET(ff_vk_shader_register_exec(s, pool, shd));
390 
391 fail:
392  if (spv_opaque)
393  spv->free_shader(spv, &spv_opaque);
394 
395  return 0;
396 }
397 
399 {
400  ProresVulkanDecodeContext *pv = ctx->sd_ctx;
401  int i;
402 
403  for (i = 0; i < FF_ARRAY_ELEMS(pv->shaders); ++i) {
404  ff_vk_shader_free(&ctx->s, &pv->shaders[i].reset);
405  ff_vk_shader_free(&ctx->s, &pv->shaders[i].vld);
406  ff_vk_shader_free(&ctx->s, &pv->shaders[i].idct);
407  }
408 
410 
411  av_freep(&pv);
412 }
413 
415 {
418 
419  AVHWFramesContext *out_frames_ctx;
421  FFVkSPIRVCompiler *spv;
423  int max_num_slices, i, err;
424 
425  max_num_slices = (avctx->coded_width >> 4) * (avctx->coded_height >> 4);
426 
427  spv = ff_vk_spirv_init();
428  if (!spv) {
429  av_log(avctx, AV_LOG_ERROR, "Unable to initialize SPIR-V compiler!\n");
430  return AVERROR_EXTERNAL;
431  }
432 
433  err = ff_vk_decode_init(avctx);
434  if (err < 0)
435  return err;
436  ctx = dec->shared_ctx;
437 
438  pv = ctx->sd_ctx = av_mallocz(sizeof(*pv));
439  if (!pv) {
440  err = AVERROR(ENOMEM);
441  goto fail;
442  }
443 
444  out_frames_ctx = (AVHWFramesContext *)avctx->hw_frames_ctx->data;
445 
446  ctx->sd_ctx_free = vk_decode_prores_uninit;
447 
448  for (i = 0; i < FF_ARRAY_ELEMS(pv->shaders); ++i) { /* Progressive/interlaced */
449  struct ProresVulkanShaderVariants *shaders = &pv->shaders[i];
450 
451  desc_set = (FFVulkanDescriptorSetBinding []) {
452  {
453  .name = "dst",
454  .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
455  .dimensions = 2,
456  .mem_layout = ff_vk_shader_rep_fmt(out_frames_ctx->sw_format,
458  .mem_quali = "writeonly",
459  .elems = av_pix_fmt_count_planes(out_frames_ctx->sw_format),
460  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
461  },
462  };
463  RET(init_shader(avctx, &ctx->s, &ctx->exec_pool, spv, &shaders->reset,
464  "prores_dec_reset", "main", desc_set, 1,
465  ff_source_prores_reset_comp, 0x080801, i));
466 
467  desc_set = (FFVulkanDescriptorSetBinding []) {
468  {
469  .name = "slice_offsets_buf",
470  .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
471  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
472  .mem_quali = "readonly",
473  .buf_content = "uint32_t slice_offsets",
474  .buf_elems = max_num_slices + 1,
475  },
476  {
477  .name = "dst",
478  .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
479  .dimensions = 2,
480  .mem_layout = ff_vk_shader_rep_fmt(out_frames_ctx->sw_format,
482  .mem_quali = "writeonly",
483  .elems = av_pix_fmt_count_planes(out_frames_ctx->sw_format),
484  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
485  },
486  };
487  RET(init_shader(avctx, &ctx->s, &ctx->exec_pool, spv, &shaders->vld,
488  "prores_dec_vld", "main", desc_set, 2,
489  ff_source_prores_vld_comp, 0x080801, i));
490 
491  desc_set = (FFVulkanDescriptorSetBinding []) {
492  {
493  .name = "dst",
494  .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
495  .dimensions = 2,
496  .mem_layout = ff_vk_shader_rep_fmt(out_frames_ctx->sw_format,
498  .elems = av_pix_fmt_count_planes(out_frames_ctx->sw_format),
499  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
500  },
501  };
502  RET(init_shader(avctx, &ctx->s, &ctx->exec_pool, spv, &shaders->idct,
503  "prores_dec_idct", "main", desc_set, 1,
504  ff_source_prores_idct_comp, 0x200201, i));
505  }
506 
507  err = 0;
508 
509 fail:
510  spv->uninit(&spv);
511 
512  return err;
513 }
514 
516 {
517  AVHWDeviceContext *dev_ctx = _hwctx.nc;
519 
520  ff_vk_decode_free_frame(dev_ctx, &pp->vp);
521 }
522 
524  .p.name = "prores_vulkan",
525  .p.type = AVMEDIA_TYPE_VIDEO,
526  .p.id = AV_CODEC_ID_PRORES,
527  .p.pix_fmt = AV_PIX_FMT_VULKAN,
528  .start_frame = &vk_prores_start_frame,
529  .decode_slice = &vk_prores_decode_slice,
530  .end_frame = &vk_prores_end_frame,
531  .free_frame_priv = &vk_prores_free_frame_priv,
532  .frame_priv_data_size = sizeof(ProresVulkanDecodePicture),
535  .decode_params = &ff_vk_params_invalidate,
538  .frame_params = &ff_vk_frame_params,
539  .priv_data_size = sizeof(FFVulkanDecodeContext),
541 };
vulkan_loader.h
name
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 default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
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:71
ProresVkParameters::qmat_luma
uint8_t qmat_luma[64]
Definition: vulkan_prores.c:73
ff_vk_shader_free
void ff_vk_shader_free(FFVulkanContext *s, FFVulkanShader *shd)
Free a shader.
Definition: vulkan.c:2915
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:2048
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:240
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:3594
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
ProresVulkanDecodePicture::slice_num
uint32_t slice_num
Definition: vulkan_prores.c:41
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:59
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
vk_prores_free_frame_priv
static void vk_prores_free_frame_priv(AVRefStructOpaque _hwctx, void *data)
Definition: vulkan_prores.c:515
FFVulkanDecodePicture::view
struct FFVulkanDecodePicture::@322 view
ProresVkParameters::log2_slice_width
uint8_t log2_slice_width
Definition: vulkan_prores.c:67
FFVulkanShader::src
AVBPrint src
Definition: vulkan.h:195
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:57
ff_source_prores_vld_comp
const char * ff_source_prores_vld_comp
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
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:70
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
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:66
av_pix_fmt_count_planes
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3634
FFHWAccel
Definition: hwaccel_internal.h:34
fail
#define fail()
Definition: checkasm.h:206
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:2792
ProresVulkanDecodePicture::bitstream_start
uint32_t bitstream_start
Definition: vulkan_prores.c:43
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:2555
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:1361
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:2420
ProresVulkanDecodePicture
Definition: vulkan_prores.c:37
AVCodecContext::coded_height
int coded_height
Definition: avcodec.h:607
FFVulkanDecodeShared
Definition: vulkan_decode.h:38
ProresVulkanDecodeContext
Definition: vulkan_prores.c:47
ProresVulkanDecodeContext::ProresVulkanShaderVariants::vld
FFVulkanShader vld
Definition: vulkan_prores.c:50
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
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
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:77
s
#define s(width, name)
Definition: cbs_vp9.c:198
FFVulkanDecodePicture
Definition: vulkan_decode.h:75
ff_source_prores_reset_comp
const char * ff_source_prores_reset_comp
ProresVulkanDecodeContext::ProresVulkanShaderVariants::idct
FFVulkanShader idct
Definition: vulkan_prores.c:51
ProresVulkanDecodeContext::ProresVulkanShaderVariants
Definition: vulkan_prores.c:48
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
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:61
ProresVkParameters::height
uint16_t height
Definition: vulkan_prores.c:62
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:1553
ProresVulkanDecodeContext::ProresVulkanShaderVariants::reset
FFVulkanShader reset
Definition: vulkan_prores.c:49
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:619
GLSLD
#define GLSLD(D)
Definition: vulkan.h:58
AVPixFmtDescriptor::log2_chroma_w
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
Definition: pixdesc.h:80
vk_decode_prores_init
static int vk_decode_prores_init(AVCodecContext *avctx)
Definition: vulkan_prores.c:414
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:1588
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:610
ProresVkParameters::mb_width
uint16_t mb_width
Definition: vulkan_prores.c:63
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:1209
flush
void(* flush)(AVBSFContext *ctx)
Definition: dts2pts.c:370
ProresVulkanDecodePicture::bitstream_size
uint32_t bitstream_size
Definition: vulkan_prores.c:44
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:1082
source
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a source
Definition: filter_design.txt:256
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:368
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:2871
FFVulkanDescriptorSetBinding
Definition: vulkan.h:74
height
#define height
Definition: dsp.h:89
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
vulkan.h
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:424
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: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
FFVkExecContext
Definition: vulkan.h:111
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:2805
FFVulkanDescriptorSetBinding::name
const char * name
Definition: vulkan.h:75
ProresVkParameters::log2_chroma_w
uint8_t log2_chroma_w
Definition: vulkan_prores.c:68
ff_prores_vulkan_hwaccel
const FFHWAccel ff_prores_vulkan_hwaccel
Definition: vulkan_prores.c:523
FFVkSPIRVCompiler
Definition: vulkan_spirv.h:26
AVHWAccel::name
const char * name
Name of the hardware accelerated codec.
Definition: avcodec.h:1949
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::out
VkImageView out[AV_NUM_DATA_POINTERS]
Definition: vulkan_decode.h:80
ProresVkParameters::depth
uint8_t depth
Definition: vulkan_prores.c:69
ff_vk_exec_start
int ff_vk_exec_start(FFVulkanContext *s, FFVkExecContext *e)
Start/submit/wait an execution.
Definition: vulkan.c:559
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
ff_vk_frame_barrier
void ff_vk_frame_barrier(FFVulkanContext *s, FFVkExecContext *e, AVFrame *pic, VkImageMemoryBarrier2 *bar, int *nb_bar, VkPipelineStageFlags src_stage, VkPipelineStageFlags dst_stage, VkAccessFlagBits new_access, VkImageLayout new_layout, uint32_t new_qf)
Definition: vulkan.c:2005
ProresVulkanDecodeContext::shaders
struct ProresVulkanDecodeContext::ProresVulkanShaderVariants shaders[2]
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:2345
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
AVCodecContext::height
int height
Definition: avcodec.h:592
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:2881
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:368
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:32
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:287
av_bprintf
void av_bprintf(AVBPrint *buf, const char *fmt,...)
Definition: bprint.c:122
ProresVulkanDecodeContext::slice_offset_pool
AVBufferPool * slice_offset_pool
Definition: vulkan_prores.c:54
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:1459
FFVkExecContext::buf
VkCommandBuffer buf
Definition: vulkan.h:122
ProresContext::frame_type
int frame_type
0 = progressive, 1 = tff, 2 = bff
Definition: proresdec.h:48
AVCodecContext
main external API structure.
Definition: avcodec.h:431
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:327
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:65
FFVulkanDecodeDescriptor
Definition: vulkan_decode.h:29
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:145
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:127
AVCodecContext::coded_width
int coded_width
Bitstream width / height, may be different from width/height e.g.
Definition: avcodec.h:607
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
ProresVkParameters::mb_height
uint16_t mb_height
Definition: vulkan_prores.c:64
FFVulkanDecodePicture::slices_buf
AVBufferRef * slices_buf
Definition: vulkan_decode.h:101
mem.h
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
ProresVulkanDecodePicture::vp
FFVulkanDecodePicture vp
Definition: vulkan_prores.c:38
ff_source_prores_idct_comp
const char * ff_source_prores_idct_comp
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:74
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:458
ProresVkParameters::slice_data
VkDeviceAddress slice_data
Definition: vulkan_prores.c:58
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:592
ff_vk_exec_submit
int ff_vk_exec_submit(FFVulkanContext *s, FFVkExecContext *e)
Definition: vulkan.c:904
ProresVulkanDecodePicture::slice_offset_buf
AVBufferRef * slice_offset_buf
Definition: vulkan_prores.c:40
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:1261
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:638
width
#define width
Definition: dsp.h:89
init_shader
static int init_shader(AVCodecContext *avctx, FFVulkanContext *s, FFVkExecPool *pool, FFVkSPIRVCompiler *spv, FFVulkanShader *shd, const char *name, const char *entrypoint, FFVulkanDescriptorSetBinding *descs, int num_descs, const char *source, int local_size, int interlaced)
Definition: vulkan_prores.c:353
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
FFVulkanFunctions
Definition: vulkan_functions.h:277
vk_decode_prores_uninit
static void vk_decode_prores_uninit(FFVulkanDecodeShared *ctx)
Definition: vulkan_prores.c:398
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:1254
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