mirror of
https://github.com/mpv-player/mpv
synced 2025-01-28 02:23:06 +00:00
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.
This commit is contained in:
parent
05e75e7946
commit
bfc33da250
@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "encode_lavc.h"
|
#include "encode_lavc.h"
|
||||||
|
#include "common/av_common.h"
|
||||||
#include "common/global.h"
|
#include "common/global.h"
|
||||||
#include "common/msg.h"
|
#include "common/msg.h"
|
||||||
#include "common/msg_control.h"
|
#include "common/msg_control.h"
|
||||||
@ -39,13 +40,13 @@ const struct m_sub_options encode_config = {
|
|||||||
.opts = (const m_option_t[]) {
|
.opts = (const m_option_t[]) {
|
||||||
OPT_STRING("o", file, M_OPT_FIXED | CONF_NOCFG | CONF_PRE_PARSE | M_OPT_FILE),
|
OPT_STRING("o", file, M_OPT_FIXED | CONF_NOCFG | CONF_PRE_PARSE | M_OPT_FILE),
|
||||||
OPT_STRING("of", format, M_OPT_FIXED),
|
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("ofps", fps, M_OPT_FIXED, 0.0, 1000000.0),
|
||||||
OPT_FLOATRANGE("omaxfps", maxfps, 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_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_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_FLAG("oharddup", harddup, M_OPT_FIXED),
|
||||||
OPT_FLOATRANGE("ovoffset", voffset, M_OPT_FIXED, -1000000.0, 1000000.0,
|
OPT_FLOATRANGE("ovoffset", voffset, M_OPT_FIXED, -1000000.0, 1000000.0,
|
||||||
.deprecation_message = "--audio-delay (once unbroken)"),
|
.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)
|
static bool value_has_flag(const char *value, const char *flag)
|
||||||
{
|
{
|
||||||
bool state = true;
|
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->avc->url = av_strdup(filename);
|
||||||
|
|
||||||
ctx->foptions = NULL;
|
mp_set_avdict(&ctx->foptions, ctx->options->fopts);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ctx->options->vcodec) {
|
if (ctx->options->vcodec) {
|
||||||
char *tok;
|
char *tok;
|
||||||
@ -476,7 +427,7 @@ static void encode_2pass_prepare(struct encode_lavc_context *ctx,
|
|||||||
MP_WARN(ctx, "%s: could not open '%s', "
|
MP_WARN(ctx, "%s: could not open '%s', "
|
||||||
"disabling 2-pass encoding at pass 2\n", prefix, buf);
|
"disabling 2-pass encoding at pass 2\n", prefix, buf);
|
||||||
codec->flags &= ~AV_CODEC_FLAG_PASS2;
|
codec->flags &= ~AV_CODEC_FLAG_PASS2;
|
||||||
set_to_avdictionary(ctx, dictp, "flags", "-pass2");
|
av_dict_set(dictp, "flags", "-pass2", AV_DICT_APPEND);
|
||||||
} else {
|
} else {
|
||||||
struct bstr content = stream_read_complete(*bytebuf, NULL,
|
struct bstr content = stream_read_complete(*bytebuf, NULL,
|
||||||
1000000000);
|
1000000000);
|
||||||
@ -499,7 +450,7 @@ static void encode_2pass_prepare(struct encode_lavc_context *ctx,
|
|||||||
"%s: could not open '%s', disabling "
|
"%s: could not open '%s', disabling "
|
||||||
"2-pass encoding at pass 1\n",
|
"2-pass encoding at pass 1\n",
|
||||||
prefix, ctx->avc->url);
|
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)
|
AVCodecContext **codec_out)
|
||||||
{
|
{
|
||||||
AVDictionaryEntry *de;
|
AVDictionaryEntry *de;
|
||||||
char **p;
|
|
||||||
|
|
||||||
*stream_out = NULL;
|
*stream_out = NULL;
|
||||||
*codec_out = NULL;
|
*codec_out = NULL;
|
||||||
@ -605,19 +555,14 @@ int encode_lavc_alloc_stream(struct encode_lavc_context *ctx,
|
|||||||
|
|
||||||
ctx->voptions = NULL;
|
ctx->voptions = NULL;
|
||||||
|
|
||||||
if (ctx->options->vopts) {
|
mp_set_avdict(&ctx->voptions, 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
de = av_dict_get(ctx->voptions, "global_quality", NULL, 0);
|
de = av_dict_get(ctx->voptions, "global_quality", NULL, 0);
|
||||||
if (de)
|
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)
|
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,
|
encode_2pass_prepare(ctx, &ctx->voptions, ctx->vst, ctx->vcc,
|
||||||
&ctx->twopass_bytebuffer_v,
|
&ctx->twopass_bytebuffer_v,
|
||||||
@ -642,19 +587,14 @@ int encode_lavc_alloc_stream(struct encode_lavc_context *ctx,
|
|||||||
|
|
||||||
ctx->aoptions = 0;
|
ctx->aoptions = 0;
|
||||||
|
|
||||||
if (ctx->options->aopts) {
|
mp_set_avdict(&ctx->aoptions, 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
de = av_dict_get(ctx->aoptions, "global_quality", NULL, 0);
|
de = av_dict_get(ctx->aoptions, "global_quality", NULL, 0);
|
||||||
if (de)
|
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)
|
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,
|
encode_2pass_prepare(ctx, &ctx->aoptions, ctx->ast, ctx->acc,
|
||||||
&ctx->twopass_bytebuffer_a,
|
&ctx->twopass_bytebuffer_a,
|
||||||
|
@ -1552,6 +1552,9 @@ static int parse_keyvalue_list(struct mp_log *log, const m_option_t *opt,
|
|||||||
bool append = false;
|
bool append = false;
|
||||||
bool full_value = false;
|
bool full_value = false;
|
||||||
|
|
||||||
|
if ((opt->flags & M_OPT_HAVE_HELP) && bstr_equals0(param, "help"))
|
||||||
|
param = bstr0("help=");
|
||||||
|
|
||||||
if (bstr_endswith0(name, "-add")) {
|
if (bstr_endswith0(name, "-add")) {
|
||||||
append = true;
|
append = true;
|
||||||
} else if (bstr_endswith0(name, "-append")) {
|
} else if (bstr_endswith0(name, "-append")) {
|
||||||
|
@ -405,6 +405,9 @@ char *format_file_size(int64_t size);
|
|||||||
// Do not add as property.
|
// Do not add as property.
|
||||||
#define M_OPT_NOPROP (1 << 6)
|
#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
|
// The following are also part of the M_OPT_* flags, and are used to update
|
||||||
// certain groups of options.
|
// certain groups of options.
|
||||||
#define UPDATE_OPT_FIRST (1 << 7)
|
#define UPDATE_OPT_FIRST (1 << 7)
|
||||||
|
Loading…
Reference in New Issue
Block a user