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 
25 extern const unsigned char ff_prores_vld_comp_spv_data[];
26 extern const unsigned int ff_prores_vld_comp_spv_len;
27 
28 extern const unsigned char ff_prores_idct_comp_spv_data[];
29 extern const unsigned int ff_prores_idct_comp_spv_len;
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 
48 
49 typedef struct ProresVulkanDecodeContext {
52 
55 
56 typedef struct ProresVkParameters {
57  VkDeviceAddress slice_data;
58  uint32_t bitstream_size;
59 
60  uint16_t width;
61  uint16_t height;
62  uint16_t mb_width;
63  uint16_t mb_height;
64  uint16_t slice_width;
65  uint16_t slice_height;
67  uint8_t log2_chroma_w;
68  uint8_t depth;
69  uint8_t alpha_info;
70  uint8_t bottom_field;
71 
72  uint8_t qmat_luma [64];
73  uint8_t qmat_chroma[64];
75 
77  const AVBufferRef *buffer_ref,
78  av_unused const uint8_t *buffer,
79  av_unused uint32_t size)
80 {
81  ProresContext *pr = avctx->priv_data;
84  ProresVulkanDecodeContext *pv = ctx->sd_ctx;
86  FFVulkanDecodePicture *vp = &pp->vp;
87 
88  int err;
89 
90  pp->slice_offsets_sz = (pr->slice_count + 1) * sizeof(uint32_t);
91  pp->mb_params_sz = pr->mb_width * pr->mb_height * sizeof(uint8_t);
92 
93  pp->slice_offsets_off = 0;
95  ctx->s.props.properties.limits.minStorageBufferOffsetAlignment);
96 
97  /* Host map the input slices data if supported */
98  if (!vp->slices_buf && ctx->s.extensions & FF_VK_EXT_EXTERNAL_HOST_MEMORY)
99  RET(ff_vk_host_map_buffer(&ctx->s, &vp->slices_buf, buffer_ref->data,
100  buffer_ref,
101  VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
102  VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT));
103 
104  /* Allocate metadata buffer */
106  &pp->metadata_buf,
107  VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
108  NULL, pp->mb_params_off + pp->mb_params_sz,
109  VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
110  VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
111 
112  /* Prepare frame to be used */
113  RET(ff_vk_decode_prepare_frame_sdr(dec, pr->frame, vp, 1,
114  FF_VK_REP_NATIVE, 0));
115 
116  pp->slice_num = 0;
117  pp->bitstream_start = pp->bitstream_size = 0;
118 
119 fail:
120  return err;
121 }
122 
124  const uint8_t *data,
125  uint32_t size)
126 {
127  ProresContext *pr = avctx->priv_data;
129  FFVulkanDecodePicture *vp = &pp->vp;
130 
131  FFVkBuffer *slice_offset = (FFVkBuffer *)pp->metadata_buf->data;
132  FFVkBuffer *slices_buf = vp->slices_buf ? (FFVkBuffer *)vp->slices_buf->data : NULL;
133 
134  /* Skip picture header */
135  if (slices_buf && slices_buf->host_ref && !pp->slice_num)
136  pp->bitstream_size = data - slices_buf->mapped_mem;
137 
138  AV_WN32(slice_offset->mapped_mem + (pp->slice_num + 0) * sizeof(uint32_t),
139  pp->bitstream_size);
140  AV_WN32(slice_offset->mapped_mem + (pp->slice_num + 1) * sizeof(uint32_t),
141  pp->bitstream_size += size);
142 
143  if (!slices_buf || !slices_buf->host_ref) {
144  int err = ff_vk_decode_add_slice(avctx, vp, data, size, 0,
145  &pp->slice_num, NULL);
146  if (err < 0)
147  return err;
148  } else {
149  pp->slice_num++;
150  }
151 
152  return 0;
153 }
154 
156 {
157  ProresContext *pr = avctx->priv_data;
160  FFVulkanFunctions *vk = &ctx->s.vkfn;
161  ProresVulkanDecodeContext *pv = ctx->sd_ctx;
163  FFVulkanDecodePicture *vp = &pp->vp;
164  AVFrame *f = pr->frame;
165  AVVkFrame *vkf = (AVVkFrame *)f->data[0];
166 
168  FFVkBuffer *slice_data, *metadata;
169  VkImageMemoryBarrier2 img_bar[AV_NUM_DATA_POINTERS];
170  VkBufferMemoryBarrier2 buf_bar[2];
171  int nb_img_bar = 0, nb_buf_bar = 0, nb_imgs, i, err;
172  const AVPixFmtDescriptor *pix_desc;
173 
174  if (!pp->slice_num)
175  return 0;
176 
177  pix_desc = av_pix_fmt_desc_get(avctx->sw_pix_fmt);
178  if (!pix_desc)
179  return AVERROR(EINVAL);
180 
181  slice_data = (FFVkBuffer *)vp->slices_buf->data;
183 
184  pd = (ProresVkParameters) {
185  .slice_data = slice_data->address,
186  .bitstream_size = pp->bitstream_size,
187 
188  .width = avctx->width,
189  .height = avctx->height,
190  .mb_width = pr->mb_width,
191  .mb_height = pr->mb_height,
192  .slice_width = pr->slice_count / pr->mb_height,
193  .slice_height = pr->mb_height,
194  .log2_slice_width = av_log2(pr->slice_mb_width),
195  .log2_chroma_w = pix_desc->log2_chroma_w,
196  .depth = avctx->bits_per_raw_sample,
197  .alpha_info = pr->alpha_info,
198  .bottom_field = pr->first_field ^ (pr->frame_type == 1),
199  };
200 
201  memcpy(pd.qmat_luma, pr->qmat_luma, sizeof(pd.qmat_luma ));
202  memcpy(pd.qmat_chroma, pr->qmat_chroma, sizeof(pd.qmat_chroma));
203 
204  FFVkExecContext *exec = ff_vk_exec_get(&ctx->s, &ctx->exec_pool);
205  RET(ff_vk_exec_start(&ctx->s, exec));
206 
207  /* Prepare deps */
208  RET(ff_vk_exec_add_dep_frame(&ctx->s, exec, f,
209  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
210  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
211 
212  RET(ff_vk_exec_mirror_sem_value(&ctx->s, exec, &vp->sem, &vp->sem_value, f));
213 
214  /* Transfer ownership to the exec context */
215  RET(ff_vk_exec_add_dep_buf(&ctx->s, exec, &vp->slices_buf, 1, 0));
216  vp->slices_buf = NULL;
217  RET(ff_vk_exec_add_dep_buf(&ctx->s, exec, &pp->metadata_buf, 1, 0));
218  pp->metadata_buf = NULL;
219 
220  vkf->layout[0] = VK_IMAGE_LAYOUT_UNDEFINED;
221  vkf->access[0] = VK_ACCESS_2_NONE;
222 
223  nb_imgs = ff_vk_count_images(vkf);
224 
225  if (pr->first_field) {
226  /* Input barrier */
227  ff_vk_frame_barrier(&ctx->s, exec, f, img_bar, &nb_img_bar,
228  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
229  VK_PIPELINE_STAGE_2_CLEAR_BIT,
230  VK_ACCESS_2_TRANSFER_WRITE_BIT,
231  VK_IMAGE_LAYOUT_GENERAL,
232  VK_QUEUE_FAMILY_IGNORED);
233 
234  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
235  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
236  .pBufferMemoryBarriers = buf_bar,
237  .bufferMemoryBarrierCount = nb_buf_bar,
238  .pImageMemoryBarriers = img_bar,
239  .imageMemoryBarrierCount = nb_img_bar,
240  });
241  nb_img_bar = nb_buf_bar = 0;
242 
243  /* Clear the input image since the vld shader does sparse writes, except for alpha */
244  for (i = 0; i < FFMIN(nb_imgs, 3); ++i) {
245  vk->CmdClearColorImage(exec->buf, vkf->img[i],
246  VK_IMAGE_LAYOUT_GENERAL,
247  &((VkClearColorValue) { 0 }),
248  1, &((VkImageSubresourceRange) {
249  .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
250  .levelCount = 1,
251  .layerCount = 1,
252  }));
253  }
254  }
255 
256  /* Input barrier, or synchronization between clear and vld shader */
257  ff_vk_frame_barrier(&ctx->s, exec, f, img_bar, &nb_img_bar,
258  pr->first_field ? VK_PIPELINE_STAGE_2_CLEAR_BIT :
259  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
260  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
261  VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,
262  VK_IMAGE_LAYOUT_GENERAL,
263  VK_QUEUE_FAMILY_IGNORED);
264 
265  ff_vk_buf_barrier(buf_bar[nb_buf_bar++], metadata,
266  ALL_COMMANDS_BIT, NONE_KHR, NONE_KHR,
267  COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
268  pp->slice_offsets_sz, pp->mb_params_sz);
269  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
270  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
271  .pBufferMemoryBarriers = buf_bar,
272  .bufferMemoryBarrierCount = nb_buf_bar,
273  .pImageMemoryBarriers = img_bar,
274  .imageMemoryBarrierCount = nb_img_bar,
275  });
276  nb_img_bar = nb_buf_bar = 0;
277 
278  /* Entropy decode */
279  ff_vk_shader_update_desc_buffer(&ctx->s, exec, &pv->vld,
280  0, 0, 0,
281  metadata,
282  pp->slice_offsets_off,
283  pp->slice_offsets_sz,
284  VK_FORMAT_UNDEFINED);
285  ff_vk_shader_update_desc_buffer(&ctx->s, exec, &pv->vld,
286  0, 1, 0,
287  metadata,
288  pp->mb_params_off,
289  pp->mb_params_sz,
290  VK_FORMAT_UNDEFINED);
291  ff_vk_shader_update_img_array(&ctx->s, exec, &pv->vld,
292  f, vp->view.out,
293  0, 2,
294  VK_IMAGE_LAYOUT_GENERAL,
295  VK_NULL_HANDLE);
296 
297  ff_vk_exec_bind_shader(&ctx->s, exec, &pv->vld);
298  ff_vk_shader_update_push_const(&ctx->s, exec, &pv->vld,
299  VK_SHADER_STAGE_COMPUTE_BIT,
300  0, sizeof(pd), &pd);
301 
302  vk->CmdDispatch(exec->buf, AV_CEIL_RSHIFT(pr->slice_count / pr->mb_height, 3),
303  AV_CEIL_RSHIFT(pr->mb_height, 3),
304  3 + !!pr->alpha_info);
305 
306  /* Synchronize vld and idct shaders */
307  ff_vk_frame_barrier(&ctx->s, exec, f, img_bar, &nb_img_bar,
308  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
309  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
310  VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
311  VK_IMAGE_LAYOUT_GENERAL,
312  VK_QUEUE_FAMILY_IGNORED);
313 
314  ff_vk_buf_barrier(buf_bar[nb_buf_bar++], metadata,
315  COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
316  COMPUTE_SHADER_BIT, SHADER_READ_BIT, NONE_KHR,
317  pp->slice_offsets_sz, pp->mb_params_sz);
318  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
319  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
320  .pBufferMemoryBarriers = buf_bar,
321  .bufferMemoryBarrierCount = nb_buf_bar,
322  .pImageMemoryBarriers = img_bar,
323  .imageMemoryBarrierCount = nb_img_bar,
324  });
325  nb_img_bar = nb_buf_bar = 0;
326 
327  /* Inverse transform */
328  ff_vk_shader_update_desc_buffer(&ctx->s, exec, &pv->idct,
329  0, 0, 0,
330  metadata,
331  pp->mb_params_off,
332  pp->mb_params_sz,
333  VK_FORMAT_UNDEFINED);
334  ff_vk_shader_update_img_array(&ctx->s, exec, &pv->idct,
335  f, vp->view.out,
336  0, 1,
337  VK_IMAGE_LAYOUT_GENERAL,
338  VK_NULL_HANDLE);
339 
340  ff_vk_exec_bind_shader(&ctx->s, exec, &pv->idct);
341  ff_vk_shader_update_push_const(&ctx->s, exec, &pv->idct,
342  VK_SHADER_STAGE_COMPUTE_BIT,
343  0, sizeof(pd), &pd);
344 
345  vk->CmdDispatch(exec->buf, AV_CEIL_RSHIFT(pr->mb_width, 1), pr->mb_height, 3);
346 
347  RET(ff_vk_exec_submit(&ctx->s, exec));
348 
349 fail:
350  return err;
351 }
352 
354  FFVkExecPool *pool, FFVulkanShader *shd,
355  int max_num_mbs, int interlaced)
356 {
357  int err;
358  AVHWFramesContext *dec_frames_ctx;
359  dec_frames_ctx = (AVHWFramesContext *)avctx->hw_frames_ctx->data;
360 
361  SPEC_LIST_CREATE(sl, 1, 1*sizeof(uint32_t))
362  SPEC_LIST_ADD(sl, 0, 32, interlaced);
363 
364  ff_vk_shader_load(shd,
365  VK_SHADER_STAGE_COMPUTE_BIT, sl,
366  (uint32_t []) { 8, 8, 1 }, 0);
367 
369  VK_SHADER_STAGE_COMPUTE_BIT);
370 
371  FFVulkanDescriptorSetBinding desc_set[] = {
372  {
373  .name = "slice_offsets_buf",
374  .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
375  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
376  },
377  {
378  .name = "quant_idx_buf",
379  .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
380  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
381  },
382  {
383  .name = "dst",
384  .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
385  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
386  .elems = av_pix_fmt_count_planes(dec_frames_ctx->sw_format),
387  },
388  };
389  ff_vk_shader_add_descriptor_set(s, shd, desc_set, 3, 0, 0);
390 
391  RET(ff_vk_shader_link(s, shd,
393  ff_prores_vld_comp_spv_len, "main"));
394 
395  RET(ff_vk_shader_register_exec(s, pool, shd));
396 
397 fail:
398  return 0;
399 }
400 
402  FFVkExecPool *pool, FFVulkanShader *shd,
403  int max_num_mbs, int interlaced)
404 {
405  int err;
406  AVHWFramesContext *dec_frames_ctx;
407  dec_frames_ctx = (AVHWFramesContext *)avctx->hw_frames_ctx->data;
408 
409  SPEC_LIST_CREATE(sl, 2 + 64, (2 + 64)*sizeof(uint32_t))
410  SPEC_LIST_ADD(sl, 0, 32, interlaced);
411  SPEC_LIST_ADD(sl, 16, 32, 4*2); /* nb_blocks */
412 
413  const double idct_8_scales[8] = {
414  cos(4.0*M_PI/16.0) / 2.0, cos(1.0*M_PI/16.0) / 2.0,
415  cos(2.0*M_PI/16.0) / 2.0, cos(3.0*M_PI/16.0) / 2.0,
416  cos(4.0*M_PI/16.0) / 2.0, cos(5.0*M_PI/16.0) / 2.0,
417  cos(6.0*M_PI/16.0) / 2.0, cos(7.0*M_PI/16.0) / 2.0,
418  };
419  for (int i = 0; i < 64; i++)
420  SPEC_LIST_ADD(sl, 18 + i, 32,
421  av_float2int(idct_8_scales[i >> 3]*idct_8_scales[i & 7]));
422 
423  ff_vk_shader_load(shd,
424  VK_SHADER_STAGE_COMPUTE_BIT, sl,
425  (uint32_t []) { 32, 2, 1 }, 0);
426 
428  VK_SHADER_STAGE_COMPUTE_BIT);
429 
430  FFVulkanDescriptorSetBinding desc_set[] = {
431  {
432  .name = "quant_idx_buf",
433  .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
434  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
435  },
436  {
437  .name = "dst",
438  .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
439  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
440  .elems = av_pix_fmt_count_planes(dec_frames_ctx->sw_format),
441  },
442  };
443  RET(ff_vk_shader_add_descriptor_set(s, shd, desc_set, 2, 0, 0));
444 
445  RET(ff_vk_shader_link(s, shd,
447  ff_prores_idct_comp_spv_len, "main"));
448 
449  RET(ff_vk_shader_register_exec(s, pool, shd));
450 
451 fail:
452  return 0;
453 }
454 
456 {
457  ProresVulkanDecodeContext *pv = ctx->sd_ctx;
458 
459  ff_vk_shader_free(&ctx->s, &pv->vld);
460  ff_vk_shader_free(&ctx->s, &pv->idct);
461 
463 
464  av_freep(&pv);
465 }
466 
468 {
471  ProresContext *pr = avctx->priv_data;
472 
474  int max_num_mbs, err;
475 
476  max_num_mbs = (avctx->coded_width >> 4) * (avctx->coded_height >> 4);
477 
478  err = ff_vk_decode_init(avctx);
479  if (err < 0)
480  return err;
481  ctx = dec->shared_ctx;
482 
483  pv = ctx->sd_ctx = av_mallocz(sizeof(*pv));
484  if (!pv) {
485  err = AVERROR(ENOMEM);
486  goto fail;
487  }
488 
489  ctx->sd_ctx_free = vk_decode_prores_uninit;
490 
491  RET(init_decode_shader(avctx, &ctx->s, &ctx->exec_pool,
492  &pv->vld, max_num_mbs, pr->frame_type != 0));
493  RET(init_idct_shader(avctx, &ctx->s, &ctx->exec_pool,
494  &pv->idct, max_num_mbs, pr->frame_type != 0));
495 
496 fail:
497  return err;
498 }
499 
501 {
502  AVHWDeviceContext *dev_ctx = _hwctx.nc;
504 
505  ff_vk_decode_free_frame(dev_ctx, &pp->vp);
506 
508 }
509 
511  .p.name = "prores_vulkan",
512  .p.type = AVMEDIA_TYPE_VIDEO,
513  .p.id = AV_CODEC_ID_PRORES,
514  .p.pix_fmt = AV_PIX_FMT_VULKAN,
515  .start_frame = &vk_prores_start_frame,
516  .decode_slice = &vk_prores_decode_slice,
517  .end_frame = &vk_prores_end_frame,
518  .free_frame_priv = &vk_prores_free_frame_priv,
519  .frame_priv_data_size = sizeof(ProresVulkanDecodePicture),
523  .frame_params = &ff_vk_frame_params,
524  .priv_data_size = sizeof(FFVulkanDecodeContext),
526 };
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:70
ProresVkParameters::qmat_luma
uint8_t qmat_luma[64]
Definition: vulkan_prores.c:72
ff_vk_shader_free
void ff_vk_shader_free(FFVulkanContext *s, FFVulkanShader *shd)
Free a shader.
Definition: vulkan.c:2984
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:68
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
ff_prores_idct_comp_spv_len
const unsigned int ff_prores_idct_comp_spv_len
ProresVkParameters::bitstream_size
uint32_t bitstream_size
Definition: vulkan_prores.c: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
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:500
ProresVkParameters::log2_slice_width
uint8_t log2_slice_width
Definition: vulkan_prores.c:66
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:155
ProresVkParameters
Definition: vulkan_prores.c:56
ProresVulkanDecodeContext::vld
FFVulkanShader vld
Definition: vulkan_prores.c:50
ff_vk_exec_get
FFVkExecContext * ff_vk_exec_get(FFVulkanContext *s, FFVkExecPool *pool)
Retrieve an execution pool.
Definition: vulkan.c:557
FF_VK_REP_NATIVE
@ FF_VK_REP_NATIVE
Definition: vulkan.h:450
SPEC_LIST_ADD
#define SPEC_LIST_ADD(name, idx, val_bits, val)
Definition: vulkan.h:86
av_float2int
static av_always_inline uint32_t av_float2int(float f)
Reinterpret a float as a 32-bit integer.
Definition: intfloat.h:50
FFVulkanDecodeContext
Definition: vulkan_decode.h:54
ProresContext::slice_count
int slice_count
number of slices in the current picture
Definition: proresdec.h:52
ProresVulkanDecodePicture::mb_params_off
uint32_t mb_params_off
Definition: vulkan_prores.c:46
ProresVkParameters::alpha_info
uint8_t alpha_info
Definition: vulkan_prores.c:69
AV_PIX_FMT_VULKAN
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
Definition: pixfmt.h:379
ff_vk_exec_add_dep_frame
int ff_vk_exec_add_dep_frame(FFVulkanContext *s, FFVkExecContext *e, AVFrame *f, VkPipelineStageFlagBits2 wait_stage, VkPipelineStageFlagBits2 signal_stage)
Definition: vulkan.c:789
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:65
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
ff_prores_vld_comp_spv_data
const unsigned char ff_prores_vld_comp_spv_data[]
fail
#define fail()
Definition: checkasm.h:216
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:2858
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:2048
HWACCEL_CAP_THREAD_SAFE
#define HWACCEL_CAP_THREAD_SAFE
Definition: hwaccel_internal.h:32
ff_vk_shader_register_exec
int ff_vk_shader_register_exec(FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd)
Register a shader with an exec pool.
Definition: vulkan.c:2637
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:1400
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:49
AVHWDeviceContext
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition: hwcontext.h:63
ProresContext::first_field
int first_field
Definition: proresdec.h:60
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:76
s
#define s(width, name)
Definition: cbs_vp9.c:198
FFVulkanDecodePicture
Definition: vulkan_decode.h:73
ff_vk_exec_mirror_sem_value
int ff_vk_exec_mirror_sem_value(FFVulkanContext *s, FFVkExecContext *e, VkSemaphore *dst, uint64_t *dst_val, AVFrame *f)
Definition: vulkan.c:888
init_idct_shader
static int init_idct_shader(AVCodecContext *avctx, FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd, int max_num_mbs, int interlaced)
Definition: vulkan_prores.c:401
ProresVulkanDecodeContext::idct
FFVulkanShader idct
Definition: vulkan_prores.c:51
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:60
ProresVkParameters::height
uint16_t height
Definition: vulkan_prores.c:61
vk_prores_decode_slice
static int vk_prores_decode_slice(AVCodecContext *avctx, const uint8_t *data, uint32_t size)
Definition: vulkan_prores.c:123
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:629
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:467
HWACCEL_CAP_ASYNC_SAFE
#define HWACCEL_CAP_ASYNC_SAFE
Header providing the internals of AVHWAccel.
Definition: hwaccel_internal.h:31
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:62
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
ff_vk_shader_link
int ff_vk_shader_link(FFVulkanContext *s, FFVulkanShader *shd, const char *spirv, size_t spirv_len, const char *entrypoint)
Link a shader into an executable.
Definition: vulkan.c:2393
SPEC_LIST_CREATE
#define SPEC_LIST_CREATE(name, max_length, max_size)
Definition: vulkan.h:76
ff_prores_idct_comp_spv_data
const unsigned char ff_prores_idct_comp_spv_data[]
FFVkBuffer::mapped_mem
uint8_t * mapped_mem
Definition: vulkan.h:134
FFVulkanContext
Definition: vulkan.h:313
ff_vk_frame_params
int ff_vk_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx)
Initialize hw_frames_ctx with the parameters needed to decode the stream using the parameters from av...
Definition: vulkan_decode.c:1141
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:552
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:550
AVVkFrame::access
VkAccessFlagBits access[AV_NUM_DATA_POINTERS]
Updated after every barrier.
Definition: hwcontext_vulkan.h:331
ff_vk_shader_update_push_const
void ff_vk_shader_update_push_const(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd, VkShaderStageFlagBits stage, int offset, size_t size, void *src)
Update push constant in a shader.
Definition: vulkan.c:2937
FFVulkanDescriptorSetBinding
Definition: vulkan.h:112
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:225
FFVkExecContext
Definition: vulkan.h:145
ff_vk_shader_update_desc_buffer
int ff_vk_shader_update_desc_buffer(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd, int set, int bind, int elem, FFVkBuffer *buf, VkDeviceSize offset, VkDeviceSize len, VkFormat fmt)
Update a descriptor in a buffer with a buffer.
Definition: vulkan.c:2871
FFVulkanDescriptorSetBinding::name
const char * name
Definition: vulkan.h:113
M_PI
#define M_PI
Definition: mathematics.h:67
ProresVkParameters::log2_chroma_w
uint8_t log2_chroma_w
Definition: vulkan_prores.c:67
ff_prores_vulkan_hwaccel
const FFHWAccel ff_prores_vulkan_hwaccel
Definition: vulkan_prores.c:510
AVHWAccel::name
const char * name
Name of the hardware accelerated codec.
Definition: avcodec.h:1957
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:68
ff_vk_exec_start
int ff_vk_exec_start(FFVulkanContext *s, FFVkExecContext *e)
Start/submit/wait an execution.
Definition: vulkan.c:569
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
ff_prores_vld_comp_spv_len
const unsigned int ff_prores_vld_comp_spv_len
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
FFVulkanDecodePicture::sem
VkSemaphore sem
Definition: vulkan_decode.h:84
AVCodecContext::height
int height
Definition: avcodec.h:600
ff_vk_exec_bind_shader
void ff_vk_exec_bind_shader(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd)
Bind a shader.
Definition: vulkan.c:2947
AVCodecContext::hw_frames_ctx
AVBufferRef * hw_frames_ctx
A reference to the AVHWFramesContext describing the input (for encoding) or output (decoding) frames.
Definition: avcodec.h:1461
ProresVulkanDecodePicture::slice_offsets_off
uint32_t slice_offsets_off
Definition: vulkan_prores.c:46
AVHWFramesContext
This struct describes a set or pool of "hardware" frames (i.e.
Definition: hwcontext.h:118
ff_vk_dec_prores_desc
const FFVulkanDecodeDescriptor ff_vk_dec_prores_desc
Definition: vulkan_prores.c:31
FFVkExecPool
Definition: vulkan.h:291
ff_vk_decode_add_slice
int ff_vk_decode_add_slice(AVCodecContext *avctx, FFVulkanDecodePicture *vp, const uint8_t *data, size_t size, int add_startcode, uint32_t *nb_slices, const uint32_t **offsets)
Add slice data to frame.
Definition: vulkan_decode.c:296
ff_vk_shader_add_push_const
int ff_vk_shader_add_push_const(FFVulkanShader *shd, int offset, int size, VkShaderStageFlagBits stage)
Add/update push constants for execution.
Definition: vulkan.c:1498
FFVkExecContext::buf
VkCommandBuffer buf
Definition: vulkan.h:156
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
ff_vk_shader_add_descriptor_set
int ff_vk_shader_add_descriptor_set(FFVulkanContext *s, FFVulkanShader *shd, const FFVulkanDescriptorSetBinding *desc, int nb, int singular, int print_to_shader_only)
Add descriptor to a shader.
Definition: vulkan.c:2525
ProresContext::qmat_chroma
uint8_t qmat_chroma[64]
Definition: proresdec.h:50
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:64
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:63
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
ProresVulkanDecodeContext::metadata_pool
AVBufferPool * metadata_pool
Definition: vulkan_prores.c:53
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:73
ff_vk_count_images
static int ff_vk_count_images(AVVkFrame *f)
Definition: vulkan.h:367
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:466
ProresVkParameters::slice_data
VkDeviceAddress slice_data
Definition: vulkan_prores.c:57
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
FFVkBuffer
Definition: vulkan.h:125
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:914
init_decode_shader
static int init_decode_shader(AVCodecContext *avctx, FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd, int max_num_mbs, int interlaced)
Definition: vulkan_prores.c:353
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
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
FFVulkanFunctions
Definition: vulkan_functions.h:282
vk_decode_prores_uninit
static void vk_decode_prores_uninit(FFVulkanDecodeShared *ctx)
Definition: vulkan_prores.c:455
ff_vk_shader_load
int ff_vk_shader_load(FFVulkanShader *shd, VkPipelineStageFlags stage, VkSpecializationInfo *spec, uint32_t wg_size[3], uint32_t required_subgroup_size)
Initialize a shader object.
Definition: vulkan.c:2091
ff_vk_get_pooled_buffer
int ff_vk_get_pooled_buffer(FFVulkanContext *ctx, AVBufferPool **buf_pool, AVBufferRef **buf, VkBufferUsageFlags usage, void *create_pNext, size_t size, VkMemoryPropertyFlagBits mem_props)
Initialize a pool and create AVBufferRefs containing FFVkBuffer.
Definition: vulkan.c:1295
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