From: Paul Gofman pgofman@codeweavers.com
--- dlls/winegstreamer/media_source.c | 1 + dlls/winegstreamer/unixlib.h | 1 + dlls/winegstreamer/wg_parser.c | 33 +++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+)
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c index 59047a5ef82..542189b28f5 100644 --- a/dlls/winegstreamer/media_source.c +++ b/dlls/winegstreamer/media_source.c @@ -1489,6 +1489,7 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_ tags[] = { {WG_PARSER_TAG_LANGUAGE, &MF_SD_LANGUAGE}, + {WG_PARSER_TAG_NAME, &MF_SD_STREAM_NAME}, }; unsigned int j; WCHAR *strW; diff --git a/dlls/winegstreamer/unixlib.h b/dlls/winegstreamer/unixlib.h index f048426b27a..2b5b8af37d5 100644 --- a/dlls/winegstreamer/unixlib.h +++ b/dlls/winegstreamer/unixlib.h @@ -255,6 +255,7 @@ struct wg_parser_stream_get_duration_params enum wg_parser_tag { WG_PARSER_TAG_LANGUAGE, + WG_PARSER_TAG_NAME, WG_PARSER_TAG_COUNT };
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c index dc98901c226..d2db1f039e4 100644 --- a/dlls/winegstreamer/wg_parser.c +++ b/dlls/winegstreamer/wg_parser.c @@ -1275,14 +1275,47 @@ static gboolean src_event_cb(GstPad *pad, GstObject *parent, GstEvent *event)
static void query_tags(struct wg_parser_stream *stream) { + const gchar *struct_name; GstTagList *tag_list; GstEvent *tag_event; + guint i, tag_count; + const GValue *val; + GstSample *sample; + GstBuffer *buf; + gsize size;
if (!(tag_event = gst_pad_get_sticky_event(stream->their_src, GST_EVENT_TAG, 0))) return;
gst_event_parse_tag(tag_event, &tag_list); gst_tag_list_get_string(tag_list, "language-code", &stream->tags[WG_PARSER_TAG_LANGUAGE]); + + /* Extract stream name from Quick Time demuxer private tag where it puts unrecognized chunks. */ + tag_count = gst_tag_list_get_tag_size(tag_list, "private-qt-tag"); + for (i = 0; i < tag_count; ++i) + { + if (!(val = gst_tag_list_get_value_index(tag_list, "private-qt-tag", i))) + continue; + if (!GST_VALUE_HOLDS_SAMPLE(val) || !(sample = gst_value_get_sample(val))) + continue; + struct_name = gst_structure_get_name(gst_sample_get_info(sample)); + if (!struct_name || strcmp(struct_name, "application/x-gst-qt-name-tag")) + continue; + if (!(buf = gst_sample_get_buffer(sample))) + continue; + if ((size = gst_buffer_get_size(buf)) < 8) + continue; + size -= 8; + if (!(stream->tags[WG_PARSER_TAG_NAME] = g_malloc(size + 1))) + continue; + if (gst_buffer_extract(buf, 8, stream->tags[WG_PARSER_TAG_NAME], size) != size) + { + g_free(stream->tags[WG_PARSER_TAG_NAME]); + stream->tags[WG_PARSER_TAG_NAME] = NULL; + continue; + } + stream->tags[WG_PARSER_TAG_NAME][size] = 0; + } gst_event_unref(tag_event); }