Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHendrik Leppkes <h.leppkes@gmail.com>2016-03-23 00:42:30 +0300
committerHendrik Leppkes <h.leppkes@gmail.com>2017-08-04 20:18:33 +0300
commit50409d3f73a7a2c19d987cb0c60cd593291bf56c (patch)
tree00b4b5a8c86bfa52c383f8ba50ec44ba4a950ec3
parent9063617372d6e7de6d50b46d1e12fe77c3eb9b30 (diff)
matroskadec_haali: basic tag parsing support (global and track)
-rw-r--r--libavformat/matroskadec_haali.c42
1 files changed, 41 insertions, 1 deletions
diff --git a/libavformat/matroskadec_haali.c b/libavformat/matroskadec_haali.c
index 79ed972676..90b64fdca0 100644
--- a/libavformat/matroskadec_haali.c
+++ b/libavformat/matroskadec_haali.c
@@ -853,9 +853,40 @@ static void mkv_process_tags_edition(AVFormatContext *s, ulonglong UID, struct S
}
}
+static void matroska_convert_tag(AVFormatContext *s, Tag *tag,
+ AVDictionary **metadata, char *prefix)
+{
+ const struct SimpleTag *tags = tag->SimpleTags;
+ char key[1024];
+ int i;
+
+ for (i = 0; i < tag->nSimpleTags; i++) {
+ const char *lang = (tags[i].Language[0] && strcmp(tags[i].Language, "und")) ? tags[i].Language : NULL;
+
+ if (!tags[i].Name) {
+ av_log(s, AV_LOG_WARNING, "Skipping invalid tag with no TagName.\n");
+ continue;
+ }
+ if (prefix)
+ snprintf(key, sizeof(key), "%s/%s", prefix, tags[i].Name);
+ else
+ av_strlcpy(key, tags[i].Name, sizeof(key));
+ if (tags[i].Default || !lang) {
+ av_dict_set(metadata, key, tags[i].Value, 0);
+ }
+ if (lang) {
+ av_strlcat(key, "-", sizeof(key));
+ av_strlcat(key, lang, sizeof(key));
+ av_dict_set(metadata, key, tags[i].Value, 0);
+ }
+ }
+ ff_metadata_conv(metadata, NULL, ff_mkv_metadata_conv);
+}
+
static void mkv_process_tags(AVFormatContext *s, Tag *tags, unsigned int tagCount)
{
- unsigned i, j;
+ MatroskaDemuxContext *ctx = (MatroskaDemuxContext *)s->priv_data;
+ unsigned i, j, k;
for (i = 0; i < tagCount; i++) {
Tag *tag = &tags[i];
if (tag->nSimpleTags > 0 && tag->nTargets > 0) {
@@ -867,12 +898,21 @@ static void mkv_process_tags(AVFormatContext *s, Tag *tags, unsigned int tagCoun
/* unsupported */
break;
case TARGET_TRACK:
+ for (k = 0; k < ctx->num_tracks; k++) {
+ if (ctx->tracks[k].info->UID == tag->Targets[j].UID) {
+ matroska_convert_tag(s, tag, &ctx->tracks[k].stream->metadata, NULL);
+ break;
+ }
+ }
break;
case TARGET_EDITION:
mkv_process_tags_edition(s, tag->Targets[j].UID, tag->SimpleTags, tag->nSimpleTags);
break;
}
}
+ } else if (tags->nSimpleTags > 0) {
+ // global tags
+ matroska_convert_tag(s, tag, &s->metadata, NULL);
}
}
}