mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-06 08:54:05 +00:00
winegstreamer: Extract stream name from QT demuxer private data.
This commit is contained in:
parent
3dd56dd606
commit
05c99cd6da
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue