summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/encode.rst21
-rw-r--r--common/encode.h2
-rw-r--r--common/encode_lavc.c26
3 files changed, 48 insertions, 1 deletions
diff --git a/DOCS/man/encode.rst b/DOCS/man/encode.rst
index 3182f85fcd..2c5bc14ddc 100644
--- a/DOCS/man/encode.rst
+++ b/DOCS/man/encode.rst
@@ -153,3 +153,24 @@ You can encode files from one format/codec to another using this facility.
``--no-ocopy-metadata``
Turns off copying of metadata from input files to output files when
encoding (which is enabled by default).
+
+``--oset-metadata=<metadata-tag[,metadata-tag,...]>``
+ Specifies metadata to include in the output file.
+ Supported keys vary between output formats. For example, Matroska (MKV) and
+ FLAC allow almost arbitrary keys, while support in MP4 and MP3 is more
+ limited.
+
+ .. admonition:: Example
+
+ "``--oset-metadata=title="Output title",comment="Another tag"``"
+ adds a title and a comment to the output file.
+
+``--oremove-metadata=<metadata-tag[,metadata-tag,...]>``
+ Specifies metadata to exclude from the output file when copying from the
+ input file.
+
+ .. admonition:: Example
+
+ "``--oremove-metadata=comment,genre``"
+ excludes copying of the the comment and genre tags to the output
+ file.
diff --git a/common/encode.h b/common/encode.h
index ce5d06873d..047207eea4 100644
--- a/common/encode.h
+++ b/common/encode.h
@@ -50,6 +50,8 @@ struct encode_opts {
int video_first;
int audio_first;
int copy_metadata;
+ char **set_metadata;
+ char **remove_metadata;
};
// interface for mplayer.c
diff --git a/common/encode_lavc.c b/common/encode_lavc.c
index 9c994bfdce..747323878f 100644
--- a/common/encode_lavc.c
+++ b/common/encode_lavc.c
@@ -56,6 +56,8 @@ const struct m_sub_options encode_config = {
OPT_FLAG("ovfirst", video_first, M_OPT_FIXED),
OPT_FLAG("oafirst", audio_first, M_OPT_FIXED),
OPT_FLAG("ocopy-metadata", copy_metadata, M_OPT_FIXED),
+ OPT_KEYVALUELIST("oset-metadata", set_metadata, M_OPT_FIXED),
+ OPT_STRINGLIST("oremove-metadata", remove_metadata, M_OPT_FIXED),
{0}
},
.size = sizeof(struct encode_opts),
@@ -278,8 +280,30 @@ struct encode_lavc_context *encode_lavc_init(struct encode_opts *options,
void encode_lavc_set_metadata(struct encode_lavc_context *ctx,
struct mp_tags *metadata)
{
- if (ctx->options->copy_metadata)
+ if (ctx->options->copy_metadata) {
ctx->metadata = metadata;
+ } else {
+ ctx->metadata = talloc_zero(ctx, struct mp_tags);
+ }
+
+ if (ctx->options->set_metadata) {
+ char **kv = ctx->options->set_metadata;
+ // Set all user-provided metadata tags
+ for (int n = 0; kv[n * 2]; n++) {
+ MP_VERBOSE(ctx, "setting metadata value '%s' for key '%s'\n",
+ kv[n*2 + 0], kv[n*2 +1]);
+ mp_tags_set_str(ctx->metadata, kv[n*2 + 0], kv[n*2 +1]);
+ }
+ }
+
+ if (ctx->options->remove_metadata) {
+ char **k = ctx->options->remove_metadata;
+ // Remove all user-provided metadata tags
+ for (int n = 0; k[n]; n++) {
+ MP_VERBOSE(ctx, "removing metadata key '%s'\n", k[n]);
+ mp_tags_remove_str(ctx->metadata, k[n]);
+ }
+ }
}
int encode_lavc_start(struct encode_lavc_context *ctx)