diff options
Diffstat (limited to 'src/libw32dll/DirectShow/cmediasample.c')
-rw-r--r-- | src/libw32dll/DirectShow/cmediasample.c | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/src/libw32dll/DirectShow/cmediasample.c b/src/libw32dll/DirectShow/cmediasample.c new file mode 100644 index 000000000..1f2f2d0ca --- /dev/null +++ b/src/libw32dll/DirectShow/cmediasample.c @@ -0,0 +1,263 @@ +#include "cmediasample.h" +#include "../wine/winerror.h" +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +static long STDCALL CMediaSample_QueryInterface(IUnknown * This, + /* [in] */ IID* iid, + /* [iid_is][out] */ void **ppv) +{ + Debug printf("CMediaSample_QueryInterface() called\n"); + if (!ppv) + return E_INVALIDARG; + if (!memcmp(iid, &IID_IUnknown, 16)) + { + *ppv=(void*)This; + ((IMediaSample *)This)->vt->AddRef(This); + return 0; + } + if (!memcmp(iid, &IID_IMediaSample, 16)) + { + *ppv=(void*)This; + ((IMediaSample *)This)->vt->AddRef(This); + return 0; + } + return E_NOINTERFACE; +} + +static long STDCALL CMediaSample_AddRef(IUnknown* This) +{ + Debug printf("CMediaSample_AddRef() called\n"); + ((CMediaSample*)This)->refcount++; + return 0; +} + +static long STDCALL CMediaSample_Release(IUnknown* This) +{ + CMediaSample* parent=(CMediaSample*)This; + Debug printf("%p: CMediaSample_Release() called, new refcount %d\n", + This, ((CMediaSample*)This)->refcount-1); + if (--((CMediaSample*)This)->refcount==0) + parent->all->vt->ReleaseBuffer((IMemAllocator*)(parent->all), + (IMediaSample*)This); + return 0; +} + +static HRESULT STDCALL CMediaSample_GetPointer(IMediaSample * This, + /* [out] */ BYTE **ppBuffer) +{ + Debug printf("%p: CMediaSample_GetPointer() called\n", This); + if (!ppBuffer) + return E_INVALIDARG; + *ppBuffer=(BYTE *)((CMediaSample*)This)->block; + return 0; +} + +static long STDCALL CMediaSample_GetSize(IMediaSample * This) +{ + Debug printf("%p: CMediaSample_GetSize() called -> %d\n", + This, ((CMediaSample*)This)->size); + return ((CMediaSample*)This)->size; +} + +static HRESULT STDCALL CMediaSample_GetTime(IMediaSample * This, + /* [out] */ REFERENCE_TIME *pTimeStart, + /* [out] */ REFERENCE_TIME *pTimeEnd) +{ + Debug printf("%p: CMediaSample_GetTime() called\n", This); + return E_NOTIMPL; +} + +static HRESULT STDCALL CMediaSample_SetTime(IMediaSample * This, + /* [in] */ REFERENCE_TIME *pTimeStart, + /* [in] */ REFERENCE_TIME *pTimeEnd) +{ + Debug printf("%p: CMediaSample_SetTime() called\n", This); + return E_NOTIMPL; +} + +static HRESULT STDCALL CMediaSample_IsSyncPoint(IMediaSample * This) +{ + Debug printf("%p: CMediaSample_IsSyncPoint() called\n", This); + if (((CMediaSample*)This)->isSyncPoint) + return 0; + return 1; +} + +static HRESULT STDCALL CMediaSample_SetSyncPoint(IMediaSample * This, + long bIsSyncPoint) +{ + Debug printf("%p: CMediaSample_SetSyncPoint() called\n", This); + ((CMediaSample*)This)->isSyncPoint=bIsSyncPoint; + return 0; +} + +static HRESULT STDCALL CMediaSample_IsPreroll(IMediaSample * This) +{ + Debug printf("%p: CMediaSample_IsPreroll() called\n", This); + + if (((CMediaSample*)This)->isPreroll) + return 0;//S_OK + + return 1;//S_FALSE +} + +static HRESULT STDCALL CMediaSample_SetPreroll(IMediaSample * This, + long bIsPreroll) +{ + Debug printf("%p: CMediaSample_SetPreroll() called\n", This); + ((CMediaSample*)This)->isPreroll=bIsPreroll; + return 0; +} + +static long STDCALL CMediaSample_GetActualDataLength(IMediaSample * This) +{ + Debug printf("%p: CMediaSample_GetActualDataLength() called -> %d\n", This, ((CMediaSample*)This)->actual_size); + return ((CMediaSample*)This)->actual_size; +} + +static HRESULT STDCALL CMediaSample_SetActualDataLength(IMediaSample * This, + long __MIDL_0010) +{ + Debug printf("%p: CMediaSample_SetActualDataLength(%ld) called\n", This, __MIDL_0010); + if (__MIDL_0010 > ((CMediaSample*)This)->size) + { + printf("%p: ERROR: CMediaSample buffer overflow\n", This); + } + ((CMediaSample*)This)->actual_size=__MIDL_0010; + return 0; +} + +static HRESULT STDCALL CMediaSample_GetMediaType(IMediaSample * This, + AM_MEDIA_TYPE **ppMediaType) +{ + AM_MEDIA_TYPE *t=&((CMediaSample*)This)->media_type; + + Debug printf("%p: CMediaSample_GetMediaType() called\n", This); + if(!ppMediaType) + return E_INVALIDARG; + if(!((CMediaSample*)This)->type_valid) + { + *ppMediaType=0; + return 1; + } +// if(t.pbFormat)CoTaskMemFree(t.pbFormat); + (*ppMediaType)=(AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)); + memcpy(*ppMediaType, t, sizeof(AM_MEDIA_TYPE)); + (*ppMediaType)->pbFormat=(char*)CoTaskMemAlloc(t->cbFormat); + memcpy((*ppMediaType)->pbFormat, t->pbFormat, t->cbFormat); +// *ppMediaType=0; //media type was not changed + return 0; +} + +static HRESULT STDCALL CMediaSample_SetMediaType(IMediaSample * This, + AM_MEDIA_TYPE *pMediaType) +{ + AM_MEDIA_TYPE *t = &((CMediaSample*)This)->media_type; + + Debug printf("%p: CMediaSample_SetMediaType() called\n", This); + if (!pMediaType) + return E_INVALIDARG; + if (t->pbFormat) + CoTaskMemFree(t->pbFormat); + t = pMediaType; + t->pbFormat = (char*)CoTaskMemAlloc(t->cbFormat); + memcpy(t->pbFormat, pMediaType->pbFormat, t->cbFormat); + ((CMediaSample*)This)->type_valid=1; + + return 0; +} + +static HRESULT STDCALL CMediaSample_IsDiscontinuity(IMediaSample * This) +{ + Debug printf("%p: CMediaSample_IsDiscontinuity() called\n", This); + return 1; +} + +static HRESULT STDCALL CMediaSample_SetDiscontinuity(IMediaSample * This, + long bDiscontinuity) +{ + Debug printf("%p: CMediaSample_SetDiscontinuity() called\n", This); + return E_NOTIMPL; +} + +static HRESULT STDCALL CMediaSample_GetMediaTime(IMediaSample * This, + /* [out] */ LONGLONG *pTimeStart, + /* [out] */ LONGLONG *pTimeEnd) +{ + Debug printf("%p: CMediaSample_GetMediaTime() called\n", This); + return E_NOTIMPL; +} + +static HRESULT STDCALL CMediaSample_SetMediaTime(IMediaSample * This, + /* [in] */ LONGLONG *pTimeStart, + /* [in] */ LONGLONG *pTimeEnd) +{ + Debug printf("%p: CMediaSample_SetMediaTime() called\n", This); + return E_NOTIMPL; +} + +void CMediaSample_SetPointer(CMediaSample *this, char* pointer) +{ this->block = pointer; } + +void CMediaSample_ResetPointer(CMediaSample *this) +{ this->block = this->own_block; } + +CMediaSample * CMediaSample_Create(IMemAllocator* allocator, long _size) +{ + CMediaSample *this; + + this = malloc( sizeof( CMediaSample ) ); + this->vt = malloc( sizeof( IMediaSample_vt ) ); + + this->vt->QueryInterface = CMediaSample_QueryInterface; + this->vt->AddRef = CMediaSample_AddRef; + this->vt->Release = CMediaSample_Release; + + this->vt->GetPointer = CMediaSample_GetPointer; + this->vt->GetSize = CMediaSample_GetSize; + this->vt->GetTime = CMediaSample_GetTime; + this->vt->SetTime = CMediaSample_SetTime; + this->vt->IsSyncPoint = CMediaSample_IsSyncPoint; + this->vt->SetSyncPoint = CMediaSample_SetSyncPoint; + this->vt->IsPreroll = CMediaSample_IsPreroll; + this->vt->SetPreroll = CMediaSample_SetPreroll; + this->vt->GetActualDataLength = CMediaSample_GetActualDataLength; + this->vt->SetActualDataLength = CMediaSample_SetActualDataLength; + this->vt->GetMediaType = CMediaSample_GetMediaType; + this->vt->SetMediaType = CMediaSample_SetMediaType; + this->vt->IsDiscontinuity = CMediaSample_IsDiscontinuity; + this->vt->SetDiscontinuity = CMediaSample_SetDiscontinuity; + this->vt->GetMediaTime = CMediaSample_GetMediaTime; + this->vt->SetMediaTime = CMediaSample_SetMediaTime; + + this->all = allocator; + this->size = _size; + this->refcount = 0; + this->actual_size = 0; + this->media_type.pbFormat = 0; + this->isPreroll = 0; + this->type_valid = 0; + this->own_block = malloc(this->size); + this->block = this->own_block; + + this->SetPointer = CMediaSample_SetPointer; + this->ResetPointer = CMediaSample_ResetPointer; + + Debug printf("%p: Creating media sample with size %ld, buffer %p\n", + this, _size, this->block); + return this; +} + +void CMediaSample_Destroy(CMediaSample *this) +{ + Debug printf("%p: CMediaSample::~CMediaSample() called\n", this); + if (!this->vt) + printf("Second delete of CMediaSample()!!\n"); + free( this->vt ); + free( this->own_block ); + if (this->media_type.pbFormat) + CoTaskMemFree(this->media_type.pbFormat); + free( this ); +} |