From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/gst_private.h | 1 - dlls/winegstreamer/wm_asyncreader.c | 2 +- dlls/winegstreamer/wm_reader.c | 40 +++++++++++++---------------- 3 files changed, 19 insertions(+), 24 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h index 5ed44f0d50b..23e568b232a 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_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); HRESULT wm_reader_get_output_format_count(struct wm_reader *reader, DWORD output, DWORD *count); diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/winegstreamer/wm_asyncreader.c index 60cffba2553..7d5bf7347cb 100644 --- a/dlls/winegstreamer/wm_asyncreader.c +++ b/dlls/winegstreamer/wm_asyncreader.c @@ -810,7 +810,7 @@ static HRESULT WINAPI WMReaderAdvanced_GetMaxStreamSampleSize(IWMReaderAdvanced6
TRACE("reader %p, stream_number %u, size %p.\n", reader, stream_number, size);
- return wm_reader_get_max_stream_size(reader->wm_reader, stream_number, size); + return IWMSyncReader2_GetMaxStreamSampleSize(reader->reader, stream_number, size); }
static HRESULT WINAPI WMReaderAdvanced_NotifyLateDelivery(IWMReaderAdvanced6 *iface, QWORD lateness) diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c index 09af7457b27..b9834f8dae5 100644 --- a/dlls/winegstreamer/wm_reader.c +++ b/dlls/winegstreamer/wm_reader.c @@ -1985,24 +1985,6 @@ HRESULT wm_reader_set_allocate_for_stream(struct wm_reader *reader, WORD stream_ return S_OK; }
-HRESULT wm_reader_get_max_stream_size(struct wm_reader *reader, WORD stream_number, DWORD *size) -{ - 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; - } - - *size = wg_format_get_max_size(&stream->format); - - LeaveCriticalSection(&reader->cs); - return S_OK; -} - static struct wm_reader *impl_from_IUnknown(IUnknown *iface) { return CONTAINING_RECORD(iface, struct wm_reader, IUnknown_inner); @@ -2145,11 +2127,25 @@ static HRESULT WINAPI reader_GetMaxOutputSampleSize(IWMSyncReader2 *iface, DWORD return E_NOTIMPL; }
-static HRESULT WINAPI reader_GetMaxStreamSampleSize(IWMSyncReader2 *iface, WORD stream, DWORD *max) +static HRESULT WINAPI reader_GetMaxStreamSampleSize(IWMSyncReader2 *iface, WORD stream_number, DWORD *size) { - struct wm_reader *This = impl_from_IWMSyncReader2(iface); - FIXME("(%p)->(%d %p): stub!\n", This, stream, max); - return E_NOTIMPL; + struct wm_reader *reader = impl_from_IWMSyncReader2(iface); + struct wm_stream *stream; + + TRACE("reader %p, stream_number %u, size %p.\n", reader, stream_number, size); + + EnterCriticalSection(&reader->cs); + + if (!(stream = wm_reader_get_stream_by_stream_number(reader, stream_number))) + { + LeaveCriticalSection(&reader->cs); + return E_INVALIDARG; + } + + *size = wg_format_get_max_size(&stream->format); + + LeaveCriticalSection(&reader->cs); + return S_OK; }
static HRESULT WINAPI reader_GetNextSample(IWMSyncReader2 *iface,
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/gst_private.h | 2 -- dlls/winegstreamer/wm_asyncreader.c | 2 +- dlls/winegstreamer/wm_reader.c | 30 ++++++++++++----------------- 3 files changed, 13 insertions(+), 21 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h index 23e568b232a..b5c2676a40d 100644 --- a/dlls/winegstreamer/gst_private.h +++ b/dlls/winegstreamer/gst_private.h @@ -192,8 +192,6 @@ struct wm_reader *wm_reader_from_sync_reader_inner(IUnknown *inner); HRESULT wm_reader_get_output_format(struct wm_reader *reader, DWORD output, DWORD index, IWMOutputMediaProps **props); 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); 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 7d5bf7347cb..c6ea7146e0a 100644 --- a/dlls/winegstreamer/wm_asyncreader.c +++ b/dlls/winegstreamer/wm_asyncreader.c @@ -508,7 +508,7 @@ static HRESULT WINAPI WMReader_GetOutputProps(IWMReader *iface, DWORD output, IW
TRACE("reader %p, output %lu, props %p.\n", reader, output, props);
- return wm_reader_get_output_props(reader->wm_reader, output, props); + return IWMSyncReader2_GetOutputProps(reader->reader, output, props); }
static HRESULT WINAPI WMReader_SetOutputProps(IWMReader *iface, DWORD output, IWMOutputMediaProps *props) diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c index b9834f8dae5..30e8e009850 100644 --- a/dlls/winegstreamer/wm_reader.c +++ b/dlls/winegstreamer/wm_reader.c @@ -1487,23 +1487,6 @@ static struct wm_stream *wm_reader_get_stream_by_stream_number(struct wm_reader return NULL; }
-HRESULT wm_reader_get_output_props(struct wm_reader *reader, DWORD output, IWMOutputMediaProps **props) -{ - struct wm_stream *stream; - - EnterCriticalSection(&reader->cs); - - if (!(stream = get_stream_by_output_number(reader, output))) - { - LeaveCriticalSection(&reader->cs); - return E_INVALIDARG; - } - - *props = output_props_create(&stream->format); - LeaveCriticalSection(&reader->cs); - return *props ? S_OK : E_OUTOFMEMORY; -} - static const enum wg_video_format video_formats[] = { /* Try to prefer YUV formats over RGB ones. Most decoders output in the @@ -2220,10 +2203,21 @@ static HRESULT WINAPI reader_GetOutputProps(IWMSyncReader2 *iface, DWORD output, IWMOutputMediaProps **props) { struct wm_reader *reader = impl_from_IWMSyncReader2(iface); + struct wm_stream *stream;
TRACE("reader %p, output %lu, props %p.\n", reader, output, props);
- return wm_reader_get_output_props(reader, output, props); + EnterCriticalSection(&reader->cs); + + if (!(stream = get_stream_by_output_number(reader, output))) + { + LeaveCriticalSection(&reader->cs); + return E_INVALIDARG; + } + + *props = output_props_create(&stream->format); + LeaveCriticalSection(&reader->cs); + return *props ? S_OK : E_OUTOFMEMORY; }
static HRESULT WINAPI reader_GetOutputSetting(IWMSyncReader2 *iface, DWORD output_num, const WCHAR *name,
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/gst_private.h | 2 - dlls/winegstreamer/wm_asyncreader.c | 2 +- dlls/winegstreamer/wm_reader.c | 173 +++++++++++++--------------- 3 files changed, 84 insertions(+), 93 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h index b5c2676a40d..e572ab156eb 100644 --- a/dlls/winegstreamer/gst_private.h +++ b/dlls/winegstreamer/gst_private.h @@ -198,8 +198,6 @@ HRESULT wm_reader_get_stream_selection(struct wm_reader *reader, WORD stream_number, WMT_STREAM_SELECTION *selection); 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, - IWMOutputMediaProps *props); 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 c6ea7146e0a..0ae1a8c5401 100644 --- a/dlls/winegstreamer/wm_asyncreader.c +++ b/dlls/winegstreamer/wm_asyncreader.c @@ -517,7 +517,7 @@ static HRESULT WINAPI WMReader_SetOutputProps(IWMReader *iface, DWORD output, IW
TRACE("reader %p, output %lu, props %p.\n", reader, output, props);
- return wm_reader_set_output_props(reader->wm_reader, output, props); + return IWMSyncReader2_SetOutputProps(reader->reader, output, props); }
static HRESULT WINAPI WMReader_GetOutputFormatCount(IWMReader *iface, DWORD output, DWORD *count) diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c index 30e8e009850..78e72cfdf82 100644 --- a/dlls/winegstreamer/wm_reader.c +++ b/dlls/winegstreamer/wm_reader.c @@ -1589,93 +1589,6 @@ HRESULT wm_reader_get_output_format(struct wm_reader *reader, DWORD output, return *props ? S_OK : E_OUTOFMEMORY; }
-HRESULT wm_reader_set_output_props(struct wm_reader *reader, DWORD output, - IWMOutputMediaProps *props_iface) -{ - struct output_props *props = unsafe_impl_from_IWMOutputMediaProps(props_iface); - struct wg_format format, pref_format; - struct wm_stream *stream; - HRESULT hr = S_OK; - int i; - - strmbase_dump_media_type(&props->mt); - - if (!amt_to_wg_format(&props->mt, &format)) - { - ERR("Failed to convert media type to winegstreamer format.\n"); - return E_FAIL; - } - - EnterCriticalSection(&reader->cs); - - if (!(stream = get_stream_by_output_number(reader, output))) - { - LeaveCriticalSection(&reader->cs); - return E_INVALIDARG; - } - - wg_parser_stream_get_preferred_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. */ - hr = NS_E_INCOMPATIBLE_FORMAT; - } - else switch (pref_format.major_type) - { - case WG_MAJOR_TYPE_AUDIO: - if (format.u.audio.format == WG_AUDIO_FORMAT_UNKNOWN) - hr = NS_E_AUDIO_CODEC_NOT_INSTALLED; - else if (format.u.audio.channels > pref_format.u.audio.channels) - hr = NS_E_AUDIO_CODEC_NOT_INSTALLED; - break; - - case WG_MAJOR_TYPE_VIDEO: - for (i = 0; i < ARRAY_SIZE(video_formats); ++i) - if (format.u.video.format == video_formats[i]) - break; - if (i == ARRAY_SIZE(video_formats)) - hr = NS_E_INVALID_OUTPUT_FORMAT; - else if (pref_format.u.video.width != format.u.video.width) - hr = NS_E_INVALID_OUTPUT_FORMAT; - else if (pref_format.u.video.height != format.u.video.height) - hr = NS_E_INVALID_OUTPUT_FORMAT; - break; - - default: - hr = NS_E_INCOMPATIBLE_FORMAT; - break; - } - - if (FAILED(hr)) - { - WARN("Unsupported media type, returning %#lx.\n", hr); - LeaveCriticalSection(&reader->cs); - return hr; - } - - stream->format = format; - wg_parser_stream_enable(stream->wg_stream, &format); - - /* Re-decode any buffers that might have been generated with the old format. - * - * FIXME: Seeking in-place will cause some buffers to be dropped. - * Unfortunately, we can't really store the last received PTS and seek there - * either: since seeks are inexact and we aren't guaranteed to receive - * samples in order, some buffers might be duplicated or dropped anyway. - * In order to really seamlessly allow for format changes, we need - * cooperation from each individual GStreamer stream, to be able to tell - * upstream exactly which buffers they need resent... - * - * In all likelihood this function is being called not mid-stream but rather - * while setting the stream up, before consuming any events. Accordingly - * let's just seek back to the beginning. */ - wg_parser_stream_seek(reader->streams[0].wg_stream, 1.0, reader->start_time, 0, - AM_SEEKING_AbsolutePositioning, AM_SEEKING_NoPositioning); - - LeaveCriticalSection(&reader->cs); - return S_OK; -} - static const char *get_major_type_string(enum wg_major_type type) { switch (type) @@ -2346,13 +2259,93 @@ static HRESULT WINAPI reader_OpenStream(IWMSyncReader2 *iface, IStream *stream) return hr; }
-static HRESULT WINAPI reader_SetOutputProps(IWMSyncReader2 *iface, DWORD output, IWMOutputMediaProps *props) +static HRESULT WINAPI reader_SetOutputProps(IWMSyncReader2 *iface, DWORD output, IWMOutputMediaProps *props_iface) { struct wm_reader *reader = impl_from_IWMSyncReader2(iface); + struct output_props *props = unsafe_impl_from_IWMOutputMediaProps(props_iface); + struct wg_format format, pref_format; + struct wm_stream *stream; + HRESULT hr = S_OK; + int i;
- TRACE("reader %p, output %lu, props %p.\n", reader, output, props); + TRACE("reader %p, output %lu, props_iface %p.\n", reader, output, props_iface); + + strmbase_dump_media_type(&props->mt); + + if (!amt_to_wg_format(&props->mt, &format)) + { + ERR("Failed to convert media type to winegstreamer format.\n"); + return E_FAIL; + } + + EnterCriticalSection(&reader->cs); + + if (!(stream = get_stream_by_output_number(reader, output))) + { + LeaveCriticalSection(&reader->cs); + return E_INVALIDARG; + }
- return wm_reader_set_output_props(reader, output, props); + wg_parser_stream_get_preferred_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. */ + hr = NS_E_INCOMPATIBLE_FORMAT; + } + else switch (pref_format.major_type) + { + case WG_MAJOR_TYPE_AUDIO: + if (format.u.audio.format == WG_AUDIO_FORMAT_UNKNOWN) + hr = NS_E_AUDIO_CODEC_NOT_INSTALLED; + else if (format.u.audio.channels > pref_format.u.audio.channels) + hr = NS_E_AUDIO_CODEC_NOT_INSTALLED; + break; + + case WG_MAJOR_TYPE_VIDEO: + for (i = 0; i < ARRAY_SIZE(video_formats); ++i) + if (format.u.video.format == video_formats[i]) + break; + if (i == ARRAY_SIZE(video_formats)) + hr = NS_E_INVALID_OUTPUT_FORMAT; + else if (pref_format.u.video.width != format.u.video.width) + hr = NS_E_INVALID_OUTPUT_FORMAT; + else if (pref_format.u.video.height != format.u.video.height) + hr = NS_E_INVALID_OUTPUT_FORMAT; + break; + + default: + hr = NS_E_INCOMPATIBLE_FORMAT; + break; + } + + if (FAILED(hr)) + { + WARN("Unsupported media type, returning %#lx.\n", hr); + LeaveCriticalSection(&reader->cs); + return hr; + } + + stream->format = format; + wg_parser_stream_enable(stream->wg_stream, &format); + + /* Re-decode any buffers that might have been generated with the old format. + * + * FIXME: Seeking in-place will cause some buffers to be dropped. + * Unfortunately, we can't really store the last received PTS and seek there + * either: since seeks are inexact and we aren't guaranteed to receive + * samples in order, some buffers might be duplicated or dropped anyway. + * In order to really seamlessly allow for format changes, we need + * cooperation from each individual GStreamer stream, to be able to tell + * upstream exactly which buffers they need resent... + * + * In all likelihood this function is being called not mid-stream but rather + * while setting the stream up, before consuming any events. Accordingly + * let's just seek back to the beginning. */ + wg_parser_stream_seek(reader->streams[0].wg_stream, 1.0, reader->start_time, 0, + AM_SEEKING_AbsolutePositioning, AM_SEEKING_NoPositioning); + + LeaveCriticalSection(&reader->cs); + return S_OK; }
static HRESULT WINAPI reader_SetOutputSetting(IWMSyncReader2 *iface, DWORD output,
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/gst_private.h | 2 - dlls/winegstreamer/wm_asyncreader.c | 2 +- dlls/winegstreamer/wm_reader.c | 97 +++++++++++++---------------- 3 files changed, 46 insertions(+), 55 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h index e572ab156eb..692777e8652 100644 --- a/dlls/winegstreamer/gst_private.h +++ b/dlls/winegstreamer/gst_private.h @@ -189,8 +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_get_output_format(struct wm_reader *reader, DWORD output, - DWORD index, IWMOutputMediaProps **props); HRESULT wm_reader_get_output_format_count(struct wm_reader *reader, DWORD output, DWORD *count); 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); diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/winegstreamer/wm_asyncreader.c index 0ae1a8c5401..5b7539e37da 100644 --- a/dlls/winegstreamer/wm_asyncreader.c +++ b/dlls/winegstreamer/wm_asyncreader.c @@ -536,7 +536,7 @@ static HRESULT WINAPI WMReader_GetOutputFormat(IWMReader *iface, DWORD output,
TRACE("reader %p, output %lu, index %lu, props %p.\n", reader, output, index, props);
- return wm_reader_get_output_format(reader->wm_reader, output, index, props); + return IWMSyncReader2_GetOutputFormat(reader->reader, output, index, props); }
static HRESULT WINAPI WMReader_Start(IWMReader *iface, diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c index 78e72cfdf82..03685687244 100644 --- a/dlls/winegstreamer/wm_reader.c +++ b/dlls/winegstreamer/wm_reader.c @@ -1538,57 +1538,6 @@ HRESULT wm_reader_get_output_format_count(struct wm_reader *reader, DWORD output return S_OK; }
-HRESULT wm_reader_get_output_format(struct wm_reader *reader, DWORD output, - DWORD index, IWMOutputMediaProps **props) -{ - struct wm_stream *stream; - struct wg_format format; - - EnterCriticalSection(&reader->cs); - - if (!(stream = get_stream_by_output_number(reader, output))) - { - LeaveCriticalSection(&reader->cs); - return E_INVALIDARG; - } - - wg_parser_stream_get_preferred_format(stream->wg_stream, &format); - - switch (format.major_type) - { - case WG_MAJOR_TYPE_VIDEO: - if (index >= ARRAY_SIZE(video_formats)) - { - LeaveCriticalSection(&reader->cs); - return NS_E_INVALID_OUTPUT_FORMAT; - } - format.u.video.format = video_formats[index]; - break; - - case WG_MAJOR_TYPE_AUDIO: - if (index) - { - LeaveCriticalSection(&reader->cs); - return NS_E_INVALID_OUTPUT_FORMAT; - } - format.u.audio.format = WG_AUDIO_FORMAT_S16LE; - break; - - case WG_MAJOR_TYPE_MPEG1_AUDIO: - case WG_MAJOR_TYPE_WMA: - case WG_MAJOR_TYPE_H264: - FIXME("Format %u not implemented!\n", format.major_type); - break; - case WG_MAJOR_TYPE_UNKNOWN: - break; - } - - LeaveCriticalSection(&reader->cs); - - *props = output_props_create(&format); - return *props ? S_OK : E_OUTOFMEMORY; -} - static const char *get_major_type_string(enum wg_major_type type) { switch (type) @@ -2086,10 +2035,54 @@ static HRESULT WINAPI reader_GetOutputFormat(IWMSyncReader2 *iface, DWORD output, DWORD index, IWMOutputMediaProps **props) { struct wm_reader *reader = impl_from_IWMSyncReader2(iface); + struct wm_stream *stream; + struct wg_format format;
TRACE("reader %p, output %lu, index %lu, props %p.\n", reader, output, index, props);
- return wm_reader_get_output_format(reader, output, index, props); + EnterCriticalSection(&reader->cs); + + if (!(stream = get_stream_by_output_number(reader, output))) + { + LeaveCriticalSection(&reader->cs); + return E_INVALIDARG; + } + + wg_parser_stream_get_preferred_format(stream->wg_stream, &format); + + switch (format.major_type) + { + case WG_MAJOR_TYPE_VIDEO: + if (index >= ARRAY_SIZE(video_formats)) + { + LeaveCriticalSection(&reader->cs); + return NS_E_INVALID_OUTPUT_FORMAT; + } + format.u.video.format = video_formats[index]; + break; + + case WG_MAJOR_TYPE_AUDIO: + if (index) + { + LeaveCriticalSection(&reader->cs); + return NS_E_INVALID_OUTPUT_FORMAT; + } + format.u.audio.format = WG_AUDIO_FORMAT_S16LE; + break; + + case WG_MAJOR_TYPE_MPEG1_AUDIO: + case WG_MAJOR_TYPE_WMA: + case WG_MAJOR_TYPE_H264: + FIXME("Format %u not implemented!\n", format.major_type); + break; + case WG_MAJOR_TYPE_UNKNOWN: + break; + } + + LeaveCriticalSection(&reader->cs); + + *props = output_props_create(&format); + return *props ? S_OK : E_OUTOFMEMORY; }
static HRESULT WINAPI reader_GetOutputFormatCount(IWMSyncReader2 *iface, DWORD output, DWORD *count)
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/gst_private.h | 1 - dlls/winegstreamer/wm_asyncreader.c | 2 +- dlls/winegstreamer/wm_reader.c | 66 +++++++++++++---------------- 3 files changed, 31 insertions(+), 38 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h index 692777e8652..7fb4f12e65a 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_get_output_format_count(struct wm_reader *reader, DWORD output, DWORD *count); 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 5b7539e37da..487bed4564c 100644 --- a/dlls/winegstreamer/wm_asyncreader.c +++ b/dlls/winegstreamer/wm_asyncreader.c @@ -526,7 +526,7 @@ static HRESULT WINAPI WMReader_GetOutputFormatCount(IWMReader *iface, DWORD outp
TRACE("reader %p, output %lu, count %p.\n", reader, output, count);
- return wm_reader_get_output_format_count(reader->wm_reader, output, count); + return IWMSyncReader2_GetOutputFormatCount(reader->reader, output, count); }
static HRESULT WINAPI WMReader_GetOutputFormat(IWMReader *iface, DWORD output, diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c index 03685687244..06373f8bdaa 100644 --- a/dlls/winegstreamer/wm_reader.c +++ b/dlls/winegstreamer/wm_reader.c @@ -1503,41 +1503,6 @@ static const enum wg_video_format video_formats[] = WG_VIDEO_FORMAT_RGB15, };
-HRESULT wm_reader_get_output_format_count(struct wm_reader *reader, DWORD output, DWORD *count) -{ - struct wm_stream *stream; - struct wg_format format; - - EnterCriticalSection(&reader->cs); - - if (!(stream = get_stream_by_output_number(reader, output))) - { - LeaveCriticalSection(&reader->cs); - return E_INVALIDARG; - } - - wg_parser_stream_get_preferred_format(stream->wg_stream, &format); - switch (format.major_type) - { - case WG_MAJOR_TYPE_VIDEO: - *count = ARRAY_SIZE(video_formats); - break; - - case WG_MAJOR_TYPE_MPEG1_AUDIO: - case WG_MAJOR_TYPE_WMA: - case WG_MAJOR_TYPE_H264: - FIXME("Format %u not implemented!\n", format.major_type); - /* fallthrough */ - case WG_MAJOR_TYPE_AUDIO: - case WG_MAJOR_TYPE_UNKNOWN: - *count = 1; - break; - } - - LeaveCriticalSection(&reader->cs); - return S_OK; -} - static const char *get_major_type_string(enum wg_major_type type) { switch (type) @@ -2088,10 +2053,39 @@ static HRESULT WINAPI reader_GetOutputFormat(IWMSyncReader2 *iface, static HRESULT WINAPI reader_GetOutputFormatCount(IWMSyncReader2 *iface, DWORD output, DWORD *count) { struct wm_reader *reader = impl_from_IWMSyncReader2(iface); + struct wm_stream *stream; + struct wg_format format;
TRACE("reader %p, output %lu, count %p.\n", reader, output, count);
- return wm_reader_get_output_format_count(reader, output, count); + EnterCriticalSection(&reader->cs); + + if (!(stream = get_stream_by_output_number(reader, output))) + { + LeaveCriticalSection(&reader->cs); + return E_INVALIDARG; + } + + wg_parser_stream_get_preferred_format(stream->wg_stream, &format); + switch (format.major_type) + { + case WG_MAJOR_TYPE_VIDEO: + *count = ARRAY_SIZE(video_formats); + break; + + case WG_MAJOR_TYPE_MPEG1_AUDIO: + case WG_MAJOR_TYPE_WMA: + case WG_MAJOR_TYPE_H264: + FIXME("Format %u not implemented!\n", format.major_type); + /* fallthrough */ + case WG_MAJOR_TYPE_AUDIO: + case WG_MAJOR_TYPE_UNKNOWN: + *count = 1; + break; + } + + LeaveCriticalSection(&reader->cs); + return S_OK; }
static HRESULT WINAPI reader_GetOutputNumberForStream(IWMSyncReader2 *iface,
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/gst_private.h | 2 -- dlls/winegstreamer/wm_asyncreader.c | 2 +- dlls/winegstreamer/wm_reader.c | 33 ++++++++++++----------------- 3 files changed, 14 insertions(+), 23 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h index 7fb4f12e65a..53588d0c8ab 100644 --- a/dlls/winegstreamer/gst_private.h +++ b/dlls/winegstreamer/gst_private.h @@ -191,8 +191,6 @@ struct wm_reader *wm_reader_from_sync_reader_inner(IUnknown *inner);
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, - WORD stream_number, WMT_STREAM_SELECTION *selection); 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_streams_selected(struct wm_reader *reader, WORD count, diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/winegstreamer/wm_asyncreader.c index 487bed4564c..f84f6aba0bf 100644 --- a/dlls/winegstreamer/wm_asyncreader.c +++ b/dlls/winegstreamer/wm_asyncreader.c @@ -711,7 +711,7 @@ static HRESULT WINAPI WMReaderAdvanced_GetStreamSelected(IWMReaderAdvanced6 *ifa
TRACE("reader %p, stream_number %u, selection %p.\n", reader, stream_number, selection);
- return wm_reader_get_stream_selection(reader->wm_reader, stream_number, selection); + return IWMSyncReader2_GetStreamSelected(reader->reader, stream_number, selection); }
static HRESULT WINAPI WMReaderAdvanced_SetReceiveSelectionCallbacks(IWMReaderAdvanced6 *iface, BOOL get_callbacks) diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c index 06373f8bdaa..e4ee11239f6 100644 --- a/dlls/winegstreamer/wm_reader.c +++ b/dlls/winegstreamer/wm_reader.c @@ -1740,25 +1740,6 @@ HRESULT wm_reader_set_streams_selected(struct wm_reader *reader, WORD count, return S_OK; }
-HRESULT wm_reader_get_stream_selection(struct wm_reader *reader, - WORD stream_number, WMT_STREAM_SELECTION *selection) -{ - 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; - } - - *selection = stream->selection; - - LeaveCriticalSection(&reader->cs); - return S_OK; -} - HRESULT wm_reader_set_allocate_for_output(struct wm_reader *reader, DWORD output, BOOL allocate) { struct wm_stream *stream; @@ -2164,10 +2145,22 @@ static HRESULT WINAPI reader_GetStreamSelected(IWMSyncReader2 *iface, WORD stream_number, WMT_STREAM_SELECTION *selection) { struct wm_reader *reader = impl_from_IWMSyncReader2(iface); + struct wm_stream *stream;
TRACE("reader %p, stream_number %u, selection %p.\n", reader, stream_number, selection);
- return wm_reader_get_stream_selection(reader, stream_number, selection); + EnterCriticalSection(&reader->cs); + + if (!(stream = wm_reader_get_stream_by_stream_number(reader, stream_number))) + { + LeaveCriticalSection(&reader->cs); + return E_INVALIDARG; + } + + *selection = stream->selection; + + LeaveCriticalSection(&reader->cs); + return S_OK; }
static HRESULT WINAPI reader_Open(IWMSyncReader2 *iface, const WCHAR *filename)
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/gst_private.h | 2 - dlls/winegstreamer/wm_asyncreader.c | 2 +- dlls/winegstreamer/wm_reader.c | 83 +++++++++++++---------------- 3 files changed, 39 insertions(+), 48 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h index 53588d0c8ab..178679c38ee 100644 --- a/dlls/winegstreamer/gst_private.h +++ b/dlls/winegstreamer/gst_private.h @@ -193,7 +193,5 @@ 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_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_streams_selected(struct wm_reader *reader, WORD count, - const WORD *stream_numbers, const WMT_STREAM_SELECTION *selections);
#endif /* __GST_PRIVATE_INCLUDED__ */ diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/winegstreamer/wm_asyncreader.c index f84f6aba0bf..f5509cd865d 100644 --- a/dlls/winegstreamer/wm_asyncreader.c +++ b/dlls/winegstreamer/wm_asyncreader.c @@ -701,7 +701,7 @@ static HRESULT WINAPI WMReaderAdvanced_SetStreamsSelected(IWMReaderAdvanced6 *if TRACE("reader %p, count %u, stream_numbers %p, selections %p.\n", reader, count, stream_numbers, selections);
- return wm_reader_set_streams_selected(reader->wm_reader, count, stream_numbers, selections); + return IWMSyncReader2_SetStreamsSelected(reader->reader, count, stream_numbers, selections); }
static HRESULT WINAPI WMReaderAdvanced_GetStreamSelected(IWMReaderAdvanced6 *iface, diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c index e4ee11239f6..95d6d8e0180 100644 --- a/dlls/winegstreamer/wm_reader.c +++ b/dlls/winegstreamer/wm_reader.c @@ -1696,50 +1696,6 @@ HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, IWMReaderCallbackA } }
-HRESULT wm_reader_set_streams_selected(struct wm_reader *reader, WORD count, - const WORD *stream_numbers, const WMT_STREAM_SELECTION *selections) -{ - struct wm_stream *stream; - WORD i; - - if (!count) - return E_INVALIDARG; - - EnterCriticalSection(&reader->cs); - - for (i = 0; i < count; ++i) - { - if (!(stream = wm_reader_get_stream_by_stream_number(reader, stream_numbers[i]))) - { - LeaveCriticalSection(&reader->cs); - WARN("Invalid stream number %u; returning NS_E_INVALID_REQUEST.\n", stream_numbers[i]); - return NS_E_INVALID_REQUEST; - } - } - - for (i = 0; i < count; ++i) - { - stream = wm_reader_get_stream_by_stream_number(reader, stream_numbers[i]); - stream->selection = selections[i]; - if (selections[i] == WMT_OFF) - { - TRACE("Disabling stream %u.\n", stream_numbers[i]); - wg_parser_stream_disable(stream->wg_stream); - } - else if (selections[i] == WMT_ON) - { - if (selections[i] != WMT_ON) - FIXME("Ignoring selection %#x for stream %u; treating as enabled.\n", - selections[i], stream_numbers[i]); - TRACE("Enabling stream %u.\n", stream_numbers[i]); - wg_parser_stream_enable(stream->wg_stream, &stream->format); - } - } - - LeaveCriticalSection(&reader->cs); - return S_OK; -} - HRESULT wm_reader_set_allocate_for_output(struct wm_reader *reader, DWORD output, BOOL allocate) { struct wm_stream *stream; @@ -2412,11 +2368,48 @@ static HRESULT WINAPI reader_SetStreamsSelected(IWMSyncReader2 *iface, WORD count, WORD *stream_numbers, WMT_STREAM_SELECTION *selections) { struct wm_reader *reader = impl_from_IWMSyncReader2(iface); + struct wm_stream *stream; + WORD i;
TRACE("reader %p, count %u, stream_numbers %p, selections %p.\n", reader, count, stream_numbers, selections);
- return wm_reader_set_streams_selected(reader, count, stream_numbers, selections); + if (!count) + return E_INVALIDARG; + + EnterCriticalSection(&reader->cs); + + for (i = 0; i < count; ++i) + { + if (!(stream = wm_reader_get_stream_by_stream_number(reader, stream_numbers[i]))) + { + LeaveCriticalSection(&reader->cs); + WARN("Invalid stream number %u; returning NS_E_INVALID_REQUEST.\n", stream_numbers[i]); + return NS_E_INVALID_REQUEST; + } + } + + for (i = 0; i < count; ++i) + { + stream = wm_reader_get_stream_by_stream_number(reader, stream_numbers[i]); + stream->selection = selections[i]; + if (selections[i] == WMT_OFF) + { + TRACE("Disabling stream %u.\n", stream_numbers[i]); + wg_parser_stream_disable(stream->wg_stream); + } + else if (selections[i] == WMT_ON) + { + if (selections[i] != WMT_ON) + FIXME("Ignoring selection %#x for stream %u; treating as enabled.\n", + selections[i], stream_numbers[i]); + TRACE("Enabling stream %u.\n", stream_numbers[i]); + wg_parser_stream_enable(stream->wg_stream, &stream->format); + } + } + + LeaveCriticalSection(&reader->cs); + return S_OK; }
static HRESULT WINAPI reader_SetRangeByTimecode(IWMSyncReader2 *iface, WORD stream_num,
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/wm_asyncreader.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/winegstreamer/wm_asyncreader.c index f5509cd865d..84742d2f40f 100644 --- a/dlls/winegstreamer/wm_asyncreader.c +++ b/dlls/winegstreamer/wm_asyncreader.c @@ -496,10 +496,7 @@ static HRESULT WINAPI WMReader_GetOutputCount(IWMReader *iface, DWORD *count)
TRACE("reader %p, count %p.\n", reader, count);
- EnterCriticalSection(&reader->wm_reader->cs); - *count = reader->wm_reader->stream_count; - LeaveCriticalSection(&reader->wm_reader->cs); - return S_OK; + return IWMSyncReader2_GetOutputCount(reader->reader, count); }
static HRESULT WINAPI WMReader_GetOutputProps(IWMReader *iface, DWORD output, IWMOutputMediaProps **props)
This merge request was approved by Zebediah Figura.