[PATCH 3/5] winegstreamer: Split the implementation of source_get_media_type().
Zebediah Figura
z.figura12 at gmail.com
Fri Jan 24 19:55:08 CST 2020
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/winegstreamer/gstdemux.c | 54 +++++++++++++++++++++++++++++------
1 file changed, 45 insertions(+), 9 deletions(-)
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c
index 47eb30383b6..625d9f31cd4 100644
--- a/dlls/winegstreamer/gstdemux.c
+++ b/dlls/winegstreamer/gstdemux.c
@@ -76,6 +76,7 @@ struct gstdemux
BOOL (*init_gst)(struct gstdemux *filter);
HRESULT (*source_query_accept)(struct gstdemux_source *pin, const AM_MEDIA_TYPE *mt);
+ HRESULT (*source_get_media_type)(struct gstdemux_source *pin, unsigned int index, AM_MEDIA_TYPE *mt);
};
struct gstdemux_source
@@ -1537,6 +1538,15 @@ static HRESULT gstdecoder_source_query_accept(struct gstdemux_source *pin, const
return S_OK;
}
+static HRESULT gstdecoder_source_get_media_type(struct gstdemux_source *pin,
+ unsigned int index, AM_MEDIA_TYPE *mt)
+{
+ if (index > 0)
+ return VFW_S_NO_MORE_ITEMS;
+ CopyMediaType(mt, &pin->mt);
+ return S_OK;
+}
+
IUnknown * CALLBACK Gstreamer_Splitter_create(IUnknown *outer, HRESULT *phr)
{
struct gstdemux *object;
@@ -1562,6 +1572,7 @@ IUnknown * CALLBACK Gstreamer_Splitter_create(IUnknown *outer, HRESULT *phr)
object->error_event = CreateEventW(NULL, TRUE, FALSE, NULL);
object->init_gst = gstdecoder_init_gst;
object->source_query_accept = gstdecoder_source_query_accept;
+ object->source_get_media_type = gstdecoder_source_get_media_type;
*phr = S_OK;
TRACE("Created GStreamer demuxer %p.\n", object);
@@ -1873,16 +1884,11 @@ static HRESULT source_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TY
return filter->source_query_accept(pin, mt);
}
-static HRESULT source_get_media_type(struct strmbase_pin *iface, unsigned int iPosition, AM_MEDIA_TYPE *pmt)
+static HRESULT source_get_media_type(struct strmbase_pin *iface, unsigned int index, AM_MEDIA_TYPE *mt)
{
- struct gstdemux_source *This = impl_source_from_IPin(&iface->IPin_iface);
-
- if (iPosition > 0)
- return VFW_S_NO_MORE_ITEMS;
-
- CopyMediaType(pmt, &This->mt);
-
- return S_OK;
+ struct gstdemux_source *pin = impl_source_from_IPin(&iface->IPin_iface);
+ struct gstdemux *filter = impl_from_strmbase_filter(iface->filter);
+ return filter->source_get_media_type(pin, index, mt);
}
static HRESULT WINAPI GSTOutPin_DecideBufferSize(struct strmbase_source *iface,
@@ -2268,6 +2274,15 @@ static HRESULT wave_parser_source_query_accept(struct gstdemux_source *pin, cons
return compare_media_types(mt, &pin->mt) ? S_OK : S_FALSE;
}
+static HRESULT wave_parser_source_get_media_type(struct gstdemux_source *pin,
+ unsigned int index, AM_MEDIA_TYPE *mt)
+{
+ if (index > 0)
+ return VFW_S_NO_MORE_ITEMS;
+ CopyMediaType(mt, &pin->mt);
+ return S_OK;
+}
+
IUnknown * CALLBACK wave_parser_create(IUnknown *outer, HRESULT *phr)
{
static const WCHAR sink_name[] = {'i','n','p','u','t',' ','p','i','n',0};
@@ -2292,6 +2307,7 @@ IUnknown * CALLBACK wave_parser_create(IUnknown *outer, HRESULT *phr)
object->init_gst = wave_parser_init_gst;
object->error_event = CreateEventW(NULL, TRUE, FALSE, NULL);
object->source_query_accept = wave_parser_source_query_accept;
+ object->source_get_media_type = wave_parser_source_get_media_type;
*phr = S_OK;
TRACE("Created WAVE parser %p.\n", object);
@@ -2380,6 +2396,15 @@ static HRESULT avi_splitter_source_query_accept(struct gstdemux_source *pin, con
return compare_media_types(mt, &pin->mt) ? S_OK : S_FALSE;
}
+static HRESULT avi_splitter_source_get_media_type(struct gstdemux_source *pin,
+ unsigned int index, AM_MEDIA_TYPE *mt)
+{
+ if (index > 0)
+ return VFW_S_NO_MORE_ITEMS;
+ CopyMediaType(mt, &pin->mt);
+ return S_OK;
+}
+
IUnknown * CALLBACK avi_splitter_create(IUnknown *outer, HRESULT *phr)
{
static const WCHAR sink_name[] = {'i','n','p','u','t',' ','p','i','n',0};
@@ -2405,6 +2430,7 @@ IUnknown * CALLBACK avi_splitter_create(IUnknown *outer, HRESULT *phr)
object->error_event = CreateEventW(NULL, TRUE, FALSE, NULL);
object->init_gst = avi_splitter_init_gst;
object->source_query_accept = avi_splitter_source_query_accept;
+ object->source_get_media_type = avi_splitter_source_get_media_type;
*phr = S_OK;
TRACE("Created AVI splitter %p.\n", object);
@@ -2503,6 +2529,15 @@ static HRESULT mpeg_splitter_source_query_accept(struct gstdemux_source *pin, co
return compare_media_types(mt, &pin->mt) ? S_OK : S_FALSE;
}
+static HRESULT mpeg_splitter_source_get_media_type(struct gstdemux_source *pin,
+ unsigned int index, AM_MEDIA_TYPE *mt)
+{
+ if (index > 0)
+ return VFW_S_NO_MORE_ITEMS;
+ CopyMediaType(mt, &pin->mt);
+ return S_OK;
+}
+
static HRESULT mpeg_splitter_query_interface(struct strmbase_filter *iface, REFIID iid, void **out)
{
struct gstdemux *filter = impl_from_strmbase_filter(iface);
@@ -2556,6 +2591,7 @@ IUnknown * CALLBACK mpeg_splitter_create(IUnknown *outer, HRESULT *phr)
object->error_event = CreateEventW(NULL, TRUE, FALSE, NULL);
object->init_gst = mpeg_splitter_init_gst;
object->source_query_accept = mpeg_splitter_source_query_accept;
+ object->source_get_media_type = mpeg_splitter_source_get_media_type;
object->enum_sink_first = TRUE;
*phr = S_OK;
--
2.25.0
More information about the wine-devel
mailing list