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:
parent
0eeb409432
commit
bc55b6fdaf
|
@ -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"
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Reference in New Issue