From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/wm_asyncreader.c | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/winegstreamer/wm_asyncreader.c index e74e25228b6..85d417b4152 100644 --- a/dlls/winegstreamer/wm_asyncreader.c +++ b/dlls/winegstreamer/wm_asyncreader.c @@ -64,6 +64,7 @@ struct async_reader IUnknown *reader_inner; LONG refcount;
+ IWMSyncReader2 *reader; struct wm_reader *wm_reader;
CRITICAL_SECTION cs; @@ -1764,6 +1765,11 @@ HRESULT WINAPI winegstreamer_create_wm_async_reader(IWMReader **reader) if (FAILED(hr = winegstreamer_create_wm_sync_reader((IUnknown *)&object->IWMReader_iface, (void **)&object->reader_inner))) goto failed; + + if (FAILED(hr = IUnknown_QueryInterface(object->reader_inner, &IID_IWMSyncReader2, + (void **)&object->reader))) + goto failed; + IWMReader_Release(&object->IWMReader_iface); object->wm_reader = wm_reader_from_sync_reader_inner(object->reader_inner);
InitializeCriticalSection(&object->cs);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/wm_reader.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-)
diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c index 85332926d49..09745ae2023 100644 --- a/dlls/winegstreamer/wm_reader.c +++ b/dlls/winegstreamer/wm_reader.c @@ -2348,11 +2348,25 @@ static HRESULT WINAPI reader_GetOutputSetting(IWMSyncReader2 *iface, DWORD outpu return E_NOTIMPL; }
-static HRESULT WINAPI reader_GetReadStreamSamples(IWMSyncReader2 *iface, WORD stream_num, BOOL *compressed) +static HRESULT WINAPI reader_GetReadStreamSamples(IWMSyncReader2 *iface, WORD stream_number, BOOL *compressed) { - struct wm_reader *This = impl_from_IWMSyncReader2(iface); - FIXME("(%p)->(%d %p): stub!\n", This, stream_num, compressed); - return E_NOTIMPL; + struct wm_reader *reader = impl_from_IWMSyncReader2(iface); + struct wm_stream *stream; + + TRACE("reader %p, stream_number %u, compressed %p.\n", reader, stream_number, compressed); + + EnterCriticalSection(&reader->cs); + + if (!(stream = wm_reader_get_stream_by_stream_number(reader, stream_number))) + { + LeaveCriticalSection(&reader->cs); + return E_INVALIDARG; + } + + *compressed = stream->read_compressed; + + LeaveCriticalSection(&reader->cs); + return S_OK; }
static HRESULT WINAPI reader_GetStreamNumberForOutput(IWMSyncReader2 *iface,
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/gst_private.h | 2 -- dlls/winegstreamer/wm_asyncreader.c | 6 +++--- dlls/winegstreamer/wm_reader.c | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h index c4d1be54364..6b24a73d5d6 100644 --- a/dlls/winegstreamer/gst_private.h +++ b/dlls/winegstreamer/gst_private.h @@ -196,8 +196,6 @@ HRESULT wm_reader_get_output_format(struct wm_reader *reader, DWORD output, HRESULT wm_reader_get_output_format_count(struct wm_reader *reader, DWORD output, DWORD *count); HRESULT wm_reader_get_output_props(struct wm_reader *reader, DWORD output, IWMOutputMediaProps **props); -struct wm_stream *wm_reader_get_stream_by_stream_number(struct wm_reader *reader, - WORD stream_number); HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, IWMReaderCallbackAdvanced *callback_advanced, WORD stream_number, INSSBuffer **ret_sample, QWORD *pts, QWORD *duration, DWORD *flags, WORD *ret_stream_number); HRESULT wm_reader_get_stream_selection(struct wm_reader *reader, diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/winegstreamer/wm_asyncreader.c index 85d417b4152..a26f03b4cd9 100644 --- a/dlls/winegstreamer/wm_asyncreader.c +++ b/dlls/winegstreamer/wm_asyncreader.c @@ -138,7 +138,6 @@ static void async_reader_deliver_sample(struct async_reader *reader, struct samp { IWMReaderCallbackAdvanced *callback_advanced = reader->callback_advanced; IWMReaderCallback *callback = reader->callback; - struct wm_stream *stream; BOOL read_compressed; HRESULT hr;
@@ -146,8 +145,9 @@ static void async_reader_deliver_sample(struct async_reader *reader, struct samp reader, sample->stream, debugstr_time(sample->pts), debugstr_time(sample->duration), sample->flags, sample->buffer);
- stream = wm_reader_get_stream_by_stream_number(reader->wm_reader, sample->stream); - read_compressed = stream->read_compressed; + if (FAILED(hr = IWMSyncReader2_GetReadStreamSamples(reader->reader, sample->stream, + &read_compressed))) + read_compressed = FALSE;
LeaveCriticalSection(&reader->callback_cs); if (read_compressed) diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c index 09745ae2023..44e75a8d0c0 100644 --- a/dlls/winegstreamer/wm_reader.c +++ b/dlls/winegstreamer/wm_reader.c @@ -1580,7 +1580,7 @@ HRESULT wm_reader_close(struct wm_reader *reader) return S_OK; }
-struct wm_stream *wm_reader_get_stream_by_stream_number(struct wm_reader *reader, WORD stream_number) +static struct wm_stream *wm_reader_get_stream_by_stream_number(struct wm_reader *reader, WORD stream_number) { if (stream_number && stream_number <= reader->stream_count) return &reader->streams[stream_number - 1];
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/gst_private.h | 2 -- dlls/winegstreamer/wm_asyncreader.c | 2 +- dlls/winegstreamer/wm_reader.c | 32 ++++++++++++----------------- 3 files changed, 14 insertions(+), 22 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h index 6b24a73d5d6..32e6555cfe3 100644 --- a/dlls/winegstreamer/gst_private.h +++ b/dlls/winegstreamer/gst_private.h @@ -207,8 +207,6 @@ HRESULT wm_reader_set_allocate_for_output(struct wm_reader *reader, DWORD output HRESULT wm_reader_set_allocate_for_stream(struct wm_reader *reader, WORD stream_number, BOOL allocate); HRESULT wm_reader_set_output_props(struct wm_reader *reader, DWORD output, IWMOutputMediaProps *props); -HRESULT wm_reader_set_read_compressed(struct wm_reader *reader, - WORD stream_number, BOOL compressed); HRESULT wm_reader_set_streams_selected(struct wm_reader *reader, WORD count, const WORD *stream_numbers, const WMT_STREAM_SELECTION *selections);
diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/winegstreamer/wm_asyncreader.c index a26f03b4cd9..48553480515 100644 --- a/dlls/winegstreamer/wm_asyncreader.c +++ b/dlls/winegstreamer/wm_asyncreader.c @@ -736,7 +736,7 @@ static HRESULT WINAPI WMReaderAdvanced_SetReceiveStreamSamples(IWMReaderAdvanced
TRACE("reader %p, stream_number %u, compressed %d.\n", reader, stream_number, compressed);
- return wm_reader_set_read_compressed(reader->wm_reader, stream_number, compressed); + return IWMSyncReader2_SetReadStreamSamples(reader->reader, stream_number, compressed); }
static HRESULT WINAPI WMReaderAdvanced_GetReceiveStreamSamples(IWMReaderAdvanced6 *iface, WORD stream_num, diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c index 44e75a8d0c0..1229789b156 100644 --- a/dlls/winegstreamer/wm_reader.c +++ b/dlls/winegstreamer/wm_reader.c @@ -2103,24 +2103,6 @@ HRESULT wm_reader_set_allocate_for_stream(struct wm_reader *reader, WORD stream_ return S_OK; }
-HRESULT wm_reader_set_read_compressed(struct wm_reader *reader, WORD stream_number, BOOL compressed) -{ - struct wm_stream *stream; - - EnterCriticalSection(&reader->cs); - - if (!(stream = wm_reader_get_stream_by_stream_number(reader, stream_number))) - { - LeaveCriticalSection(&reader->cs); - return E_INVALIDARG; - } - - stream->read_compressed = compressed; - - LeaveCriticalSection(&reader->cs); - return S_OK; -} - HRESULT wm_reader_get_max_stream_size(struct wm_reader *reader, WORD stream_number, DWORD *size) { struct wm_stream *stream; @@ -2468,10 +2450,22 @@ static HRESULT WINAPI reader_SetRangeByFrame(IWMSyncReader2 *iface, WORD stream_ static HRESULT WINAPI reader_SetReadStreamSamples(IWMSyncReader2 *iface, WORD stream_number, BOOL compressed) { struct wm_reader *reader = impl_from_IWMSyncReader2(iface); + struct wm_stream *stream;
TRACE("reader %p, stream_index %u, compressed %d.\n", reader, stream_number, compressed);
- return wm_reader_set_read_compressed(reader, stream_number, compressed); + EnterCriticalSection(&reader->cs); + + if (!(stream = wm_reader_get_stream_by_stream_number(reader, stream_number))) + { + LeaveCriticalSection(&reader->cs); + return E_INVALIDARG; + } + + stream->read_compressed = compressed; + + LeaveCriticalSection(&reader->cs); + return S_OK; }
static HRESULT WINAPI reader_SetStreamsSelected(IWMSyncReader2 *iface,
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/gst_private.h | 1 - dlls/winegstreamer/wm_asyncreader.c | 8 ++-- dlls/winegstreamer/wm_reader.c | 61 +++++++++++++---------------- 3 files changed, 32 insertions(+), 38 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h index 32e6555cfe3..04a2f99f154 100644 --- a/dlls/winegstreamer/gst_private.h +++ b/dlls/winegstreamer/gst_private.h @@ -189,7 +189,6 @@ struct wm_reader HRESULT WINAPI winegstreamer_create_wm_sync_reader(IUnknown *outer, void **out); struct wm_reader *wm_reader_from_sync_reader_inner(IUnknown *inner);
-HRESULT wm_reader_close(struct wm_reader *reader); HRESULT wm_reader_get_max_stream_size(struct wm_reader *reader, WORD stream_number, DWORD *size); HRESULT wm_reader_get_output_format(struct wm_reader *reader, DWORD output, DWORD index, IWMOutputMediaProps **props); diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/winegstreamer/wm_asyncreader.c index 48553480515..8ec782f3056 100644 --- a/dlls/winegstreamer/wm_asyncreader.c +++ b/dlls/winegstreamer/wm_asyncreader.c @@ -443,7 +443,7 @@ static ULONG WINAPI WMReader_Release(IWMReader *iface) reader->cs.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&reader->cs);
- wm_reader_close(reader->wm_reader); + IWMSyncReader2_Close(reader->reader);
IUnknown_Release(reader->reader_inner); free(reader); @@ -465,7 +465,7 @@ static HRESULT WINAPI WMReader_Open(IWMReader *iface, const WCHAR *url,
if (SUCCEEDED(hr = wm_reader_open_file(reader->wm_reader, url)) && FAILED(hr = async_reader_open(reader, callback, context))) - wm_reader_close(reader->wm_reader); + IWMSyncReader2_Close(reader->reader);
LeaveCriticalSection(&reader->cs); return hr; @@ -483,7 +483,7 @@ static HRESULT WINAPI WMReader_Close(IWMReader *iface) if (SUCCEEDED(hr = async_reader_queue_op(reader, ASYNC_OP_CLOSE, NULL))) { async_reader_close(reader); - hr = wm_reader_close(reader->wm_reader); + hr = IWMSyncReader2_Close(reader->reader); }
LeaveCriticalSection(&reader->cs); @@ -935,7 +935,7 @@ static HRESULT WINAPI WMReaderAdvanced2_OpenStream(IWMReaderAdvanced6 *iface,
if (SUCCEEDED(hr = wm_reader_open_stream(reader->wm_reader, stream)) && FAILED(hr = async_reader_open(reader, callback, context))) - wm_reader_close(reader->wm_reader); + IWMSyncReader2_Close(reader->reader);
LeaveCriticalSection(&reader->cs); return hr; diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c index 1229789b156..d42726c04d1 100644 --- a/dlls/winegstreamer/wm_reader.c +++ b/dlls/winegstreamer/wm_reader.c @@ -1549,37 +1549,6 @@ HRESULT wm_reader_open_file(struct wm_reader *reader, const WCHAR *filename) return hr; }
-HRESULT wm_reader_close(struct wm_reader *reader) -{ - EnterCriticalSection(&reader->cs); - - if (!reader->wg_parser) - { - LeaveCriticalSection(&reader->cs); - return NS_E_INVALID_REQUEST; - } - - wg_parser_disconnect(reader->wg_parser); - - reader->read_thread_shutdown = true; - WaitForSingleObject(reader->read_thread, INFINITE); - CloseHandle(reader->read_thread); - reader->read_thread = NULL; - - wg_parser_destroy(reader->wg_parser); - reader->wg_parser = NULL; - - if (reader->source_stream) - IStream_Release(reader->source_stream); - reader->source_stream = NULL; - if (reader->file) - CloseHandle(reader->file); - reader->file = NULL; - - LeaveCriticalSection(&reader->cs); - return S_OK; -} - static struct wm_stream *wm_reader_get_stream_by_stream_number(struct wm_reader *reader, WORD stream_number) { if (stream_number && stream_number <= reader->stream_count) @@ -2180,7 +2149,7 @@ static ULONG WINAPI unknown_inner_Release(IUnknown *iface)
if (!refcount) { - wm_reader_close(reader); + IWMSyncReader2_Close(&reader->IWMSyncReader2_iface);
reader->cs.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&reader->cs); @@ -2227,7 +2196,33 @@ static HRESULT WINAPI reader_Close(IWMSyncReader2 *iface)
TRACE("reader %p.\n", reader);
- return wm_reader_close(reader); + EnterCriticalSection(&reader->cs); + + if (!reader->wg_parser) + { + LeaveCriticalSection(&reader->cs); + return NS_E_INVALID_REQUEST; + } + + wg_parser_disconnect(reader->wg_parser); + + reader->read_thread_shutdown = true; + WaitForSingleObject(reader->read_thread, INFINITE); + CloseHandle(reader->read_thread); + reader->read_thread = NULL; + + wg_parser_destroy(reader->wg_parser); + reader->wg_parser = NULL; + + if (reader->source_stream) + IStream_Release(reader->source_stream); + reader->source_stream = NULL; + if (reader->file) + CloseHandle(reader->file); + reader->file = NULL; + + LeaveCriticalSection(&reader->cs); + return S_OK; }
static HRESULT WINAPI reader_GetMaxOutputSampleSize(IWMSyncReader2 *iface, DWORD output, DWORD *max)
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/gst_private.h | 1 - dlls/winegstreamer/wm_asyncreader.c | 2 +- dlls/winegstreamer/wm_reader.c | 74 +++++++++++++---------------- 3 files changed, 35 insertions(+), 42 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h index 04a2f99f154..a16c72c807b 100644 --- a/dlls/winegstreamer/gst_private.h +++ b/dlls/winegstreamer/gst_private.h @@ -199,7 +199,6 @@ HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, IWMReaderCallbackA INSSBuffer **ret_sample, QWORD *pts, QWORD *duration, DWORD *flags, WORD *ret_stream_number); HRESULT wm_reader_get_stream_selection(struct wm_reader *reader, WORD stream_number, WMT_STREAM_SELECTION *selection); -HRESULT wm_reader_open_file(struct wm_reader *reader, const WCHAR *filename); HRESULT wm_reader_open_stream(struct wm_reader *reader, IStream *stream); void wm_reader_seek(struct wm_reader *reader, QWORD start, LONGLONG duration); HRESULT wm_reader_set_allocate_for_output(struct wm_reader *reader, DWORD output, BOOL allocate); diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/winegstreamer/wm_asyncreader.c index 8ec782f3056..825a042b534 100644 --- a/dlls/winegstreamer/wm_asyncreader.c +++ b/dlls/winegstreamer/wm_asyncreader.c @@ -463,7 +463,7 @@ static HRESULT WINAPI WMReader_Open(IWMReader *iface, const WCHAR *url,
EnterCriticalSection(&reader->cs);
- if (SUCCEEDED(hr = wm_reader_open_file(reader->wm_reader, url)) + if (SUCCEEDED(hr = IWMSyncReader2_Open(reader->reader, url)) && FAILED(hr = async_reader_open(reader, callback, context))) IWMSyncReader2_Close(reader->reader);
diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c index d42726c04d1..21efac4df66 100644 --- a/dlls/winegstreamer/wm_reader.c +++ b/dlls/winegstreamer/wm_reader.c @@ -1510,45 +1510,6 @@ HRESULT wm_reader_open_stream(struct wm_reader *reader, IStream *stream) return hr; }
-HRESULT wm_reader_open_file(struct wm_reader *reader, const WCHAR *filename) -{ - LARGE_INTEGER size; - HANDLE file; - HRESULT hr; - - if ((file = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, NULL, - OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE) - { - ERR("Failed to open %s, error %lu.\n", debugstr_w(filename), GetLastError()); - return HRESULT_FROM_WIN32(GetLastError()); - } - - if (!GetFileSizeEx(file, &size)) - { - ERR("Failed to get the size of %s, error %lu.\n", debugstr_w(filename), GetLastError()); - CloseHandle(file); - return HRESULT_FROM_WIN32(GetLastError()); - } - - EnterCriticalSection(&reader->cs); - - if (reader->wg_parser) - { - LeaveCriticalSection(&reader->cs); - WARN("Stream is already open; returning E_UNEXPECTED.\n"); - CloseHandle(file); - return E_UNEXPECTED; - } - - reader->file = file; - - if (FAILED(hr = init_stream(reader, size.QuadPart))) - reader->file = NULL; - - LeaveCriticalSection(&reader->cs); - return hr; -} - static struct wm_stream *wm_reader_get_stream_by_stream_number(struct wm_reader *reader, WORD stream_number) { if (stream_number && stream_number <= reader->stream_count) @@ -2370,10 +2331,43 @@ static HRESULT WINAPI reader_GetStreamSelected(IWMSyncReader2 *iface, static HRESULT WINAPI reader_Open(IWMSyncReader2 *iface, const WCHAR *filename) { struct wm_reader *reader = impl_from_IWMSyncReader2(iface); + LARGE_INTEGER size; + HANDLE file; + HRESULT hr;
TRACE("reader %p, filename %s.\n", reader, debugstr_w(filename));
- return wm_reader_open_file(reader, filename); + if ((file = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE) + { + ERR("Failed to open %s, error %lu.\n", debugstr_w(filename), GetLastError()); + return HRESULT_FROM_WIN32(GetLastError()); + } + + if (!GetFileSizeEx(file, &size)) + { + ERR("Failed to get the size of %s, error %lu.\n", debugstr_w(filename), GetLastError()); + CloseHandle(file); + return HRESULT_FROM_WIN32(GetLastError()); + } + + EnterCriticalSection(&reader->cs); + + if (reader->wg_parser) + { + LeaveCriticalSection(&reader->cs); + WARN("Stream is already open; returning E_UNEXPECTED.\n"); + CloseHandle(file); + return E_UNEXPECTED; + } + + reader->file = file; + + if (FAILED(hr = init_stream(reader, size.QuadPart))) + reader->file = NULL; + + LeaveCriticalSection(&reader->cs); + return hr; }
static HRESULT WINAPI reader_OpenStream(IWMSyncReader2 *iface, IStream *stream)
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/gst_private.h | 1 - dlls/winegstreamer/wm_asyncreader.c | 2 +- dlls/winegstreamer/wm_reader.c | 58 +++++++++++++---------------- 3 files changed, 27 insertions(+), 34 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h index a16c72c807b..6430e853777 100644 --- a/dlls/winegstreamer/gst_private.h +++ b/dlls/winegstreamer/gst_private.h @@ -199,7 +199,6 @@ HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, IWMReaderCallbackA INSSBuffer **ret_sample, QWORD *pts, QWORD *duration, DWORD *flags, WORD *ret_stream_number); HRESULT wm_reader_get_stream_selection(struct wm_reader *reader, WORD stream_number, WMT_STREAM_SELECTION *selection); -HRESULT wm_reader_open_stream(struct wm_reader *reader, IStream *stream); void wm_reader_seek(struct wm_reader *reader, QWORD start, LONGLONG duration); HRESULT wm_reader_set_allocate_for_output(struct wm_reader *reader, DWORD output, BOOL allocate); HRESULT wm_reader_set_allocate_for_stream(struct wm_reader *reader, WORD stream_number, BOOL allocate); diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/winegstreamer/wm_asyncreader.c index 825a042b534..4546a9c3309 100644 --- a/dlls/winegstreamer/wm_asyncreader.c +++ b/dlls/winegstreamer/wm_asyncreader.c @@ -933,7 +933,7 @@ static HRESULT WINAPI WMReaderAdvanced2_OpenStream(IWMReaderAdvanced6 *iface,
EnterCriticalSection(&reader->cs);
- if (SUCCEEDED(hr = wm_reader_open_stream(reader->wm_reader, stream)) + if (SUCCEEDED(hr = IWMSyncReader2_OpenStream(reader->reader, stream)) && FAILED(hr = async_reader_open(reader, callback, context))) IWMSyncReader2_Close(reader->reader);
diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c index 21efac4df66..d3e71efeac6 100644 --- a/dlls/winegstreamer/wm_reader.c +++ b/dlls/winegstreamer/wm_reader.c @@ -1479,37 +1479,6 @@ out_destroy_parser: return hr; }
-HRESULT wm_reader_open_stream(struct wm_reader *reader, IStream *stream) -{ - STATSTG stat; - HRESULT hr; - - if (FAILED(hr = IStream_Stat(stream, &stat, STATFLAG_NONAME))) - { - ERR("Failed to stat stream, hr %#lx.\n", hr); - return hr; - } - - EnterCriticalSection(&reader->cs); - - if (reader->wg_parser) - { - LeaveCriticalSection(&reader->cs); - WARN("Stream is already open; returning E_UNEXPECTED.\n"); - return E_UNEXPECTED; - } - - IStream_AddRef(reader->source_stream = stream); - if (FAILED(hr = init_stream(reader, stat.cbSize.QuadPart))) - { - IStream_Release(stream); - reader->source_stream = NULL; - } - - LeaveCriticalSection(&reader->cs); - return hr; -} - static struct wm_stream *wm_reader_get_stream_by_stream_number(struct wm_reader *reader, WORD stream_number) { if (stream_number && stream_number <= reader->stream_count) @@ -2373,10 +2342,35 @@ static HRESULT WINAPI reader_Open(IWMSyncReader2 *iface, const WCHAR *filename) static HRESULT WINAPI reader_OpenStream(IWMSyncReader2 *iface, IStream *stream) { struct wm_reader *reader = impl_from_IWMSyncReader2(iface); + STATSTG stat; + HRESULT hr;
TRACE("reader %p, stream %p.\n", reader, stream);
- return wm_reader_open_stream(reader, stream); + if (FAILED(hr = IStream_Stat(stream, &stat, STATFLAG_NONAME))) + { + ERR("Failed to stat stream, hr %#lx.\n", hr); + return hr; + } + + EnterCriticalSection(&reader->cs); + + if (reader->wg_parser) + { + LeaveCriticalSection(&reader->cs); + WARN("Stream is already open; returning E_UNEXPECTED.\n"); + return E_UNEXPECTED; + } + + IStream_AddRef(reader->source_stream = stream); + if (FAILED(hr = init_stream(reader, stat.cbSize.QuadPart))) + { + IStream_Release(stream); + reader->source_stream = NULL; + } + + LeaveCriticalSection(&reader->cs); + return hr; }
static HRESULT WINAPI reader_SetOutputProps(IWMSyncReader2 *iface, DWORD output, IWMOutputMediaProps *props)
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/gst_private.h | 1 - dlls/winegstreamer/wm_asyncreader.c | 5 ++--- dlls/winegstreamer/wm_reader.c | 30 ++++++++++++----------------- 3 files changed, 14 insertions(+), 22 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h index 6430e853777..5ed44f0d50b 100644 --- a/dlls/winegstreamer/gst_private.h +++ b/dlls/winegstreamer/gst_private.h @@ -199,7 +199,6 @@ HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, IWMReaderCallbackA INSSBuffer **ret_sample, QWORD *pts, QWORD *duration, DWORD *flags, WORD *ret_stream_number); HRESULT wm_reader_get_stream_selection(struct wm_reader *reader, WORD stream_number, WMT_STREAM_SELECTION *selection); -void wm_reader_seek(struct wm_reader *reader, QWORD start, LONGLONG duration); HRESULT wm_reader_set_allocate_for_output(struct wm_reader *reader, DWORD output, BOOL allocate); HRESULT wm_reader_set_allocate_for_stream(struct wm_reader *reader, WORD stream_number, BOOL allocate); HRESULT wm_reader_set_output_props(struct wm_reader *reader, DWORD output, diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/winegstreamer/wm_asyncreader.c index 4546a9c3309..60cffba2553 100644 --- a/dlls/winegstreamer/wm_asyncreader.c +++ b/dlls/winegstreamer/wm_asyncreader.c @@ -244,10 +244,9 @@ static DWORD WINAPI async_reader_callback_thread(void *arg) { reader->context = op->u.start.context; if (SUCCEEDED(hr)) - { - wm_reader_seek(reader->wm_reader, op->u.start.start, op->u.start.duration); + hr = IWMSyncReader2_SetRange(reader->reader, op->u.start.start, op->u.start.duration); + if (SUCCEEDED(hr)) reader->clock_start = get_current_time(reader); - }
LeaveCriticalSection(&reader->callback_cs); IWMReaderCallback_OnStatus(reader->callback, WMT_STARTED, hr, diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c index d3e71efeac6..09af7457b27 100644 --- a/dlls/winegstreamer/wm_reader.c +++ b/dlls/winegstreamer/wm_reader.c @@ -1886,23 +1886,6 @@ HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, IWMReaderCallbackA } }
-void wm_reader_seek(struct wm_reader *reader, QWORD start, LONGLONG duration) -{ - WORD i; - - EnterCriticalSection(&reader->cs); - - reader->start_time = start; - - wg_parser_stream_seek(reader->streams[0].wg_stream, 1.0, start, start + duration, - AM_SEEKING_AbsolutePositioning, duration ? AM_SEEKING_AbsolutePositioning : AM_SEEKING_NoPositioning); - - for (i = 0; i < reader->stream_count; ++i) - reader->streams[i].eos = false; - - LeaveCriticalSection(&reader->cs); -} - HRESULT wm_reader_set_streams_selected(struct wm_reader *reader, WORD count, const WORD *stream_numbers, const WMT_STREAM_SELECTION *selections) { @@ -2415,10 +2398,21 @@ static HRESULT WINAPI reader_SetOutputSetting(IWMSyncReader2 *iface, DWORD outpu static HRESULT WINAPI reader_SetRange(IWMSyncReader2 *iface, QWORD start, LONGLONG duration) { struct wm_reader *reader = impl_from_IWMSyncReader2(iface); + WORD i;
TRACE("reader %p, start %I64u, duration %I64d.\n", reader, start, duration);
- wm_reader_seek(reader, start, duration); + EnterCriticalSection(&reader->cs); + + reader->start_time = start; + + wg_parser_stream_seek(reader->streams[0].wg_stream, 1.0, start, start + duration, + AM_SEEKING_AbsolutePositioning, duration ? AM_SEEKING_AbsolutePositioning : AM_SEEKING_NoPositioning); + + for (i = 0; i < reader->stream_count; ++i) + reader->streams[i].eos = false; + + LeaveCriticalSection(&reader->cs); return S_OK; }
This merge request was approved by Zebediah Figura.