FFmpeg
ffv1enc_vulkan.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2024 Lynne <dev@lynne.ee>
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include "libavutil/mem.h"
22 #include "libavutil/vulkan.h"
23 
24 #include "avcodec.h"
25 #include "internal.h"
26 #include "hwconfig.h"
27 #include "encode.h"
28 #include "libavutil/opt.h"
29 #include "codec_internal.h"
30 
31 #include "ffv1.h"
32 #include "ffv1enc.h"
33 #include "ffv1_vulkan.h"
34 
35 /* Parallel Golomb alignment */
36 #define LG_ALIGN_W 32
37 #define LG_ALIGN_H 32
38 
39 /* Unlike the decoder, we need 4 lines (but really only 3) */
40 #define RGB_LINECACHE 4
41 
42 typedef struct VulkanEncodeFFv1FrameData {
43  /* Output data */
45 
46  /* Copied from the source */
49  void *frame_opaque;
51 
52  int key_frame;
53  int idx;
55 
56 typedef struct VulkanEncodeFFv1Context {
59 
63 
66 
67  VkBufferCopy *buf_regions;
69  int in_flight;
71  size_t max_heap_size;
72 
77 
78  /* Constant read-only buffers */
80 
81  /* Results buffer */
83 
84  /* Slice data buffer pool */
87 
88  /* Output data buffer */
90 
91  /* Intermediate frame pool */
93 
96  int force_pcm;
98 
99  int is_rgb;
100  int ppi;
101  int chunks;
103 
104 extern const char *ff_source_common_comp;
105 extern const char *ff_source_rangecoder_comp;
106 extern const char *ff_source_ffv1_vlc_comp;
107 extern const char *ff_source_ffv1_common_comp;
108 extern const char *ff_source_ffv1_enc_comp;
109 
110 extern const unsigned char ff_ffv1_enc_setup_comp_spv_data[];
111 extern const unsigned int ff_ffv1_enc_setup_comp_spv_len;
112 
113 extern const unsigned char ff_ffv1_enc_reset_comp_spv_data[];
114 extern const unsigned int ff_ffv1_enc_reset_comp_spv_len;
115 
116 extern const unsigned char ff_ffv1_enc_reset_golomb_comp_spv_data[];
117 extern const unsigned int ff_ffv1_enc_reset_golomb_comp_spv_len;
118 
119 extern const unsigned char ff_ffv1_enc_comp_spv_data[];
120 extern const unsigned int ff_ffv1_enc_comp_spv_len;
121 
122 extern const unsigned char ff_ffv1_enc_rgb_comp_spv_data[];
123 extern const unsigned int ff_ffv1_enc_rgb_comp_spv_len;
124 
125 extern const unsigned char ff_ffv1_enc_golomb_comp_spv_data[];
126 extern const unsigned int ff_ffv1_enc_golomb_comp_spv_len;
127 
128 extern const unsigned char ff_ffv1_enc_rgb_golomb_comp_spv_data[];
129 extern const unsigned int ff_ffv1_enc_rgb_golomb_comp_spv_len;
130 
131 extern const unsigned char ff_ffv1_enc_rct_search_comp_spv_data[];
132 extern const unsigned int ff_ffv1_enc_rct_search_comp_spv_len;
133 
135  AVFrame *enc_in, VkImageView *enc_in_views,
136  FFVkBuffer *slice_data_buf, uint32_t slice_data_size,
137  FFv1ShaderParams *pd)
138 {
139  VulkanEncodeFFv1Context *fv = avctx->priv_data;
140  FFV1Context *f = &fv->ctx;
141  FFVulkanFunctions *vk = &fv->s.vkfn;
142 
143  /* Update descriptors */
145  1, 0, 0,
146  slice_data_buf,
147  0, slice_data_size*f->slice_count,
148  VK_FORMAT_UNDEFINED);
149  ff_vk_shader_update_img_array(&fv->s, exec, &fv->rct_search,
150  enc_in, enc_in_views,
151  1, 1,
152  VK_IMAGE_LAYOUT_GENERAL,
153  VK_NULL_HANDLE);
154 
155  ff_vk_exec_bind_shader(&fv->s, exec, &fv->rct_search);
157  VK_SHADER_STAGE_COMPUTE_BIT,
158  0, sizeof(FFv1ShaderParams), pd);
159 
160  vk->CmdDispatch(exec->buf, fv->ctx.num_h_slices, fv->ctx.num_v_slices, 1);
161 
162  return 0;
163 }
164 
166  FFVkExecContext *exec,
167  const AVFrame *pict)
168 {
169  int err;
170  VulkanEncodeFFv1Context *fv = avctx->priv_data;
171  FFV1Context *f = &fv->ctx;
172  FFVulkanFunctions *vk = &fv->s.vkfn;
173 
174  VulkanEncodeFFv1FrameData *fd = exec->opaque;
175 
176  /* Slice data */
177  AVBufferRef *slice_data_ref;
178  FFVkBuffer *slice_data_buf;
179  uint32_t plane_state_size;
180  uint32_t slice_state_size;
181  uint32_t slice_data_size;
182 
183  /* Output data */
184  size_t maxsize;
185  FFVkBuffer *out_data_buf;
186 
187  int has_inter = avctx->gop_size > 1;
188  uint32_t context_count = f->context_count[f->context_model];
189 
190  VkImageMemoryBarrier2 img_bar[37];
191  int nb_img_bar = 0;
192  VkBufferMemoryBarrier2 buf_bar[8];
193  int nb_buf_bar = 0;
194 
195  /* Frame state */
196  f->cur_enc_frame = pict;
197  if (avctx->gop_size == 0 || f->picture_number % avctx->gop_size == 0) {
199  f->key_frame = fd->key_frame = 1;
200  f->gob_count++;
201  } else {
202  f->key_frame = fd->key_frame = 0;
203  }
204 
205  f->slice_count = f->max_slice_count;
206 
207  /* Allocate slice buffer data */
208  if (f->ac == AC_GOLOMB_RICE)
209  plane_state_size = 8;
210  else
211  plane_state_size = CONTEXT_SIZE;
212 
213  plane_state_size *= context_count;
214  slice_state_size = plane_state_size*f->plane_count;
215 
216  slice_data_size = 256; /* Overestimation for the SliceContext struct */
217  slice_state_size += slice_data_size;
218  slice_state_size = FFALIGN(slice_state_size, 8);
219 
220  /* Allocate slice data buffer */
221  slice_data_ref = fv->keyframe_slice_data_ref;
222  if (!slice_data_ref) {
224  &slice_data_ref,
225  VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
226  NULL, slice_state_size*f->slice_count,
227  VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
228 
229  /* Only save it if we're going to use it again */
230  if (has_inter)
231  fv->keyframe_slice_data_ref = slice_data_ref;
232  }
233  slice_data_buf = (FFVkBuffer *)slice_data_ref->data;
234 
235  /* Output buffer size */
236  maxsize = ff_ffv1_encode_buffer_size(avctx);
237  maxsize = FFMIN(maxsize, fv->s.props_11.maxMemoryAllocationSize);
238 
239  /* Allocate output buffer */
240  VkMemoryPropertyFlagBits out_buf_flags;
241  if (maxsize < fv->max_heap_size) {
242  out_buf_flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
243  /* If we can't map host memory, we can't let the GPU copy its buffer. */
245  out_buf_flags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
246  } else {
247  out_buf_flags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
248  fv->s.host_cached_flag;
249  }
250 
252  &fd->out_data_ref,
253  VK_BUFFER_USAGE_TRANSFER_SRC_BIT |
254  VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
255  VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
256  NULL, maxsize, out_buf_flags));
257  out_data_buf = (FFVkBuffer *)fd->out_data_ref->data;
258 
259  /* Image views */
260  AVFrame *src = (AVFrame *)pict;
261  VkImageView src_views[AV_NUM_DATA_POINTERS];
262 
263  AVFrame *tmp = NULL;
264  VkImageView tmp_views[AV_NUM_DATA_POINTERS];
265  if (fv->is_rgb) {
266  /* Create a temporaty frame */
267  tmp = av_frame_alloc();
268  if (!(tmp))
269  return AVERROR(ENOMEM);
270 
272  tmp, 0));
273  }
274 
275  /* With everything allocated, setup push data */
276  FFv1ShaderParams pd = {
277  .slice_data = out_data_buf->address,
278 
279  .img_size[0] = fv->s.frames->width,
280  .img_size[1] = fv->s.frames->height,
281 
282  .plane_state_size = plane_state_size,
283  .key_frame = f->key_frame,
284  .crcref = f->crcref,
285  .micro_version = f->micro_version,
286 
287  .sar[0] = pict->sample_aspect_ratio.num,
288  .sar[1] = pict->sample_aspect_ratio.den,
289  .pic_mode = !(pict->flags & AV_FRAME_FLAG_INTERLACED) ? 3 :
290  !(pict->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST) ? 2 : 1,
291  .slice_size_max = out_data_buf->size / f->slice_count,
292  };
293 
294  for (int i = 0; i < f->quant_table_count; i++) {
295  pd.context_count[i] = f->context_count[i];
296  pd.extend_lookup[i] = f->quant_tables[i][3][127] ||
297  f->quant_tables[i][4][127];
298  }
299 
300  /* For some reason the C FFv1 encoder/decoder treats these differently */
301  if (avctx->sw_pix_fmt == AV_PIX_FMT_GBRP10 ||
302  avctx->sw_pix_fmt == AV_PIX_FMT_GBRP12 ||
303  avctx->sw_pix_fmt == AV_PIX_FMT_GBRP14)
304  memcpy(pd.fmt_lut, (int [4]) { 2, 1, 0, 3 }, 4*sizeof(int));
305  else
306  ff_vk_set_perm(avctx->sw_pix_fmt, pd.fmt_lut, 1);
307 
308  /* Start recording */
309  ff_vk_exec_start(&fv->s, exec);
310  fd->idx = exec->idx;
311 
312  RET(ff_vk_create_imageviews(&fv->s, exec, src_views, src,
314 
315  ff_vk_exec_add_dep_buf(&fv->s, exec, &slice_data_ref, 1, has_inter);
316  ff_vk_exec_add_dep_buf(&fv->s, exec, &fd->out_data_ref, 1, 1);
317 
318  RET(ff_vk_exec_add_dep_frame(&fv->s, exec, src,
319  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
320  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
321  if (fv->is_rgb)
322  RET(ff_vk_exec_add_dep_frame(&fv->s, exec, tmp,
323  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
324  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
325 
326  /* Run RCT search if needed */
327  if (fv->optimize_rct) {
328  /* Prepare the frame for reading */
329  ff_vk_frame_barrier(&fv->s, exec, src, img_bar, &nb_img_bar,
330  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
331  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
332  VK_ACCESS_SHADER_READ_BIT,
333  VK_IMAGE_LAYOUT_GENERAL,
334  VK_QUEUE_FAMILY_IGNORED);
335 
336  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
337  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
338  .pImageMemoryBarriers = img_bar,
339  .imageMemoryBarrierCount = nb_img_bar,
340  });
341  nb_img_bar = 0;
342 
343  RET(run_rct_search(avctx, exec,
344  src, src_views,
345  slice_data_buf, slice_data_size, &pd));
346 
347  /* Make sure the writes are visible to the setup shader */
348  ff_vk_buf_barrier(buf_bar[nb_buf_bar++], slice_data_buf,
349  COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
350  COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
351  0, slice_data_size*f->slice_count);
352  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
353  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
354  .pBufferMemoryBarriers = buf_bar,
355  .bufferMemoryBarrierCount = nb_buf_bar,
356  });
357  nb_buf_bar = 0;
358  }
359 
360  /* Setup shader */
361  ff_vk_shader_update_desc_buffer(&fv->s, exec, &fv->setup,
362  1, 0, 0,
363  slice_data_buf,
364  0, slice_data_size*f->slice_count,
365  VK_FORMAT_UNDEFINED);
366 
367  ff_vk_exec_bind_shader(&fv->s, exec, &fv->setup);
368  ff_vk_shader_update_push_const(&fv->s, exec, &fv->setup,
369  VK_SHADER_STAGE_COMPUTE_BIT,
370  0, sizeof(FFv1ShaderParams), &pd);
371 
372  vk->CmdDispatch(exec->buf, fv->ctx.num_h_slices, fv->ctx.num_v_slices, 1);
373 
374  /* Clean up temporary image if needed */
375  if (fv->is_rgb) {
376  AVVkFrame *vkf = (AVVkFrame *)tmp->data[0];
377  vkf->layout[0] = VK_IMAGE_LAYOUT_UNDEFINED;
378  vkf->access[0] = VK_ACCESS_2_NONE;
379 
380  RET(ff_vk_create_imageviews(&fv->s, exec, tmp_views,
381  tmp,
383 
384  ff_vk_frame_barrier(&fv->s, exec, tmp, img_bar, &nb_img_bar,
385  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
386  VK_PIPELINE_STAGE_2_CLEAR_BIT,
387  VK_ACCESS_2_TRANSFER_WRITE_BIT,
388  VK_IMAGE_LAYOUT_GENERAL,
389  VK_QUEUE_FAMILY_IGNORED);
390  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
391  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
392  .pImageMemoryBarriers = img_bar,
393  .imageMemoryBarrierCount = nb_img_bar,
394  });
395  nb_img_bar = 0;
396 
397  vk->CmdClearColorImage(exec->buf, vkf->img[0], VK_IMAGE_LAYOUT_GENERAL,
398  &((VkClearColorValue) { 0 }),
399  1, &((VkImageSubresourceRange) {
400  .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
401  .levelCount = 1,
402  .layerCount = 1,
403  }));
404  }
405 
406  /* Run reset shader */
407  if (f->key_frame || fv->force_pcm) {
408  ff_vk_shader_update_desc_buffer(&fv->s, exec, &fv->reset,
409  1, 0, 0,
410  slice_data_buf,
411  0, slice_data_size*f->slice_count,
412  VK_FORMAT_UNDEFINED);
413  ff_vk_shader_update_desc_buffer(&fv->s, exec, &fv->reset,
414  1, 1, 0,
415  slice_data_buf,
416  f->slice_count*256,
417  VK_WHOLE_SIZE,
418  VK_FORMAT_UNDEFINED);
419 
420  ff_vk_exec_bind_shader(&fv->s, exec, &fv->reset);
421  ff_vk_shader_update_push_const(&fv->s, exec, &fv->reset,
422  VK_SHADER_STAGE_COMPUTE_BIT,
423  0, sizeof(FFv1ShaderParams), &pd);
424 
425  vk->CmdDispatch(exec->buf, fv->ctx.num_h_slices, fv->ctx.num_v_slices,
426  f->plane_count);
427  }
428 
429  /* Sync between reset and encode shaders */
430  ff_vk_buf_barrier(buf_bar[nb_buf_bar++], slice_data_buf,
431  COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
432  COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
433  0, slice_data_size*f->slice_count);
434  if (f->key_frame || fv->force_pcm)
435  ff_vk_buf_barrier(buf_bar[nb_buf_bar++], slice_data_buf,
436  COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
437  COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
438  slice_data_size*f->slice_count, VK_WHOLE_SIZE);
439  else
440  ff_vk_buf_barrier(buf_bar[nb_buf_bar++], slice_data_buf,
441  COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
442  COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
443  slice_data_size*f->slice_count, VK_WHOLE_SIZE);
444 
445  ff_vk_frame_barrier(&fv->s, exec, src, img_bar, &nb_img_bar,
446  fv->optimize_rct ? VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT :
447  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
448  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
449  VK_ACCESS_SHADER_READ_BIT,
450  VK_IMAGE_LAYOUT_GENERAL,
451  VK_QUEUE_FAMILY_IGNORED);
452 
453  if (fv->is_rgb)
454  ff_vk_frame_barrier(&fv->s, exec, tmp, img_bar, &nb_img_bar,
455  VK_PIPELINE_STAGE_2_CLEAR_BIT,
456  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
457  VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
458  VK_IMAGE_LAYOUT_GENERAL,
459  VK_QUEUE_FAMILY_IGNORED);
460 
461  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
462  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
463  .pImageMemoryBarriers = img_bar,
464  .imageMemoryBarrierCount = nb_img_bar,
465  .pBufferMemoryBarriers = buf_bar,
466  .bufferMemoryBarrierCount = nb_buf_bar,
467  });
468  nb_img_bar = 0;
469  nb_buf_bar = 0;
470 
471  /* Main encode shader */
472  ff_vk_shader_update_desc_buffer(&fv->s, exec, &fv->enc,
473  1, 0, 0,
474  slice_data_buf,
475  0, slice_data_size*f->slice_count,
476  VK_FORMAT_UNDEFINED);
478  &fv->enc, 1, 1, 0,
479  &fv->results_buf,
480  fd->idx*f->max_slice_count*sizeof(uint32_t),
481  f->slice_count*sizeof(uint32_t),
482  VK_FORMAT_UNDEFINED);
483  ff_vk_shader_update_desc_buffer(&fv->s, exec, &fv->enc,
484  1, 2, 0,
485  slice_data_buf,
486  f->slice_count*256,
487  VK_WHOLE_SIZE,
488  VK_FORMAT_UNDEFINED);
489  ff_vk_shader_update_img_array(&fv->s, exec, &fv->enc,
490  src, src_views,
491  1, 3,
492  VK_IMAGE_LAYOUT_GENERAL,
493  VK_NULL_HANDLE);
494  if (fv->is_rgb)
495  ff_vk_shader_update_img_array(&fv->s, exec, &fv->enc,
496  tmp, tmp_views,
497  1, 4,
498  VK_IMAGE_LAYOUT_GENERAL,
499  VK_NULL_HANDLE);
500 
501  ff_vk_exec_bind_shader(&fv->s, exec, &fv->enc);
502  ff_vk_shader_update_push_const(&fv->s, exec, &fv->enc,
503  VK_SHADER_STAGE_COMPUTE_BIT,
504  0, sizeof(FFv1ShaderParams), &pd);
505  vk->CmdDispatch(exec->buf, fv->ctx.num_h_slices, fv->ctx.num_v_slices, 1);
506 
507  /* Submit */
508  err = ff_vk_exec_submit(&fv->s, exec);
509  if (err < 0)
510  return err;
511 
512  f->picture_number++;
513 
514  /* This, if needed, was referenced by the execution context
515  * as it was declared as a dependency. */
516  av_frame_free(&tmp);
517  return 0;
518 
519 fail:
520  av_frame_free(&tmp);
521  ff_vk_exec_discard_deps(&fv->s, exec);
522 
523  return err;
524 }
525 
526 static int transfer_slices(AVCodecContext *avctx,
527  VkBufferCopy *buf_regions, int nb_regions,
529  uint8_t *dst, AVBufferRef *dst_ref)
530 {
531  int err;
532  VulkanEncodeFFv1Context *fv = avctx->priv_data;
533  FFVulkanFunctions *vk = &fv->s.vkfn;
534  FFVkExecContext *exec;
535 
536  FFVkBuffer *out_data_buf = (FFVkBuffer *)fd->out_data_ref->data;
537 
538  AVBufferRef *mapped_ref;
539  FFVkBuffer *mapped_buf;
540 
541  VkBufferMemoryBarrier2 buf_bar[8];
542  int nb_buf_bar = 0;
543 
544  err = ff_vk_host_map_buffer(&fv->s, &mapped_ref, dst, dst_ref,
545  VK_BUFFER_USAGE_TRANSFER_DST_BIT);
546  if (err < 0)
547  return err;
548 
549  mapped_buf = (FFVkBuffer *)mapped_ref->data;
550 
551  /* Transfer the slices */
552  exec = ff_vk_exec_get(&fv->s, &fv->transfer_exec_pool);
553  ff_vk_exec_start(&fv->s, exec);
554 
555  ff_vk_exec_add_dep_buf(&fv->s, exec, &fd->out_data_ref, 1, 0);
556  fd->out_data_ref = NULL; /* Ownership passed */
557 
558  ff_vk_exec_add_dep_buf(&fv->s, exec, &mapped_ref, 1, 0);
559  mapped_ref = NULL; /* Ownership passed */
560 
561  /* Ensure the output buffer is finished */
562  ff_vk_buf_barrier(buf_bar[nb_buf_bar++], out_data_buf,
563  COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
564  TRANSFER_BIT, TRANSFER_READ_BIT, NONE_KHR,
565  0, VK_WHOLE_SIZE);
566  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
567  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
568  .pBufferMemoryBarriers = buf_bar,
569  .bufferMemoryBarrierCount = nb_buf_bar,
570  });
571  nb_buf_bar = 0;
572 
573  for (int i = 0; i < nb_regions; i++)
574  buf_regions[i].dstOffset += mapped_buf->virtual_offset;
575 
576  vk->CmdCopyBuffer(exec->buf,
577  out_data_buf->buf, mapped_buf->buf,
578  nb_regions, buf_regions);
579 
580  /* Submit */
581  err = ff_vk_exec_submit(&fv->s, exec);
582  if (err < 0)
583  return err;
584 
585  /* We need the encoded data immediately */
586  ff_vk_exec_wait(&fv->s, exec);
587 
588  return 0;
589 }
590 
591 static int get_packet(AVCodecContext *avctx, FFVkExecContext *exec,
592  AVPacket *pkt)
593 {
594  int err;
595  VulkanEncodeFFv1Context *fv = avctx->priv_data;
596  FFV1Context *f = &fv->ctx;
597  FFVulkanFunctions *vk = &fv->s.vkfn;
598  VulkanEncodeFFv1FrameData *fd = exec->opaque;
599 
600  FFVkBuffer *out_data_buf = (FFVkBuffer *)fd->out_data_ref->data;
601  uint32_t slice_size_max = out_data_buf->size / f->slice_count;
602 
603  /* Make sure encoding's done */
604  ff_vk_exec_wait(&fv->s, exec);
605 
606  /* Invalidate slice/output data if needed */
607  uint32_t rb_off = fd->idx*f->max_slice_count*sizeof(uint32_t);
608  if (!(fv->results_buf.flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
609  VkMappedMemoryRange invalidate_data = {
610  .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
611  .memory = fv->results_buf.mem,
612  .offset = rb_off,
613  .size = f->slice_count*sizeof(uint32_t),
614  };
615  vk->InvalidateMappedMemoryRanges(fv->s.hwctx->act_dev,
616  1, &invalidate_data);
617  }
618 
619  /* Calculate final size */
620  pkt->size = 0;
621  uint8_t *rb = fv->results_buf.mapped_mem + rb_off;
622  for (int i = 0; i < f->slice_count; i++) {
623  uint32_t sl_len = AV_RN32(rb + i*4);
624  av_log(avctx, AV_LOG_DEBUG, "Slice %i size = %u\n", i, sl_len);
625 
626  fv->buf_regions[i] = (VkBufferCopy) {
627  .srcOffset = i*slice_size_max,
628  .dstOffset = pkt->size,
629  .size = sl_len,
630  };
631  pkt->size += sl_len;
632  }
633  av_log(avctx, AV_LOG_VERBOSE, "Encoded data: %iMiB\n", pkt->size / (1024*1024));
634 
635  /* Allocate packet */
636  if ((err = ff_get_encode_buffer(avctx, pkt, pkt->size, 0)) < 0)
637  return err;
638 
639  pkt->pts = fd->pts;
640  pkt->dts = fd->pts;
641  pkt->duration = fd->duration;
643 
644  if (avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE) {
645  pkt->opaque = fd->frame_opaque;
647  fd->frame_opaque_ref = NULL;
648  }
649 
650  /* Try using host mapped memory transfers first */
652  err = transfer_slices(avctx, fv->buf_regions, f->slice_count, fd,
653  pkt->data, pkt->buf);
654  if (err >= 0)
655  return err;
656  }
657 
658  /* Invalidate slice/output data if needed */
659  if (!(out_data_buf->flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
660  VkMappedMemoryRange invalidate_data = {
661  .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
662  .memory = out_data_buf->mem,
663  .offset = 0,
664  .size = VK_WHOLE_SIZE,
665  };
666  vk->InvalidateMappedMemoryRanges(fv->s.hwctx->act_dev,
667  1, &invalidate_data);
668  }
669 
670  /* Copy each slice */
671  for (int i = 0; i < f->slice_count; i++) {
672  VkBufferCopy *region = &fv->buf_regions[i];
673  memcpy(pkt->data + region->dstOffset,
674  out_data_buf->mapped_mem + region->srcOffset,
675  region->size);
676  }
677 
679 
680  return 0;
681 }
682 
684  AVPacket *pkt)
685 {
686  int err;
687  VulkanEncodeFFv1Context *fv = avctx->priv_data;
689  FFVkExecContext *exec;
690  AVFrame *frame;
691 
692  while (1) {
693  /* Roll an execution context */
694  exec = ff_vk_exec_get(&fv->s, &fv->exec_pool);
695 
696  /* If it had a frame, immediately output it */
697  if (exec->had_submission) {
698  exec->had_submission = 0;
699  fv->in_flight--;
700  return get_packet(avctx, exec, pkt);
701  }
702 
703  /* Get next frame to encode */
704  frame = fv->frame;
705  err = ff_encode_get_frame(avctx, frame);
706  if (err < 0 && err != AVERROR_EOF) {
707  return err;
708  } else if (err == AVERROR_EOF) {
709  if (!fv->in_flight)
710  return err;
711  continue;
712  }
713 
714  /* Encode frame */
715  fd = exec->opaque;
716  fd->pts = frame->pts;
717  fd->duration = frame->duration;
718  if (avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE) {
719  fd->frame_opaque = frame->opaque;
720  fd->frame_opaque_ref = frame->opaque_ref;
721  frame->opaque_ref = NULL;
722  }
723 
724  err = vulkan_encode_ffv1_submit_frame(avctx, exec, frame);
726  if (err < 0)
727  return err;
728 
729  fv->in_flight++;
730  if (fv->in_flight < fv->async_depth)
731  return AVERROR(EAGAIN);
732  }
733 
734  return 0;
735 }
736 
737 static int init_indirect(AVCodecContext *avctx, enum AVPixelFormat sw_format)
738 {
739  int err;
740  VulkanEncodeFFv1Context *fv = avctx->priv_data;
741  FFV1Context *f = &fv->ctx;
742  AVHWFramesContext *frames_ctx;
743  AVVulkanFramesContext *vk_frames;
744 
746  if (!fv->intermediate_frames_ref)
747  return AVERROR(ENOMEM);
748 
749  frames_ctx = (AVHWFramesContext *)fv->intermediate_frames_ref->data;
750  frames_ctx->format = AV_PIX_FMT_VULKAN;
751  frames_ctx->sw_format = sw_format;
752  frames_ctx->width = fv->s.frames->width;
753  frames_ctx->height = f->num_v_slices*RGB_LINECACHE;
754 
755  vk_frames = frames_ctx->hwctx;
756  vk_frames->tiling = VK_IMAGE_TILING_OPTIMAL;
757  vk_frames->usage = VK_IMAGE_USAGE_STORAGE_BIT |
758  VK_IMAGE_USAGE_TRANSFER_DST_BIT;
759  vk_frames->img_flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
760 
762  if (err < 0) {
763  av_log(avctx, AV_LOG_ERROR, "Unable to initialize frame pool with format %s: %s\n",
764  av_get_pix_fmt_name(sw_format), av_err2str(err));
766  return err;
767  }
768 
769  return 0;
770 }
771 
772 static int init_rct_search_shader(AVCodecContext *avctx, VkSpecializationInfo *sl)
773 {
774  int err;
775  VulkanEncodeFFv1Context *fv = avctx->priv_data;
776  FFVulkanShader *shd = &fv->rct_search;
777 
778  ff_vk_shader_load(shd, VK_SHADER_STAGE_COMPUTE_BIT, sl,
779  (uint32_t []) { 32, 32, 1 }, 0);
780 
782  VK_SHADER_STAGE_COMPUTE_BIT);
783 
784  const FFVulkanDescriptorSetBinding desc_set_const[] = {
785  { /* rangecoder_buf */
786  .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
787  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
788  },
789  };
790  ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set_const, 1, 1, 0);
791 
792  const FFVulkanDescriptorSetBinding desc_set[] = {
793  { /* slice_data_buf */
794  .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
795  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
796  },
797  { /* src */
798  .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
799  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
800  .elems = av_pix_fmt_count_planes(fv->s.frames->sw_format),
801  },
802  };
803  ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set, 2, 0, 0);
804 
805  RET(ff_vk_shader_link(&fv->s, shd,
808 
809  RET(ff_vk_shader_register_exec(&fv->s, &fv->exec_pool, shd));
810 
811 fail:
812  return err;
813 }
814 
815 static int init_setup_shader(AVCodecContext *avctx, VkSpecializationInfo *sl)
816 {
817  int err;
818  VulkanEncodeFFv1Context *fv = avctx->priv_data;
819  FFVulkanShader *shd = &fv->setup;
820 
821  ff_vk_shader_load(shd, VK_SHADER_STAGE_COMPUTE_BIT, sl,
822  (uint32_t []) { 1, 1, 1 }, 0);
823 
825  VK_SHADER_STAGE_COMPUTE_BIT);
826 
827  const FFVulkanDescriptorSetBinding desc_set_const[] = {
828  { /* rangecoder_buf */
829  .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
830  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
831  },
832  };
833  ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set_const, 1, 1, 0);
834 
835  const FFVulkanDescriptorSetBinding desc_set[] = {
836  { /* slice_data_buf */
837  .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
838  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
839  },
840  };
841  ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set, 1, 0, 0);
842 
843  RET(ff_vk_shader_link(&fv->s, shd,
846 
847  RET(ff_vk_shader_register_exec(&fv->s, &fv->exec_pool, shd));
848 
849 fail:
850  return err;
851 }
852 
853 static int init_reset_shader(AVCodecContext *avctx, VkSpecializationInfo *sl)
854 {
855  int err;
856  VulkanEncodeFFv1Context *fv = avctx->priv_data;
857  FFVulkanShader *shd = &fv->reset;
858 
859  int wg_dim = FFMIN(fv->s.props.properties.limits.maxComputeWorkGroupSize[0], 1024);
860 
861  ff_vk_shader_load(shd, VK_SHADER_STAGE_COMPUTE_BIT, sl,
862  (uint32_t []) { wg_dim, 1, 1 }, 0);
863 
865  VK_SHADER_STAGE_COMPUTE_BIT);
866 
867  const FFVulkanDescriptorSetBinding desc_set_const[] = {
868  { /* rangecoder_buf */
869  .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
870  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
871  },
872  };
873  ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set_const, 1, 1, 0);
874 
875  const FFVulkanDescriptorSetBinding desc_set[] = {
876  { /* slice_data_buf */
877  .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
878  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
879  },
880  { /* slice_state_buf */
881  .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
882  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
883  },
884  };
885  ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set, 2, 0, 0);
886 
887  if (fv->ctx.ac == AC_GOLOMB_RICE)
888  RET(ff_vk_shader_link(&fv->s, shd,
891  else
892  RET(ff_vk_shader_link(&fv->s, shd,
895 
896  RET(ff_vk_shader_register_exec(&fv->s, &fv->exec_pool, shd));
897 
898 fail:
899  return err;
900 }
901 
902 static int init_encode_shader(AVCodecContext *avctx, VkSpecializationInfo *sl)
903 {
904  int err;
905  VulkanEncodeFFv1Context *fv = avctx->priv_data;
906  FFVulkanShader *shd = &fv->enc;
907 
908  uint32_t wg_x = fv->ctx.ac != AC_GOLOMB_RICE ? CONTEXT_SIZE : 1;
909  ff_vk_shader_load(shd, VK_SHADER_STAGE_COMPUTE_BIT, sl,
910  (uint32_t []) { wg_x, 1, 1 }, 0);
911 
913  VK_SHADER_STAGE_COMPUTE_BIT);
914 
915  const FFVulkanDescriptorSetBinding desc_set_const[] = {
916  { /* rangecoder_buf */
917  .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
918  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
919  },
920  { /* quant_buf */
921  .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
922  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
923  },
924  { /* crc_ieee_buf */
925  .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
926  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
927  },
928  };
929  ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set_const, 3, 1, 0);
930 
931  const FFVulkanDescriptorSetBinding desc_set[] = {
932  { /* slice_data_buf */
933  .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
934  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
935  },
936  { /* slice_results_buf */
937  .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
938  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
939  },
940  { /* slice_state_buf */
941  .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
942  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
943  },
944  { /* src */
945  .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
946  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
947  .elems = av_pix_fmt_count_planes(fv->s.frames->sw_format),
948  },
949  { /* tmp */
950  .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
951  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
952  },
953  };
954  ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set, 4 + fv->is_rgb, 0, 0);
955 
956  if (fv->ctx.ac == AC_GOLOMB_RICE) {
957  if (fv->is_rgb)
958  ff_vk_shader_link(&fv->s, shd,
961  else
962  ff_vk_shader_link(&fv->s, shd,
965  } else {
966  if (fv->is_rgb)
967  ff_vk_shader_link(&fv->s, shd,
970  else
971  ff_vk_shader_link(&fv->s, shd,
973  ff_ffv1_enc_comp_spv_len, "main");
974  }
975 
976  RET(ff_vk_shader_register_exec(&fv->s, &fv->exec_pool, shd));
977 
978 fail:
979  return err;
980 }
981 
983 {
984  int err;
985  size_t maxsize, max_heap_size, max_host_size;
986  VulkanEncodeFFv1Context *fv = avctx->priv_data;
987  FFV1Context *f = &fv->ctx;
988 
989  if ((err = ff_ffv1_common_init(avctx, f)) < 0)
990  return err;
991 
992  if (f->ac == 1)
993  f->ac = AC_RANGE_CUSTOM_TAB;
994 
995  err = ff_ffv1_encode_setup_plane_info(avctx, avctx->sw_pix_fmt);
996  if (err < 0)
997  return err;
998 
999  /* Target version 3 by default */
1000  f->version = 3;
1001 
1002  err = ff_ffv1_encode_init(avctx);
1003  if (err < 0)
1004  return err;
1005 
1006  /* Rice coding did not support high bit depths */
1007  if (f->bits_per_raw_sample > (f->version > 3 ? 16 : 8)) {
1008  if (f->ac == AC_GOLOMB_RICE) {
1009  av_log(avctx, AV_LOG_WARNING, "bits_per_raw_sample > 8, "
1010  "forcing range coder\n");
1011  f->ac = AC_RANGE_CUSTOM_TAB;
1012  }
1013  }
1014 
1015  if (f->version < 4 && avctx->gop_size > 1) {
1016  av_log(avctx, AV_LOG_ERROR, "Using inter frames requires version 4 (-level 4)\n");
1017  return AVERROR_INVALIDDATA;
1018  }
1019 
1020  if (f->version == 4 && avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
1021  av_log(avctx, AV_LOG_ERROR, "Version 4 is experimental and requires -strict -2\n");
1022  return AVERROR_INVALIDDATA;
1023  }
1024 
1025  /* We target version 4.3 */
1026  if (f->version == 4 && f->micro_version > 4)
1027  f->micro_version = 3;
1028 
1029  f->num_h_slices = fv->num_h_slices;
1030  f->num_v_slices = fv->num_v_slices;
1031 
1032  if (f->num_h_slices <= 0 && f->num_v_slices <= 0) {
1033  if (avctx->slices) {
1034  err = ff_ffv1_encode_determine_slices(avctx);
1035  if (err < 0)
1036  return err;
1037  } else {
1038  f->num_h_slices = 32;
1039  f->num_v_slices = 32;
1040  }
1041  } else if (f->num_h_slices && f->num_v_slices <= 0) {
1042  f->num_v_slices = MAX_SLICES / f->num_h_slices;
1043  } else if (f->num_v_slices && f->num_h_slices <= 0) {
1044  f->num_h_slices = MAX_SLICES / f->num_v_slices;
1045  }
1046 
1047  f->num_h_slices = FFMIN(f->num_h_slices, avctx->width);
1048  f->num_v_slices = FFMIN(f->num_v_slices, avctx->height);
1049 
1050  if (f->num_h_slices * f->num_v_slices > MAX_SLICES) {
1051  av_log(avctx, AV_LOG_ERROR, "Too many slices (%i), maximum supported "
1052  "by the standard is %i\n",
1053  f->num_h_slices * f->num_v_slices, MAX_SLICES);
1054  return AVERROR_PATCHWELCOME;
1055  }
1056 
1057  f->max_slice_count = f->num_h_slices * f->num_v_slices;
1058 
1059  if ((err = ff_ffv1_write_extradata(avctx)) < 0)
1060  return err;
1061 
1062  if (f->version < 4) {
1063  if (((f->chroma_h_shift > 0) && (avctx->width % (64 << f->chroma_h_shift))) ||
1064  ((f->chroma_v_shift > 0) && (avctx->height % (64 << f->chroma_v_shift)))) {
1065  av_log(avctx, AV_LOG_ERROR, "Encoding frames with subsampling and unaligned "
1066  "dimensions is only supported in version 4 (-level 4)\n");
1067  return AVERROR_PATCHWELCOME;
1068  }
1069  }
1070 
1071  if (fv->force_pcm) {
1072  if (f->version < 4) {
1073  av_log(avctx, AV_LOG_ERROR, "PCM coding only supported by version 4 (-level 4)\n");
1074  return AVERROR_INVALIDDATA;
1075  } else if (f->ac == AC_GOLOMB_RICE) {
1076  av_log(avctx, AV_LOG_ERROR, "PCM coding requires range coding\n");
1077  return AVERROR_INVALIDDATA;
1078  }
1079  }
1080 
1081  /* Init Vulkan */
1082  err = ff_vk_init(&fv->s, avctx, NULL, avctx->hw_frames_ctx);
1083  if (err < 0)
1084  return err;
1085 
1086  fv->qf = ff_vk_qf_find(&fv->s, VK_QUEUE_COMPUTE_BIT, 0);
1087  if (!fv->qf) {
1088  av_log(avctx, AV_LOG_ERROR, "Device has no compute queues!\n");
1089  return err;
1090  }
1091 
1092  /* Try to measure VRAM size */
1093  max_heap_size = 0;
1094  max_host_size = 0;
1095  for (int i = 0; i < fv->s.mprops.memoryHeapCount; i++) {
1096  if (fv->s.mprops.memoryHeaps[i].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT)
1097  max_heap_size = FFMAX(fv->max_heap_size,
1098  fv->s.mprops.memoryHeaps[i].size);
1099  if (!(fv->s.mprops.memoryHeaps[i].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT))
1100  max_host_size = FFMAX(max_host_size,
1101  fv->s.mprops.memoryHeaps[i].size);
1102  }
1103  fv->max_heap_size = max_heap_size;
1104 
1105  maxsize = ff_ffv1_encode_buffer_size(avctx);
1106  if (maxsize > fv->s.props_11.maxMemoryAllocationSize) {
1107  av_log(avctx, AV_LOG_WARNING, "Encoding buffer size (%zu) larger "
1108  "than maximum device allocation (%zu), clipping\n",
1109  maxsize, fv->s.props_11.maxMemoryAllocationSize);
1110  maxsize = fv->s.props_11.maxMemoryAllocationSize;
1111  }
1112 
1113  if (max_heap_size < maxsize) {
1114  av_log(avctx, AV_LOG_WARNING, "Encoding buffer (%zu) larger than VRAM (%zu), "
1115  "using host memory (slower)\n",
1116  maxsize, fv->max_heap_size);
1117 
1118  /* Keep 1/2th of RAM as headroom */
1119  max_heap_size = max_host_size - (max_host_size >> 1);
1120  } else {
1121  /* Keep 1/8th of VRAM as headroom */
1122  max_heap_size = max_heap_size - (max_heap_size >> 3);
1123  }
1124 
1125  av_log(avctx, AV_LOG_INFO, "Async buffers: %zuMiB per context, %zuMiB total, depth: %i\n",
1126  maxsize / (1024*1024),
1127  (fv->async_depth * maxsize) / (1024*1024),
1128  fv->async_depth);
1129 
1130  err = ff_vk_exec_pool_init(&fv->s, fv->qf, &fv->exec_pool,
1131  fv->async_depth,
1132  0, 0, 0, NULL);
1133  if (err < 0)
1134  return err;
1135 
1136  fv->transfer_qf = ff_vk_qf_find(&fv->s, VK_QUEUE_TRANSFER_BIT, 0);
1137  if (!fv->transfer_qf) {
1138  av_log(avctx, AV_LOG_ERROR, "Device has no transfer queues!\n");
1139  return err;
1140  }
1141 
1142  err = ff_vk_exec_pool_init(&fv->s, fv->transfer_qf, &fv->transfer_exec_pool,
1143  1,
1144  0, 0, 0, NULL);
1145  if (err < 0)
1146  return err;
1147 
1148  /* Detect the special RGB coding mode */
1149  fv->is_rgb = !(f->colorspace == 0 && avctx->sw_pix_fmt != AV_PIX_FMT_YA8) &&
1150  !(avctx->sw_pix_fmt == AV_PIX_FMT_YA8);
1151 
1152  /* Init rct search shader */
1153  fv->optimize_rct = fv->is_rgb && f->version >= 4 &&
1154  !fv->force_pcm && fv->optimize_rct;
1155 
1156  /* Init shader specialization consts */
1157  SPEC_LIST_CREATE(sl, 18, 18*sizeof(uint32_t))
1158  SPEC_LIST_ADD(sl, 0, 32, RGB_LINECACHE);
1159  SPEC_LIST_ADD(sl, 1, 32, f->ec);
1160  ff_ffv1_vk_set_common_sl(avctx, f, sl, fv->s.frames->sw_format);
1161  SPEC_LIST_ADD(sl, 15, 32, fv->force_pcm);
1162  SPEC_LIST_ADD(sl, 16, 32, fv->optimize_rct);
1163  SPEC_LIST_ADD(sl, 17, 32, f->context_model);
1164 
1165  if (fv->optimize_rct) {
1166  err = init_rct_search_shader(avctx, sl);
1167  if (err < 0)
1168  return err;
1169  }
1170 
1171  /* Init setup shader */
1172  err = init_setup_shader(avctx, sl);
1173  if (err < 0)
1174  return err;
1175 
1176  /* Init reset shader */
1177  err = init_reset_shader(avctx, sl);
1178  if (err < 0)
1179  return err;
1180 
1181  if (fv->is_rgb)
1182  RET(init_indirect(avctx, fv->ctx.use32bit ?
1184 
1185  /* Encode shader */
1186  err = init_encode_shader(avctx, sl);
1187  if (err < 0)
1188  return err;
1189 
1190  /* Constant data */
1191  err = ff_ffv1_vk_init_consts(&fv->s, &fv->consts_buf, f);
1192  if (err < 0)
1193  return err;
1194 
1195  /* Update setup global descriptors */
1197  &fv->setup, 0, 0, 0,
1198  &fv->consts_buf,
1199  256*sizeof(uint32_t), 512*sizeof(uint8_t),
1200  VK_FORMAT_UNDEFINED));
1201 
1202  /* Update encode global descriptors */
1204  &fv->enc, 0, 0, 0,
1205  &fv->consts_buf,
1206  256*sizeof(uint32_t), 512*sizeof(uint8_t),
1207  VK_FORMAT_UNDEFINED));
1209  &fv->enc, 0, 1, 0,
1210  &fv->consts_buf,
1211  256*sizeof(uint32_t) + 512*sizeof(uint8_t),
1212  VK_WHOLE_SIZE,
1213  VK_FORMAT_UNDEFINED));
1215  &fv->enc, 0, 2, 0,
1216  &fv->consts_buf,
1217  0, 256*sizeof(uint32_t),
1218  VK_FORMAT_UNDEFINED));
1219 
1220  /* Temporary frame */
1221  fv->frame = av_frame_alloc();
1222  if (!fv->frame)
1223  return AVERROR(ENOMEM);
1224 
1225  /* Async data pool */
1226  fv->async_depth = fv->exec_pool.pool_size;
1227  fv->exec_ctx_info = av_calloc(fv->async_depth, sizeof(*fv->exec_ctx_info));
1228  if (!fv->exec_ctx_info)
1229  return AVERROR(ENOMEM);
1230  for (int i = 0; i < fv->async_depth; i++)
1231  fv->exec_pool.contexts[i].opaque = &fv->exec_ctx_info[i];
1232 
1233  fv->buf_regions = av_malloc_array(f->max_slice_count, sizeof(*fv->buf_regions));
1234  if (!fv->buf_regions)
1235  return AVERROR(ENOMEM);
1236 
1237  /* Buffers */
1238  RET(ff_vk_create_buf(&fv->s, &fv->results_buf,
1239  fv->async_depth*f->max_slice_count*sizeof(uint32_t),
1240  NULL, NULL,
1241  VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
1242  VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
1243  VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
1244  RET(ff_vk_map_buffer(&fv->s, &fv->results_buf, NULL, 0));
1245 
1246 fail:
1247  return err;
1248 }
1249 
1251 {
1252  VulkanEncodeFFv1Context *fv = avctx->priv_data;
1253 
1254  ff_vk_exec_pool_free(&fv->s, &fv->exec_pool);
1256 
1257  ff_vk_shader_free(&fv->s, &fv->enc);
1258  ff_vk_shader_free(&fv->s, &fv->reset);
1259  ff_vk_shader_free(&fv->s, &fv->setup);
1260  ff_vk_shader_free(&fv->s, &fv->rct_search);
1261 
1262  if (fv->exec_ctx_info) {
1263  for (int i = 0; i < fv->async_depth; i++) {
1267  }
1268  }
1269  av_free(fv->exec_ctx_info);
1270 
1272 
1274 
1277 
1278  ff_vk_free_buf(&fv->s, &fv->results_buf);
1279 
1280  ff_vk_free_buf(&fv->s, &fv->consts_buf);
1281 
1282  av_free(fv->buf_regions);
1283  av_frame_free(&fv->frame);
1284  ff_vk_uninit(&fv->s);
1285 
1286  return 0;
1287 }
1288 
1289 #define OFFSET(x) offsetof(VulkanEncodeFFv1Context, x)
1290 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1292  { "slicecrc", "Protect slices with CRCs", OFFSET(ctx.ec), AV_OPT_TYPE_INT,
1293  { .i64 = -1 }, -1, 2, VE },
1294  { "context", "Context model", OFFSET(ctx.context_model), AV_OPT_TYPE_INT,
1295  { .i64 = 0 }, 0, 1, VE },
1296  { "coder", "Coder type", OFFSET(ctx.ac), AV_OPT_TYPE_INT,
1297  { .i64 = AC_RANGE_CUSTOM_TAB }, -2, 2, VE, .unit = "coder" },
1298  { "rice", "Golomb rice", 0, AV_OPT_TYPE_CONST,
1299  { .i64 = AC_GOLOMB_RICE }, INT_MIN, INT_MAX, VE, .unit = "coder" },
1300  { "range_def", "Range with default table", 0, AV_OPT_TYPE_CONST,
1301  { .i64 = AC_RANGE_DEFAULT_TAB_FORCE }, INT_MIN, INT_MAX, VE, .unit = "coder" },
1302  { "range_tab", "Range with custom table", 0, AV_OPT_TYPE_CONST,
1303  { .i64 = AC_RANGE_CUSTOM_TAB }, INT_MIN, INT_MAX, VE, .unit = "coder" },
1304  { "qtable", "Quantization table", OFFSET(ctx.qtable), AV_OPT_TYPE_INT,
1305  { .i64 = -1 }, -1, 2, VE , .unit = "qtable"},
1306  { "default", NULL, 0, AV_OPT_TYPE_CONST,
1307  { .i64 = QTABLE_DEFAULT }, INT_MIN, INT_MAX, VE, .unit = "qtable" },
1308  { "8bit", NULL, 0, AV_OPT_TYPE_CONST,
1309  { .i64 = QTABLE_8BIT }, INT_MIN, INT_MAX, VE, .unit = "qtable" },
1310  { "greater8bit", NULL, 0, AV_OPT_TYPE_CONST,
1311  { .i64 = QTABLE_GT8BIT }, INT_MIN, INT_MAX, VE, .unit = "qtable" },
1312 
1313  { "slices_h", "Number of horizontal slices", OFFSET(num_h_slices), AV_OPT_TYPE_INT,
1314  { .i64 = -1 }, -1, MAX_SLICES, VE },
1315  { "slices_v", "Number of vertical slices", OFFSET(num_v_slices), AV_OPT_TYPE_INT,
1316  { .i64 = -1 }, -1, MAX_SLICES, VE },
1317 
1318  { "force_pcm", "Code all slices with no prediction", OFFSET(force_pcm), AV_OPT_TYPE_BOOL,
1319  { .i64 = 0 }, 0, 1, VE },
1320 
1321  { "rct_search", "Run a search for RCT parameters (level 4 only)", OFFSET(optimize_rct), AV_OPT_TYPE_BOOL,
1322  { .i64 = 1 }, 0, 1, VE },
1323 
1324  { "async_depth", "Internal parallelization depth", OFFSET(async_depth), AV_OPT_TYPE_INT,
1325  { .i64 = 1 }, 1, INT_MAX, VE },
1326 
1327  { NULL }
1328 };
1329 
1331  { "g", "1" },
1332  { NULL },
1333 };
1334 
1336  .class_name = "ffv1_vulkan",
1337  .item_name = av_default_item_name,
1338  .option = vulkan_encode_ffv1_options,
1339  .version = LIBAVUTIL_VERSION_INT,
1340 };
1341 
1343  HW_CONFIG_ENCODER_FRAMES(VULKAN, VULKAN),
1344  NULL,
1345 };
1346 
1348  .p.name = "ffv1_vulkan",
1349  CODEC_LONG_NAME("FFmpeg video codec #1 (Vulkan)"),
1350  .p.type = AVMEDIA_TYPE_VIDEO,
1351  .p.id = AV_CODEC_ID_FFV1,
1352  .priv_data_size = sizeof(VulkanEncodeFFv1Context),
1355  .close = &vulkan_encode_ffv1_close,
1356  .p.priv_class = &vulkan_encode_ffv1_class,
1357  .p.capabilities = AV_CODEC_CAP_DELAY |
1363  .defaults = vulkan_encode_ffv1_defaults,
1365  .hw_configs = vulkan_encode_ffv1_hw_configs,
1366  .p.wrapper_name = "vulkan",
1367 };
hwconfig.h
CODEC_PIXFMTS
#define CODEC_PIXFMTS(...)
Definition: codec_internal.h:392
ff_vk_create_buf
int ff_vk_create_buf(FFVulkanContext *s, FFVkBuffer *buf, size_t size, void *pNext, void *alloc_pNext, VkBufferUsageFlags usage, VkMemoryPropertyFlagBits flags)
Definition: vulkan.c:1020
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
ff_ffv1_enc_golomb_comp_spv_len
const unsigned int ff_ffv1_enc_golomb_comp_spv_len
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
ff_ffv1_encode_determine_slices
int ff_ffv1_encode_determine_slices(AVCodecContext *avctx)
Definition: ffv1enc.c:566
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: codec_internal.h:42
ff_ffv1_enc_comp_spv_len
const unsigned int ff_ffv1_enc_comp_spv_len
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
opt.h
AV_PIX_FMT_YA8
@ AV_PIX_FMT_YA8
8 bits gray, 8 bits alpha
Definition: pixfmt.h:140
FFVulkanContext::props_11
VkPhysicalDeviceVulkan11Properties props_11
Definition: vulkan.h:319
ff_vk_shader_free
void ff_vk_shader_free(FFVulkanContext *s, FFVulkanShader *shd)
Free a shader.
Definition: vulkan.c:2789
AVBufferPool
The buffer pool.
Definition: buffer_internal.h:88
FFVulkanContext::device_ref
AVBufferRef * device_ref
Definition: vulkan.h:347
FFVkExecPool::contexts
FFVkExecContext * contexts
Definition: vulkan.h:291
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:90
AV_CODEC_CAP_HARDWARE
#define AV_CODEC_CAP_HARDWARE
Codec is backed by a hardware implementation.
Definition: codec.h:130
RET
#define RET(x)
Definition: vulkan.h:68
ff_vk_exec_pool_init
int ff_vk_exec_pool_init(FFVulkanContext *s, AVVulkanDeviceQueueFamily *qf, FFVkExecPool *pool, int nb_contexts, int nb_queries, VkQueryType query_type, int query_64bit, const void *query_create_pnext)
Allocates/frees an execution pool.
Definition: vulkan.c:355
FFv1ShaderParams::fmt_lut
int fmt_lut[4]
Definition: ffv1_vulkan.h:39
VulkanEncodeFFv1Context::is_rgb
int is_rgb
Definition: ffv1enc_vulkan.c:99
AVHWFramesContext::format
enum AVPixelFormat format
The pixel format identifying the underlying HW surface type.
Definition: hwcontext.h:200
FF_CODEC_CAP_EOF_FLUSH
#define FF_CODEC_CAP_EOF_FLUSH
The encoder has AV_CODEC_CAP_DELAY set, but does not actually have delay - it only wants to be flushe...
Definition: codec_internal.h:89
int64_t
long long int64_t
Definition: coverity.c:34
VulkanEncodeFFv1Context::in_flight
int in_flight
Definition: ffv1enc_vulkan.c:69
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:64
av_hwframe_ctx_init
int av_hwframe_ctx_init(AVBufferRef *ref)
Finalize the context before use.
Definition: hwcontext.c:337
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:427
ff_vk_map_buffer
static int ff_vk_map_buffer(FFVulkanContext *s, FFVkBuffer *buf, uint8_t **mem, int invalidate)
Definition: vulkan.h:603
QTABLE_DEFAULT
@ QTABLE_DEFAULT
Definition: ffv1enc.h:29
VulkanEncodeFFv1Context::chunks
int chunks
Definition: ffv1enc_vulkan.c:101
av_hwframe_ctx_alloc
AVBufferRef * av_hwframe_ctx_alloc(AVBufferRef *device_ref_in)
Allocate an AVHWFramesContext tied to a given device context.
Definition: hwcontext.c:263
internal.h
AC_RANGE_DEFAULT_TAB_FORCE
#define AC_RANGE_DEFAULT_TAB_FORCE
Definition: ffv1.h:55
AVPacket::data
uint8_t * data
Definition: packet.h:588
AVOption
AVOption.
Definition: opt.h:429
encode.h
VulkanEncodeFFv1Context::rct_search
FFVulkanShader rct_search
Definition: ffv1enc_vulkan.c:74
ff_source_ffv1_vlc_comp
const char * ff_source_ffv1_vlc_comp
AV_PIX_FMT_RGBA128
#define AV_PIX_FMT_RGBA128
Definition: pixfmt.h:630
ff_ffv1_write_extradata
av_cold int ff_ffv1_write_extradata(AVCodecContext *avctx)
Definition: ffv1enc.c:447
FFCodec
Definition: codec_internal.h:127
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
FFV1Context::num_h_slices
int num_h_slices
Definition: ffv1.h:175
FFVkBuffer::address
VkDeviceAddress address
Definition: vulkan.h:130
AVPacket::duration
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition: packet.h:606
ff_vk_init
int ff_vk_init(FFVulkanContext *s, void *log_parent, AVBufferRef *device_ref, AVBufferRef *frames_ref)
Initializes the AVClass, in case this context is not used as the main user's context.
Definition: vulkan.c:2827
ff_vk_exec_get
FFVkExecContext * ff_vk_exec_get(FFVulkanContext *s, FFVkExecPool *pool)
Retrieve an execution pool.
Definition: vulkan.c:546
FF_VK_REP_NATIVE
@ FF_VK_REP_NATIVE
Definition: vulkan.h:449
ff_vk_uninit
void ff_vk_uninit(FFVulkanContext *s)
Frees main context.
Definition: vulkan.c:2815
FF_COMPLIANCE_EXPERIMENTAL
#define FF_COMPLIANCE_EXPERIMENTAL
Allow nonstandardized experimental things.
Definition: defs.h:62
AVFrame::flags
int flags
Frame flags, a combination of AV_FRAME_FLAGS.
Definition: frame.h:671
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
SPEC_LIST_ADD
#define SPEC_LIST_ADD(name, idx, val_bits, val)
Definition: vulkan.h:86
AVHWFramesContext::width
int width
The allocated dimensions of the frames in this pool.
Definition: hwcontext.h:220
AC_RANGE_CUSTOM_TAB
#define AC_RANGE_CUSTOM_TAB
Definition: ffv1.h:54
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:643
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:778
FFVkBuffer::buf
VkBuffer buf
Definition: vulkan.h:126
VulkanEncodeFFv1Context::results_buf
FFVkBuffer results_buf
Definition: ffv1enc_vulkan.c:82
AV_FRAME_FLAG_TOP_FIELD_FIRST
#define AV_FRAME_FLAG_TOP_FIELD_FIRST
A flag to mark frames where the top field is displayed first if the content is interlaced.
Definition: frame.h:655
av_pix_fmt_count_planes
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3496
AV_CODEC_FLAG_COPY_OPAQUE
#define AV_CODEC_FLAG_COPY_OPAQUE
Definition: avcodec.h:279
vulkan_encode_ffv1_class
static const AVClass vulkan_encode_ffv1_class
Definition: ffv1enc_vulkan.c:1335
FFCodecDefault
Definition: codec_internal.h:96
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
AV_PIX_FMT_GBRP14
#define AV_PIX_FMT_GBRP14
Definition: pixfmt.h:560
AVVkFrame::img
VkImage img[AV_NUM_DATA_POINTERS]
Vulkan images to which the memory is bound to.
Definition: hwcontext_vulkan.h:307
VulkanEncodeFFv1FrameData::key_frame
int key_frame
Definition: ffv1enc_vulkan.c:52
AVPacket::opaque_ref
AVBufferRef * opaque_ref
AVBufferRef for free use by the API user.
Definition: packet.h:624
VulkanEncodeFFv1Context::num_v_slices
int num_v_slices
Definition: ffv1enc_vulkan.c:95
fail
#define fail()
Definition: checkasm.h:218
AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_GBRP10
Definition: pixfmt.h:558
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:2717
AVVulkanFramesContext
Allocated as AVHWFramesContext.hwctx, used to set pool-specific options.
Definition: hwcontext_vulkan.h:212
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:2029
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:2582
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:496
VulkanEncodeFFv1Context::ppi
int ppi
Definition: ffv1enc_vulkan.c:100
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:1381
MAX_SLICES
#define MAX_SLICES
Definition: d3d12va_hevc.c:33
CONTEXT_SIZE
#define CONTEXT_SIZE
Definition: ffv1.h:45
AV_CODEC_CAP_ENCODER_FLUSH
#define AV_CODEC_CAP_ENCODER_FLUSH
This encoder can be flushed using avcodec_flush_buffers().
Definition: codec.h:151
ff_ffv1_enc_setup_comp_spv_len
const unsigned int ff_ffv1_enc_setup_comp_spv_len
VulkanEncodeFFv1Context::keyframe_slice_data_ref
AVBufferRef * keyframe_slice_data_ref
Definition: ffv1enc_vulkan.c:86
VulkanEncodeFFv1FrameData::frame_opaque_ref
AVBufferRef * frame_opaque_ref
Definition: ffv1enc_vulkan.c:50
AVRational::num
int num
Numerator.
Definition: rational.h:59
ff_ffv1_vulkan_encoder
const FFCodec ff_ffv1_vulkan_encoder
Definition: ffv1enc_vulkan.c:1347
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:52
FFVulkanDescriptorSetBinding::type
VkDescriptorType type
Definition: vulkan.h:114
VulkanEncodeFFv1Context::s
FFVulkanContext s
Definition: ffv1enc_vulkan.c:60
VulkanEncodeFFv1FrameData
Definition: ffv1enc_vulkan.c:42
vulkan_encode_ffv1_hw_configs
const AVCodecHWConfigInternal *const vulkan_encode_ffv1_hw_configs[]
Definition: ffv1enc_vulkan.c:1342
get_packet
static int get_packet(AVCodecContext *avctx, FFVkExecContext *exec, AVPacket *pkt)
Definition: ffv1enc_vulkan.c:591
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
VulkanEncodeFFv1Context::exec_ctx_info
VulkanEncodeFFv1FrameData * exec_ctx_info
Definition: ffv1enc_vulkan.c:68
av_cold
#define av_cold
Definition: attributes.h:106
VulkanEncodeFFv1Context::setup
FFVulkanShader setup
Definition: ffv1enc_vulkan.c:73
AVHWFramesContext::height
int height
Definition: hwcontext.h:220
FFV1Context::use32bit
int use32bit
Definition: ffv1.h:158
ff_ffv1_enc_reset_comp_spv_data
const unsigned char ff_ffv1_enc_reset_comp_spv_data[]
ff_vk_exec_wait
void ff_vk_exec_wait(FFVulkanContext *s, FFVkExecContext *e)
Definition: vulkan.c:551
AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
Definition: codec.h:144
ff_vk_set_perm
void ff_vk_set_perm(enum AVPixelFormat pix_fmt, int lut[4], int inv)
Since storage images may not be swizzled, we have to do this in the shader itself.
Definition: vulkan.c:1561
VulkanEncodeFFv1Context::max_heap_size
size_t max_heap_size
Definition: ffv1enc_vulkan.c:71
FFVulkanContext::host_cached_flag
VkMemoryPropertyFlagBits host_cached_flag
Definition: vulkan.h:345
AVVulkanFramesContext::img_flags
VkImageCreateFlags img_flags
Flags to set during image creation.
Definition: hwcontext_vulkan.h:265
vulkan_encode_ffv1_receive_packet
static int vulkan_encode_ffv1_receive_packet(AVCodecContext *avctx, AVPacket *pkt)
Definition: ffv1enc_vulkan.c:683
ff_source_ffv1_common_comp
const char * ff_source_ffv1_common_comp
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
VulkanEncodeFFv1Context::transfer_qf
AVVulkanDeviceQueueFamily * transfer_qf
Definition: ffv1enc_vulkan.c:64
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:618
FFV1Context::ac
int ac
1=range coder <-> 0=golomb rice
Definition: ffv1.h:147
ff_ffv1_encode_setup_plane_info
av_cold int ff_ffv1_encode_setup_plane_info(AVCodecContext *avctx, enum AVPixelFormat pix_fmt)
Definition: ffv1enc.c:801
ff_vk_exec_pool_free
void ff_vk_exec_pool_free(FFVulkanContext *s, FFVkExecPool *pool)
Definition: vulkan.c:299
AVPacket::opaque
void * opaque
for some private data of the user
Definition: packet.h:613
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:332
tmp
static uint8_t tmp[40]
Definition: aes_ctr.c:52
ff_ffv1_enc_rct_search_comp_spv_len
const unsigned int ff_ffv1_enc_rct_search_comp_spv_len
FFv1ShaderParams::extend_lookup
uint32_t extend_lookup[8]
Definition: ffv1_vulkan.h:36
VulkanEncodeFFv1Context::frame
AVFrame * frame
Definition: ffv1enc_vulkan.c:58
AVPacket::buf
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
Definition: packet.h:571
ff_ffv1_vk_init_consts
int ff_ffv1_vk_init_consts(FFVulkanContext *s, FFVkBuffer *vkb, FFV1Context *f)
Definition: ffv1_vulkan.c:76
AV_PIX_FMT_RGBA64
#define AV_PIX_FMT_RGBA64
Definition: pixfmt.h:529
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
ff_ffv1_enc_rgb_comp_spv_len
const unsigned int ff_ffv1_enc_rgb_comp_spv_len
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
NULL
#define NULL
Definition: coverity.c:32
run_rct_search
static int run_rct_search(AVCodecContext *avctx, FFVkExecContext *exec, AVFrame *enc_in, VkImageView *enc_in_views, FFVkBuffer *slice_data_buf, uint32_t slice_data_size, FFv1ShaderParams *pd)
Definition: ffv1enc_vulkan.c:134
AVHWFramesContext::sw_format
enum AVPixelFormat sw_format
The pixel format identifying the actual data layout of the hardware frames.
Definition: hwcontext.h:213
AC_GOLOMB_RICE
#define AC_GOLOMB_RICE
Definition: ffv1.h:52
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
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
init_encode_shader
static int init_encode_shader(AVCodecContext *avctx, VkSpecializationInfo *sl)
Definition: ffv1enc_vulkan.c:902
FFV1Context::num_v_slices
int num_v_slices
Definition: ffv1.h:174
VulkanEncodeFFv1Context::force_pcm
int force_pcm
Definition: ffv1enc_vulkan.c:96
VulkanEncodeFFv1Context::consts_buf
FFVkBuffer consts_buf
Definition: ffv1enc_vulkan.c:79
VulkanEncodeFFv1FrameData::idx
int idx
Definition: ffv1enc_vulkan.c:53
FF_CODEC_RECEIVE_PACKET_CB
#define FF_CODEC_RECEIVE_PACKET_CB(func)
Definition: codec_internal.h:367
ff_ffv1_enc_rgb_comp_spv_data
const unsigned char ff_ffv1_enc_rgb_comp_spv_data[]
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:242
AV_RN32
#define AV_RN32(p)
Definition: intreadwrite.h:360
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_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:2355
FFVkExecContext::had_submission
int had_submission
Definition: vulkan.h:148
FFVkBuffer::size
size_t size
Definition: vulkan.h:129
AVVulkanFramesContext::usage
VkImageUsageFlagBits usage
Defines extra usage of output frames.
Definition: hwcontext_vulkan.h:232
SPEC_LIST_CREATE
#define SPEC_LIST_CREATE(name, max_length, max_size)
Definition: vulkan.h:76
transfer_slices
static int transfer_slices(AVCodecContext *avctx, VkBufferCopy *buf_regions, int nb_regions, VulkanEncodeFFv1FrameData *fd, uint8_t *dst, AVBufferRef *dst_ref)
Definition: ffv1enc_vulkan.c:526
ff_ffv1_enc_rgb_golomb_comp_spv_data
const unsigned char ff_ffv1_enc_rgb_golomb_comp_spv_data[]
ffv1_vulkan.h
VulkanEncodeFFv1Context::num_h_slices
int num_h_slices
Definition: ffv1enc_vulkan.c:94
FFVkBuffer::mapped_mem
uint8_t * mapped_mem
Definition: vulkan.h:134
FFVulkanContext
Definition: vulkan.h:312
VulkanEncodeFFv1FrameData::duration
int64_t duration
Definition: ffv1enc_vulkan.c:48
VulkanEncodeFFv1Context
Definition: ffv1enc_vulkan.c:56
AV_CODEC_ID_FFV1
@ AV_CODEC_ID_FFV1
Definition: codec_id.h:85
f
f
Definition: af_crystalizer.c:122
VulkanEncodeFFv1Context::slice_data_pool
AVBufferPool * slice_data_pool
Definition: ffv1enc_vulkan.c:85
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:551
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:550
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
VulkanEncodeFFv1Context::ctx
FFV1Context ctx
Definition: ffv1enc_vulkan.c:57
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:2756
AVPacket::size
int size
Definition: packet.h:589
FFVulkanDescriptorSetBinding
Definition: vulkan.h:112
VulkanEncodeFFv1FrameData::pts
int64_t pts
Definition: ffv1enc_vulkan.c:47
AVCodecContext::gop_size
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
Definition: avcodec.h:1013
codec_internal.h
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
AVVkFrame
Definition: hwcontext_vulkan.h:302
vulkan.h
av_err2str
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: error.h:122
QTABLE_GT8BIT
@ QTABLE_GT8BIT
Definition: ffv1enc.h:31
AV_NUM_DATA_POINTERS
#define AV_NUM_DATA_POINTERS
Definition: frame.h:428
init_indirect
static int init_indirect(AVCodecContext *avctx, enum AVPixelFormat sw_format)
Definition: ffv1enc_vulkan.c:737
FFVulkanShader
Definition: vulkan.h:225
VulkanEncodeFFv1Context::optimize_rct
int optimize_rct
Definition: ffv1enc_vulkan.c:97
AVCodecHWConfigInternal
Definition: hwconfig.h:25
QTABLE_8BIT
@ QTABLE_8BIT
Definition: ffv1enc.h:30
FFVkBuffer::flags
VkMemoryPropertyFlagBits flags
Definition: vulkan.h:128
ff_ffv1_enc_reset_comp_spv_len
const unsigned int ff_ffv1_enc_reset_comp_spv_len
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:587
ff_source_common_comp
const char * ff_source_common_comp
VulkanEncodeFFv1FrameData::out_data_ref
AVBufferRef * out_data_ref
Definition: ffv1enc_vulkan.c:44
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:2730
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:594
ff_ffv1_enc_rct_search_comp_spv_data
const unsigned char ff_ffv1_enc_rct_search_comp_spv_data[]
VulkanEncodeFFv1Context::enc
FFVulkanShader enc
Definition: ffv1enc_vulkan.c:76
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:221
ff_ffv1_enc_golomb_comp_spv_data
const unsigned char ff_ffv1_enc_golomb_comp_spv_data[]
ff_ffv1_vk_set_common_sl
void ff_ffv1_vk_set_common_sl(AVCodecContext *avctx, FFV1Context *f, VkSpecializationInfo *sl, enum AVPixelFormat sw_format)
Definition: ffv1_vulkan.c:24
VE
#define VE
Definition: ffv1enc_vulkan.c:1290
HW_CONFIG_ENCODER_FRAMES
#define HW_CONFIG_ENCODER_FRAMES(format, device_type_)
Definition: hwconfig.h:98
FF_VK_EXT_EXTERNAL_HOST_MEMORY
#define FF_VK_EXT_EXTERNAL_HOST_MEMORY
Definition: vulkan_functions.h:36
ff_source_ffv1_enc_comp
const char * ff_source_ffv1_enc_comp
ff_vk_exec_start
int ff_vk_exec_start(FFVulkanContext *s, FFVkExecContext *e)
Start/submit/wait an execution.
Definition: vulkan.c:558
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:581
ff_ffv1_enc_reset_golomb_comp_spv_data
const unsigned char ff_ffv1_enc_reset_golomb_comp_spv_data[]
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:32
AV_PIX_FMT_GBRP12
#define AV_PIX_FMT_GBRP12
Definition: pixfmt.h:559
ff_ffv1_common_init
av_cold int ff_ffv1_common_init(AVCodecContext *avctx, FFV1Context *s)
Definition: ffv1.c:36
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
ffv1.h
av_frame_unref
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:496
FFVkBuffer::mem
VkDeviceMemory mem
Definition: vulkan.h:127
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
vulkan_encode_ffv1_close
static av_cold int vulkan_encode_ffv1_close(AVCodecContext *avctx)
Definition: ffv1enc_vulkan.c:1250
FFVulkanContext::props
VkPhysicalDeviceProperties2 props
Definition: vulkan.h:318
FFVulkanContext::extensions
FFVulkanExtensions extensions
Definition: vulkan.h:317
ff_vk_free_buf
void ff_vk_free_buf(FFVulkanContext *s, FFVkBuffer *buf)
Definition: vulkan.c:1234
AVCodecContext::height
int height
Definition: avcodec.h:600
init_setup_shader
static int init_setup_shader(AVCodecContext *avctx, VkSpecializationInfo *sl)
Definition: ffv1enc_vulkan.c:815
AV_FRAME_FLAG_INTERLACED
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
Definition: frame.h:650
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
FFVulkanContext::mprops
VkPhysicalDeviceMemoryProperties mprops
Definition: vulkan.h:321
ff_vk_exec_bind_shader
void ff_vk_exec_bind_shader(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd)
Bind a shader.
Definition: vulkan.c:2766
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
avcodec.h
AVHWFramesContext
This struct describes a set or pool of "hardware" frames (i.e.
Definition: hwcontext.h:118
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:81
ff_ffv1_encode_buffer_size
size_t ff_ffv1_encode_buffer_size(AVCodecContext *avctx)
Definition: ffv1enc.c:1686
frame
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 it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:265
ff_vk_create_imageviews
int ff_vk_create_imageviews(FFVulkanContext *s, FFVkExecContext *e, VkImageView views[AV_NUM_DATA_POINTERS], AVFrame *f, enum FFVkShaderRepFormat rep_fmt)
Create an imageview and add it as a dependency to an execution.
Definition: vulkan.c:1946
FFVulkanContext::vkfn
FFVulkanFunctions vkfn
Definition: vulkan.h:316
AVHWFramesContext::hwctx
void * hwctx
The format-specific data, allocated and freed automatically along with this context.
Definition: hwcontext.h:153
AVCodecContext::strict_std_compliance
int strict_std_compliance
strictly follow the standard (MPEG-4, ...).
Definition: avcodec.h:1365
VulkanEncodeFFv1Context::exec_pool
FFVkExecPool exec_pool
Definition: ffv1enc_vulkan.c:62
FFVkExecContext::opaque
void * opaque
Definition: vulkan.h:162
FFVkExecPool
Definition: vulkan.h:290
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:1479
VulkanEncodeFFv1Context::intermediate_frames_ref
AVBufferRef * intermediate_frames_ref
Definition: ffv1enc_vulkan.c:92
VulkanEncodeFFv1FrameData::frame_opaque
void * frame_opaque
Definition: ffv1enc_vulkan.c:49
AVFrame::sample_aspect_ratio
AVRational sample_aspect_ratio
Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.
Definition: frame.h:524
ff_vk_qf_find
AVVulkanDeviceQueueFamily * ff_vk_qf_find(FFVulkanContext *s, VkQueueFlagBits dev_family, VkVideoCodecOperationFlagBitsKHR vid_ops)
Chooses an appropriate QF.
Definition: vulkan.c:286
vulkan_encode_ffv1_options
static const AVOption vulkan_encode_ffv1_options[]
Definition: ffv1enc_vulkan.c:1291
FFVkExecContext::buf
VkCommandBuffer buf
Definition: vulkan.h:156
AVCodecContext
main external API structure.
Definition: avcodec.h:439
ff_ffv1_enc_comp_spv_data
const unsigned char ff_ffv1_enc_comp_spv_data[]
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:2482
VulkanEncodeFFv1Context::transfer_exec_pool
FFVkExecPool transfer_exec_pool
Definition: ffv1enc_vulkan.c:65
init_reset_shader
static int init_reset_shader(AVCodecContext *avctx, VkSpecializationInfo *sl)
Definition: ffv1enc_vulkan.c:853
RGB_LINECACHE
#define RGB_LINECACHE
Definition: ffv1enc_vulkan.c:40
ff_get_encode_buffer
int ff_get_encode_buffer(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int flags)
Get a buffer for a packet.
Definition: encode.c:105
VulkanEncodeFFv1Context::reset
FFVulkanShader reset
Definition: ffv1enc_vulkan.c:75
AVRational::den
int den
Denominator.
Definition: rational.h:60
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
VulkanEncodeFFv1Context::async_depth
int async_depth
Definition: ffv1enc_vulkan.c:70
AV_CODEC_CAP_DELAY
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition: codec.h:76
ffv1enc.h
vulkan_encode_ffv1_submit_frame
static int vulkan_encode_ffv1_submit_frame(AVCodecContext *avctx, FFVkExecContext *exec, const AVFrame *pict)
Definition: ffv1enc_vulkan.c:165
AVVulkanFramesContext::tiling
VkImageTiling tiling
Controls the tiling of allocated frames.
Definition: hwcontext_vulkan.h:221
VulkanEncodeFFv1Context::qf
AVVulkanDeviceQueueFamily * qf
Definition: ffv1enc_vulkan.c:61
vulkan_encode_ffv1_defaults
static const FFCodecDefault vulkan_encode_ffv1_defaults[]
Definition: ffv1enc_vulkan.c:1330
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
FFVulkanContext::hwctx
AVVulkanDeviceContext * hwctx
Definition: vulkan.h:349
VulkanEncodeFFv1Context::buf_regions
VkBufferCopy * buf_regions
Definition: ffv1enc_vulkan.c:67
mem.h
ff_encode_get_frame
int ff_encode_get_frame(AVCodecContext *avctx, AVFrame *frame)
Called by encoders to get the next frame for encoding.
Definition: encode.c:204
AVVkFrame::layout
VkImageLayout layout[AV_NUM_DATA_POINTERS]
Definition: hwcontext_vulkan.h:332
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
ff_ffv1_encode_init
av_cold int ff_ffv1_encode_init(AVCodecContext *avctx)
Definition: ffv1enc.c:601
AVVulkanDeviceContext::act_dev
VkDevice act_dev
Active device.
Definition: hwcontext_vulkan.h:84
FFV1Context
Definition: ffv1.h:122
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
FFv1ShaderParams
Definition: ffv1_vulkan.h:33
ff_vk_exec_discard_deps
void ff_vk_exec_discard_deps(FFVulkanContext *s, FFVkExecContext *e)
Definition: vulkan.c:590
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
AVCodecContext::slices
int slices
Number of slices.
Definition: avcodec.h:1029
AVPacket
This structure stores compressed data.
Definition: packet.h:565
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:466
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition: opt.h:327
FFVkBuffer
Definition: vulkan.h:125
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:600
vulkan_encode_ffv1_init
static av_cold int vulkan_encode_ffv1_init(AVCodecContext *avctx)
Definition: ffv1enc_vulkan.c:982
FFv1ShaderParams::context_count
uint16_t context_count[8]
Definition: ffv1_vulkan.h:37
ff_ffv1_enc_reset_golomb_comp_spv_len
const unsigned int ff_ffv1_enc_reset_golomb_comp_spv_len
ff_vk_exec_submit
int ff_vk_exec_submit(FFVulkanContext *s, FFVkExecContext *e)
Definition: vulkan.c:903
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVVulkanDeviceQueueFamily
Definition: hwcontext_vulkan.h:33
ff_ffv1_enc_setup_comp_spv_data
const unsigned char ff_ffv1_enc_setup_comp_spv_data[]
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
FFVulkanContext::frames
AVHWFramesContext * frames
Definition: vulkan.h:353
OFFSET
#define OFFSET(x)
Definition: ffv1enc_vulkan.c:1289
AVCodecContext::sw_pix_fmt
enum AVPixelFormat sw_pix_fmt
Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:646
pkt
static AVPacket * pkt
Definition: demux_decode.c:55
FFv1ShaderParams::slice_data
VkDeviceAddress slice_data
Definition: ffv1_vulkan.h:34
ff_ffv1_enc_rgb_golomb_comp_spv_len
const unsigned int ff_ffv1_enc_rgb_golomb_comp_spv_len
av_hwframe_get_buffer
int av_hwframe_get_buffer(AVBufferRef *hwframe_ref, AVFrame *frame, int flags)
Allocate a new frame attached to the given AVHWFramesContext.
Definition: hwcontext.c:506
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:299
FFVulkanFunctions
Definition: vulkan_functions.h:274
FFVkExecPool::pool_size
int pool_size
Definition: vulkan.h:296
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:2072
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:1276
FFVkExecContext::idx
uint32_t idx
Definition: vulkan.h:146
src
#define src
Definition: vp8dsp.c:248
av_get_pix_fmt_name
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition: pixdesc.c:3376
init_rct_search_shader
static int init_rct_search_shader(AVCodecContext *avctx, VkSpecializationInfo *sl)
Definition: ffv1enc_vulkan.c:772
VulkanEncodeFFv1Context::out_data_pool
AVBufferPool * out_data_pool
Definition: ffv1enc_vulkan.c:89
ff_source_rangecoder_comp
const char * ff_source_rangecoder_comp