Commit 90fb2c3e authored by Rémi Bernon's avatar Rémi Bernon Committed by Alexandre Julliard

winegstreamer: Use IWMSyncReader2_GetNextSample in the async reader.

parent b2315480
...@@ -143,54 +143,6 @@ HRESULT winegstreamer_stream_handler_create(REFIID riid, void **obj); ...@@ -143,54 +143,6 @@ HRESULT winegstreamer_stream_handler_create(REFIID riid, void **obj);
HRESULT h264_decoder_create(REFIID riid, void **ret); HRESULT h264_decoder_create(REFIID riid, void **ret);
HRESULT video_processor_create(REFIID riid, void **ret); HRESULT video_processor_create(REFIID riid, void **ret);
struct wm_stream
{
struct wm_reader *reader;
struct wg_parser_stream *wg_stream;
struct wg_format format;
WMT_STREAM_SELECTION selection;
WORD index;
bool eos;
/* Note that we only pretend to read compressed samples, and instead output
* uncompressed samples regardless of whether we are configured to read
* compressed samples. Rather, the behaviour of the reader objects differs
* in nontrivial ways depending on this field. */
bool read_compressed;
IWMReaderAllocatorEx *output_allocator;
IWMReaderAllocatorEx *stream_allocator;
};
struct wm_reader
{
IUnknown IUnknown_inner;
IWMSyncReader2 IWMSyncReader2_iface;
IWMHeaderInfo3 IWMHeaderInfo3_iface;
IWMLanguageList IWMLanguageList_iface;
IWMPacketSize2 IWMPacketSize2_iface;
IWMProfile3 IWMProfile3_iface;
IWMReaderPlaylistBurn IWMReaderPlaylistBurn_iface;
IWMReaderTimecode IWMReaderTimecode_iface;
IUnknown *outer;
LONG refcount;
CRITICAL_SECTION cs;
QWORD start_time;
IStream *source_stream;
HANDLE file;
HANDLE read_thread;
bool read_thread_shutdown;
struct wg_parser *wg_parser;
struct wm_stream *streams;
WORD stream_count;
};
HRESULT WINAPI winegstreamer_create_wm_sync_reader(IUnknown *outer, void **out); 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_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);
#endif /* __GST_PRIVATE_INCLUDED__ */ #endif /* __GST_PRIVATE_INCLUDED__ */
...@@ -48,7 +48,7 @@ struct sample ...@@ -48,7 +48,7 @@ struct sample
{ {
INSSBuffer *buffer; INSSBuffer *buffer;
QWORD pts, duration; QWORD pts, duration;
DWORD flags; DWORD flags, output;
WORD stream; WORD stream;
}; };
...@@ -65,7 +65,6 @@ struct async_reader ...@@ -65,7 +65,6 @@ struct async_reader
LONG refcount; LONG refcount;
IWMSyncReader2 *reader; IWMSyncReader2 *reader;
struct wm_reader *wm_reader;
CRITICAL_SECTION cs; CRITICAL_SECTION cs;
...@@ -261,9 +260,9 @@ static void async_reader_deliver_sample(struct async_reader *reader, struct samp ...@@ -261,9 +260,9 @@ static void async_reader_deliver_sample(struct async_reader *reader, struct samp
BOOL read_compressed; BOOL read_compressed;
HRESULT hr; HRESULT hr;
TRACE("reader %p, stream %u, pts %s, duration %s, flags %#lx, buffer %p.\n", TRACE("reader %p, output %lu, stream %u, pts %s, duration %s, flags %#lx, buffer %p.\n",
reader, sample->stream, debugstr_time(sample->pts), debugstr_time(sample->duration), reader, sample->output, sample->stream, debugstr_time(sample->pts),
sample->flags, sample->buffer); debugstr_time(sample->duration), sample->flags, sample->buffer);
if (FAILED(hr = IWMSyncReader2_GetReadStreamSamples(reader->reader, sample->stream, if (FAILED(hr = IWMSyncReader2_GetReadStreamSamples(reader->reader, sample->stream,
&read_compressed))) &read_compressed)))
...@@ -274,7 +273,7 @@ static void async_reader_deliver_sample(struct async_reader *reader, struct samp ...@@ -274,7 +273,7 @@ static void async_reader_deliver_sample(struct async_reader *reader, struct samp
hr = IWMReaderCallbackAdvanced_OnStreamSample(callback_advanced, sample->stream, hr = IWMReaderCallbackAdvanced_OnStreamSample(callback_advanced, sample->stream,
sample->pts, sample->duration, sample->flags, sample->buffer, reader->context); sample->pts, sample->duration, sample->flags, sample->buffer, reader->context);
else else
hr = IWMReaderCallback_OnSample(callback, sample->stream - 1, sample->pts, sample->duration, hr = IWMReaderCallback_OnSample(callback, sample->output, sample->pts, sample->duration,
sample->flags, sample->buffer, reader->context); sample->flags, sample->buffer, reader->context);
EnterCriticalSection(&reader->callback_cs); EnterCriticalSection(&reader->callback_cs);
...@@ -295,8 +294,8 @@ static void callback_thread_run(struct async_reader *reader) ...@@ -295,8 +294,8 @@ static void callback_thread_run(struct async_reader *reader)
struct sample sample; struct sample sample;
LeaveCriticalSection(&reader->callback_cs); LeaveCriticalSection(&reader->callback_cs);
hr = wm_reader_get_stream_sample(reader->wm_reader, callback_advanced, 0, &sample.buffer, hr = IWMSyncReader2_GetNextSample(reader->reader, 0, &sample.buffer, &sample.pts,
&sample.pts, &sample.duration, &sample.flags, &sample.stream); &sample.duration, &sample.flags, &sample.output, &sample.stream);
EnterCriticalSection(&reader->callback_cs); EnterCriticalSection(&reader->callback_cs);
if (hr != S_OK) if (hr != S_OK)
break; break;
...@@ -1909,7 +1908,6 @@ HRESULT WINAPI winegstreamer_create_wm_async_reader(IWMReader **reader) ...@@ -1909,7 +1908,6 @@ HRESULT WINAPI winegstreamer_create_wm_async_reader(IWMReader **reader)
(void **)&object->reader))) (void **)&object->reader)))
goto failed; goto failed;
IWMReader_Release(&object->IWMReader_iface); IWMReader_Release(&object->IWMReader_iface);
object->wm_reader = wm_reader_from_sync_reader_inner(object->reader_inner);
InitializeCriticalSection(&object->cs); InitializeCriticalSection(&object->cs);
object->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": async_reader.cs"); object->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": async_reader.cs");
......
...@@ -20,6 +20,50 @@ ...@@ -20,6 +20,50 @@
WINE_DEFAULT_DEBUG_CHANNEL(wmvcore); WINE_DEFAULT_DEBUG_CHANNEL(wmvcore);
struct wm_stream
{
struct wm_reader *reader;
struct wg_parser_stream *wg_stream;
struct wg_format format;
WMT_STREAM_SELECTION selection;
WORD index;
bool eos;
/* Note that we only pretend to read compressed samples, and instead output
* uncompressed samples regardless of whether we are configured to read
* compressed samples. Rather, the behaviour of the reader objects differs
* in nontrivial ways depending on this field. */
bool read_compressed;
IWMReaderAllocatorEx *output_allocator;
IWMReaderAllocatorEx *stream_allocator;
};
struct wm_reader
{
IUnknown IUnknown_inner;
IWMSyncReader2 IWMSyncReader2_iface;
IWMHeaderInfo3 IWMHeaderInfo3_iface;
IWMLanguageList IWMLanguageList_iface;
IWMPacketSize2 IWMPacketSize2_iface;
IWMProfile3 IWMProfile3_iface;
IWMReaderPlaylistBurn IWMReaderPlaylistBurn_iface;
IWMReaderTimecode IWMReaderTimecode_iface;
IUnknown *outer;
LONG refcount;
CRITICAL_SECTION cs;
QWORD start_time;
IStream *source_stream;
HANDLE file;
HANDLE read_thread;
bool read_thread_shutdown;
struct wg_parser *wg_parser;
struct wm_stream *streams;
WORD stream_count;
};
static struct wm_stream *get_stream_by_output_number(struct wm_reader *reader, DWORD output) static struct wm_stream *get_stream_by_output_number(struct wm_reader *reader, DWORD output)
{ {
if (output < reader->stream_count) if (output < reader->stream_count)
...@@ -1569,7 +1613,7 @@ static WORD get_earliest_buffer(struct wm_reader *reader, struct wg_parser_buffe ...@@ -1569,7 +1613,7 @@ static WORD get_earliest_buffer(struct wm_reader *reader, struct wg_parser_buffe
return stream_number; return stream_number;
} }
HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, IWMReaderCallbackAdvanced *callback_advanced, WORD stream_number, static HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, WORD stream_number,
INSSBuffer **ret_sample, QWORD *pts, QWORD *duration, DWORD *flags, WORD *ret_stream_number) INSSBuffer **ret_sample, QWORD *pts, QWORD *duration, DWORD *flags, WORD *ret_stream_number)
{ {
struct wg_parser_stream *wg_stream; struct wg_parser_stream *wg_stream;
...@@ -1865,7 +1909,7 @@ static HRESULT WINAPI reader_GetNextSample(IWMSyncReader2 *iface, ...@@ -1865,7 +1909,7 @@ static HRESULT WINAPI reader_GetNextSample(IWMSyncReader2 *iface,
EnterCriticalSection(&reader->cs); EnterCriticalSection(&reader->cs);
hr = wm_reader_get_stream_sample(reader, NULL, stream_number, sample, pts, duration, flags, &stream_number); hr = wm_reader_get_stream_sample(reader, stream_number, sample, pts, duration, flags, &stream_number);
if (output_number && hr == S_OK) if (output_number && hr == S_OK)
*output_number = stream_number - 1; *output_number = stream_number - 1;
if (ret_stream_number && (hr == S_OK || stream_number)) if (ret_stream_number && (hr == S_OK || stream_number))
...@@ -2518,11 +2562,6 @@ static const IWMSyncReader2Vtbl reader_vtbl = ...@@ -2518,11 +2562,6 @@ static const IWMSyncReader2Vtbl reader_vtbl =
reader_GetAllocateForStream reader_GetAllocateForStream
}; };
struct wm_reader *wm_reader_from_sync_reader_inner(IUnknown *iface)
{
return impl_from_IUnknown(iface);
}
HRESULT WINAPI winegstreamer_create_wm_sync_reader(IUnknown *outer, void **out) HRESULT WINAPI winegstreamer_create_wm_sync_reader(IUnknown *outer, void **out)
{ {
struct wm_reader *object; struct wm_reader *object;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment