26#include "config_components.h"
43#define OFFSET(x) offsetof(VPPContext, x)
44#define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM)
47#define ENH_FILTERS_COUNT (8)
63 mfxExtVideoSignalInfo invsi_conf;
65 mfxExtVideoSignalInfo outvsi_conf;
67 mfxExtMasteringDisplayColourVolume mdcv_conf;
68 mfxExtContentLightLevelInfo clli_conf;
157#define PASS_EXPR(e, s) {\
159 ret = av_expr_parse(&e, s, var_names, NULL, NULL, NULL, NULL, 0, ctx); \
161 av_log(ctx, AV_LOG_ERROR, "Error when passing '%s'.\n", s); \
166#define CALC_EXPR(e, v, i, d) {\
168 i = v = av_expr_eval(e, var_values, NULL); \
195 var_values[
VAR_SAR] =
ctx->inputs[0]->sample_aspect_ratio.num ?
196 (
double)
ctx->inputs[0]->sample_aspect_ratio.num /
ctx->inputs[0]->sample_aspect_ratio.den : 1;
274#define STRING_OPTION(var_name, func_name, default_value) do { \
275 if (vpp->var_name ## _str) { \
276 int var = av_ ## func_name ## _from_name(vpp->var_name ## _str); \
278 av_log(ctx, AV_LOG_ERROR, "Invalid %s.\n", #var_name); \
279 return AVERROR(EINVAL); \
281 vpp->var_name = var; \
283 vpp->var_name = default_value; \
324 if (ow < -1 || oh < -1) {
329 if (ow == -1 && oh == -1)
344 if (ow > INT_MAX || oh > INT_MAX ||
345 (oh * inlink->
w) > INT_MAX ||
346 (ow * inlink->
h) > INT_MAX)
375 }
else if (
ctx->hw_device_ctx) {
376 device_ref =
ctx->hw_device_ctx;
380 mfx_version->Major = 0;
381 mfx_version->Minor = 0;
386 device_hwctx = device_ctx->
hwctx;
388 return MFXQueryVersion(device_hwctx->
session, mfx_version);
396 mfxExtVideoSignalInfo invsi_conf, outvsi_conf;
397 mfxExtMasteringDisplayColourVolume mdcv_conf;
398 mfxExtContentLightLevelInfo clli_conf;
408 memset(&invsi_conf, 0,
sizeof(mfxExtVideoSignalInfo));
409 invsi_conf.Header.BufferId = MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN;
410 invsi_conf.Header.BufferSz =
sizeof(mfxExtVideoSignalInfo);
415 invsi_conf.ColourDescriptionPresent = 1;
417 memset(&mdcv_conf, 0,
sizeof(mfxExtMasteringDisplayColourVolume));
423 const int mapping[3] = {1, 2, 0};
424 const int chroma_den = 50000;
425 const int luma_den = 10000;
428 mdcv_conf.Header.BufferId = MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_IN;
429 mdcv_conf.Header.BufferSz =
sizeof(mfxExtMasteringDisplayColourVolume);
431 for (
i = 0;
i < 3;
i++) {
432 const int j = mapping[
i];
434 mdcv_conf.DisplayPrimariesX[
i] =
438 mdcv_conf.DisplayPrimariesY[
i] =
444 mdcv_conf.WhitePointX =
447 mdcv_conf.WhitePointY =
454 mdcv_conf.MaxDisplayMasteringLuminance =
456 mdcv_conf.MinDisplayMasteringLuminance =
462 memset(&clli_conf, 0,
sizeof(mfxExtContentLightLevelInfo));
467 clli_conf.Header.BufferId = MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO;
468 clli_conf.Header.BufferSz =
sizeof(mfxExtContentLightLevelInfo);
469 clli_conf.MaxContentLightLevel =
FFMIN(clm->
MaxCLL, 65535);
470 clli_conf.MaxPicAverageLightLevel =
FFMIN(clm->
MaxFALL, 65535);
493 memset(&outvsi_conf, 0,
sizeof(mfxExtVideoSignalInfo));
494 outvsi_conf.Header.BufferId = MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT;
495 outvsi_conf.Header.BufferSz =
sizeof(mfxExtVideoSignalInfo);
500 outvsi_conf.ColourDescriptionPresent = 1;
502 if (memcmp(&vpp->invsi_conf, &invsi_conf,
sizeof(mfxExtVideoSignalInfo)) ||
503 memcmp(&vpp->mdcv_conf, &mdcv_conf,
sizeof(mfxExtMasteringDisplayColourVolume)) ||
504 memcmp(&vpp->clli_conf, &clli_conf,
sizeof(mfxExtContentLightLevelInfo)) ||
505 memcmp(&vpp->outvsi_conf, &outvsi_conf,
sizeof(mfxExtVideoSignalInfo))) {
506 vpp->invsi_conf = invsi_conf;
509 vpp->outvsi_conf = outvsi_conf;
512 vpp->mdcv_conf = mdcv_conf;
513 if (mdcv_conf.Header.BufferId)
516 vpp->clli_conf = clli_conf;
517 if (clli_conf.Header.BufferId)
533 mfxVersion mfx_version;
563 in_format = inlink->
format;
580#define INIT_MFX_EXTBUF(extbuf, id) do { \
581 memset(&vpp->extbuf, 0, sizeof(vpp->extbuf)); \
582 vpp->extbuf.Header.BufferId = id; \
583 vpp->extbuf.Header.BufferSz = sizeof(vpp->extbuf); \
584 param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->extbuf; \
587#define SET_MFX_PARAM_FIELD(extbuf, field, value) do { \
588 vpp->extbuf.field = value; \
594 MFX_DEINTERLACING_BOB : MFX_DEINTERLACING_ADVANCED));
624 vpp->
rotate = MFX_ANGLE_270;
625 vpp->
hflip = MFX_MIRRORING_HORIZONTAL;
628 vpp->
rotate = MFX_ANGLE_90;
629 vpp->
hflip = MFX_MIRRORING_DISABLED;
632 vpp->
rotate = MFX_ANGLE_270;
633 vpp->
hflip = MFX_MIRRORING_DISABLED;
636 vpp->
rotate = MFX_ANGLE_90;
637 vpp->
hflip = MFX_MIRRORING_HORIZONTAL;
640 vpp->
rotate = MFX_ANGLE_180;
641 vpp->
hflip = MFX_MIRRORING_DISABLED;
644 vpp->
rotate = MFX_ANGLE_0;
645 vpp->
hflip = MFX_MIRRORING_HORIZONTAL;
648 vpp->
rotate = MFX_ANGLE_180;
649 vpp->
hflip = MFX_MIRRORING_HORIZONTAL;
657 "not supported with this MSDK version.\n");
667 if (MFX_ANGLE_90 == vpp->
rotate || MFX_ANGLE_270 == vpp->
rotate) {
669 FFSWAP(
int, outlink->
w, outlink->
h);
674 "not supported with this MSDK version.\n");
685 "not supported with this MSDK version.\n");
690 if (inlink->
w != outlink->
w || inlink->
h != outlink->
h || in_format != vpp->
out_format) {
696 mode = MFX_SCALING_MODE_VENDOR +
mode - 2;
703 "option is not supported with this MSDK version.\n");
706#undef INIT_MFX_EXTBUF
707#undef SET_MFX_PARAM_FIELD
711 inlink->
w != outlink->
w || inlink->
h != outlink->
h || in_format != vpp->
out_format ||
753 if (in || qsv->
eof) {
828#define DEFINE_QSV_FILTER(x, sn, ln, fmts) \
829static const AVClass x##_class = { \
830 .class_name = #sn "_qsv", \
831 .item_name = av_default_item_name, \
832 .option = x##_options, \
833 .version = LIBAVUTIL_VERSION_INT, \
835const FFFilter ff_vf_##sn##_qsv = { \
836 .p.name = #sn "_qsv", \
837 .p.description = NULL_IF_CONFIG_SMALL("Quick Sync Video " #ln), \
838 .p.priv_class = &x##_class, \
839 .p.flags = AVFILTER_FLAG_HWDEVICE, \
840 .preinit = x##_preinit, \
842 .uninit = vpp_uninit, \
843 .priv_size = sizeof(VPPContext), \
844 FILTER_INPUTS(vpp_inputs), \
845 FILTER_OUTPUTS(vpp_outputs), \
847 .activate = activate, \
848 .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE, \
851#if CONFIG_VPP_QSV_FILTER
853static const AVOption vpp_options[] = {
854 {
"deinterlace",
"deinterlace mode: 0=off, 1=bob, 2=advanced",
OFFSET(deinterlace),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, MFX_DEINTERLACING_ADVANCED, .flags =
FLAGS, .unit =
"deinterlace" },
855 {
"bob",
"Bob deinterlace mode.", 0,
AV_OPT_TYPE_CONST, { .i64 = MFX_DEINTERLACING_BOB }, .flags =
FLAGS, .unit =
"deinterlace" },
856 {
"advanced",
"Advanced deinterlace mode. ", 0,
AV_OPT_TYPE_CONST, { .i64 = MFX_DEINTERLACING_ADVANCED }, .flags =
FLAGS, .unit =
"deinterlace" },
881 {
"w",
"Output video width(0=input video width, -1=keep input video aspect)",
OFFSET(ow),
AV_OPT_TYPE_STRING, { .str=
"cw" }, 0, 255, .flags =
FLAGS },
882 {
"width",
"Output video width(0=input video width, -1=keep input video aspect)",
OFFSET(ow),
AV_OPT_TYPE_STRING, { .str=
"cw" }, 0, 255, .flags =
FLAGS },
883 {
"h",
"Output video height(0=input video height, -1=keep input video aspect)",
OFFSET(oh),
AV_OPT_TYPE_STRING, { .str=
"w*ch/cw" }, 0, 255, .flags =
FLAGS },
884 {
"height",
"Output video height(0=input video height, -1=keep input video aspect)",
OFFSET(oh),
AV_OPT_TYPE_STRING, { .str=
"w*ch/cw" }, 0, 255, .flags =
FLAGS },
886 {
"async_depth",
"Internal parallelization depth, the higher the value the higher the latency.",
OFFSET(qsv.async_depth),
AV_OPT_TYPE_INT, { .i64 = 4 }, 0, INT_MAX, .flags =
FLAGS },
888 {
"scale_mode",
"scaling & format conversion mode (mode compute(3), vd(4) and ve(5) are only available on some platforms)",
OFFSET(scale_mode),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 5, .flags =
FLAGS, .unit =
"scale mode" },
890 {
"scale_mode",
"scaling & format conversion mode",
OFFSET(scale_mode),
AV_OPT_TYPE_INT, { .i64 = MFX_SCALING_MODE_DEFAULT }, MFX_SCALING_MODE_DEFAULT, MFX_SCALING_MODE_QUALITY, .flags =
FLAGS, .unit =
"scale mode" },
892 {
"auto",
"auto mode", 0,
AV_OPT_TYPE_CONST, { .i64 = MFX_SCALING_MODE_DEFAULT}, INT_MIN, INT_MAX,
FLAGS, .unit =
"scale mode"},
893 {
"low_power",
"low power mode", 0,
AV_OPT_TYPE_CONST, { .i64 = MFX_SCALING_MODE_LOWPOWER}, INT_MIN, INT_MAX,
FLAGS, .unit =
"scale mode"},
894 {
"hq",
"high quality mode", 0,
AV_OPT_TYPE_CONST, { .i64 = MFX_SCALING_MODE_QUALITY}, INT_MIN, INT_MAX,
FLAGS, .unit =
"scale mode"},
896 {
"compute",
"compute", 0,
AV_OPT_TYPE_CONST, { .i64 = 3}, INT_MIN, INT_MAX,
FLAGS, .unit =
"scale mode"},
901 {
"rate",
"Generate output at frame rate or field rate, available only for deinterlace mode",
903 {
"frame",
"Output at frame rate (one frame of output for each field-pair)",
905 {
"field",
"Output at field rate (one frame of output for each field)",
908 {
"out_range",
"Output color range",
911 {
"full",
"Full range",
913 {
"limited",
"Limited range",
915 {
"jpeg",
"Full range",
917 {
"mpeg",
"Limited range",
919 {
"tv",
"Limited range",
921 {
"pc",
"Full range",
923 {
"out_color_matrix",
"Output color matrix coefficient set",
925 {
"out_color_primaries",
"Output color primaries",
927 {
"out_color_transfer",
"Output color transfer characteristics",
930 {
"tonemap",
"Perform tonemapping (0=disable tonemapping, 1=perform tonemapping if the input has HDR metadata)",
OFFSET(
tonemap),
AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 1, .flags =
FLAGS},
980#if CONFIG_SCALE_QSV_FILTER
982static const AVOption qsvscale_options[] = {
983 {
"w",
"Output video width(0=input video width, -1=keep input video aspect)",
OFFSET(ow),
AV_OPT_TYPE_STRING, { .str =
"iw" }, .flags =
FLAGS },
984 {
"h",
"Output video height(0=input video height, -1=keep input video aspect)",
OFFSET(oh),
AV_OPT_TYPE_STRING, { .str =
"ih" }, .flags =
FLAGS },
988 {
"mode",
"scaling & format conversion mode (mode compute(3), vd(4) and ve(5) are only available on some platforms)",
OFFSET(scale_mode),
AV_OPT_TYPE_INT, { .i64 = 0}, 0, 5,
FLAGS, .unit =
"mode"},
990 {
"mode",
"scaling & format conversion mode",
OFFSET(scale_mode),
AV_OPT_TYPE_INT, { .i64 = MFX_SCALING_MODE_DEFAULT}, MFX_SCALING_MODE_DEFAULT, MFX_SCALING_MODE_QUALITY,
FLAGS, .unit =
"mode"},
992 {
"low_power",
"low power mode", 0,
AV_OPT_TYPE_CONST, { .i64 = MFX_SCALING_MODE_LOWPOWER}, INT_MIN, INT_MAX,
FLAGS, .unit =
"mode"},
993 {
"hq",
"high quality mode", 0,
AV_OPT_TYPE_CONST, { .i64 = MFX_SCALING_MODE_QUALITY}, INT_MIN, INT_MAX,
FLAGS, .unit =
"mode"},
1017#if CONFIG_DEINTERLACE_QSV_FILTER
1019static const AVOption qsvdeint_options[] = {
1020 {
"mode",
"set deinterlace mode",
OFFSET(deinterlace),
AV_OPT_TYPE_INT, {.i64 = MFX_DEINTERLACING_ADVANCED}, MFX_DEINTERLACING_BOB, MFX_DEINTERLACING_ADVANCED,
FLAGS, .unit =
"mode"},
1021 {
"bob",
"bob algorithm", 0,
AV_OPT_TYPE_CONST, {.i64 = MFX_DEINTERLACING_BOB}, MFX_DEINTERLACING_BOB, MFX_DEINTERLACING_ADVANCED,
FLAGS, .unit =
"mode"},
1022 {
"advanced",
"Motion adaptive algorithm", 0,
AV_OPT_TYPE_CONST, {.i64 = MFX_DEINTERLACING_ADVANCED}, MFX_DEINTERLACING_BOB, MFX_DEINTERLACING_ADVANCED,
FLAGS, .unit =
"mode"},
static int config_input(AVFilterLink *inlink)
Mode
Frame type (Table 1a in 3GPP TS 26.101)
static AVFormatContext * ctx
int ff_inlink_acknowledge_status(AVFilterLink *link, int *rstatus, int64_t *rpts)
Test and acknowledge the change of status on the link.
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
int ff_inlink_consume_frame(AVFilterLink *link, AVFrame **rframe)
Take a frame from the link's FIFO and update the link's stats.
Main libavfilter public API header.
#define i(width, name, range_min, range_max)
static IPT saturation(const CmsCtx *ctx, IPT ipt)
static const AVColorPrimariesDesc color_primaries[AVCOL_PRI_NB]
void av_expr_free(AVExpr *e)
Free a parsed expression previously created with av_expr_parse().
simple arithmetic expression evaluator
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
@ AV_OPT_TYPE_RATIONAL
Underlying C type is AVRational.
@ AV_OPT_TYPE_INT
Underlying C type is int.
@ AV_OPT_TYPE_FLOAT
Underlying C type is float.
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
#define AVERROR_EOF
End of file.
AVFrameSideData * av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type)
void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type)
Remove and free all side data instances of the given type.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
@ AV_FRAME_DATA_CONTENT_LIGHT_LEVEL
Content light level (based on CTA-861.3).
@ AV_FRAME_DATA_MASTERING_DISPLAY_METADATA
Mastering display metadata associated with a video frame.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_VERBOSE
Detailed information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
static double av_q2d(AVRational a)
Convert an AVRational to a double.
static int av_cmp_q(AVRational a, AVRational b)
Compare two rationals.
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
#define AV_NOPTS_VALUE
Undefined timestamp value.
An API-specific header for AV_HWDEVICE_TYPE_QSV.
static void scale(int *out, const int *in, const int w, const int h, const int shift)
static int config_output(AVBitStreamFilterLink *outlink)
#define FF_FILTER_FORWARD_WANTED(outlink, inlink)
Forward the frame_wanted_out flag from an output link to an input link.
static void ff_outlink_set_status(AVFilterLink *link, int status, int64_t pts)
Set the status field of a link from the source filter.
#define FFERROR_NOT_READY
Filters implementation helper functions and internal structures.
#define FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink)
Forward the status on an output link to an input link.
static FilterLink * ff_filter_link(AVFilterLink *link)
#define FILTER_SINGLE_PIXFMT(pix_fmt_)
#define FILTER_QUERY_FUNC2(func)
#define FFSWAP(type, a, b)
static const char *const var_names[]
enum AVPixelFormat av_get_pix_fmt(const char *name)
Return the pixel format corresponding to name.
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
@ AVCOL_RANGE_UNSPECIFIED
@ AVCOL_RANGE_JPEG
Full range content.
AVPixelFormat
Pixel format.
@ 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...
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
@ AV_PIX_FMT_UYVY422
packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
@ AV_PIX_FMT_YUYV422
packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
@ AV_PIX_FMT_QSV
HW acceleration through QSV, data[3] contains a pointer to the mfxFrameSurface1 structure.
AVColorPrimaries
Chromaticity coordinates of the source primaries.
@ AVCOL_PRI_BT709
also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP 177 Annex B
AVColorTransferCharacteristic
Color Transfer Characteristic.
@ AVCOL_TRC_BT709
also ITU-R BT1361
AVColorSpace
YUV colorspace type.
@ AVCOL_SPC_BT709
also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / derived in SMPTE RP 177 Annex B
#define QSV_RUNTIME_VERSION_ATLEAST(MFX_VERSION, MAJOR, MINOR)
AVFrame * ff_qsvvpp_get_video_buffer(AVFilterLink *inlink, int w, int h)
int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *picref, AVFrame *propref)
int ff_qsvvpp_close(AVFilterContext *avctx)
int ff_qsvvpp_init(AVFilterContext *avctx, QSVVPPParam *param)
Intel Quick Sync Video VPP base function.
A reference to a data buffer.
uint8_t * data
The data buffer.
Content light level needed by to transmit HDR over HDMI (CTA-861.3).
unsigned MaxFALL
Max average light level per frame (cd/m^2).
unsigned MaxCLL
Max content light level (cd/m^2).
A link between two filters.
int w
agreed upon image width
int h
agreed upon image height
AVFilterContext * src
source filter
AVRational time_base
Define the time base used by the PTS of the frames/samples which will pass through this link.
AVFilterContext * dst
dest filter
int format
agreed upon media format
A filter pad used for either input or output.
Structure to hold side data for an AVFrame.
This structure describes decoded (raw) audio or video data.
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
enum AVColorPrimaries color_primaries
enum AVColorRange color_range
MPEG vs JPEG YUV range.
enum AVColorSpace colorspace
YUV colorspace type.
enum AVColorTransferCharacteristic color_trc
int64_t duration
Duration of the frame, in the same units as pts.
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
void * hwctx
The format-specific data, allocated and freed by libavutil along with this context.
This struct describes a set or pool of "hardware" frames (i.e.
AVBufferRef * device_ref
A reference to the parent AVHWDeviceContext.
This struct is allocated as AVHWDeviceContext.hwctx.
Rational number (pair of numerator and denominator).
Link properties exposed to filter code, but not external callers.
AVRational frame_rate
Frame rate of the stream on the link, or 1/0 if unknown or variable.
AVBufferRef * hw_frames_ctx
For hwaccel pixel formats, this should be a reference to the AVHWFramesContext describing the frames.
int(* set_frame_ext_params)(AVFilterContext *ctx, const AVFrame *in, AVFrame *out, QSVVPPFrameParam *fp)
callback
int(* filter_frame)(AVFilterLink *outlink, AVFrame *frame)
enum AVPixelFormat out_sw_format
mfxExtVPPRotation rotation_conf
char * color_transfer_str
mfxExtVPPDeinterlacing deinterlace_conf
enum AVPixelFormat out_format
Output sw format.
mfxExtVPPFrameRateConversion frc_conf
char * color_primaries_str
The color properties for output.
mfxExtVPPProcAmp procamp_conf
enum AVColorSpace color_matrix
enum AVColorTransferCharacteristic color_transfer
mfxExtVPPDenoise denoise_conf
enum AVColorPrimaries color_primaries
int out_width
New dimensions.
mfxExtVPPScaling scale_conf
mfxExtVPPMirroring mirroring_conf
mfxExtVPPDetail detail_conf
static enum AVPixelFormat in_pix_fmts[]
static enum AVPixelFormat out_pix_fmts[]
@ VAR_CY
Y coordinate for current point.
@ VAR_CX
X coordinate for current point.
static void tonemap(TonemapContext *s, AVFrame *out, const AVFrame *in, const AVPixFmtDescriptor *desc, int x, int y, double peak)
static av_cold int vpp_init(AVFilterContext *ctx)
static mfxStatus get_mfx_version(const AVFilterContext *ctx, mfxVersion *mfx_version)
#define INIT_MFX_EXTBUF(extbuf, id)
static int config_input(AVFilterLink *inlink)
static const AVFilterPad vpp_inputs[]
#define CALC_EXPR(e, v, i, d)
static const AVFilterPad vpp_outputs[]
static av_cold void vpp_uninit(AVFilterContext *ctx)
static int eval_expr(AVFilterContext *ctx)
static int activate(AVFilterContext *ctx)
static av_cold int vpp_preinit(AVFilterContext *ctx)
#define DEFINE_QSV_FILTER(x, sn, ln, fmts)
static int config_output(AVFilterLink *outlink)
#define ENH_FILTERS_COUNT
#define SET_MFX_PARAM_FIELD(extbuf, field, value)
static int vpp_set_frame_ext_params(AVFilterContext *ctx, const AVFrame *in, AVFrame *out, QSVVPPFrameParam *fp)
#define STRING_OPTION(var_name, func_name, default_value)