mfreadwrite/reader: Update to IMFSourceReaderEx.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
This commit is contained in:
Alistair Leslie-Hughes 2023-09-16 19:24:20 +02:00 committed by Alexandre Julliard
parent 67fbcff745
commit 07f50ee66b
2 changed files with 96 additions and 37 deletions

View file

@ -145,7 +145,7 @@ enum source_reader_flags
struct source_reader
{
IMFSourceReader IMFSourceReader_iface;
IMFSourceReaderEx IMFSourceReaderEx_iface;
IMFAsyncCallback source_events_callback;
IMFAsyncCallback stream_events_callback;
IMFAsyncCallback async_commands_callback;
@ -170,9 +170,9 @@ struct source_reader
CONDITION_VARIABLE stop_event;
};
static inline struct source_reader *impl_from_IMFSourceReader(IMFSourceReader *iface)
static inline struct source_reader *impl_from_IMFSourceReaderEx(IMFSourceReaderEx *iface)
{
return CONTAINING_RECORD(iface, struct source_reader, IMFSourceReader_iface);
return CONTAINING_RECORD(iface, struct source_reader, IMFSourceReaderEx_iface);
}
static struct source_reader *impl_from_source_callback_IMFAsyncCallback(IMFAsyncCallback *iface)
@ -1329,16 +1329,17 @@ static const IMFAsyncCallbackVtbl async_commands_callback_vtbl =
source_reader_async_commands_callback_Invoke,
};
static HRESULT WINAPI src_reader_QueryInterface(IMFSourceReader *iface, REFIID riid, void **out)
static HRESULT WINAPI src_reader_QueryInterface(IMFSourceReaderEx *iface, REFIID riid, void **out)
{
struct source_reader *reader = impl_from_IMFSourceReader(iface);
struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out);
if(IsEqualGUID(riid, &IID_IUnknown) ||
IsEqualGUID(riid, &IID_IMFSourceReader))
if (IsEqualGUID(riid, &IID_IUnknown)
|| IsEqualGUID(riid, &IID_IMFSourceReader)
|| IsEqualGUID(riid, &IID_IMFSourceReaderEx))
{
*out = &reader->IMFSourceReader_iface;
*out = &reader->IMFSourceReaderEx_iface;
}
else
{
@ -1351,9 +1352,9 @@ static HRESULT WINAPI src_reader_QueryInterface(IMFSourceReader *iface, REFIID r
return S_OK;
}
static ULONG WINAPI src_reader_AddRef(IMFSourceReader *iface)
static ULONG WINAPI src_reader_AddRef(IMFSourceReaderEx *iface)
{
struct source_reader *reader = impl_from_IMFSourceReader(iface);
struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
ULONG refcount = InterlockedIncrement(&reader->public_refcount);
TRACE("%p, refcount %lu.\n", iface, refcount);
@ -1377,9 +1378,9 @@ static BOOL source_reader_is_source_stopped(const struct source_reader *reader)
return TRUE;
}
static ULONG WINAPI src_reader_Release(IMFSourceReader *iface)
static ULONG WINAPI src_reader_Release(IMFSourceReaderEx *iface)
{
struct source_reader *reader = impl_from_IMFSourceReader(iface);
struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
ULONG refcount = InterlockedDecrement(&reader->public_refcount);
unsigned int i;
@ -1423,9 +1424,9 @@ static ULONG WINAPI src_reader_Release(IMFSourceReader *iface)
return refcount;
}
static HRESULT WINAPI src_reader_GetStreamSelection(IMFSourceReader *iface, DWORD index, BOOL *selected)
static HRESULT WINAPI src_reader_GetStreamSelection(IMFSourceReaderEx *iface, DWORD index, BOOL *selected)
{
struct source_reader *reader = impl_from_IMFSourceReader(iface);
struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
TRACE("%p, %#lx, %p.\n", iface, index, selected);
@ -1444,9 +1445,9 @@ static HRESULT WINAPI src_reader_GetStreamSelection(IMFSourceReader *iface, DWOR
return source_reader_get_stream_selection(reader, index, selected);
}
static HRESULT WINAPI src_reader_SetStreamSelection(IMFSourceReader *iface, DWORD index, BOOL selection)
static HRESULT WINAPI src_reader_SetStreamSelection(IMFSourceReaderEx *iface, DWORD index, BOOL selection)
{
struct source_reader *reader = impl_from_IMFSourceReader(iface);
struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
HRESULT hr = S_OK;
BOOL selection_changed = FALSE, selected;
unsigned int i;
@ -1554,19 +1555,19 @@ static HRESULT source_reader_get_native_media_type(struct source_reader *reader,
return hr;
}
static HRESULT WINAPI src_reader_GetNativeMediaType(IMFSourceReader *iface, DWORD index, DWORD type_index,
static HRESULT WINAPI src_reader_GetNativeMediaType(IMFSourceReaderEx *iface, DWORD index, DWORD type_index,
IMFMediaType **type)
{
struct source_reader *reader = impl_from_IMFSourceReader(iface);
struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
TRACE("%p, %#lx, %#lx, %p.\n", iface, index, type_index, type);
return source_reader_get_native_media_type(reader, index, type_index, type);
}
static HRESULT WINAPI src_reader_GetCurrentMediaType(IMFSourceReader *iface, DWORD index, IMFMediaType **type)
static HRESULT WINAPI src_reader_GetCurrentMediaType(IMFSourceReaderEx *iface, DWORD index, IMFMediaType **type)
{
struct source_reader *reader = impl_from_IMFSourceReader(iface);
struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
HRESULT hr;
TRACE("%p, %#lx, %p.\n", iface, index, type);
@ -1846,10 +1847,10 @@ static HRESULT source_reader_create_decoder_for_stream(struct source_reader *rea
return MF_E_TOPO_CODEC_NOT_FOUND;
}
static HRESULT WINAPI src_reader_SetCurrentMediaType(IMFSourceReader *iface, DWORD index, DWORD *reserved,
static HRESULT WINAPI src_reader_SetCurrentMediaType(IMFSourceReaderEx *iface, DWORD index, DWORD *reserved,
IMFMediaType *type)
{
struct source_reader *reader = impl_from_IMFSourceReader(iface);
struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
HRESULT hr;
TRACE("%p, %#lx, %p, %p.\n", iface, index, reserved, type);
@ -1884,9 +1885,9 @@ static HRESULT WINAPI src_reader_SetCurrentMediaType(IMFSourceReader *iface, DWO
return hr;
}
static HRESULT WINAPI src_reader_SetCurrentPosition(IMFSourceReader *iface, REFGUID format, REFPROPVARIANT position)
static HRESULT WINAPI src_reader_SetCurrentPosition(IMFSourceReaderEx *iface, REFGUID format, REFPROPVARIANT position)
{
struct source_reader *reader = impl_from_IMFSourceReader(iface);
struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
struct source_reader_async_command *command;
unsigned int i;
DWORD flags;
@ -2036,10 +2037,10 @@ static HRESULT source_reader_read_sample_async(struct source_reader *reader, uns
return hr;
}
static HRESULT WINAPI src_reader_ReadSample(IMFSourceReader *iface, DWORD index, DWORD flags, DWORD *actual_index,
static HRESULT WINAPI src_reader_ReadSample(IMFSourceReaderEx *iface, DWORD index, DWORD flags, DWORD *actual_index,
DWORD *stream_flags, LONGLONG *timestamp, IMFSample **sample)
{
struct source_reader *reader = impl_from_IMFSourceReader(iface);
struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
HRESULT hr;
TRACE("%p, %#lx, %#lx, %p, %p, %p, %p\n", iface, index, flags, actual_index, stream_flags, timestamp, sample);
@ -2098,9 +2099,9 @@ static HRESULT source_reader_flush_async(struct source_reader *reader, unsigned
return hr;
}
static HRESULT WINAPI src_reader_Flush(IMFSourceReader *iface, DWORD index)
static HRESULT WINAPI src_reader_Flush(IMFSourceReaderEx *iface, DWORD index)
{
struct source_reader *reader = impl_from_IMFSourceReader(iface);
struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
HRESULT hr;
TRACE("%p, %#lx.\n", iface, index);
@ -2117,10 +2118,10 @@ static HRESULT WINAPI src_reader_Flush(IMFSourceReader *iface, DWORD index)
return hr;
}
static HRESULT WINAPI src_reader_GetServiceForStream(IMFSourceReader *iface, DWORD index, REFGUID service,
static HRESULT WINAPI src_reader_GetServiceForStream(IMFSourceReaderEx *iface, DWORD index, REFGUID service,
REFIID riid, void **object)
{
struct source_reader *reader = impl_from_IMFSourceReader(iface);
struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
IUnknown *obj = NULL;
HRESULT hr = S_OK;
@ -2179,10 +2180,10 @@ static HRESULT WINAPI src_reader_GetServiceForStream(IMFSourceReader *iface, DWO
return hr;
}
static HRESULT WINAPI src_reader_GetPresentationAttribute(IMFSourceReader *iface, DWORD index,
static HRESULT WINAPI src_reader_GetPresentationAttribute(IMFSourceReaderEx *iface, DWORD index,
REFGUID guid, PROPVARIANT *value)
{
struct source_reader *reader = impl_from_IMFSourceReader(iface);
struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
IMFStreamDescriptor *sd;
BOOL selected;
HRESULT hr;
@ -2227,7 +2228,38 @@ static HRESULT WINAPI src_reader_GetPresentationAttribute(IMFSourceReader *iface
return hr;
}
static const IMFSourceReaderVtbl srcreader_vtbl =
static HRESULT WINAPI src_reader_SetNativeMediaType(IMFSourceReaderEx *iface, DWORD stream_index,
IMFMediaType *media_type, DWORD *stream_flags)
{
FIXME("%p, %#lx, %p, %p.\n", iface, stream_index, media_type, stream_flags);
return E_NOTIMPL;
}
static HRESULT WINAPI src_reader_AddTransformForStream(IMFSourceReaderEx *iface, DWORD stream_index,
IUnknown *transform)
{
FIXME("%p, %#lx, %p.\n", iface, stream_index, transform);
return E_NOTIMPL;
}
static HRESULT WINAPI src_reader_RemoveAllTransformsForStream(IMFSourceReaderEx *iface, DWORD stream_index)
{
FIXME("%p, %#lx.\n", iface, stream_index);
return E_NOTIMPL;
}
static HRESULT WINAPI src_reader_GetTransformForStream(IMFSourceReaderEx *iface, DWORD stream_index,
DWORD transform_index, GUID *category, IMFTransform **transform)
{
FIXME("%p, %#lx, %#lx, %p, %p.\n", iface, stream_index, transform_index, category, transform);
return E_NOTIMPL;
}
static const IMFSourceReaderExVtbl srcreader_vtbl =
{
src_reader_QueryInterface,
src_reader_AddRef,
@ -2241,7 +2273,11 @@ static const IMFSourceReaderVtbl srcreader_vtbl =
src_reader_ReadSample,
src_reader_Flush,
src_reader_GetServiceForStream,
src_reader_GetPresentationAttribute
src_reader_GetPresentationAttribute,
src_reader_SetNativeMediaType,
src_reader_AddTransformForStream,
src_reader_RemoveAllTransformsForStream,
src_reader_GetTransformForStream,
};
static DWORD reader_get_first_stream_index(IMFPresentationDescriptor *descriptor, const GUID *major)
@ -2295,7 +2331,7 @@ static HRESULT create_source_reader_from_source(IMFMediaSource *source, IMFAttri
if (!object)
return E_OUTOFMEMORY;
object->IMFSourceReader_iface.lpVtbl = &srcreader_vtbl;
object->IMFSourceReaderEx_iface.lpVtbl = &srcreader_vtbl;
object->source_events_callback.lpVtbl = &source_events_callback_vtbl;
object->stream_events_callback.lpVtbl = &stream_events_callback_vtbl;
object->async_commands_callback.lpVtbl = &async_commands_callback_vtbl;
@ -2414,10 +2450,10 @@ static HRESULT create_source_reader_from_source(IMFMediaSource *source, IMFAttri
WARN("Failed to acquired shared queue, hr %#lx.\n", hr);
if (SUCCEEDED(hr))
hr = IMFSourceReader_QueryInterface(&object->IMFSourceReader_iface, riid, out);
hr = IMFSourceReaderEx_QueryInterface(&object->IMFSourceReaderEx_iface, riid, out);
failed:
IMFSourceReader_Release(&object->IMFSourceReader_iface);
IMFSourceReaderEx_Release(&object->IMFSourceReaderEx_iface);
return hr;
}

View file

@ -1505,6 +1505,28 @@ static void test_sink_writer_mp4(void)
IMFAttributes_Release(attr);
}
static void test_interfaces(void)
{
IMFSourceReader *reader;
IMFMediaSource *source;
IUnknown *unk;
HRESULT hr;
source = create_test_source(1);
ok(!!source, "Failed to create test source.\n");
hr = MFCreateSourceReaderFromMediaSource(source, NULL, &reader);
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = IMFSourceReader_QueryInterface(reader, &IID_IMFSourceReaderEx, (void **)&unk);
ok(hr == S_OK || broken(hr == E_NOINTERFACE) /* Windows 7 and below.*/, "Unexpected hr %#lx.\n", hr);
if (unk)
IUnknown_Release(unk);
IMFSourceReader_Release(reader);
IMFMediaSource_Release(source);
}
START_TEST(mfplat)
{
HRESULT hr;
@ -1514,6 +1536,7 @@ START_TEST(mfplat)
init_functions();
test_interfaces();
test_factory();
test_source_reader("test.wav", false);
test_source_reader("test.mp4", true);