FFmpeg
vsrc_testsrc_vulkan.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) Lynne
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/random_seed.h"
22 #include "libavutil/csp.h"
23 #include "libavutil/opt.h"
24 #include "libavutil/vulkan_spirv.h"
25 #include "vulkan_filter.h"
26 #include "filters.h"
27 #include "colorspace.h"
28 #include "video.h"
29 
32 };
33 
34 typedef struct TestSrcVulkanPushData {
35  float color_comp[4];
37 
38 typedef struct TestSrcVulkanContext {
40 
45 
46  /* Only used by color_vulkan */
47  uint8_t color_rgba[4];
48 
50 
51  int w, h;
52  int pw, ph;
54  /* enum AVColorRange */
55  int out_range;
56  unsigned int nb_frame;
59  int64_t duration; ///< duration expressed in microseconds
60  AVRational sar; ///< sample aspect ratio
61  int draw_once; ///< draw only the first frame, always put out the same picture
62  int draw_once_reset; ///< draw only the first frame or in case of reset
63  AVFrame *picref; ///< cached reference containing the painted picture
65 
67 {
68  int err;
69  uint8_t *spv_data;
70  size_t spv_len;
71  void *spv_opaque = NULL;
72  TestSrcVulkanContext *s = ctx->priv;
73  FFVulkanContext *vkctx = &s->vkctx;
74  const int planes = av_pix_fmt_count_planes(s->vkctx.output_format);
75  FFVulkanShader *shd = &s->shd;
76  FFVkSPIRVCompiler *spv;
78  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->vkctx.output_format);
79 
80  spv = ff_vk_spirv_init();
81  if (!spv) {
82  av_log(ctx, AV_LOG_ERROR, "Unable to initialize SPIR-V compiler!\n");
83  return AVERROR_EXTERNAL;
84  }
85 
86  s->qf = ff_vk_qf_find(vkctx, VK_QUEUE_COMPUTE_BIT, 0);
87  if (!s->qf) {
88  av_log(ctx, AV_LOG_ERROR, "Device has no compute queues\n");
89  err = AVERROR(ENOTSUP);
90  goto fail;
91  }
92 
93  RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, NULL));
94  RET(ff_vk_shader_init(vkctx, &s->shd, "scale",
95  VK_SHADER_STAGE_COMPUTE_BIT,
96  NULL, 0,
97  32, 32, 1,
98  0));
99 
100  GLSLC(0, layout(push_constant, std430) uniform pushConstants { );
101  GLSLC(1, vec4 color_comp; );
102  GLSLC(0, }; );
103  GLSLC(0, );
104 
105  ff_vk_shader_add_push_const(&s->shd, 0, sizeof(s->opts),
106  VK_SHADER_STAGE_COMPUTE_BIT);
107 
108  desc_set = (FFVulkanDescriptorSetBinding []) {
109  {
110  .name = "output_img",
111  .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
112  .mem_layout = ff_vk_shader_rep_fmt(s->vkctx.output_format, FF_VK_REP_FLOAT),
113  .mem_quali = "writeonly",
114  .dimensions = 2,
115  .elems = planes,
116  .stages = VK_SHADER_STAGE_COMPUTE_BIT,
117  },
118  };
119 
120  RET(ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc_set, 1, 0, 0));
121 
122  GLSLC(0, void main() );
123  GLSLC(0, { );
124  GLSLC(1, ivec2 pos = ivec2(gl_GlobalInvocationID.xy); );
125  if (mode == TESTSRC_COLOR) {
126  double rgb2yuv[3][3];
127  double rgbad[4];
128  double yuvad[4];
129 
130  enum AVColorSpace csp;
131  const AVLumaCoefficients *luma = NULL;
132 
133  s->draw_once = 1;
134 
135  if (desc->flags & AV_PIX_FMT_FLAG_RGB)
136  csp = AVCOL_SPC_RGB;
137  else
138  csp = AVCOL_SPC_SMPTE170M;
139 
140  if (!(desc->flags & AV_PIX_FMT_FLAG_RGB) && !(luma = av_csp_luma_coeffs_from_avcsp(csp)))
141  return AVERROR(EINVAL);
142  else if (!(desc->flags & AV_PIX_FMT_FLAG_RGB))
144 
145  for (int i = 0; i < 4; i++)
146  rgbad[i] = s->color_rgba[i] / 255.0;
147 
148  if (!(desc->flags & AV_PIX_FMT_FLAG_RGB))
149  ff_matrix_mul_3x3_vec(yuvad, rgbad, rgb2yuv);
150  else
151  memcpy(yuvad, rgbad, sizeof(rgbad));
152 
153  yuvad[3] = rgbad[3];
154 
155  if (!(desc->flags & AV_PIX_FMT_FLAG_RGB)) {
156  for (int i = 0; i < 3; i++) {
157  int chroma = (!(desc->flags & AV_PIX_FMT_FLAG_RGB) && i > 0);
158  if (s->out_range == AVCOL_RANGE_MPEG) {
159  yuvad[i] *= (chroma ? 224.0 : 219.0) / 255.0;
160  yuvad[i] += (chroma ? 128.0 : 16.0) / 255.0;
161  } else if (chroma) {
162  yuvad[i] += 0.5;
163  }
164  }
165  }
166 
167  /* Ensure we place the alpha appropriately for gray formats */
168  if (desc->nb_components <= 2)
169  yuvad[1] = yuvad[3];
170 
171  for (int i = 0; i < 4; i++)
172  s->opts.color_comp[i] = yuvad[i];
173 
174  GLSLC(1, vec4 r; );
175  GLSLC(0, );
176  for (int i = 0, c_off = 0; i < planes; i++) {
177  for (int c = 0; c < desc->nb_components; c++) {
178  if (desc->comp[c].plane == i) {
179  int off = desc->comp[c].offset / (FFALIGN(desc->comp[c].depth, 8)/8);
180  GLSLF(1, r[%i] = color_comp[%i]; ,off, c_off++);
181  }
182  }
183  GLSLF(1, imageStore(output_img[%i], pos, r); ,i);
184  GLSLC(0, );
185  }
186  }
187  GLSLC(0, } );
188 
189  RET(spv->compile_shader(vkctx, spv, shd, &spv_data, &spv_len, "main",
190  &spv_opaque));
191  RET(ff_vk_shader_link(vkctx, shd, spv_data, spv_len, "main"));
192 
193  RET(ff_vk_shader_register_exec(vkctx, &s->e, &s->shd));
194 
195  s->initialized = 1;
196 
197 fail:
198  if (spv_opaque)
199  spv->free_shader(spv, &spv_opaque);
200  if (spv)
201  spv->uninit(&spv);
202 
203  return err;
204 }
205 
207 {
208  int err;
209  AVFilterLink *outlink = ctx->outputs[0];
210  TestSrcVulkanContext *s = ctx->priv;
211  AVFrame *frame;
212 
213  if (!s->initialized) {
215  err = init_filter(ctx, mode);
216  if (err < 0)
217  return err;
218  }
219 
220  if (!ff_outlink_frame_wanted(outlink))
221  return FFERROR_NOT_READY;
222  if (s->duration >= 0 &&
223  av_rescale_q(s->pts, s->time_base, AV_TIME_BASE_Q) >= s->duration) {
224  ff_outlink_set_status(outlink, AVERROR_EOF, s->pts);
225  return 0;
226  }
227 
228  if (s->draw_once) {
229  if (s->draw_once_reset) {
230  av_frame_free(&s->picref);
231  s->draw_once_reset = 0;
232  }
233  if (!s->picref) {
234  s->picref = ff_get_video_buffer(outlink, s->w, s->h);
235  if (!s->picref)
236  return AVERROR(ENOMEM);
237 
238  err = ff_vk_filter_process_simple(&s->vkctx, &s->e, &s->shd, s->picref, NULL,
239  VK_NULL_HANDLE, &s->opts, sizeof(s->opts));
240  if (err < 0)
241  return err;
242  }
243  frame = av_frame_clone(s->picref);
244  } else {
245  frame = ff_get_video_buffer(outlink, s->w, s->h);
246  }
247 
248  if (!frame)
249  return AVERROR(ENOMEM);
250 
251  frame->pts = s->pts;
252  frame->duration = 1;
253  frame->flags = AV_FRAME_FLAG_KEY;
254  frame->pict_type = AV_PICTURE_TYPE_I;
255  frame->sample_aspect_ratio = s->sar;
256  if (!s->draw_once) {
257  err = ff_vk_filter_process_simple(&s->vkctx, &s->e, &s->shd, frame, NULL,
258  VK_NULL_HANDLE, &s->opts, sizeof(s->opts));
259  if (err < 0) {
261  return err;
262  }
263  }
264 
265  s->pts++;
266  s->nb_frame++;
267 
268  return ff_filter_frame(outlink, frame);
269 }
270 
272 {
273  int err;
274  FilterLink *l = ff_filter_link(outlink);
275  TestSrcVulkanContext *s = outlink->src->priv;
276  FFVulkanContext *vkctx = &s->vkctx;
277 
278  if (!s->out_format_string) {
280  } else {
281  vkctx->output_format = av_get_pix_fmt(s->out_format_string);
282  if (vkctx->output_format == AV_PIX_FMT_NONE) {
283  av_log(vkctx, AV_LOG_ERROR, "Invalid output format.\n");
284  return AVERROR(EINVAL);
285  }
286  }
287 
288  err = ff_vk_filter_init_context(outlink->src, vkctx, NULL,
289  s->w, s->h, vkctx->output_format);
290  if (err < 0)
291  return err;
292 
294  if (!l->hw_frames_ctx)
295  return AVERROR(ENOMEM);
296 
297  s->time_base = av_inv_q(s->frame_rate);
298  s->nb_frame = 0;
299  s->pts = 0;
300 
301  s->vkctx.output_width = s->w;
302  s->vkctx.output_height = s->h;
303  outlink->w = s->w;
304  outlink->h = s->h;
305  outlink->sample_aspect_ratio = s->sar;
306  l->frame_rate = s->frame_rate;
307  outlink->time_base = s->time_base;
308 
309  return 0;
310 }
311 
313 {
314  TestSrcVulkanContext *s = avctx->priv;
315  FFVulkanContext *vkctx = &s->vkctx;
316 
317  av_frame_free(&s->picref);
318 
319  ff_vk_exec_pool_free(vkctx, &s->e);
320  ff_vk_shader_free(vkctx, &s->shd);
321 
322  ff_vk_uninit(&s->vkctx);
323 
324  s->initialized = 0;
325 }
326 
327 #define OFFSET(x) offsetof(TestSrcVulkanContext, x)
328 #define FLAGS (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
329 
330 #define COMMON_OPTS \
331  { "size", "set video size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, { .str = "1920x1080" }, 0, 0, FLAGS }, \
332  { "s", "set video size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, { .str = "1920x1080" }, 0, 0, FLAGS }, \
333  \
334  { "rate", "set video rate", OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, { .str = "60" }, 0, INT_MAX, FLAGS }, \
335  { "r", "set video rate", OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, { .str = "60" }, 0, INT_MAX, FLAGS }, \
336  \
337  { "duration", "set video duration", OFFSET(duration), AV_OPT_TYPE_DURATION, { .i64 = -1 }, -1, INT64_MAX, FLAGS }, \
338  { "d", "set video duration", OFFSET(duration), AV_OPT_TYPE_DURATION, { .i64 = -1 }, -1, INT64_MAX, FLAGS }, \
339  \
340  { "sar", "set video sample aspect ratio", OFFSET(sar), AV_OPT_TYPE_RATIONAL, { .dbl = 1 }, 0, INT_MAX, FLAGS }, \
341  \
342  { "format", "Output video format (software format of hardware frames)", OFFSET(out_format_string), AV_OPT_TYPE_STRING, .flags = FLAGS },
343 
344 static const AVOption color_vulkan_options[] = {
345  { "color", "set color", OFFSET(color_rgba), AV_OPT_TYPE_COLOR, {.str = "black"}, 0, 0, FLAGS },
346  { "c", "set color", OFFSET(color_rgba), AV_OPT_TYPE_COLOR, {.str = "black"}, 0, 0, FLAGS },
348  { "out_range", "Output colour range (from 0 to 2) (default 0)", OFFSET(out_range), AV_OPT_TYPE_INT, {.i64 = AVCOL_RANGE_UNSPECIFIED}, AVCOL_RANGE_UNSPECIFIED, AVCOL_RANGE_JPEG, .flags = FLAGS, .unit = "range" },
349  { "full", "Full range", 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, .unit = "range" },
350  { "limited", "Limited range", 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, .unit = "range" },
351  { "jpeg", "Full range", 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, .unit = "range" },
352  { "mpeg", "Limited range", 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, .unit = "range" },
353  { "tv", "Limited range", 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, .unit = "range" },
354  { "pc", "Full range", 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, .unit = "range" },
355  { NULL },
356 };
357 
358 AVFILTER_DEFINE_CLASS(color_vulkan);
359 
361  {
362  .name = "default",
363  .type = AVMEDIA_TYPE_VIDEO,
364  .config_props = testsrc_vulkan_config_props,
365  },
366 };
367 
369  .p.name = "color_vulkan",
370  .p.description = NULL_IF_CONFIG_SMALL("Generate a constant color (Vulkan)"),
371  .p.inputs = NULL,
372  .p.flags = AVFILTER_FLAG_HWDEVICE,
373  .p.priv_class = &color_vulkan_class,
374  .priv_size = sizeof(TestSrcVulkanContext),
380  .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
381 };
ff_get_video_buffer
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
Definition: video.c:118
TestSrcVulkanPushData::color_comp
float color_comp[4]
Definition: vsrc_testsrc_vulkan.c:35
r
const char * r
Definition: vf_curves.c:127
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
ff_vk_shader_free
void ff_vk_shader_free(FFVulkanContext *s, FFVulkanShader *shd)
Free a shader.
Definition: vulkan.c:2791
ff_vk_shader_init
int ff_vk_shader_init(FFVulkanContext *s, FFVulkanShader *shd, const char *name, VkPipelineStageFlags stage, const char *extensions[], int nb_extensions, int lg_x, int lg_y, int lg_z, uint32_t required_subgroup_size)
Initialize a shader object, with a specific set of extensions, type+bind, local group size,...
Definition: vulkan.c:2103
testsrc_vulkan_uninit
static void testsrc_vulkan_uninit(AVFilterContext *avctx)
Definition: vsrc_testsrc_vulkan.c:312
ff_filter_frame
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:1067
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3456
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
RET
#define RET(x)
Definition: vulkan.h:68
FFERROR_NOT_READY
return FFERROR_NOT_READY
Definition: filter_design.txt:204
ff_vk_filter_process_simple
int ff_vk_filter_process_simple(FFVulkanContext *vkctx, FFVkExecPool *e, FFVulkanShader *shd, AVFrame *out_f, AVFrame *in_f, VkSampler sampler, void *push_src, size_t push_size)
Submit a compute shader with a zero/one input and single out for execution.
Definition: vulkan_filter.c:242
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:357
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:263
int64_t
long long int64_t
Definition: coverity.c:34
TestSrcVulkanContext::qf
AVVulkanDeviceQueueFamily * qf
Definition: vsrc_testsrc_vulkan.c:43
TestSrcVulkanContext::duration
int64_t duration
duration expressed in microseconds
Definition: vsrc_testsrc_vulkan.c:59
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
mode
Definition: swscale.c:56
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:427
ff_vk_filter_init
int ff_vk_filter_init(AVFilterContext *avctx)
General lavfi IO functions.
Definition: vulkan_filter.c:233
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:777
av_csp_luma_coeffs_from_avcsp
const struct AVLumaCoefficients * av_csp_luma_coeffs_from_avcsp(enum AVColorSpace csp)
Retrieves the Luma coefficients necessary to construct a conversion matrix from an enum constant desc...
Definition: csp.c:58
AVOption
AVOption.
Definition: opt.h:429
chroma
static av_always_inline void chroma(WaveformContext *s, AVFrame *in, AVFrame *out, int component, int intensity, int offset_y, int offset_x, int column, int mirror, int jobnr, int nb_jobs)
Definition: vf_waveform.c:1639
rgb2yuv
static const char rgb2yuv[]
Definition: vf_scale_vulkan.c:84
TestSrcVulkanContext::w
int w
Definition: vsrc_testsrc_vulkan.c:51
AVCOL_SPC_RGB
@ AVCOL_SPC_RGB
order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB), YZX and ST 428-1
Definition: pixfmt.h:701
TestSrcVulkanPushData
Definition: vsrc_testsrc_vulkan.c:34
AVLumaCoefficients
Struct containing luma coefficients to be used for RGB to YUV/YCoCg, or similar calculations.
Definition: csp.h:48
ff_vk_uninit
void ff_vk_uninit(FFVulkanContext *s)
Frees main context.
Definition: vulkan.c:2817
init_filter
static av_cold int init_filter(AVFilterContext *ctx, enum TestSrcVulkanMode mode)
Definition: vsrc_testsrc_vulkan.c:66
FFVkSPIRVCompiler::uninit
void(* uninit)(struct FFVkSPIRVCompiler **ctx)
Definition: vulkan_spirv.h:32
av_buffer_ref
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition: buffer.c:103
AVFilter::name
const char * name
Filter name.
Definition: avfilter.h:220
AVFILTER_DEFINE_CLASS
AVFILTER_DEFINE_CLASS(color_vulkan)
video.h
TestSrcVulkanContext::pts
int64_t pts
Definition: vsrc_testsrc_vulkan.c:58
TestSrcVulkanContext::color_rgba
uint8_t color_rgba[4]
Definition: vsrc_testsrc_vulkan.c:47
AV_PIX_FMT_VULKAN
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
Definition: pixfmt.h:379
av_pix_fmt_count_planes
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3496
COMMON_OPTS
#define COMMON_OPTS
Definition: vsrc_testsrc_vulkan.c:330
AVFilterContext::priv
void * priv
private data for use by the filter
Definition: avfilter.h:289
fail
#define fail()
Definition: checkasm.h:219
vulkan_filter.h
OFFSET
#define OFFSET(x)
Definition: vsrc_testsrc_vulkan.c:327
colorspace.h
ff_vk_filter_init_context
int ff_vk_filter_init_context(AVFilterContext *avctx, FFVulkanContext *s, AVBufferRef *frames_ref, int width, int height, enum AVPixelFormat sw_format)
Can be called manually, if not using ff_vk_filter_config_output.
Definition: vulkan_filter.c:25
FLAGS
#define FLAGS
Definition: vsrc_testsrc_vulkan.c:328
TestSrcVulkanContext::initialized
int initialized
Definition: vsrc_testsrc_vulkan.c:41
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:2584
TestSrcVulkanContext::draw_once_reset
int draw_once_reset
draw only the first frame or in case of reset
Definition: vsrc_testsrc_vulkan.c:62
FFVulkanContext::frames_ref
AVBufferRef * frames_ref
Definition: vulkan.h:352
AVFilterPad
A filter pad used for either input or output.
Definition: filters.h:40
GLSLC
#define GLSLC(N, S)
Definition: vulkan.h:45
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
av_cold
#define av_cold
Definition: attributes.h:106
main
int main
Definition: dovi_rpuenc.c:38
AV_FRAME_FLAG_KEY
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition: frame.h:642
FFFilter
Definition: filters.h:267
ff_outlink_set_status
static void ff_outlink_set_status(AVFilterLink *link, int status, int64_t pts)
Set the status field of a link from the source filter.
Definition: filters.h:629
s
#define s(width, name)
Definition: cbs_vp9.c:198
TestSrcVulkanContext::out_format_string
char * out_format_string
Definition: vsrc_testsrc_vulkan.c:53
TestSrcVulkanContext::e
FFVkExecPool e
Definition: vsrc_testsrc_vulkan.c:42
AVCOL_SPC_SMPTE170M
@ AVCOL_SPC_SMPTE170M
also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above
Definition: pixfmt.h:707
TestSrcVulkanContext::picref
AVFrame * picref
cached reference containing the painted picture
Definition: vsrc_testsrc_vulkan.c:63
filters.h
FF_VK_REP_FLOAT
@ FF_VK_REP_FLOAT
Definition: vulkan.h:451
TestSrcVulkanContext::pw
int pw
Definition: vsrc_testsrc_vulkan.c:52
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
av_frame_clone
AVFrame * av_frame_clone(const AVFrame *src)
Create a new frame that references the same data as src.
Definition: frame.c:483
av_rescale_q
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:142
testsrc_vulkan_activate
static int testsrc_vulkan_activate(AVFilterContext *ctx)
Definition: vsrc_testsrc_vulkan.c:206
ff_matrix_mul_3x3_vec
void ff_matrix_mul_3x3_vec(double dst[3], const double vec[3], const double mat[3][3])
Definition: colorspace.c:66
ff_vk_exec_pool_free
void ff_vk_exec_pool_free(FFVulkanContext *s, FFVkExecPool *pool)
Definition: vulkan.c:299
FILTER_OUTPUTS
#define FILTER_OUTPUTS(array)
Definition: filters.h:265
if
if(ret)
Definition: filter_design.txt:179
planes
static const struct @558 planes[]
ff_vk_shader_rep_fmt
const char * ff_vk_shader_rep_fmt(enum AVPixelFormat pix_fmt, enum FFVkShaderRepFormat rep_fmt)
Definition: vulkan.c:1607
TestSrcVulkanContext::opts
TestSrcVulkanPushData opts
Definition: vsrc_testsrc_vulkan.c:49
NULL
#define NULL
Definition: coverity.c:32
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
TestSrcVulkanContext::nb_frame
unsigned int nb_frame
Definition: vsrc_testsrc_vulkan.c:56
activate
filter_frame For filters that do not use the activate() callback
AV_OPT_TYPE_COLOR
@ AV_OPT_TYPE_COLOR
Underlying C type is uint8_t[4].
Definition: opt.h:323
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:278
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:2357
testsrc_vulkan_outputs
static const AVFilterPad testsrc_vulkan_outputs[]
Definition: vsrc_testsrc_vulkan.c:360
FFVulkanContext
Definition: vulkan.h:312
AVCOL_RANGE_UNSPECIFIED
@ AVCOL_RANGE_UNSPECIFIED
Definition: pixfmt.h:743
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
ff_filter_link
static FilterLink * ff_filter_link(AVFilterLink *link)
Definition: filters.h:199
FF_FILTER_FLAG_HWFRAME_AWARE
#define FF_FILTER_FLAG_HWFRAME_AWARE
The filter is aware of hardware frames, and any hardware frame context should not be automatically pr...
Definition: filters.h:208
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:550
FFVulkanDescriptorSetBinding
Definition: vulkan.h:112
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:94
TestSrcVulkanContext::vkctx
FFVulkanContext vkctx
Definition: vsrc_testsrc_vulkan.c:39
AV_PIX_FMT_FLAG_RGB
#define AV_PIX_FMT_FLAG_RGB
The pixel format contains RGB-like data (as opposed to YUV/grayscale).
Definition: pixdesc.h:136
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
AVFILTER_FLAG_HWDEVICE
#define AVFILTER_FLAG_HWDEVICE
The filter can create hardware frames using AVFilterContext.hw_device_ctx.
Definition: avfilter.h:188
ff_vsrc_color_vulkan
const FFFilter ff_vsrc_color_vulkan
Definition: vsrc_testsrc_vulkan.c:368
FFVulkanShader
Definition: vulkan.h:225
FFVulkanContext::output_format
enum AVPixelFormat output_format
Definition: vulkan.h:362
FFVkSPIRVCompiler::compile_shader
int(* compile_shader)(FFVulkanContext *s, struct FFVkSPIRVCompiler *ctx, FFVulkanShader *shd, uint8_t **data, size_t *size, const char *entrypoint, void **opaque)
Definition: vulkan_spirv.h:28
TestSrcVulkanMode
TestSrcVulkanMode
Definition: vsrc_testsrc_vulkan.c:30
csp.h
AVERROR_EXTERNAL
#define AVERROR_EXTERNAL
Generic error in an external library.
Definition: error.h:59
FFVulkanDescriptorSetBinding::name
const char * name
Definition: vulkan.h:113
TestSrcVulkanContext::sar
AVRational sar
sample aspect ratio
Definition: vsrc_testsrc_vulkan.c:60
TestSrcVulkanContext::ph
int ph
Definition: vsrc_testsrc_vulkan.c:52
FFVkSPIRVCompiler
Definition: vulkan_spirv.h:26
TestSrcVulkanContext::frame_rate
AVRational frame_rate
Definition: vsrc_testsrc_vulkan.c:57
layout
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel layout
Definition: filter_design.txt:18
color_vulkan_options
static const AVOption color_vulkan_options[]
Definition: vsrc_testsrc_vulkan.c:344
uninit
static void uninit(AVBSFContext *ctx)
Definition: pcm_rechunk.c:68
ff_fill_rgb2yuv_table
void ff_fill_rgb2yuv_table(const AVLumaCoefficients *coeffs, double rgb2yuv[3][3])
Definition: colorspace.c:125
AVColorSpace
AVColorSpace
YUV colorspace type.
Definition: pixfmt.h:700
av_inv_q
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
Definition: rational.h:159
vulkan_spirv.h
AVFilterPad::name
const char * name
Pad name.
Definition: filters.h:46
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:760
FFVkSPIRVCompiler::free_shader
void(* free_shader)(struct FFVkSPIRVCompiler *ctx, void **opaque)
Definition: vulkan_spirv.h:31
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
TestSrcVulkanContext::shd
FFVulkanShader shd
Definition: vsrc_testsrc_vulkan.c:44
FFVkExecPool
Definition: vulkan.h:290
pos
unsigned int pos
Definition: spdifenc.c:414
ff_vk_shader_add_push_const
int ff_vk_shader_add_push_const(FFVulkanShader *shd, int offset, int size, VkShaderStageFlagBits stage)
Add/update push constants for execution.
Definition: vulkan.c:1481
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
av_get_pix_fmt
enum AVPixelFormat av_get_pix_fmt(const char *name)
Return the pixel format corresponding to name.
Definition: pixdesc.c:3388
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:2484
random_seed.h
GLSLF
#define GLSLF(N, S,...)
Definition: vulkan.h:55
TestSrcVulkanContext
Definition: vsrc_testsrc_vulkan.c:38
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
TestSrcVulkanContext::draw_once
int draw_once
draw only the first frame, always put out the same picture
Definition: vsrc_testsrc_vulkan.c:61
AV_PIX_FMT_YUV444P
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:78
AVFilterContext
An instance of a filter.
Definition: avfilter.h:274
TestSrcVulkanContext::h
int h
Definition: vsrc_testsrc_vulkan.c:51
desc
const char * desc
Definition: libsvtav1.c:82
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
FFFilter::p
AVFilter p
The public AVFilter.
Definition: filters.h:271
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
testsrc_vulkan_config_props
static int testsrc_vulkan_config_props(AVFilterLink *outlink)
Definition: vsrc_testsrc_vulkan.c:271
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVVulkanDeviceQueueFamily
Definition: hwcontext_vulkan.h:33
TESTSRC_COLOR
@ TESTSRC_COLOR
Definition: vsrc_testsrc_vulkan.c:31
ff_outlink_frame_wanted
the definition of that something depends on the semantic of the filter The callback must examine the status of the filter s links and proceed accordingly The status of output links is stored in the status_in and status_out fields and tested by the ff_outlink_frame_wanted() function. If this function returns true
TestSrcVulkanContext::out_range
int out_range
Definition: vsrc_testsrc_vulkan.c:55
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:299
FILTER_SINGLE_PIXFMT
#define FILTER_SINGLE_PIXFMT(pix_fmt_)
Definition: filters.h:254
TestSrcVulkanContext::time_base
AVRational time_base
Definition: vsrc_testsrc_vulkan.c:57