Index: libavformat/matroskadec.c =================================================================== --- libavformat/matroskadec.c (revision 19123) +++ libavformat/matroskadec.c (working copy) @@ -991,12 +991,19 @@ char key[1024]; int i; +// if(list->nb_elem > 0) +// printf("\nmatroska_convert_tag() # of elements: %u\n", list->nb_elem); + for (i=0; i < list->nb_elem; i++) { const char *lang = strcmp(tags[i].lang, "und") ? tags[i].lang : NULL; - if (prefix) snprintf(key, sizeof(key), "%s/%s", prefix, tags[i].name); - else av_strlcpy(key, tags[i].name, sizeof(key)); + if (prefix) { + snprintf(key, sizeof(key), "%s/%s", prefix, tags[i].name); + } else { + av_strlcpy(key, tags[i].name, sizeof(key)); + } + if (tags[i].def || !lang) { - av_metadata_set(metadata, key, tags[i].string); + av_metadata_set(metadata, key, tags[i].string); if (tags[i].sub.nb_elem) matroska_convert_tag(s, &tags[i].sub, metadata, key); } @@ -1016,6 +1023,7 @@ MatroskaTags *tags = matroska->tags.elem; int i, j; +// printf("matroska_convert_tags() total num. elements: %i\n", matroska->tags.nb_elem); for (i=0; i < matroska->tags.nb_elem; i++) { if (tags[i].target.attachuid) { MatroskaAttachement *attachment = matroska->attachments.elem; @@ -1037,6 +1045,9 @@ &track[j].stream->metadata, NULL); } else { matroska_convert_tag(s, &tags[i].tag, &s->metadata, NULL); + if(tags[i].target.typevalue) { + matroska_convert_tag(s, &tags[i].tag, &s->metadata, tags[i].target.type); + } } } } Index: libavformat/metadata.c =================================================================== --- libavformat/metadata.c (revision 19123) +++ libavformat/metadata.c (working copy) @@ -26,6 +26,8 @@ av_metadata_get(AVMetadata *m, const char *key, const AVMetadataTag *prev, int flags) { unsigned int i, j; + +// printf("av_metadata_get()\n"); if(!m) return NULL; @@ -50,6 +52,9 @@ { AVMetadata *m= *pm; AVMetadataTag *tag= av_metadata_get(m, key, NULL, AV_METADATA_MATCH_CASE); + +// printf("av_metadata_set()\n"); +// printf("key: %s value: %s\n", key, value); if(!m) m=*pm= av_mallocz(sizeof(*m)); @@ -74,6 +79,8 @@ av_free(m->elems); av_freep(pm); } + +// printf("num flags %i\n", m->count); return 0; } @@ -102,19 +109,26 @@ AVMetadata *dst = NULL; const char *key; +// printf("metadata_conv()\n"); + while((mtag=av_metadata_get(*pm, "", mtag, AV_METADATA_IGNORE_SUFFIX))) { key = mtag->key; + +// printf("metadata_conv() key: %s\n", key); + if (s_conv != d_conv) { if (s_conv) for (sc=s_conv; sc->native; sc++) if (!strcasecmp(key, sc->native)) { key = sc->generic; +// printf("generic key: %s\n", key); break; } if (d_conv) for (dc=d_conv; dc->native; dc++) if (!strcasecmp(key, dc->generic)) { key = dc->native; +// printf("native key: %s\n", key); break; } } @@ -127,6 +141,9 @@ void av_metadata_conv(AVFormatContext *ctx, const AVMetadataConv *d_conv, const AVMetadataConv *s_conv) { + +// printf("av_metadata_conv()\n"); + int i; metadata_conv(&ctx->metadata, d_conv, s_conv); for (i=0; inb_streams ; i++) Index: libmpdemux/demux_lavf.c =================================================================== --- libmpdemux/demux_lavf.c (revision 29351) +++ libmpdemux/demux_lavf.c (working copy) @@ -421,6 +421,7 @@ static demuxer_t* demux_open_lavf(demuxer_t *demuxer){ AVFormatContext *avfc; AVFormatParameters ap; + AVMetadataTag *tag; const AVOption *opt; lavf_priv_t *priv= demuxer->priv; int i; @@ -486,6 +487,34 @@ // if(avfc->track ) demux_info_add(demuxer, "track" , avfc->track ); if(avfc->genre [0]) demux_info_add(demuxer, "genre" , avfc->genre ); + tag = av_metadata_get(avfc->metadata, "collection/title" , NULL, 0); + if(tag && tag->value) + demux_info_add(demuxer, "collection/title" , tag->value ); + + tag = av_metadata_get(avfc->metadata, "collection/production_studio" , NULL, 0); + if(tag && tag->value) + demux_info_add(demuxer, "collection/production_studio" , tag->value ); + + tag = av_metadata_get(avfc->metadata, "collection/date_release" , NULL, 0); + if(tag && tag->value) + demux_info_add(demuxer, "collection/date_release" , tag->value ); + + tag = av_metadata_get(avfc->metadata, "season/date_release" , NULL, 0); + if(tag && tag->value) + demux_info_add(demuxer, "season/date_release" , tag->value ); + + tag = av_metadata_get(avfc->metadata, "season/part_number" , NULL, 0); + if(tag && tag->value) + demux_info_add(demuxer, "season/part_number" , tag->value ); + + tag = av_metadata_get(avfc->metadata, "episode/title" , NULL, 0); + if(tag && tag->value) + demux_info_add(demuxer, "episode/title" , tag->value ); + + tag = av_metadata_get(avfc->metadata, "episode/part_number" , NULL, 0); + if(tag && tag->value) + demux_info_add(demuxer, "episode/part_number" , tag->value ); + for(i=0; i < avfc->nb_chapters; i++) { AVChapter *c = avfc->chapters[i]; uint64_t start = av_rescale_q(c->start, c->time_base, (AVRational){1,1000});