[MPlayer-dev-eng] [PATCH] vf_scale: add generic libswscale options support.
Reimar Döffinger
Reimar.Doeffinger at gmx.de
Sat Sep 5 18:08:52 EEST 2020
Allows setting any of the options exposed by libswscale,
in particular for example source and destination colorspace
range.
---
DOCS/man/en/mplayer.1 | 5 +++++
av_opts.c | 6 ++++++
cfg-common.h | 1 +
libmpcodecs/vf_scale.c | 25 ++++++++++++++++++++++++-
libmpcodecs/vf_scale.h | 1 +
5 files changed, 37 insertions(+), 1 deletion(-)
diff --git a/DOCS/man/en/mplayer.1 b/DOCS/man/en/mplayer.1
index 7c01ca2c8..8e28024de 100644
--- a/DOCS/man/en/mplayer.1
+++ b/DOCS/man/en/mplayer.1
@@ -5405,6 +5405,11 @@ The description of the scale video filter has further information.
.RE
.
.TP
+.B \-swsopts <software scaler options>
+Specify advanced software scaler options provided by libswscale.
+Set to "help" to get a list of supported options.
+.
+.TP
.B \-vc <[\-|+]codec1,[\-|+]codec2,...[,]>
Specify a priority list of video codecs to be used, according to their codec
name in codecs.conf.
diff --git a/av_opts.c b/av_opts.c
index e10e92e90..30e049db2 100644
--- a/av_opts.c
+++ b/av_opts.c
@@ -30,6 +30,12 @@ int parse_avopts(void *v, char *str){
if (!v)
return -1;
+ if (!str)
+ return 0;
+ if (strcmp(str, "help") == 0) {
+ av_opt_show2(v, NULL, -1, 0);
+ return -1;
+ }
start= str= strdup(str);
diff --git a/cfg-common.h b/cfg-common.h
index ca4e9c9cb..bfb815790 100644
--- a/cfg-common.h
+++ b/cfg-common.h
@@ -521,6 +521,7 @@ const m_option_t common_opts[] = {
// scaling:
{"sws", &sws_flags, CONF_TYPE_INT, 0, 0, 2, NULL},
+ {"swsopts", &sws_opts, CONF_TYPE_STRING, 0, 0, 0, NULL},
{"ssf", scaler_filter_conf, CONF_TYPE_SUBCONFIG, 0, 0, 0, NULL},
{"zoom", &softzoom, CONF_TYPE_FLAG, 0, 0, 1, NULL},
{"nozoom", &softzoom, CONF_TYPE_FLAG, 0, 1, 0, NULL},
diff --git a/libmpcodecs/vf_scale.c b/libmpcodecs/vf_scale.c
index ef50261ea..e48a2ad45 100644
--- a/libmpcodecs/vf_scale.c
+++ b/libmpcodecs/vf_scale.c
@@ -32,9 +32,11 @@
#include "fmt-conversion.h"
#include "mpbswap.h"
+#include "libavutil/opt.h"
#include "libswscale/swscale.h"
#include "vf_scale.h"
+#include "av_opts.h"
#include "m_option.h"
#include "m_struct.h"
@@ -588,6 +590,7 @@ static int vf_open(vf_instance_t *vf, char *args){
//global sws_flags from the command line
int sws_flags=2;
+char *sws_opts;
//global srcFilter
static SwsFilter *src_filter= NULL;
@@ -648,6 +651,7 @@ struct SwsContext *sws_getContextFromCmdLine(int srcW, int srcH, int srcFormat,
{
int flags;
SwsFilter *dstFilterParam, *srcFilterParam;
+ struct SwsContext *ctx;
enum AVPixelFormat dfmt, sfmt;
dfmt = imgfmt2pixfmt(dstFormat);
@@ -655,7 +659,26 @@ struct SwsContext *sws_getContextFromCmdLine(int srcW, int srcH, int srcFormat,
if (srcFormat == IMGFMT_RGB8 || srcFormat == IMGFMT_BGR8) sfmt = AV_PIX_FMT_PAL8;
sws_getFlagsAndFilterFromCmdLine(&flags, &srcFilterParam, &dstFilterParam);
- return sws_getContext(srcW, srcH, sfmt, dstW, dstH, dfmt, flags, srcFilterParam, dstFilterParam, NULL);
+ ctx = sws_alloc_context();
+ if (!ctx) return NULL;
+ // set it first to allow swsopts to override/add to it
+ av_opt_set_int(ctx, "sws_flags", flags, 0);
+ if (parse_avopts(ctx, sws_opts) < 0) {
+ mp_msg(MSGT_VFILTER, MSGL_ERR, "Your options /%s/ look like gibberish to me pal.\n", sws_opts);
+ return NULL;
+ }
+ // always override these
+ av_opt_set_int(ctx, "srcw", srcW, 0);
+ av_opt_set_int(ctx, "srch", srcH, 0);
+ av_opt_set_int(ctx, "src_format", sfmt, 0);
+ av_opt_set_int(ctx, "dstw", dstW, 0);
+ av_opt_set_int(ctx, "dsth", dstH, 0);
+ av_opt_set_int(ctx, "dst_format", dfmt, 0);
+ if (sws_init_context(ctx, srcFilterParam, dstFilterParam) < 0) {
+ sws_freeContext(ctx);
+ return NULL;
+ }
+ return ctx;
}
/// An example of presets usage
diff --git a/libmpcodecs/vf_scale.h b/libmpcodecs/vf_scale.h
index 4de3b48ec..5890b5713 100644
--- a/libmpcodecs/vf_scale.h
+++ b/libmpcodecs/vf_scale.h
@@ -28,6 +28,7 @@ extern float sws_chr_sharpen;
extern float sws_lum_sharpen;
extern int sws_flags;
+extern char *sws_opts;
struct SwsContext *sws_getContextFromCmdLine(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat);
--
2.28.0
More information about the MPlayer-dev-eng
mailing list