Nikolay Sivov : mfreadwrite: Determine first streams on reader creation.
Alexandre Julliard
julliard at winehq.org
Tue Mar 19 17:09:21 CDT 2019
Module: wine
Branch: master
Commit: 79b37c8aa0d1419794f565aeac8a492a708326bf
URL: https://source.winehq.org/git/wine.git/?a=commit;h=79b37c8aa0d1419794f565aeac8a492a708326bf
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Tue Mar 19 11:17:34 2019 +0300
mfreadwrite: Determine first streams on reader creation.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mfreadwrite/main.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 48 insertions(+)
diff --git a/dlls/mfreadwrite/main.c b/dlls/mfreadwrite/main.c
index 3dac3e4..2d6b7a0 100644
--- a/dlls/mfreadwrite/main.c
+++ b/dlls/mfreadwrite/main.c
@@ -30,6 +30,8 @@
#undef INITGUID
#include <guiddef.h>
+#include "mfapi.h"
+#include "mferror.h"
#include "mfidl.h"
#include "mfreadwrite.h"
@@ -77,6 +79,8 @@ typedef struct source_reader
LONG refcount;
IMFMediaSource *source;
IMFPresentationDescriptor *descriptor;
+ DWORD first_audio_stream_index;
+ DWORD first_video_stream_index;
} srcreader;
struct sink_writer
@@ -374,6 +378,40 @@ struct IMFSourceReaderVtbl srcreader_vtbl =
src_reader_GetPresentationAttribute
};
+static DWORD reader_get_first_stream_index(IMFPresentationDescriptor *descriptor, const GUID *major)
+{
+ unsigned int count, i;
+ BOOL selected;
+ HRESULT hr;
+ GUID guid;
+
+ if (FAILED(IMFPresentationDescriptor_GetStreamDescriptorCount(descriptor, &count)))
+ return MF_SOURCE_READER_INVALID_STREAM_INDEX;
+
+ for (i = 0; i < count; ++i)
+ {
+ IMFMediaTypeHandler *handler;
+ IMFStreamDescriptor *sd;
+
+ if (SUCCEEDED(IMFPresentationDescriptor_GetStreamDescriptorByIndex(descriptor, i, &selected, &sd)))
+ {
+ hr = IMFStreamDescriptor_GetMediaTypeHandler(sd, &handler);
+ IMFStreamDescriptor_Release(sd);
+ if (SUCCEEDED(hr))
+ {
+ hr = IMFMediaTypeHandler_GetMajorType(handler, &guid);
+ IMFMediaTypeHandler_Release(handler);
+ if (SUCCEEDED(hr) && IsEqualGUID(&guid, major))
+ {
+ return i;
+ }
+ }
+ }
+ }
+
+ return MF_SOURCE_READER_INVALID_STREAM_INDEX;
+}
+
static HRESULT create_source_reader_from_source(IMFMediaSource *source, IMFAttributes *attributes,
REFIID riid, void **out)
{
@@ -393,6 +431,16 @@ static HRESULT create_source_reader_from_source(IMFMediaSource *source, IMFAttri
if (FAILED(hr = IMFMediaSource_CreatePresentationDescriptor(object->source, &object->descriptor)))
goto failed;
+ /* At least one major type has to be set. */
+ object->first_audio_stream_index = reader_get_first_stream_index(object->descriptor, &MFMediaType_Audio);
+ object->first_video_stream_index = reader_get_first_stream_index(object->descriptor, &MFMediaType_Video);
+
+ if (object->first_audio_stream_index == MF_SOURCE_READER_INVALID_STREAM_INDEX &&
+ object->first_video_stream_index == MF_SOURCE_READER_INVALID_STREAM_INDEX)
+ {
+ hr = MF_E_ATTRIBUTENOTFOUND;
+ }
+
if (FAILED(hr = IMFMediaSource_BeginGetEvent(object->source, &object->source_events_callback,
(IUnknown *)object->source)))
{
More information about the wine-cvs
mailing list