summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2018-04-21 20:33:58 +0200
committerJan Ekström <jeebjp@gmail.com>2018-04-29 02:21:32 +0300
commitbfc33da250e4fdb6bb57bdf051ad666570ae985f (patch)
tree32c1a4c08de75212399e6936f4b8808e33d785fa
parent05e75e794623754f6e1e77ea20f46629bc71882b (diff)
downloadmpv-bfc33da250e4fdb6bb57bdf051ad666570ae985f.tar.bz2
mpv-bfc33da250e4fdb6bb57bdf051ad666570ae985f.tar.xz
encode: get rid of AVDictionary setter helper
Removes a good hunk of weird code. This loses qscale "emulation", some logging, and the fact that duplicate keys for values starting with +/- were added with AV_DICT_APPEND. I don't assign those any importance, even if they are user-visible changes. The new M_OPT_ flag is just so that nothing weird happens for other key-value options, which do not interpret a "help" key specially.
-rw-r--r--common/encode_lavc.c86
-rw-r--r--options/m_option.c3
-rw-r--r--options/m_option.h3
3 files changed, 19 insertions, 73 deletions
diff --git a/common/encode_lavc.c b/common/encode_lavc.c
index 81b12d4936..905c30dc54 100644
--- a/common/encode_lavc.c
+++ b/common/encode_lavc.c
@@ -24,6 +24,7 @@
#include "config.h"
#include "encode_lavc.h"
+#include "common/av_common.h"
#include "common/global.h"
#include "common/msg.h"
#include "common/msg_control.h"
@@ -39,13 +40,13 @@ const struct m_sub_options encode_config = {
.opts = (const m_option_t[]) {
OPT_STRING("o", file, M_OPT_FIXED | CONF_NOCFG | CONF_PRE_PARSE | M_OPT_FILE),
OPT_STRING("of", format, M_OPT_FIXED),
- OPT_STRINGLIST("ofopts", fopts, M_OPT_FIXED),
+ OPT_KEYVALUELIST("ofopts", fopts, M_OPT_FIXED | M_OPT_HAVE_HELP),
OPT_FLOATRANGE("ofps", fps, M_OPT_FIXED, 0.0, 1000000.0),
OPT_FLOATRANGE("omaxfps", maxfps, M_OPT_FIXED, 0.0, 1000000.0),
OPT_STRING("ovc", vcodec, M_OPT_FIXED),
- OPT_STRINGLIST("ovcopts", vopts, M_OPT_FIXED),
+ OPT_KEYVALUELIST("ovcopts", vopts, M_OPT_FIXED | M_OPT_HAVE_HELP),
OPT_STRING("oac", acodec, M_OPT_FIXED),
- OPT_STRINGLIST("oacopts", aopts, M_OPT_FIXED),
+ OPT_KEYVALUELIST("oacopts", aopts, M_OPT_FIXED | M_OPT_HAVE_HELP),
OPT_FLAG("oharddup", harddup, M_OPT_FIXED),
OPT_FLOATRANGE("ovoffset", voffset, M_OPT_FIXED, -1000000.0, 1000000.0,
.deprecation_message = "--audio-delay (once unbroken)"),
@@ -70,49 +71,6 @@ const struct m_sub_options encode_config = {
},
};
-static int set_to_avdictionary(struct encode_lavc_context *ctx,
- AVDictionary **dictp,
- const char *key,
- const char *val)
-{
- char keybuf[1024];
- char valuebuf[1024];
-
- if (key == NULL) {
- // we need to split at equals sign
- const char *equals = strchr(val, '=');
- if (!equals || equals - val >= sizeof(keybuf)) {
- MP_WARN(ctx, "option '%s' does not contain an equals sign\n",
- val);
- return 0;
- }
- memcpy(keybuf, val, equals - val);
- keybuf[equals - val] = 0;
- key = keybuf;
- val = equals + 1;
- }
-
- // hack: support "qscale" key as virtual "global_quality" key that multiplies by QP2LAMBDA
- if (!strcmp(key, "qscale")) {
- key = "global_quality";
- snprintf(valuebuf, sizeof(valuebuf),
- "%.1s(%s)*QP2LAMBDA",
- (val[0] == '+' || val[0] == '-') ? val : "",
- (val[0] == '+' || val[0] == '-') ? val + 1 : val);
- valuebuf[sizeof(valuebuf) - 1] = 0;
- val = valuebuf;
- }
-
- MP_VERBOSE(ctx, "setting value '%s' for key '%s'\n",
- val, key);
-
- if (av_dict_set(dictp, key, *val ? val : NULL,
- (val[0] == '+' || val[0] == '-') ? AV_DICT_APPEND : 0) >= 0)
- return 1;
-
- return 0;
-}
-
static bool value_has_flag(const char *value, const char *flag)
{
bool state = true;
@@ -205,14 +163,7 @@ struct encode_lavc_context *encode_lavc_init(struct encode_opts *options,
ctx->avc->url = av_strdup(filename);
- ctx->foptions = NULL;
- if (ctx->options->fopts) {
- char **p;
- for (p = ctx->options->fopts; *p; ++p) {
- if (!set_to_avdictionary(ctx, &ctx->foptions, NULL, *p))
- MP_WARN(ctx, "could not set option %s\n", *p);
- }
- }
+ mp_set_avdict(&ctx->foptions, ctx->options->fopts);
if (ctx->options->vcodec) {
char *tok;
@@ -476,7 +427,7 @@ static void encode_2pass_prepare(struct encode_lavc_context *ctx,
MP_WARN(ctx, "%s: could not open '%s', "
"disabling 2-pass encoding at pass 2\n", prefix, buf);
codec->flags &= ~AV_CODEC_FLAG_PASS2;
- set_to_avdictionary(ctx, dictp, "flags", "-pass2");
+ av_dict_set(dictp, "flags", "-pass2", AV_DICT_APPEND);
} else {
struct bstr content = stream_read_complete(*bytebuf, NULL,
1000000000);
@@ -499,7 +450,7 @@ static void encode_2pass_prepare(struct encode_lavc_context *ctx,
"%s: could not open '%s', disabling "
"2-pass encoding at pass 1\n",
prefix, ctx->avc->url);
- set_to_avdictionary(ctx, dictp, "flags", "-pass1");
+ av_dict_set(dictp, "flags", "-pass1", AV_DICT_APPEND);
}
}
}
@@ -511,7 +462,6 @@ int encode_lavc_alloc_stream(struct encode_lavc_context *ctx,
AVCodecContext **codec_out)
{
AVDictionaryEntry *de;
- char **p;
*stream_out = NULL;
*codec_out = NULL;
@@ -605,19 +555,14 @@ int encode_lavc_alloc_stream(struct encode_lavc_context *ctx,
ctx->voptions = NULL;
- if (ctx->options->vopts) {
- for (p = ctx->options->vopts; *p; ++p) {
- if (!set_to_avdictionary(ctx, &ctx->voptions, NULL, *p))
- MP_WARN(ctx, "vo-lavc: could not set option %s\n", *p);
- }
- }
+ mp_set_avdict(&ctx->voptions, ctx->options->vopts);
de = av_dict_get(ctx->voptions, "global_quality", NULL, 0);
if (de)
- set_to_avdictionary(ctx, &ctx->voptions, "flags", "+qscale");
+ av_dict_set(&ctx->voptions, "flags", "+qscale", AV_DICT_APPEND);
if (ctx->avc->oformat->flags & AVFMT_GLOBALHEADER)
- set_to_avdictionary(ctx, &ctx->voptions, "flags", "+global_header");
+ av_dict_set(&ctx->voptions, "flags", "+global_header", AV_DICT_APPEND);
encode_2pass_prepare(ctx, &ctx->voptions, ctx->vst, ctx->vcc,
&ctx->twopass_bytebuffer_v,
@@ -642,19 +587,14 @@ int encode_lavc_alloc_stream(struct encode_lavc_context *ctx,
ctx->aoptions = 0;
- if (ctx->options->aopts) {
- for (p = ctx->options->aopts; *p; ++p) {
- if (!set_to_avdictionary(ctx, &ctx->aoptions, NULL, *p))
- MP_WARN(ctx, "ao-lavc: could not set option %s\n", *p);
- }
- }
+ mp_set_avdict(&ctx->aoptions, ctx->options->aopts);
de = av_dict_get(ctx->aoptions, "global_quality", NULL, 0);
if (de)
- set_to_avdictionary(ctx, &ctx->aoptions, "flags", "+qscale");
+ av_dict_set(&ctx->aoptions, "flags", "+qscale", AV_DICT_APPEND);
if (ctx->avc->oformat->flags & AVFMT_GLOBALHEADER)
- set_to_avdictionary(ctx, &ctx->aoptions, "flags", "+global_header");
+ av_dict_set(&ctx->aoptions, "flags", "+global_header", AV_DICT_APPEND);
encode_2pass_prepare(ctx, &ctx->aoptions, ctx->ast, ctx->acc,
&ctx->twopass_bytebuffer_a,
diff --git a/options/m_option.c b/options/m_option.c
index e0dc1b9729..e0f3dc5c76 100644
--- a/options/m_option.c
+++ b/options/m_option.c
@@ -1552,6 +1552,9 @@ static int parse_keyvalue_list(struct mp_log *log, const m_option_t *opt,
bool append = false;
bool full_value = false;
+ if ((opt->flags & M_OPT_HAVE_HELP) && bstr_equals0(param, "help"))
+ param = bstr0("help=");
+
if (bstr_endswith0(name, "-add")) {
append = true;
} else if (bstr_endswith0(name, "-append")) {
diff --git a/options/m_option.h b/options/m_option.h
index 2402405cde..60b7700c6d 100644
--- a/options/m_option.h
+++ b/options/m_option.h
@@ -405,6 +405,9 @@ char *format_file_size(int64_t size);
// Do not add as property.
#define M_OPT_NOPROP (1 << 6)
+// Enable special semantics for some options when parsing the string "help".
+#define M_OPT_HAVE_HELP (1 << 7)
+
// The following are also part of the M_OPT_* flags, and are used to update
// certain groups of options.
#define UPDATE_OPT_FIRST (1 << 7)