mfplat: Implement media type handler functionality for stream descriptor.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2019-03-04 13:33:49 +03:00 committed by Alexandre Julliard
parent 0eeb409432
commit bc55b6fdaf
4 changed files with 82 additions and 12 deletions

View File

@ -28,7 +28,6 @@
#include "winreg.h" #include "winreg.h"
#include "initguid.h" #include "initguid.h"
#include "mferror.h"
#include "wine/heap.h" #include "wine/heap.h"
#include "wine/debug.h" #include "wine/debug.h"

View File

@ -37,6 +37,10 @@ struct stream_desc
IMFStreamDescriptor IMFStreamDescriptor_iface; IMFStreamDescriptor IMFStreamDescriptor_iface;
IMFMediaTypeHandler IMFMediaTypeHandler_iface; IMFMediaTypeHandler IMFMediaTypeHandler_iface;
DWORD identifier; DWORD identifier;
IMFMediaType **media_types;
unsigned int media_types_count;
IMFMediaType *current_type;
CRITICAL_SECTION cs;
}; };
static inline struct media_type *impl_from_IMFMediaType(IMFMediaType *iface) static inline struct media_type *impl_from_IMFMediaType(IMFMediaType *iface)
@ -416,11 +420,21 @@ static ULONG WINAPI stream_descriptor_Release(IMFStreamDescriptor *iface)
{ {
struct stream_desc *stream_desc = impl_from_IMFStreamDescriptor(iface); struct stream_desc *stream_desc = impl_from_IMFStreamDescriptor(iface);
ULONG refcount = InterlockedDecrement(&stream_desc->attributes.ref); ULONG refcount = InterlockedDecrement(&stream_desc->attributes.ref);
unsigned int i;
TRACE("%p, refcount %u.\n", iface, refcount); TRACE("%p, refcount %u.\n", iface, refcount);
if (!refcount) if (!refcount)
{ {
for (i = 0; i < stream_desc->media_types_count; ++i)
{
if (stream_desc->media_types[i])
IMFMediaType_Release(stream_desc->media_types[i]);
}
heap_free(stream_desc->media_types);
if (stream_desc->current_type)
IMFMediaType_Release(stream_desc->current_type);
DeleteCriticalSection(&stream_desc->cs);
heap_free(stream_desc); heap_free(stream_desc);
} }
@ -715,31 +729,71 @@ static HRESULT WINAPI mediatype_handler_IsMediaTypeSupported(IMFMediaTypeHandler
static HRESULT WINAPI mediatype_handler_GetMediaTypeCount(IMFMediaTypeHandler *iface, DWORD *count) static HRESULT WINAPI mediatype_handler_GetMediaTypeCount(IMFMediaTypeHandler *iface, DWORD *count)
{ {
FIXME("%p, %p.\n", iface, count); struct stream_desc *stream_desc = impl_from_IMFMediaTypeHandler(iface);
return E_NOTIMPL; TRACE("%p, %p.\n", iface, count);
*count = stream_desc->media_types_count;
return S_OK;
} }
static HRESULT WINAPI mediatype_handler_GetMediaTypeByIndex(IMFMediaTypeHandler *iface, DWORD index, static HRESULT WINAPI mediatype_handler_GetMediaTypeByIndex(IMFMediaTypeHandler *iface, DWORD index,
IMFMediaType **type) IMFMediaType **type)
{ {
FIXME("%p, %u, %p.\n", iface, index, type); struct stream_desc *stream_desc = impl_from_IMFMediaTypeHandler(iface);
return E_NOTIMPL; TRACE("%p, %u, %p.\n", iface, index, type);
if (index >= stream_desc->media_types_count)
return MF_E_NO_MORE_TYPES;
if (stream_desc->media_types[index])
{
*type = stream_desc->media_types[index];
IMFMediaType_AddRef(*type);
}
return stream_desc->media_types[index] ? S_OK : E_FAIL;
} }
static HRESULT WINAPI mediatype_handler_SetCurrentMediaType(IMFMediaTypeHandler *iface, IMFMediaType *type) static HRESULT WINAPI mediatype_handler_SetCurrentMediaType(IMFMediaTypeHandler *iface, IMFMediaType *type)
{ {
FIXME("%p, %p.\n", iface, type); struct stream_desc *stream_desc = impl_from_IMFMediaTypeHandler(iface);
return E_NOTIMPL; TRACE("%p, %p.\n", iface, type);
if (!type)
return E_POINTER;
EnterCriticalSection(&stream_desc->cs);
if (stream_desc->current_type)
IMFMediaType_Release(stream_desc->current_type);
stream_desc->current_type = type;
IMFMediaType_AddRef(stream_desc->current_type);
LeaveCriticalSection(&stream_desc->cs);
return S_OK;
} }
static HRESULT WINAPI mediatype_handler_GetCurrentMediaType(IMFMediaTypeHandler *iface, IMFMediaType **type) static HRESULT WINAPI mediatype_handler_GetCurrentMediaType(IMFMediaTypeHandler *iface, IMFMediaType **type)
{ {
FIXME("%p, %p.\n", iface, type); struct stream_desc *stream_desc = impl_from_IMFMediaTypeHandler(iface);
HRESULT hr = S_OK;
return E_NOTIMPL; TRACE("%p, %p.\n", iface, type);
EnterCriticalSection(&stream_desc->cs);
if (stream_desc->current_type)
{
*type = stream_desc->current_type;
IMFMediaType_AddRef(*type);
}
else
hr = MF_E_NOT_INITIALIZED;
LeaveCriticalSection(&stream_desc->cs);
return hr;
} }
static HRESULT WINAPI mediatype_handler_GetMajorType(IMFMediaTypeHandler *iface, GUID *type) static HRESULT WINAPI mediatype_handler_GetMajorType(IMFMediaTypeHandler *iface, GUID *type)
@ -769,10 +823,14 @@ HRESULT WINAPI MFCreateStreamDescriptor(DWORD identifier, DWORD count,
IMFMediaType **types, IMFStreamDescriptor **descriptor) IMFMediaType **types, IMFStreamDescriptor **descriptor)
{ {
struct stream_desc *object; struct stream_desc *object;
unsigned int i;
TRACE("%d, %d, %p, %p.\n", identifier, count, types, descriptor); TRACE("%d, %d, %p, %p.\n", identifier, count, types, descriptor);
object = heap_alloc(sizeof(*object)); if (!count)
return E_INVALIDARG;
object = heap_alloc_zero(sizeof(*object));
if (!object) if (!object)
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
@ -780,6 +838,20 @@ HRESULT WINAPI MFCreateStreamDescriptor(DWORD identifier, DWORD count,
object->IMFStreamDescriptor_iface.lpVtbl = &streamdescriptorvtbl; object->IMFStreamDescriptor_iface.lpVtbl = &streamdescriptorvtbl;
object->IMFMediaTypeHandler_iface.lpVtbl = &mediatypehandlervtbl; object->IMFMediaTypeHandler_iface.lpVtbl = &mediatypehandlervtbl;
object->identifier = identifier; object->identifier = identifier;
object->media_types = heap_alloc(count * sizeof(*object->media_types));
if (!object->media_types)
{
heap_free(object);
return E_OUTOFMEMORY;
}
for (i = 0; i < count; ++i)
{
object->media_types[i] = types[i];
if (object->media_types[i])
IMFMediaType_AddRef(object->media_types[i]);
}
object->media_types_count = count;
InitializeCriticalSection(&object->cs);
*descriptor = &object->IMFStreamDescriptor_iface; *descriptor = &object->IMFStreamDescriptor_iface;

View File

@ -18,6 +18,7 @@
#include "mfapi.h" #include "mfapi.h"
#include "mfidl.h" #include "mfidl.h"
#include "mferror.h"
typedef struct attributes typedef struct attributes
{ {

View File

@ -20,8 +20,6 @@
#define COBJMACROS #define COBJMACROS
#include "mferror.h"
#include "wine/debug.h" #include "wine/debug.h"
#include "wine/heap.h" #include "wine/heap.h"
#include "wine/list.h" #include "wine/list.h"