FFmpeg
vf_vpp_qsv.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 /**
20  ** @file
21  ** Hardware accelerated common filters based on Intel Quick Sync Video VPP
22  **/
23 
24 #include <float.h>
25 
26 #include "libavutil/opt.h"
27 #include "libavutil/eval.h"
28 #include "libavutil/hwcontext.h"
30 #include "libavutil/pixdesc.h"
31 #include "libavutil/mathematics.h"
32 
33 #include "formats.h"
34 #include "internal.h"
35 #include "avfilter.h"
36 #include "filters.h"
37 #include "libavcodec/avcodec.h"
38 #include "libavformat/avformat.h"
39 
40 #include "qsvvpp.h"
41 #include "transpose.h"
42 
43 #define OFFSET(x) offsetof(VPPContext, x)
44 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM)
45 
46 /* number of video enhancement filters */
47 #define ENH_FILTERS_COUNT (8)
48 #define QSV_HAVE_ROTATION QSV_VERSION_ATLEAST(1, 17)
49 #define QSV_HAVE_MIRRORING QSV_VERSION_ATLEAST(1, 19)
50 #define QSV_HAVE_SCALING_CONFIG QSV_VERSION_ATLEAST(1, 19)
51 
52 typedef struct VPPContext{
53  const AVClass *class;
54 
56 
57  /* Video Enhancement Algorithms */
58  mfxExtVPPDeinterlacing deinterlace_conf;
59  mfxExtVPPFrameRateConversion frc_conf;
60  mfxExtVPPDenoise denoise_conf;
61  mfxExtVPPDetail detail_conf;
62  mfxExtVPPProcAmp procamp_conf;
63  mfxExtVPPRotation rotation_conf;
64  mfxExtVPPMirroring mirroring_conf;
65 #ifdef QSV_HAVE_SCALING_CONFIG
66  mfxExtVPPScaling scale_conf;
67 #endif
68 
69  int out_width;
71  /**
72  * Output sw format. AV_PIX_FMT_NONE for no conversion.
73  */
75 
76  AVRational framerate; /* target framerate */
77  int use_frc; /* use framerate conversion */
78  int deinterlace; /* deinterlace mode : 0=off, 1=bob, 2=advanced */
79  int denoise; /* Enable Denoise algorithm. Value [0, 100] */
80  int detail; /* Enable Detail Enhancement algorithm. */
81  /* Level is the optional, value [0, 100] */
82  int use_crop; /* 1 = use crop; 0=none */
83  int crop_w;
84  int crop_h;
85  int crop_x;
86  int crop_y;
87 
88  int transpose;
89  int rotate; /* rotate angle : [0, 90, 180, 270] */
90  int hflip; /* flip mode : 0 = off, 1 = HORIZONTAL flip */
91 
92  int scale_mode; /* scale mode : 0 = auto, 1 = low power, 2 = high quality */
93 
94  /* param for the procamp */
95  int procamp; /* enable procamp */
96  float hue;
97  float saturation;
98  float contrast;
99  float brightness;
100 
101  char *cx, *cy, *cw, *ch;
102  char *ow, *oh;
104 
106  int eof;
107 } VPPContext;
108 
109 static const AVOption options[] = {
110  { "deinterlace", "deinterlace mode: 0=off, 1=bob, 2=advanced", OFFSET(deinterlace), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, MFX_DEINTERLACING_ADVANCED, .flags = FLAGS, "deinterlace" },
111  { "bob", "Bob deinterlace mode.", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_DEINTERLACING_BOB }, .flags = FLAGS, "deinterlace" },
112  { "advanced", "Advanced deinterlace mode. ", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_DEINTERLACING_ADVANCED }, .flags = FLAGS, "deinterlace" },
113 
114  { "denoise", "denoise level [0, 100]", OFFSET(denoise), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 100, .flags = FLAGS },
115  { "detail", "enhancement level [0, 100]", OFFSET(detail), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 100, .flags = FLAGS },
116  { "framerate", "output framerate", OFFSET(framerate), AV_OPT_TYPE_RATIONAL, { .dbl = 0.0 },0, DBL_MAX, .flags = FLAGS },
117  { "procamp", "Enable ProcAmp", OFFSET(procamp), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, .flags = FLAGS},
118  { "hue", "ProcAmp hue", OFFSET(hue), AV_OPT_TYPE_FLOAT, { .dbl = 0.0 }, -180.0, 180.0, .flags = FLAGS},
119  { "saturation", "ProcAmp saturation", OFFSET(saturation), AV_OPT_TYPE_FLOAT, { .dbl = 1.0 }, 0.0, 10.0, .flags = FLAGS},
120  { "contrast", "ProcAmp contrast", OFFSET(contrast), AV_OPT_TYPE_FLOAT, { .dbl = 1.0 }, 0.0, 10.0, .flags = FLAGS},
121  { "brightness", "ProcAmp brightness", OFFSET(brightness), AV_OPT_TYPE_FLOAT, { .dbl = 0.0 }, -100.0, 100.0, .flags = FLAGS},
122 
123  { "transpose", "set transpose direction", OFFSET(transpose), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 6, FLAGS, "transpose"},
124  { "cclock_hflip", "rotate counter-clockwise with horizontal flip", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CCLOCK_FLIP }, .flags=FLAGS, .unit = "transpose" },
125  { "clock", "rotate clockwise", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CLOCK }, .flags=FLAGS, .unit = "transpose" },
126  { "cclock", "rotate counter-clockwise", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CCLOCK }, .flags=FLAGS, .unit = "transpose" },
127  { "clock_hflip", "rotate clockwise with horizontal flip", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CLOCK_FLIP }, .flags=FLAGS, .unit = "transpose" },
128  { "reversal", "rotate by half-turn", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_REVERSAL }, .flags=FLAGS, .unit = "transpose" },
129  { "hflip", "flip horizontally", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_HFLIP }, .flags=FLAGS, .unit = "transpose" },
130  { "vflip", "flip vertically", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_VFLIP }, .flags=FLAGS, .unit = "transpose" },
131 
132  { "cw", "set the width crop area expression", OFFSET(cw), AV_OPT_TYPE_STRING, { .str = "iw" }, 0, 0, FLAGS },
133  { "ch", "set the height crop area expression", OFFSET(ch), AV_OPT_TYPE_STRING, { .str = "ih" }, 0, 0, FLAGS },
134  { "cx", "set the x crop area expression", OFFSET(cx), AV_OPT_TYPE_STRING, { .str = "(in_w-out_w)/2" }, 0, 0, FLAGS },
135  { "cy", "set the y crop area expression", OFFSET(cy), AV_OPT_TYPE_STRING, { .str = "(in_h-out_h)/2" }, 0, 0, FLAGS },
136 
137  { "w", "Output video width", OFFSET(ow), AV_OPT_TYPE_STRING, { .str="cw" }, 0, 255, .flags = FLAGS },
138  { "width", "Output video width", OFFSET(ow), AV_OPT_TYPE_STRING, { .str="cw" }, 0, 255, .flags = FLAGS },
139  { "h", "Output video height", OFFSET(oh), AV_OPT_TYPE_STRING, { .str="w*ch/cw" }, 0, 255, .flags = FLAGS },
140  { "height", "Output video height", OFFSET(oh), AV_OPT_TYPE_STRING, { .str="w*ch/cw" }, 0, 255, .flags = FLAGS },
141  { "format", "Output pixel format", OFFSET(output_format_str), AV_OPT_TYPE_STRING, { .str = "same" }, .flags = FLAGS },
142  { "async_depth", "Internal parallelization depth, the higher the value the higher the latency.", OFFSET(async_depth), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, .flags = FLAGS },
143 #ifdef QSV_HAVE_SCALING_CONFIG
144  { "scale_mode", "scale mode: 0=auto, 1=low power, 2=high quality", OFFSET(scale_mode), AV_OPT_TYPE_INT, { .i64 = MFX_SCALING_MODE_DEFAULT }, MFX_SCALING_MODE_DEFAULT, MFX_SCALING_MODE_QUALITY, .flags = FLAGS, "scale mode" },
145 #endif
146  { NULL }
147 };
148 
149 static const char *const var_names[] = {
150  "iw", "in_w",
151  "ih", "in_h",
152  "ow", "out_w", "w",
153  "oh", "out_h", "h",
154  "cw",
155  "ch",
156  "cx",
157  "cy",
158  NULL
159 };
160 
161 enum var_name {
166  CW,
167  CH,
168  CX,
169  CY,
171 };
172 
174 {
175 #define PASS_EXPR(e, s) {\
176  ret = av_expr_parse(&e, s, var_names, NULL, NULL, NULL, NULL, 0, ctx); \
177  if (ret < 0) {\
178  av_log(ctx, AV_LOG_ERROR, "Error when passing '%s'.\n", s);\
179  goto release;\
180  }\
181 }
182 #define CALC_EXPR(e, v, i) {\
183  i = v = av_expr_eval(e, var_values, NULL); \
184 }
185  VPPContext *vpp = ctx->priv;
186  double var_values[VAR_VARS_NB] = { NAN };
187  AVExpr *w_expr = NULL, *h_expr = NULL;
188  AVExpr *cw_expr = NULL, *ch_expr = NULL;
189  AVExpr *cx_expr = NULL, *cy_expr = NULL;
190  int ret = 0;
191 
192  PASS_EXPR(cw_expr, vpp->cw);
193  PASS_EXPR(ch_expr, vpp->ch);
194 
195  PASS_EXPR(w_expr, vpp->ow);
196  PASS_EXPR(h_expr, vpp->oh);
197 
198  PASS_EXPR(cx_expr, vpp->cx);
199  PASS_EXPR(cy_expr, vpp->cy);
200 
201  var_values[VAR_iW] =
202  var_values[VAR_IN_W] = ctx->inputs[0]->w;
203 
204  var_values[VAR_iH] =
205  var_values[VAR_IN_H] = ctx->inputs[0]->h;
206 
207  /* crop params */
208  CALC_EXPR(cw_expr, var_values[CW], vpp->crop_w);
209  CALC_EXPR(ch_expr, var_values[CH], vpp->crop_h);
210 
211  /* calc again in case cw is relative to ch */
212  CALC_EXPR(cw_expr, var_values[CW], vpp->crop_w);
213 
214  CALC_EXPR(w_expr,
215  var_values[VAR_OUT_W] = var_values[VAR_oW] = var_values[VAR_W],
216  vpp->out_width);
217  CALC_EXPR(h_expr,
218  var_values[VAR_OUT_H] = var_values[VAR_oH] = var_values[VAR_H],
219  vpp->out_height);
220 
221  /* calc again in case ow is relative to oh */
222  CALC_EXPR(w_expr,
223  var_values[VAR_OUT_W] = var_values[VAR_oW] = var_values[VAR_W],
224  vpp->out_width);
225 
226 
227  CALC_EXPR(cx_expr, var_values[CX], vpp->crop_x);
228  CALC_EXPR(cy_expr, var_values[CY], vpp->crop_y);
229 
230  /* calc again in case cx is relative to cy */
231  CALC_EXPR(cx_expr, var_values[CX], vpp->crop_x);
232 
233  if ((vpp->crop_w != var_values[VAR_iW]) || (vpp->crop_h != var_values[VAR_iH]))
234  vpp->use_crop = 1;
235 
236 release:
237  av_expr_free(w_expr);
238  av_expr_free(h_expr);
239  av_expr_free(cw_expr);
240  av_expr_free(ch_expr);
241  av_expr_free(cx_expr);
242  av_expr_free(cy_expr);
243 #undef PASS_EXPR
244 #undef CALC_EXPR
245 
246  return ret;
247 }
248 
250 {
251  VPPContext *vpp = ctx->priv;
252 
253  if (!strcmp(vpp->output_format_str, "same")) {
255  } else {
257  if (vpp->out_format == AV_PIX_FMT_NONE) {
258  av_log(ctx, AV_LOG_ERROR, "Unrecognized output pixel format: %s\n", vpp->output_format_str);
259  return AVERROR(EINVAL);
260  }
261  }
262 
263  return 0;
264 }
265 
267 {
268  AVFilterContext *ctx = inlink->dst;
269  VPPContext *vpp = ctx->priv;
270  int ret;
271 
272  if (vpp->framerate.den == 0 || vpp->framerate.num == 0)
273  vpp->framerate = inlink->frame_rate;
274 
275  if (av_cmp_q(vpp->framerate, inlink->frame_rate))
276  vpp->use_frc = 1;
277 
278  ret = eval_expr(ctx);
279  if (ret != 0) {
280  av_log(ctx, AV_LOG_ERROR, "Fail to eval expr.\n");
281  return ret;
282  }
283 
284  if (vpp->out_height == 0 || vpp->out_width == 0) {
285  vpp->out_width = inlink->w;
286  vpp->out_height = inlink->h;
287  }
288 
289  if (vpp->use_crop) {
290  vpp->crop_x = FFMAX(vpp->crop_x, 0);
291  vpp->crop_y = FFMAX(vpp->crop_y, 0);
292 
293  if(vpp->crop_w + vpp->crop_x > inlink->w)
294  vpp->crop_x = inlink->w - vpp->crop_w;
295  if(vpp->crop_h + vpp->crop_y > inlink->h)
296  vpp->crop_y = inlink->h - vpp->crop_h;
297  }
298 
299  return 0;
300 }
301 
302 static mfxStatus get_mfx_version(const AVFilterContext *ctx, mfxVersion *mfx_version)
303 {
304  const AVFilterLink *inlink = ctx->inputs[0];
305  AVBufferRef *device_ref;
306  AVHWDeviceContext *device_ctx;
307  AVQSVDeviceContext *device_hwctx;
308 
309  if (inlink->hw_frames_ctx) {
310  AVHWFramesContext *frames_ctx = (AVHWFramesContext *)inlink->hw_frames_ctx->data;
311  device_ref = frames_ctx->device_ref;
312  } else if (ctx->hw_device_ctx) {
313  device_ref = ctx->hw_device_ctx;
314  } else {
315  // Unavailable hw context doesn't matter in pass-through mode,
316  // so don't error here but let runtime version checks fail by setting to 0.0
317  mfx_version->Major = 0;
318  mfx_version->Minor = 0;
319  return MFX_ERR_NONE;
320  }
321 
322  device_ctx = (AVHWDeviceContext *)device_ref->data;
323  device_hwctx = device_ctx->hwctx;
324 
325  return MFXQueryVersion(device_hwctx->session, mfx_version);
326 }
327 
328 static int config_output(AVFilterLink *outlink)
329 {
330  AVFilterContext *ctx = outlink->src;
331  VPPContext *vpp = ctx->priv;
332  QSVVPPParam param = { NULL };
333  QSVVPPCrop crop = { 0 };
334  mfxExtBuffer *ext_buf[ENH_FILTERS_COUNT];
335  mfxVersion mfx_version;
336  AVFilterLink *inlink = ctx->inputs[0];
337  enum AVPixelFormat in_format;
338 
339  outlink->w = vpp->out_width;
340  outlink->h = vpp->out_height;
341  outlink->frame_rate = vpp->framerate;
342  outlink->time_base = inlink->time_base;
343 
344  param.filter_frame = NULL;
345  param.num_ext_buf = 0;
346  param.ext_buf = ext_buf;
347  param.async_depth = vpp->async_depth;
348 
349  if (get_mfx_version(ctx, &mfx_version) != MFX_ERR_NONE) {
350  av_log(ctx, AV_LOG_ERROR, "Failed to query mfx version.\n");
351  return AVERROR(EINVAL);
352  }
353 
354  if (inlink->format == AV_PIX_FMT_QSV) {
355  if (!inlink->hw_frames_ctx || !inlink->hw_frames_ctx->data)
356  return AVERROR(EINVAL);
357  else
358  in_format = ((AVHWFramesContext*)inlink->hw_frames_ctx->data)->sw_format;
359  } else
360  in_format = inlink->format;
361 
362  if (vpp->out_format == AV_PIX_FMT_NONE)
363  vpp->out_format = in_format;
364  param.out_sw_format = vpp->out_format;
365 
366  if (vpp->use_crop) {
367  crop.in_idx = 0;
368  crop.x = vpp->crop_x;
369  crop.y = vpp->crop_y;
370  crop.w = vpp->crop_w;
371  crop.h = vpp->crop_h;
372 
373  param.num_crop = 1;
374  param.crop = &crop;
375  }
376 
377  if (vpp->deinterlace) {
378  memset(&vpp->deinterlace_conf, 0, sizeof(mfxExtVPPDeinterlacing));
379  vpp->deinterlace_conf.Header.BufferId = MFX_EXTBUFF_VPP_DEINTERLACING;
380  vpp->deinterlace_conf.Header.BufferSz = sizeof(mfxExtVPPDeinterlacing);
381  vpp->deinterlace_conf.Mode = vpp->deinterlace == 1 ?
382  MFX_DEINTERLACING_BOB : MFX_DEINTERLACING_ADVANCED;
383 
384  param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->deinterlace_conf;
385  }
386 
387  if (vpp->use_frc) {
388  memset(&vpp->frc_conf, 0, sizeof(mfxExtVPPFrameRateConversion));
389  vpp->frc_conf.Header.BufferId = MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION;
390  vpp->frc_conf.Header.BufferSz = sizeof(mfxExtVPPFrameRateConversion);
391  vpp->frc_conf.Algorithm = MFX_FRCALGM_DISTRIBUTED_TIMESTAMP;
392 
393  param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->frc_conf;
394  }
395 
396  if (vpp->denoise) {
397  memset(&vpp->denoise_conf, 0, sizeof(mfxExtVPPDenoise));
398  vpp->denoise_conf.Header.BufferId = MFX_EXTBUFF_VPP_DENOISE;
399  vpp->denoise_conf.Header.BufferSz = sizeof(mfxExtVPPDenoise);
400  vpp->denoise_conf.DenoiseFactor = vpp->denoise;
401 
402  param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->denoise_conf;
403  }
404 
405  if (vpp->detail) {
406  memset(&vpp->detail_conf, 0, sizeof(mfxExtVPPDetail));
407  vpp->detail_conf.Header.BufferId = MFX_EXTBUFF_VPP_DETAIL;
408  vpp->detail_conf.Header.BufferSz = sizeof(mfxExtVPPDetail);
409  vpp->detail_conf.DetailFactor = vpp->detail;
410 
411  param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->detail_conf;
412  }
413 
414  if (vpp->procamp) {
415  memset(&vpp->procamp_conf, 0, sizeof(mfxExtVPPProcAmp));
416  vpp->procamp_conf.Header.BufferId = MFX_EXTBUFF_VPP_PROCAMP;
417  vpp->procamp_conf.Header.BufferSz = sizeof(mfxExtVPPProcAmp);
418  vpp->procamp_conf.Hue = vpp->hue;
419  vpp->procamp_conf.Saturation = vpp->saturation;
420  vpp->procamp_conf.Contrast = vpp->contrast;
421  vpp->procamp_conf.Brightness = vpp->brightness;
422 
423  param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->procamp_conf;
424  }
425 
426  if (vpp->transpose >= 0) {
427 #ifdef QSV_HAVE_ROTATION
428  switch (vpp->transpose) {
430  vpp->rotate = MFX_ANGLE_270;
431  vpp->hflip = MFX_MIRRORING_HORIZONTAL;
432  break;
433  case TRANSPOSE_CLOCK:
434  vpp->rotate = MFX_ANGLE_90;
435  vpp->hflip = MFX_MIRRORING_DISABLED;
436  break;
437  case TRANSPOSE_CCLOCK:
438  vpp->rotate = MFX_ANGLE_270;
439  vpp->hflip = MFX_MIRRORING_DISABLED;
440  break;
442  vpp->rotate = MFX_ANGLE_90;
443  vpp->hflip = MFX_MIRRORING_HORIZONTAL;
444  break;
445  case TRANSPOSE_REVERSAL:
446  vpp->rotate = MFX_ANGLE_180;
447  vpp->hflip = MFX_MIRRORING_DISABLED;
448  break;
449  case TRANSPOSE_HFLIP:
450  vpp->rotate = MFX_ANGLE_0;
451  vpp->hflip = MFX_MIRRORING_HORIZONTAL;
452  break;
453  case TRANSPOSE_VFLIP:
454  vpp->rotate = MFX_ANGLE_180;
455  vpp->hflip = MFX_MIRRORING_HORIZONTAL;
456  break;
457  default:
458  av_log(ctx, AV_LOG_ERROR, "Failed to set transpose mode to %d.\n", vpp->transpose);
459  return AVERROR(EINVAL);
460  }
461 #else
462  av_log(ctx, AV_LOG_WARNING, "The QSV VPP transpose option is "
463  "not supported with this MSDK version.\n");
464  vpp->transpose = 0;
465 #endif
466  }
467 
468  if (vpp->rotate) {
469 #ifdef QSV_HAVE_ROTATION
470  memset(&vpp->rotation_conf, 0, sizeof(mfxExtVPPRotation));
471  vpp->rotation_conf.Header.BufferId = MFX_EXTBUFF_VPP_ROTATION;
472  vpp->rotation_conf.Header.BufferSz = sizeof(mfxExtVPPRotation);
473  vpp->rotation_conf.Angle = vpp->rotate;
474 
475  if (MFX_ANGLE_90 == vpp->rotate || MFX_ANGLE_270 == vpp->rotate) {
476  FFSWAP(int, vpp->out_width, vpp->out_height);
477  FFSWAP(int, outlink->w, outlink->h);
478  av_log(ctx, AV_LOG_DEBUG, "Swap width and height for clock/cclock rotation.\n");
479  }
480 
481  param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->rotation_conf;
482 #else
483  av_log(ctx, AV_LOG_WARNING, "The QSV VPP rotate option is "
484  "not supported with this MSDK version.\n");
485  vpp->rotate = 0;
486 #endif
487  }
488 
489  if (vpp->hflip) {
490 #ifdef QSV_HAVE_MIRRORING
491  memset(&vpp->mirroring_conf, 0, sizeof(mfxExtVPPMirroring));
492  vpp->mirroring_conf.Header.BufferId = MFX_EXTBUFF_VPP_MIRRORING;
493  vpp->mirroring_conf.Header.BufferSz = sizeof(mfxExtVPPMirroring);
494  vpp->mirroring_conf.Type = vpp->hflip;
495 
496  param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->mirroring_conf;
497 #else
498  av_log(ctx, AV_LOG_WARNING, "The QSV VPP hflip option is "
499  "not supported with this MSDK version.\n");
500  vpp->hflip = 0;
501 #endif
502  }
503 
504 #ifdef QSV_HAVE_SCALING_CONFIG
505  if (inlink->w != outlink->w || inlink->h != outlink->h) {
506  if (QSV_RUNTIME_VERSION_ATLEAST(mfx_version, 1, 19)) {
507  memset(&vpp->scale_conf, 0, sizeof(mfxExtVPPScaling));
508  vpp->scale_conf.Header.BufferId = MFX_EXTBUFF_VPP_SCALING;
509  vpp->scale_conf.Header.BufferSz = sizeof(mfxExtVPPScaling);
510  vpp->scale_conf.ScalingMode = vpp->scale_mode;
511 
512  param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->scale_conf;
513  } else
514  av_log(ctx, AV_LOG_WARNING, "The QSV VPP Scale option is "
515  "not supported with this MSDK version.\n");
516  }
517 #endif
518 
519  if (vpp->use_frc || vpp->use_crop || vpp->deinterlace || vpp->denoise ||
520  vpp->detail || vpp->procamp || vpp->rotate || vpp->hflip ||
521  inlink->w != outlink->w || inlink->h != outlink->h || in_format != vpp->out_format)
522  return ff_qsvvpp_create(ctx, &vpp->qsv, &param);
523  else {
524  av_log(ctx, AV_LOG_VERBOSE, "qsv vpp pass through mode.\n");
525  if (inlink->hw_frames_ctx)
526  outlink->hw_frames_ctx = av_buffer_ref(inlink->hw_frames_ctx);
527  }
528 
529  return 0;
530 }
531 
533 {
534  AVFilterLink *inlink = ctx->inputs[0];
535  AVFilterLink *outlink = ctx->outputs[0];
536  VPPContext *s =ctx->priv;
537  QSVVPPContext *qsv = s->qsv;
538  AVFrame *in = NULL;
539  int ret, status = 0;
540  int64_t pts = AV_NOPTS_VALUE;
541 
543 
544  if (!s->eof) {
546  if (ret < 0)
547  return ret;
548 
550  if (status == AVERROR_EOF) {
551  s->eof = 1;
552  }
553  }
554  }
555 
556  if (qsv) {
557  if (in || s->eof) {
558  qsv->eof = s->eof;
559  ret = ff_qsvvpp_filter_frame(qsv, inlink, in);
560  av_frame_free(&in);
561 
562  if (s->eof) {
563  ff_outlink_set_status(outlink, status, pts);
564  return 0;
565  }
566 
567  if (qsv->got_frame) {
568  qsv->got_frame = 0;
569  return ret;
570  }
571  }
572  } else {
573  if (in) {
574  if (in->pts != AV_NOPTS_VALUE)
575  in->pts = av_rescale_q(in->pts, inlink->time_base, outlink->time_base);
576 
577  ret = ff_filter_frame(outlink, in);
578  return ret;
579  }
580  }
581 
582  if (s->eof) {
583  ff_outlink_set_status(outlink, status, pts);
584  return 0;
585  } else {
587  }
588 
589  return FFERROR_NOT_READY;
590 }
591 
593 {
594  int ret;
595  static const enum AVPixelFormat in_pix_fmts[] = {
602  };
603  static const enum AVPixelFormat out_pix_fmts[] = {
608  };
609 
611  &ctx->inputs[0]->outcfg.formats);
612  if (ret < 0)
613  return ret;
615  &ctx->outputs[0]->incfg.formats);
616 }
617 
619 {
620  VPPContext *vpp = ctx->priv;
621 
622  ff_qsvvpp_free(&vpp->qsv);
623 }
624 
625 static const AVClass vpp_class = {
626  .class_name = "vpp_qsv",
627  .item_name = av_default_item_name,
628  .option = options,
629  .version = LIBAVUTIL_VERSION_INT,
630 };
631 
632 static const AVFilterPad vpp_inputs[] = {
633  {
634  .name = "default",
635  .type = AVMEDIA_TYPE_VIDEO,
636  .config_props = config_input,
637  },
638 };
639 
640 static const AVFilterPad vpp_outputs[] = {
641  {
642  .name = "default",
643  .type = AVMEDIA_TYPE_VIDEO,
644  .config_props = config_output,
645  },
646 };
647 
649  .name = "vpp_qsv",
650  .description = NULL_IF_CONFIG_SMALL("Quick Sync Video VPP."),
651  .priv_size = sizeof(VPPContext),
652  .init = vpp_init,
653  .uninit = vpp_uninit,
657  .activate = activate,
658  .priv_class = &vpp_class,
659  .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
660 };
VAR_oW
@ VAR_oW
Definition: vf_vpp_qsv.c:164
AVHWDeviceContext::hwctx
void * hwctx
The format-specific data, allocated and freed by libavutil along with this context.
Definition: hwcontext.h:92
QSVVPPCrop::in_idx
int in_idx
Input index.
Definition: qsvvpp.h:80
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
ff_vf_vpp_qsv
const AVFilter ff_vf_vpp_qsv
Definition: vf_vpp_qsv.c:648
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
status
they must not be accessed directly The fifo field contains the frames that are queued in the input for processing by the filter The status_in and status_out fields contains the queued status(EOF or error) of the link
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
VPPContext::eof
int eof
Definition: vf_vpp_qsv.c:106
ff_make_format_list
AVFilterFormats * ff_make_format_list(const int *fmts)
Create a list of supported formats.
Definition: formats.c:381
OFFSET
#define OFFSET(x)
Definition: vf_vpp_qsv.c:43
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: internal.h:371
QSVVPPParam::crop
QSVVPPCrop * crop
Definition: qsvvpp.h:97
QSVVPPParam::out_sw_format
enum AVPixelFormat out_sw_format
Definition: qsvvpp.h:93
ff_filter_frame
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:1018
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:90
FFERROR_NOT_READY
return FFERROR_NOT_READY
Definition: filter_design.txt:204
VPPContext::cx
char * cx
Definition: vf_vpp_qsv.c:101
inlink
The exact code depends on how similar the blocks are and how related they are to the and needs to apply these operations to the correct inlink or outlink if there are several Macros are available to factor that when no extra processing is inlink
Definition: filter_design.txt:212
VPPContext::crop_w
int crop_w
Definition: vf_vpp_qsv.c:83
VPPContext::crop_h
int crop_h
Definition: vf_vpp_qsv.c:84
VPPContext::detail
int detail
Definition: vf_vpp_qsv.c:80
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:109
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:317
pixdesc.h
AVFrame::pts
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition: frame.h:424
AVQSVDeviceContext
This struct is allocated as AVHWDeviceContext.hwctx.
Definition: hwcontext_qsv.h:35
AVOption
AVOption.
Definition: opt.h:247
VPPContext::scale_mode
int scale_mode
Definition: vf_vpp_qsv.c:92
FILTER_QUERY_FUNC
#define FILTER_QUERY_FUNC(func)
Definition: internal.h:168
VPPContext::contrast
float contrast
Definition: vf_vpp_qsv.c:98
vpp_uninit
static av_cold void vpp_uninit(AVFilterContext *ctx)
Definition: vf_vpp_qsv.c:618
VPPContext::qsv
QSVVPPContext * qsv
Definition: vf_vpp_qsv.c:55
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:196
float.h
TRANSPOSE_CLOCK_FLIP
@ TRANSPOSE_CLOCK_FLIP
Definition: transpose.h:34
VAR_OUT_H
@ VAR_OUT_H
Definition: vf_vpp_qsv.c:165
VPPContext::hue
float hue
Definition: vf_vpp_qsv.c:96
mathematics.h
CY
@ CY
Definition: vf_vpp_qsv.c:169
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
av_buffer_ref
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition: buffer.c:103
VAR_IN_H
@ VAR_IN_H
Definition: vf_vpp_qsv.c:163
AVFilter::name
const char * name
Filter name.
Definition: avfilter.h:169
AV_OPT_TYPE_RATIONAL
@ AV_OPT_TYPE_RATIONAL
Definition: opt.h:229
FF_FILTER_FORWARD_STATUS_BACK
#define FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink)
Forward the status on an output link to an input link.
Definition: filters.h:199
formats.h
init
static int init
Definition: av_tx.c:47
TRANSPOSE_CCLOCK
@ TRANSPOSE_CCLOCK
Definition: transpose.h:33
framerate
int framerate
Definition: h264_levels.c:65
ff_inlink_consume_frame
int ff_inlink_consume_frame(AVFilterLink *link, AVFrame **rframe)
Take a frame from the link's FIFO and update the link's stats.
Definition: avfilter.c:1417
VAR_oH
@ VAR_oH
Definition: vf_vpp_qsv.c:165
VPPContext::saturation
float saturation
Definition: vf_vpp_qsv.c:97
qsvvpp.h
VAR_IN_W
@ VAR_IN_W
Definition: vf_vpp_qsv.c:162
VPPContext::transpose
int transpose
Definition: vf_vpp_qsv.c:88
pts
static int64_t pts
Definition: transcode_aac.c:653
PASS_EXPR
#define PASS_EXPR(e, s)
VPPContext::out_format
enum AVPixelFormat out_format
Output sw format.
Definition: vf_vpp_qsv.c:74
av_expr_free
void av_expr_free(AVExpr *e)
Free a parsed expression previously created with av_expr_parse().
Definition: eval.c:336
AVRational::num
int num
Numerator.
Definition: rational.h:59
AVFilterPad
A filter pad used for either input or output.
Definition: internal.h:50
AVHWDeviceContext
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition: hwcontext.h:61
VPPContext::out_width
int out_width
Definition: vf_vpp_qsv.c:69
FLAGS
#define FLAGS
Definition: vf_vpp_qsv.c:44
TRANSPOSE_HFLIP
@ TRANSPOSE_HFLIP
Definition: transpose.h:36
in_pix_fmts
static enum AVPixelFormat in_pix_fmts[]
Definition: vf_ciescope.c:124
VPPContext::crop_x
int crop_x
Definition: vf_vpp_qsv.c:85
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
av_cold
#define av_cold
Definition: attributes.h:90
VPPContext::use_frc
int use_frc
Definition: vf_vpp_qsv.c:77
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:189
QSVVPPCrop::w
int w
Definition: qsvvpp.h:81
s
#define s(width, name)
Definition: cbs_vp9.c:257
VPPContext::denoise_conf
mfxExtVPPDenoise denoise_conf
Definition: vf_vpp_qsv.c:60
ff_qsvvpp_create
int ff_qsvvpp_create(AVFilterContext *avctx, QSVVPPContext **vpp, QSVVPPParam *param)
Definition: qsvvpp.c:655
QSV_RUNTIME_VERSION_ATLEAST
#define QSV_RUNTIME_VERSION_ATLEAST(MFX_VERSION, MAJOR, MINOR)
Definition: qsv_internal.h:59
ff_formats_ref
int ff_formats_ref(AVFilterFormats *f, AVFilterFormats **ref)
Add *ref as a new reference to formats.
Definition: formats.c:555
filters.h
var_name
var_name
Definition: noise_bsf.c:47
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
ctx
AVFormatContext * ctx
Definition: movenc.c:48
activate
static int activate(AVFilterContext *ctx)
Definition: vf_vpp_qsv.c:532
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:141
AVExpr
Definition: eval.c:157
VPPContext::detail_conf
mfxExtVPPDetail detail_conf
Definition: vf_vpp_qsv.c:61
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:66
NAN
#define NAN
Definition: mathematics.h:64
FILTER_INPUTS
#define FILTER_INPUTS(array)
Definition: internal.h:191
options
static const AVOption options[]
Definition: vf_vpp_qsv.c:109
QSVVPPParam::async_depth
int async_depth
Definition: qsvvpp.h:99
VAR_iW
@ VAR_iW
Definition: vf_vpp_qsv.c:162
QSVVPPContext
Definition: qsvvpp.h:50
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
NULL
#define NULL
Definition: coverity.c:32
ENH_FILTERS_COUNT
#define ENH_FILTERS_COUNT
Definition: vf_vpp_qsv.c:47
QSVVPPParam::num_crop
int num_crop
Definition: qsvvpp.h:96
QSVVPPParam
Definition: qsvvpp.h:84
QSVVPPCrop::x
int x
Definition: qsvvpp.h:81
VPPContext::cw
char * cw
Definition: vf_vpp_qsv.c:101
AV_PIX_FMT_YUYV422
@ AV_PIX_FMT_YUYV422
packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
Definition: pixfmt.h:67
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
AVHWFramesContext::device_ref
AVBufferRef * device_ref
A reference to the parent AVHWDeviceContext.
Definition: hwcontext.h:141
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:235
VPPContext::deinterlace
int deinterlace
Definition: vf_vpp_qsv.c:78
CALC_EXPR
#define CALC_EXPR(e, v, i)
VAR_H
@ VAR_H
Definition: vf_vpp_qsv.c:165
VPPContext::deinterlace_conf
mfxExtVPPDeinterlacing deinterlace_conf
Definition: vf_vpp_qsv.c:58
VPPContext::frc_conf
mfxExtVPPFrameRateConversion frc_conf
Definition: vf_vpp_qsv.c:59
vpp_inputs
static const AVFilterPad vpp_inputs[]
Definition: vf_vpp_qsv.c:632
VPPContext::denoise
int denoise
Definition: vf_vpp_qsv.c:79
AV_PIX_FMT_QSV
@ AV_PIX_FMT_QSV
HW acceleration through QSV, data[3] contains a pointer to the mfxFrameSurface1 structure.
Definition: pixfmt.h:212
VPPContext
Definition: vf_vpp_qsv.c:52
QSVVPPContext::got_frame
int got_frame
Definition: qsvvpp.h:72
ff_inlink_acknowledge_status
int ff_inlink_acknowledge_status(AVFilterLink *link, int *rstatus, int64_t *rpts)
Test and acknowledge the change of status on the link.
Definition: avfilter.c:1371
ff_qsvvpp_free
int ff_qsvvpp_free(QSVVPPContext **vpp)
Definition: qsvvpp.c:773
VPPContext::ow
char * ow
Definition: vf_vpp_qsv.c:102
VPPContext::hflip
int hflip
Definition: vf_vpp_qsv.c:90
VPPContext::scale_conf
mfxExtVPPScaling scale_conf
Definition: vf_vpp_qsv.c:66
query_formats
static int query_formats(AVFilterContext *ctx)
Definition: vf_vpp_qsv.c:592
eval.h
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:117
VAR_W
@ VAR_W
Definition: vf_vpp_qsv.c:164
config_input
static int config_input(AVFilterLink *inlink)
Definition: vf_vpp_qsv.c:266
VPPContext::rotate
int rotate
Definition: vf_vpp_qsv.c:89
VAR_iH
@ VAR_iH
Definition: vf_vpp_qsv.c:163
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
VAR_OUT_W
@ VAR_OUT_W
Definition: vf_vpp_qsv.c:164
VPPContext::output_format_str
char * output_format_str
Definition: vf_vpp_qsv.c:103
VAR_VARS_NB
@ VAR_VARS_NB
Definition: vf_vpp_qsv.c:170
VPPContext::ch
char * ch
Definition: vf_vpp_qsv.c:101
VPPContext::procamp_conf
mfxExtVPPProcAmp procamp_conf
Definition: vf_vpp_qsv.c:62
CH
@ CH
Definition: vf_vpp_qsv.c:167
AV_PIX_FMT_RGB32
#define AV_PIX_FMT_RGB32
Definition: pixfmt.h:377
FF_FILTER_FORWARD_WANTED
FF_FILTER_FORWARD_WANTED(outlink, inlink)
QSVVPPContext::eof
int eof
Definition: qsvvpp.h:74
internal.h
AV_OPT_TYPE_FLOAT
@ AV_OPT_TYPE_FLOAT
Definition: opt.h:227
denoise
#define denoise(...)
Definition: vf_hqdn3d.c:156
hwcontext_qsv.h
config_output
static int config_output(AVFilterLink *outlink)
Definition: vf_vpp_qsv.c:328
VPPContext::rotation_conf
mfxExtVPPRotation rotation_conf
Definition: vf_vpp_qsv.c:63
out_pix_fmts
static enum AVPixelFormat out_pix_fmts[]
Definition: vf_ciescope.c:133
QSVVPPParam::num_ext_buf
int num_ext_buf
Definition: qsvvpp.h:89
get_mfx_version
static mfxStatus get_mfx_version(const AVFilterContext *ctx, mfxVersion *mfx_version)
Definition: vf_vpp_qsv.c:302
TRANSPOSE_CLOCK
@ TRANSPOSE_CLOCK
Definition: transpose.h:32
QSVVPPParam::filter_frame
int(* filter_frame)(AVFilterLink *outlink, AVFrame *frame)
Definition: qsvvpp.h:86
VPPContext::crop_y
int crop_y
Definition: vf_vpp_qsv.c:86
VPPContext::framerate
AVRational framerate
Definition: vf_vpp_qsv.c:76
AVFilterPad::name
const char * name
Pad name.
Definition: internal.h:56
VPPContext::out_height
int out_height
Definition: vf_vpp_qsv.c:70
vpp_init
static av_cold int vpp_init(AVFilterContext *ctx)
Definition: vf_vpp_qsv.c:249
avcodec.h
av_cmp_q
static int av_cmp_q(AVRational a, AVRational b)
Compare two rationals.
Definition: rational.h:89
AVFilter
Filter definition.
Definition: avfilter.h:165
AVHWFramesContext
This struct describes a set or pool of "hardware" frames (i.e.
Definition: hwcontext.h:124
ret
ret
Definition: filter_design.txt:187
VPPContext::async_depth
int async_depth
Definition: vf_vpp_qsv.c:105
AV_PIX_FMT_NV12
@ AV_PIX_FMT_NV12
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
Definition: pixfmt.h:89
FFSWAP
#define FFSWAP(type, a, b)
Definition: macros.h:52
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:71
avformat.h
av_get_pix_fmt
enum AVPixelFormat av_get_pix_fmt(const char *name)
Return the pixel format corresponding to name.
Definition: pixdesc.c:2592
QSVVPPCrop::h
int h
Crop rectangle.
Definition: qsvvpp.h:81
QSVVPPCrop::y
int y
Definition: qsvvpp.h:81
VPPContext::oh
char * oh
Definition: vf_vpp_qsv.c:102
TRANSPOSE_CCLOCK_FLIP
@ TRANSPOSE_CCLOCK_FLIP
Definition: transpose.h:31
ff_qsvvpp_filter_frame
int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *picref)
Definition: qsvvpp.c:798
eval_expr
static int eval_expr(AVFilterContext *ctx)
Definition: vf_vpp_qsv.c:173
AVQSVDeviceContext::session
mfxSession session
Definition: hwcontext_qsv.h:36
AVRational::den
int den
Denominator.
Definition: rational.h:60
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:65
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:224
avfilter.h
vpp_class
static const AVClass vpp_class
Definition: vf_vpp_qsv.c:625
VPPContext::use_crop
int use_crop
Definition: vf_vpp_qsv.c:82
transpose.h
TRANSPOSE_REVERSAL
@ TRANSPOSE_REVERSAL
Definition: transpose.h:35
VPPContext::cy
char * cy
Definition: vf_vpp_qsv.c:101
AVFilterContext
An instance of a filter.
Definition: avfilter.h:402
TRANSPOSE_VFLIP
@ TRANSPOSE_VFLIP
Definition: transpose.h:37
AV_PIX_FMT_P010
#define AV_PIX_FMT_P010
Definition: pixfmt.h:453
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
var_names
static const char *const var_names[]
Definition: vf_vpp_qsv.c:149
CW
@ CW
Definition: vf_vpp_qsv.c:166
VPPContext::mirroring_conf
mfxExtVPPMirroring mirroring_conf
Definition: vf_vpp_qsv.c:64
FILTER_OUTPUTS
#define FILTER_OUTPUTS(array)
Definition: internal.h:192
CX
@ CX
Definition: vf_vpp_qsv.c:168
hwcontext.h
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
uninit
static av_cold int uninit(AVCodecContext *avctx)
Definition: crystalhd.c:282
QSVVPPCrop
Definition: qsvvpp.h:79
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Definition: opt.h:228
transpose
#define transpose(x)
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Definition: opt.h:233
VPPContext::brightness
float brightness
Definition: vf_vpp_qsv.c:99
VPPContext::procamp
int procamp
Definition: vf_vpp_qsv.c:95
QSVVPPParam::ext_buf
mfxExtBuffer ** ext_buf
Definition: qsvvpp.h:90
vpp_outputs
static const AVFilterPad vpp_outputs[]
Definition: vf_vpp_qsv.c:640