Module: wine Branch: master Commit: c38fcd19b38b0ec1d3f556013bc9dc1ebad769bf URL: https://source.winehq.org/git/wine.git/?a=commit;h=c38fcd19b38b0ec1d3f556013...
Author: Zebediah Figura z.figura12@gmail.com Date: Fri Jan 15 17:59:19 2021 -0600
winegstreamer: Explicitly store a GstCaps pointer in the parser_source structure.
gst_pad_get_current_caps() is not guaranteed to return the updated caps when GST_EVENT_CAPS is handled by the event handler, or even after gst_pad_event_default(). The actual implementation of gst_pad_send_event() in fact sets it later. Avoid a potential race condition by using our own caps pointer.
Signed-off-by: Zebediah Figura z.figura12@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/winegstreamer/gstdemux.c | 36 +++++++++++++----------------------- 1 file changed, 13 insertions(+), 23 deletions(-)
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index f30264f1c88..d6b47e871d5 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -83,6 +83,7 @@ struct parser_source GstElement *flip; HANDLE caps_event, eos_event; GstSegment *segment; + GstCaps *caps; SourceSeeking seek; };
@@ -720,9 +721,12 @@ static gboolean event_sink(GstPad *pad, GstObject *parent, GstEvent *event) break; case GST_EVENT_CAPS: { - gboolean ret = gst_pad_event_default(pad, parent, event); + GstCaps *caps; + + gst_event_parse_caps(event, &caps); + gst_caps_replace(&pin->caps, caps); SetEvent(pin->caps_event); - return ret; + break; } default: WARN("Ignoring "%s" event.\n", GST_EVENT_TYPE_NAME(event)); @@ -1712,7 +1716,7 @@ static HRESULT decodebin_parser_source_query_accept(struct parser_source *pin, c static HRESULT decodebin_parser_source_get_media_type(struct parser_source *pin, unsigned int index, AM_MEDIA_TYPE *mt) { - GstCaps *caps = gst_pad_get_current_caps(pin->my_sink); + const GstCaps *caps = pin->caps; const GstStructure *structure; const char *type;
@@ -1744,10 +1748,7 @@ static HRESULT decodebin_parser_source_get_media_type(struct parser_source *pin, if (amt_from_gst_caps(caps, mt)) { if (!index--) - { - gst_caps_unref(caps); return S_OK; - } FreeMediaType(mt); }
@@ -1756,7 +1757,6 @@ static HRESULT decodebin_parser_source_get_media_type(struct parser_source *pin, gint width, height, fps_n, fps_d; GstVideoInfo info;
- gst_caps_unref(caps); gst_structure_get_int(structure, "width", &width); gst_structure_get_int(structure, "height", &height); gst_video_info_set_format(&info, video_formats[index], width, height); @@ -1774,7 +1774,6 @@ static HRESULT decodebin_parser_source_get_media_type(struct parser_source *pin, GstAudioInfo info; gint rate;
- gst_caps_unref(caps); gst_structure_get_int(structure, "rate", &rate); gst_audio_info_set_format(&info, GST_AUDIO_FORMAT_S16LE, rate, 2, NULL); if (!amt_from_gst_audio_info(&info, mt)) @@ -1782,7 +1781,6 @@ static HRESULT decodebin_parser_source_get_media_type(struct parser_source *pin, return S_OK; }
- gst_caps_unref(caps); return VFW_S_NO_MORE_ITEMS; }
@@ -2406,20 +2404,12 @@ static BOOL wave_parser_init_gst(struct parser *filter) return TRUE; }
-static gboolean get_source_amt(const struct parser_source *pin, AM_MEDIA_TYPE *mt) -{ - GstCaps *caps = gst_pad_get_current_caps(pin->my_sink); - gboolean ret = amt_from_gst_caps(caps, mt); - gst_caps_unref(caps); - return ret; -} - static HRESULT wave_parser_source_query_accept(struct parser_source *pin, const AM_MEDIA_TYPE *mt) { AM_MEDIA_TYPE pad_mt; HRESULT hr;
- if (!get_source_amt(pin, &pad_mt)) + if (!amt_from_gst_caps(pin->caps, &pad_mt)) return E_OUTOFMEMORY; hr = compare_media_types(mt, &pad_mt) ? S_OK : S_FALSE; FreeMediaType(&pad_mt); @@ -2431,7 +2421,7 @@ static HRESULT wave_parser_source_get_media_type(struct parser_source *pin, { if (index > 0) return VFW_S_NO_MORE_ITEMS; - if (!get_source_amt(pin, mt)) + if (!amt_from_gst_caps(pin->caps, mt)) return E_OUTOFMEMORY; return S_OK; } @@ -2538,7 +2528,7 @@ static HRESULT avi_splitter_source_query_accept(struct parser_source *pin, const AM_MEDIA_TYPE pad_mt; HRESULT hr;
- if (!get_source_amt(pin, &pad_mt)) + if (!amt_from_gst_caps(pin->caps, &pad_mt)) return E_OUTOFMEMORY; hr = compare_media_types(mt, &pad_mt) ? S_OK : S_FALSE; FreeMediaType(&pad_mt); @@ -2550,7 +2540,7 @@ static HRESULT avi_splitter_source_get_media_type(struct parser_source *pin, { if (index > 0) return VFW_S_NO_MORE_ITEMS; - if (!get_source_amt(pin, mt)) + if (!amt_from_gst_caps(pin->caps, mt)) return E_OUTOFMEMORY; return S_OK; } @@ -2671,7 +2661,7 @@ static HRESULT mpeg_splitter_source_query_accept(struct parser_source *pin, cons AM_MEDIA_TYPE pad_mt; HRESULT hr;
- if (!get_source_amt(pin, &pad_mt)) + if (!amt_from_gst_caps(pin->caps, &pad_mt)) return E_OUTOFMEMORY; hr = compare_media_types(mt, &pad_mt) ? S_OK : S_FALSE; FreeMediaType(&pad_mt); @@ -2683,7 +2673,7 @@ static HRESULT mpeg_splitter_source_get_media_type(struct parser_source *pin, { if (index > 0) return VFW_S_NO_MORE_ITEMS; - if (!get_source_amt(pin, mt)) + if (!amt_from_gst_caps(pin->caps, mt)) return E_OUTOFMEMORY; return S_OK; }