diff options
author | James Almer <jamrial@gmail.com> | 2018-04-13 19:58:47 -0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2018-04-13 19:58:47 -0300 |
commit | ae7e66fb4b1a256fb79a016b9c585de84ac77339 (patch) | |
tree | 93468125fb915952166dfc881f0e5f6195fe0bf3 /libavfilter/vf_vpp_qsv.c | |
parent | 6f277e1f76121736baf98aedb2bf55d8bb413fa7 (diff) | |
parent | 29a8ed766354c45c9be4b8512c5b2eb25a450cdc (diff) | |
download | ffmpeg-ae7e66fb4b1a256fb79a016b9c585de84ac77339.tar.gz |
Merge commit '29a8ed766354c45c9be4b8512c5b2eb25a450cdc'
* commit '29a8ed766354c45c9be4b8512c5b2eb25a450cdc':
lavf/qsvvpp: bypass vpp if not needed.
Merged-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavfilter/vf_vpp_qsv.c')
-rw-r--r-- | libavfilter/vf_vpp_qsv.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c index bd5fc32299..6be7098ae9 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -27,6 +27,7 @@ #include "libavutil/eval.h" #include "libavutil/avassert.h" #include "libavutil/pixdesc.h" +#include "libavutil/mathematics.h" #include "formats.h" #include "internal.h" @@ -249,6 +250,7 @@ static int config_output(AVFilterLink *outlink) QSVVPPParam param = { NULL }; QSVVPPCrop crop = { 0 }; mfxExtBuffer *ext_buf[ENH_FILTERS_COUNT]; + AVFilterLink *inlink = ctx->inputs[0]; outlink->w = vpp->out_width; outlink->h = vpp->out_height; @@ -320,14 +322,34 @@ static int config_output(AVFilterLink *outlink) param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->procamp_conf; } - return ff_qsvvpp_create(ctx, &vpp->qsv, ¶m); + if (vpp->use_frc || vpp->use_crop || vpp->deinterlace || vpp->denoise || + vpp->detail || vpp->procamp || inlink->w != outlink->w || inlink->h != outlink->h) + return ff_qsvvpp_create(ctx, &vpp->qsv, ¶m); + else { + av_log(ctx, AV_LOG_VERBOSE, "qsv vpp pass through mode.\n"); + if (inlink->hw_frames_ctx) + outlink->hw_frames_ctx = av_buffer_ref(inlink->hw_frames_ctx); + } + + return 0; } static int filter_frame(AVFilterLink *inlink, AVFrame *picref) { - VPPContext *vpp = inlink->dst->priv; + int ret = 0; + AVFilterContext *ctx = inlink->dst; + VPPContext *vpp = inlink->dst->priv; + AVFilterLink *outlink = ctx->outputs[0]; + + if (vpp->qsv) + ret = ff_qsvvpp_filter_frame(vpp->qsv, inlink, picref); + else { + if (picref->pts != AV_NOPTS_VALUE) + picref->pts = av_rescale_q(picref->pts, inlink->time_base, outlink->time_base); + ret = ff_filter_frame(outlink, picref); + } - return ff_qsvvpp_filter_frame(vpp->qsv, inlink, picref); + return ret; } static int query_formats(AVFilterContext *ctx) |