From: Rémi Bernon rbernon@codeweavers.com
And rename it desired_caps as this is the caps that has been requested, not necessarily the current stream caps. --- dlls/winegstreamer/wg_parser.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-)
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c index c017edf3f86..4456dfab332 100644 --- a/dlls/winegstreamer/wg_parser.c +++ b/dlls/winegstreamer/wg_parser.c @@ -107,7 +107,8 @@ struct wg_parser_stream GstPad *my_sink; GstElement *flip, *decodebin; GstSegment segment; - struct wg_format preferred_format, current_format, codec_format; + struct wg_format preferred_format, codec_format; + GstCaps *desired_caps;
pthread_cond_t event_cond, event_empty_cond; GstBuffer *buffer; @@ -246,7 +247,7 @@ static NTSTATUS wg_parser_stream_enable(void *args)
pthread_mutex_lock(&parser->mutex);
- stream->current_format = *format; + stream->desired_caps = wg_format_to_caps(format); stream->enabled = true;
pthread_mutex_unlock(&parser->mutex); @@ -269,7 +270,11 @@ static NTSTATUS wg_parser_stream_disable(void *args)
pthread_mutex_lock(&parser->mutex); stream->enabled = false; - stream->current_format.major_type = WG_MAJOR_TYPE_UNKNOWN; + if (stream->desired_caps) + { + gst_caps_unref(stream->desired_caps); + stream->desired_caps = NULL; + } pthread_mutex_unlock(&parser->mutex); pthread_cond_signal(&stream->event_empty_cond); return S_OK; @@ -728,11 +733,12 @@ static gboolean sink_query_cb(GstPad *pad, GstObject *parent, GstQuery *query) gst_query_parse_caps(query, &filter);
pthread_mutex_lock(&parser->mutex); - caps = wg_format_to_caps(&stream->current_format); - pthread_mutex_unlock(&parser->mutex); - - if (!caps) + if (!stream->desired_caps || !(caps = gst_caps_copy(stream->desired_caps))) + { + pthread_mutex_unlock(&parser->mutex); return FALSE; + } + pthread_mutex_unlock(&parser->mutex);
/* Clear some fields that shouldn't prevent us from connecting. */ for (i = 0; i < gst_caps_get_size(caps); ++i) @@ -755,13 +761,13 @@ static gboolean sink_query_cb(GstPad *pad, GstObject *parent, GstQuery *query)
case GST_QUERY_ACCEPT_CAPS: { - struct wg_format format; + struct wg_format format, current_format; gboolean ret = TRUE; GstCaps *caps;
pthread_mutex_lock(&parser->mutex);
- if (stream->current_format.major_type == WG_MAJOR_TYPE_UNKNOWN) + if (!stream->desired_caps) { pthread_mutex_unlock(&parser->mutex); gst_query_set_accept_caps_result(query, TRUE); @@ -770,7 +776,8 @@ static gboolean sink_query_cb(GstPad *pad, GstObject *parent, GstQuery *query)
gst_query_parse_accept_caps(query, &caps); wg_format_from_caps(&format, caps); - ret = wg_format_compare(&format, &stream->current_format); + wg_format_from_caps(¤t_format, stream->desired_caps); + ret = wg_format_compare(&format, ¤t_format);
pthread_mutex_unlock(&parser->mutex);
@@ -802,7 +809,6 @@ static struct wg_parser_stream *create_stream(struct wg_parser *parser) stream->parser = parser; stream->number = parser->stream_count; stream->no_more_pads = true; - stream->current_format.major_type = WG_MAJOR_TYPE_UNKNOWN; pthread_cond_init(&stream->event_cond, NULL); pthread_cond_init(&stream->event_empty_cond, NULL);
From: Rémi Bernon rbernon@codeweavers.com
And rename it current_caps as this is the actual current stream caps. --- dlls/winegstreamer/wg_parser.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-)
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c index 4456dfab332..3ed9b29ebf6 100644 --- a/dlls/winegstreamer/wg_parser.c +++ b/dlls/winegstreamer/wg_parser.c @@ -107,14 +107,15 @@ struct wg_parser_stream GstPad *my_sink; GstElement *flip, *decodebin; GstSegment segment; - struct wg_format preferred_format, codec_format; + struct wg_format codec_format; + GstCaps *current_caps; GstCaps *desired_caps;
pthread_cond_t event_cond, event_empty_cond; GstBuffer *buffer; GstMapInfo map_info;
- bool flushing, eos, enabled, has_caps, has_tags, has_buffer, no_more_pads; + bool flushing, eos, enabled, has_tags, has_buffer, no_more_pads;
uint64_t duration; gchar *tags[WG_PARSER_TAG_COUNT]; @@ -222,8 +223,13 @@ static NTSTATUS wg_parser_push_data(void *args) static NTSTATUS wg_parser_stream_get_preferred_format(void *args) { const struct wg_parser_stream_get_preferred_format_params *params = args; + struct wg_parser_stream *stream = get_stream(params->stream); + + if (stream->current_caps) + wg_format_from_caps(params->format, stream->current_caps); + else + memset(params->format, 0, sizeof(*params->format));
- *params->format = get_stream(params->stream)->preferred_format; return S_OK; }
@@ -232,9 +238,13 @@ static NTSTATUS wg_parser_stream_get_codec_format(void *args) struct wg_parser_stream_get_codec_format_params *params = args; struct wg_parser_stream *stream = get_stream(params->stream);
- *params->format = format_is_compressed(&stream->codec_format) ? - stream->codec_format : - stream->preferred_format; + if (format_is_compressed(&stream->codec_format)) + *params->format = stream->codec_format; + else if (stream->current_caps) + wg_format_from_caps(params->format, stream->current_caps); + else + memset(params->format, 0, sizeof(*params->format)); + return S_OK; }
@@ -637,8 +647,7 @@ static gboolean sink_event_cb(GstPad *pad, GstObject *parent, GstEvent *event)
gst_event_parse_caps(event, &caps); pthread_mutex_lock(&parser->mutex); - wg_format_from_caps(&stream->preferred_format, caps); - stream->has_caps = true; + stream->current_caps = gst_caps_ref(caps); pthread_mutex_unlock(&parser->mutex); pthread_cond_signal(&parser->init_cond); break; @@ -1627,7 +1636,7 @@ static NTSTATUS wg_parser_connect(void *args) gint64 duration;
/* If we received a buffer, waiting for tags or caps does not make sense anymore. */ - while ((!stream->has_caps || !stream->has_tags) && !parser->error && !stream->has_buffer) + while ((!stream->current_caps || !stream->has_tags) && !parser->error && !stream->has_buffer) pthread_cond_wait(&parser->init_cond, &parser->mutex);
/* GStreamer doesn't actually provide any guarantees about when duration
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/gst_private.h | 2 +- dlls/winegstreamer/main.c | 6 +++--- dlls/winegstreamer/media_source.c | 2 +- dlls/winegstreamer/quartz_parser.c | 16 ++++++++-------- dlls/winegstreamer/unixlib.h | 4 ++-- dlls/winegstreamer/wg_parser.c | 14 +++++++------- dlls/winegstreamer/wm_reader.c | 12 ++++++------ 7 files changed, 28 insertions(+), 28 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h index 78b9c4c3aa0..85991c2efde 100644 --- a/dlls/winegstreamer/gst_private.h +++ b/dlls/winegstreamer/gst_private.h @@ -61,7 +61,7 @@ void wg_parser_push_data(wg_parser_t parser, const void *data, uint32_t size); uint32_t wg_parser_get_stream_count(wg_parser_t parser); wg_parser_stream_t wg_parser_get_stream(wg_parser_t parser, uint32_t index);
-void wg_parser_stream_get_preferred_format(wg_parser_stream_t stream, struct wg_format *format); +void wg_parser_stream_get_current_format(wg_parser_stream_t stream, struct wg_format *format); void wg_parser_stream_get_codec_format(wg_parser_stream_t stream, struct wg_format *format); void wg_parser_stream_enable(wg_parser_stream_t stream, const struct wg_format *format); void wg_parser_stream_disable(wg_parser_stream_t stream); diff --git a/dlls/winegstreamer/main.c b/dlls/winegstreamer/main.c index 91397da8f69..3454ff46226 100644 --- a/dlls/winegstreamer/main.c +++ b/dlls/winegstreamer/main.c @@ -176,9 +176,9 @@ wg_parser_stream_t wg_parser_get_stream(wg_parser_t parser, uint32_t index) return params.stream; }
-void wg_parser_stream_get_preferred_format(wg_parser_stream_t stream, struct wg_format *format) +void wg_parser_stream_get_current_format(wg_parser_stream_t stream, struct wg_format *format) { - struct wg_parser_stream_get_preferred_format_params params = + struct wg_parser_stream_get_current_format_params params = { .stream = stream, .format = format, @@ -186,7 +186,7 @@ void wg_parser_stream_get_preferred_format(wg_parser_stream_t stream, struct wg_
TRACE("stream %#I64x, format %p.\n", stream, format);
- WINE_UNIX_CALL(unix_wg_parser_stream_get_preferred_format, ¶ms); + WINE_UNIX_CALL(unix_wg_parser_stream_get_current_format, ¶ms); }
void wg_parser_stream_get_codec_format(wg_parser_stream_t stream, struct wg_format *format) diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c index d4b7e9a0051..474bc42ae15 100644 --- a/dlls/winegstreamer/media_source.c +++ b/dlls/winegstreamer/media_source.c @@ -1673,7 +1673,7 @@ static HRESULT media_source_create(struct object_context *context, IMFMediaSourc struct media_stream *stream; struct wg_format format;
- wg_parser_stream_get_preferred_format(wg_stream, &format); + wg_parser_stream_get_current_format(wg_stream, &format); if (FAILED(hr = stream_descriptor_create(i, &format, &descriptor))) goto fail; if (FAILED(hr = media_stream_create(&object->IMFMediaSource_iface, descriptor, wg_stream, &stream))) diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c index 2c9fb896b1e..45f30ba8561 100644 --- a/dlls/winegstreamer/quartz_parser.c +++ b/dlls/winegstreamer/quartz_parser.c @@ -1620,7 +1620,7 @@ static HRESULT decodebin_parser_source_get_media_type(struct parser_source *pin, WG_VIDEO_FORMAT_RGB15, };
- wg_parser_stream_get_preferred_format(pin->wg_stream, &format); + wg_parser_stream_get_current_format(pin->wg_stream, &format);
memset(mt, 0, sizeof(AM_MEDIA_TYPE));
@@ -2227,7 +2227,7 @@ static HRESULT wave_parser_source_query_accept(struct parser_source *pin, const AM_MEDIA_TYPE pad_mt; HRESULT hr;
- wg_parser_stream_get_preferred_format(pin->wg_stream, &format); + wg_parser_stream_get_current_format(pin->wg_stream, &format); if (!amt_from_wg_format(&pad_mt, &format, false)) return E_OUTOFMEMORY; hr = compare_media_types(mt, &pad_mt) ? S_OK : S_FALSE; @@ -2242,7 +2242,7 @@ static HRESULT wave_parser_source_get_media_type(struct parser_source *pin,
if (index > 0) return VFW_S_NO_MORE_ITEMS; - wg_parser_stream_get_preferred_format(pin->wg_stream, &format); + wg_parser_stream_get_current_format(pin->wg_stream, &format); if (!amt_from_wg_format(mt, &format, false)) return E_OUTOFMEMORY; return S_OK; @@ -2305,7 +2305,7 @@ static HRESULT avi_splitter_source_query_accept(struct parser_source *pin, const AM_MEDIA_TYPE pad_mt; HRESULT hr;
- wg_parser_stream_get_preferred_format(pin->wg_stream, &format); + wg_parser_stream_get_current_format(pin->wg_stream, &format); if (!amt_from_wg_format(&pad_mt, &format, false)) return E_OUTOFMEMORY; hr = compare_media_types(mt, &pad_mt) ? S_OK : S_FALSE; @@ -2320,7 +2320,7 @@ static HRESULT avi_splitter_source_get_media_type(struct parser_source *pin,
if (index > 0) return VFW_S_NO_MORE_ITEMS; - wg_parser_stream_get_preferred_format(pin->wg_stream, &format); + wg_parser_stream_get_current_format(pin->wg_stream, &format); if (!amt_from_wg_format(mt, &format, false)) return E_OUTOFMEMORY; return S_OK; @@ -2417,7 +2417,7 @@ static BOOL mpeg_splitter_filter_init_gst(struct parser *filter) for (i = 0; i < stream_count; ++i) { stream = wg_parser_get_stream(parser, i); - wg_parser_stream_get_preferred_format(stream, &fmt); + wg_parser_stream_get_current_format(stream, &fmt); if (fmt.major_type == WG_MAJOR_TYPE_VIDEO_MPEG1) { if (!create_pin(filter, wg_parser_get_stream(parser, i), L"Video")) @@ -2444,7 +2444,7 @@ static HRESULT mpeg_splitter_source_query_accept(struct parser_source *pin, cons AM_MEDIA_TYPE pad_mt; HRESULT hr;
- wg_parser_stream_get_preferred_format(pin->wg_stream, &format); + wg_parser_stream_get_current_format(pin->wg_stream, &format); if (!amt_from_wg_format(&pad_mt, &format, false)) return E_OUTOFMEMORY; hr = compare_media_types(mt, &pad_mt) ? S_OK : S_FALSE; @@ -2459,7 +2459,7 @@ static HRESULT mpeg_splitter_source_get_media_type(struct parser_source *pin,
if (index > 0) return VFW_S_NO_MORE_ITEMS; - wg_parser_stream_get_preferred_format(pin->wg_stream, &format); + wg_parser_stream_get_current_format(pin->wg_stream, &format); if (!amt_from_wg_format(mt, &format, false)) return E_OUTOFMEMORY; return S_OK; diff --git a/dlls/winegstreamer/unixlib.h b/dlls/winegstreamer/unixlib.h index a169cac55dd..806a66c42bf 100644 --- a/dlls/winegstreamer/unixlib.h +++ b/dlls/winegstreamer/unixlib.h @@ -225,7 +225,7 @@ struct wg_parser_get_stream_params wg_parser_stream_t stream; };
-struct wg_parser_stream_get_preferred_format_params +struct wg_parser_stream_get_current_format_params { wg_parser_stream_t stream; struct wg_format *format; @@ -393,7 +393,7 @@ enum unix_funcs unix_wg_parser_get_stream_count, unix_wg_parser_get_stream,
- unix_wg_parser_stream_get_preferred_format, + unix_wg_parser_stream_get_current_format, unix_wg_parser_stream_get_codec_format, unix_wg_parser_stream_enable, unix_wg_parser_stream_disable, diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c index 3ed9b29ebf6..7d5dcce83f0 100644 --- a/dlls/winegstreamer/wg_parser.c +++ b/dlls/winegstreamer/wg_parser.c @@ -220,9 +220,9 @@ static NTSTATUS wg_parser_push_data(void *args) return S_OK; }
-static NTSTATUS wg_parser_stream_get_preferred_format(void *args) +static NTSTATUS wg_parser_stream_get_current_format(void *args) { - const struct wg_parser_stream_get_preferred_format_params *params = args; + const struct wg_parser_stream_get_current_format_params *params = args; struct wg_parser_stream *stream = get_stream(params->stream);
if (stream->current_caps) @@ -1875,7 +1875,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] = X(wg_parser_get_stream_count), X(wg_parser_get_stream),
- X(wg_parser_stream_get_preferred_format), + X(wg_parser_stream_get_current_format), X(wg_parser_stream_get_codec_format), X(wg_parser_stream_enable), X(wg_parser_stream_disable), @@ -1950,20 +1950,20 @@ static NTSTATUS wow64_wg_parser_push_data(void *args) { return wg_parser_push_data(¶ms); }
-static NTSTATUS wow64_wg_parser_stream_get_preferred_format(void *args) +static NTSTATUS wow64_wg_parser_stream_get_current_format(void *args) { struct { wg_parser_stream_t stream; PTR32 format; } *params32 = args; - struct wg_parser_stream_get_preferred_format_params params = + struct wg_parser_stream_get_current_format_params params = { .stream = params32->stream, .format = ULongToPtr(params32->format), };
- return wg_parser_stream_get_preferred_format(¶ms); + return wg_parser_stream_get_current_format(¶ms); }
static NTSTATUS wow64_wg_parser_stream_get_codec_format(void *args) @@ -2226,7 +2226,7 @@ const unixlib_entry_t __wine_unix_call_wow64_funcs[] = X(wg_parser_get_stream_count), X(wg_parser_get_stream),
- X64(wg_parser_stream_get_preferred_format), + X64(wg_parser_stream_get_current_format), X64(wg_parser_stream_get_codec_format), X64(wg_parser_stream_enable), X(wg_parser_stream_disable), diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c index fbbb55201a7..e3016b0918b 100644 --- a/dlls/winegstreamer/wm_reader.c +++ b/dlls/winegstreamer/wm_reader.c @@ -1487,7 +1487,7 @@ static HRESULT init_stream(struct wm_reader *reader) stream->reader = reader; stream->index = i; stream->selection = WMT_ON; - wg_parser_stream_get_preferred_format(stream->wg_stream, &stream->format); + wg_parser_stream_get_current_format(stream->wg_stream, &stream->format); if (stream->format.major_type == WG_MAJOR_TYPE_AUDIO) { /* R.U.S.E enumerates available audio types, picks the first one it @@ -1585,7 +1585,7 @@ static HRESULT reinit_stream(struct wm_reader *reader, bool read_compressed)
stream->wg_stream = wg_parser_get_stream(reader->wg_parser, i); stream->reader = reader; - wg_parser_stream_get_preferred_format(stream->wg_stream, &format); + wg_parser_stream_get_current_format(stream->wg_stream, &format); if (stream->selection == WMT_ON) wg_parser_stream_enable(stream->wg_stream, read_compressed ? &format : &stream->format); } @@ -2000,7 +2000,7 @@ static HRESULT WINAPI reader_GetOutputFormat(IWMSyncReader2 *iface, return E_INVALIDARG; }
- wg_parser_stream_get_preferred_format(stream->wg_stream, &format); + wg_parser_stream_get_current_format(stream->wg_stream, &format);
switch (format.major_type) { @@ -2061,7 +2061,7 @@ static HRESULT WINAPI reader_GetOutputFormatCount(IWMSyncReader2 *iface, DWORD o return E_INVALIDARG; }
- wg_parser_stream_get_preferred_format(stream->wg_stream, &format); + wg_parser_stream_get_current_format(stream->wg_stream, &format); switch (format.major_type) { case WG_MAJOR_TYPE_VIDEO: @@ -2312,7 +2312,7 @@ static HRESULT WINAPI reader_SetOutputProps(IWMSyncReader2 *iface, DWORD output, return E_INVALIDARG; }
- wg_parser_stream_get_preferred_format(stream->wg_stream, &pref_format); + wg_parser_stream_get_current_format(stream->wg_stream, &pref_format); if (pref_format.major_type != format.major_type) { /* R.U.S.E sets the type of the wrong stream, apparently by accident. */ @@ -2498,7 +2498,7 @@ static HRESULT WINAPI reader_SetStreamsSelected(IWMSyncReader2 *iface, if (stream->read_compressed) { struct wg_format format; - wg_parser_stream_get_preferred_format(stream->wg_stream, &format); + wg_parser_stream_get_current_format(stream->wg_stream, &format); wg_parser_stream_enable(stream->wg_stream, &format); } else
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/wg_parser.c | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-)
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c index 7d5dcce83f0..431a8b74cb2 100644 --- a/dlls/winegstreamer/wg_parser.c +++ b/dlls/winegstreamer/wg_parser.c @@ -107,7 +107,7 @@ struct wg_parser_stream GstPad *my_sink; GstElement *flip, *decodebin; GstSegment segment; - struct wg_format codec_format; + GstCaps *codec_caps; GstCaps *current_caps; GstCaps *desired_caps;
@@ -131,11 +131,17 @@ static struct wg_parser_stream *get_stream(wg_parser_stream_t stream) return (struct wg_parser_stream *)(ULONG_PTR)stream; }
-static bool format_is_compressed(struct wg_format *format) +static bool caps_is_compressed(GstCaps *caps) { - return format->major_type != WG_MAJOR_TYPE_UNKNOWN - && format->major_type != WG_MAJOR_TYPE_VIDEO - && format->major_type != WG_MAJOR_TYPE_AUDIO; + struct wg_format format; + + if (!caps) + return false; + wg_format_from_caps(&format, caps); + + return format.major_type != WG_MAJOR_TYPE_UNKNOWN + && format.major_type != WG_MAJOR_TYPE_VIDEO + && format.major_type != WG_MAJOR_TYPE_AUDIO; }
static NTSTATUS wg_parser_get_stream_count(void *args) @@ -238,8 +244,8 @@ static NTSTATUS wg_parser_stream_get_codec_format(void *args) struct wg_parser_stream_get_codec_format_params *params = args; struct wg_parser_stream *stream = get_stream(params->stream);
- if (format_is_compressed(&stream->codec_format)) - *params->format = stream->codec_format; + if (caps_is_compressed(stream->codec_caps)) + wg_format_from_caps(params->format, stream->codec_caps); else if (stream->current_caps) wg_format_from_caps(params->format, stream->current_caps); else @@ -519,11 +525,7 @@ static bool parser_no_more_pads(struct wg_parser *parser)
static gboolean autoplug_continue_cb(GstElement * decodebin, GstPad *pad, GstCaps * caps, gpointer user) { - struct wg_format format; - - wg_format_from_caps(&format, caps); - - return !format_is_compressed(&format); + return !caps_is_compressed(caps); }
static GstAutoplugSelectResult autoplug_select_cb(GstElement *bin, GstPad *pad, @@ -980,7 +982,6 @@ static void pad_added_cb(GstElement *element, GstPad *pad, gpointer user) { struct wg_parser_stream *stream; struct wg_parser *parser = user; - GstCaps *caps;
GST_LOG("parser %p, element %p, pad %p.", parser, element, pad);
@@ -989,13 +990,10 @@ static void pad_added_cb(GstElement *element, GstPad *pad, gpointer user)
if (!(stream = create_stream(parser))) return; - - caps = gst_pad_query_caps(pad, NULL); - wg_format_from_caps(&stream->codec_format, caps); - gst_caps_unref(caps); + stream->codec_caps = gst_pad_query_caps(pad, NULL);
/* For compressed stream, create an extra decodebin to decode it. */ - if (!parser->output_compressed && format_is_compressed(&stream->codec_format)) + if (!parser->output_compressed && caps_is_compressed(stream->codec_caps)) { if (!stream_decodebin_create(stream)) {