Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfreadwrite/reader.c | 52 ++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 14 deletions(-)
diff --git a/dlls/mfreadwrite/reader.c b/dlls/mfreadwrite/reader.c index 7aa8f65df7a..85aec9aaedc 100644 --- a/dlls/mfreadwrite/reader.c +++ b/dlls/mfreadwrite/reader.c @@ -1906,36 +1906,60 @@ static HRESULT WINAPI src_reader_GetServiceForStream(IMFSourceReader *iface, DWO { struct source_reader *reader = impl_from_IMFSourceReader(iface); IUnknown *obj = NULL; - HRESULT hr; + HRESULT hr = S_OK;
TRACE("%p, %#x, %s, %s, %p\n", iface, index, debugstr_guid(service), debugstr_guid(riid), object);
+ EnterCriticalSection(&reader->cs); + switch (index) { case MF_SOURCE_READER_MEDIASOURCE: obj = (IUnknown *)reader->source; break; default: - FIXME("Unsupported index %#x.\n", index); - return E_NOTIMPL; - } + if (index == MF_SOURCE_READER_FIRST_VIDEO_STREAM) + index = reader->first_video_stream_index; + else if (index == MF_SOURCE_READER_FIRST_AUDIO_STREAM) + index = reader->first_audio_stream_index;
- if (IsEqualGUID(service, &GUID_NULL)) - { - hr = IUnknown_QueryInterface(obj, riid, object); + if (index >= reader->stream_count) + hr = MF_E_INVALIDSTREAMNUMBER; + else + { + obj = (IUnknown *)reader->streams[index].decoder; + if (!obj) hr = E_NOINTERFACE; + } + break; } - else - { - IMFGetService *gs;
- hr = IUnknown_QueryInterface(obj, &IID_IMFGetService, (void **)&gs); - if (SUCCEEDED(hr)) + if (obj) + IUnknown_AddRef(obj); + + LeaveCriticalSection(&reader->cs); + + if (obj) + { + if (IsEqualGUID(service, &GUID_NULL)) { - hr = IMFGetService_GetService(gs, service, riid, object); - IMFGetService_Release(gs); + hr = IUnknown_QueryInterface(obj, riid, object); + } + else + { + IMFGetService *gs; + + hr = IUnknown_QueryInterface(obj, &IID_IMFGetService, (void **)&gs); + if (SUCCEEDED(hr)) + { + hr = IMFGetService_GetService(gs, service, riid, object); + IMFGetService_Release(gs); + } } }
+ if (obj) + IUnknown_Release(obj); + return hr; }