summaryrefslogtreecommitdiffstats
path: root/loader/dshow/cmediasample.c
diff options
context:
space:
mode:
Diffstat (limited to 'loader/dshow/cmediasample.c')
-rw-r--r--loader/dshow/cmediasample.c251
1 files changed, 251 insertions, 0 deletions
diff --git a/loader/dshow/cmediasample.c b/loader/dshow/cmediasample.c
new file mode 100644
index 0000000000..c54774ad82
--- /dev/null
+++ b/loader/dshow/cmediasample.c
@@ -0,0 +1,251 @@
+#include <stdio.h>
+#include <string.h>
+#include "cmediasample.h"
+#define E_NOTIMPL 0x80004003
+CMediaSample::CMediaSample(IMemAllocator* allocator, long _size):refcount(0)
+{
+ vt=new IMediaSample_vt;
+
+ vt->QueryInterface=QueryInterface;
+ vt->AddRef=AddRef;
+ vt->Release=Release;
+ vt->GetPointer=GetPointer ;
+ vt->GetSize=GetSize ;
+ vt->GetTime=GetTime ;
+ vt->SetTime=SetTime ;
+ vt->IsSyncPoint=IsSyncPoint ;
+ vt->SetSyncPoint=SetSyncPoint;
+ vt->IsPreroll=IsPreroll;
+ vt->SetPreroll=SetPreroll;
+ vt->GetActualDataLength=GetActualDataLength;
+ vt->SetActualDataLength=SetActualDataLength;
+ vt->GetMediaType=GetMediaType;
+ vt->SetMediaType=SetMediaType;
+ vt->IsDiscontinuity=IsDiscontinuity;
+ vt->SetDiscontinuity=SetDiscontinuity;
+ vt->GetMediaTime=GetMediaTime;
+ vt->SetMediaTime=SetMediaTime;
+
+ all=allocator;
+ size=_size;
+ actual_size=0;
+ media_type.pbFormat=0;
+ isPreroll=0;
+ type_valid=0;
+ block=new char[size];
+ Debug printf("%x: Creating media sample with size %d, buffer 0x%x\n", this, _size, block);
+}
+CMediaSample::~CMediaSample()
+{
+ Debug printf("%x: CMediaSample::~CMediaSample() called\n", this);
+ delete vt;
+ delete[] block;
+ if(media_type.pbFormat)
+ CoTaskMemFree(media_type.pbFormat);
+}
+
+long STDCALL CMediaSample::QueryInterface (
+ IUnknown * This,
+ /* [in] */ IID* iid,
+ /* [iid_is][out] */ void **ppv)
+{
+ Debug printf("CMediaSample::QueryInterface() called\n");
+ if(!ppv)return 0x80004003;
+ if(!memcmp(iid, &IID_IUnknown, 16))
+ {
+ *ppv=(void*)This;
+ This->vt->AddRef(This);
+ return 0;
+ }
+ if(!memcmp(iid, &IID_IMediaSample, 16))
+ {
+ *ppv=(void*)This;
+ This->vt->AddRef(This);
+ return 0;
+ }
+ return 0x80004002;
+}
+
+long STDCALL CMediaSample::AddRef (
+ IUnknown * This)
+{
+ Debug printf("CMediaSample::AddRef() called\n");
+ ((CMediaSample*)This)->refcount++;
+ return 0;
+}
+
+long STDCALL CMediaSample::Release (
+ IUnknown * This)
+{
+ Debug printf("%x: CMediaSample::Release() called, new refcount %d\n", This,
+ ((CMediaSample*)This)->refcount-1);
+ CMediaSample* parent=(CMediaSample*)This;
+ if(--((CMediaSample*)This)->refcount==0)
+ parent->
+ all->
+ vt->
+ ReleaseBuffer(
+ (IMemAllocator*)(parent->all),
+ (IMediaSample*)This);
+ return 0;
+}
+HRESULT STDCALL CMediaSample::GetPointer (
+ IMediaSample * This,
+ /* [out] */ BYTE **ppBuffer)
+{
+ Debug printf("%x: CMediaSample::GetPointer() called\n", This);
+ if(!ppBuffer)return 0x80004003;
+ *ppBuffer=(BYTE *)((CMediaSample*)This)->block;
+ return 0;
+}
+
+long STDCALL CMediaSample::GetSize (
+ IMediaSample * This)
+{
+ Debug printf("%x: CMediaSample::GetSize() called -> %d\n", This, ((CMediaSample*)This)->size);
+ return ((CMediaSample*)This)->size;
+}
+
+HRESULT STDCALL CMediaSample::GetTime (
+ IMediaSample * This,
+ /* [out] */ REFERENCE_TIME *pTimeStart,
+ /* [out] */ REFERENCE_TIME *pTimeEnd)
+{
+ Debug printf("%x: CMediaSample::GetTime() called\n", This);
+ return E_NOTIMPL;
+}
+
+HRESULT STDCALL CMediaSample::SetTime (
+ IMediaSample * This,
+ /* [in] */ REFERENCE_TIME *pTimeStart,
+ /* [in] */ REFERENCE_TIME *pTimeEnd)
+{
+ Debug printf("%x: CMediaSample::SetTime() called\n", This);
+ return E_NOTIMPL;
+}
+
+HRESULT STDCALL CMediaSample::IsSyncPoint (
+ IMediaSample * This)
+{
+ Debug printf("%x: CMediaSample::IsSyncPoint() called\n", This);
+ if(((CMediaSample*)This)->isSyncPoint)return 0;
+ return 1;
+}
+
+HRESULT STDCALL CMediaSample::SetSyncPoint (
+ IMediaSample * This,
+ long bIsSyncPoint)
+{
+ Debug printf("%x: CMediaSample::SetSyncPoint() called\n", This);
+ ((CMediaSample*)This)->isSyncPoint=bIsSyncPoint;
+ return 0;
+}
+
+HRESULT STDCALL CMediaSample::IsPreroll (
+ IMediaSample * This)
+{
+ Debug printf("%x: CMediaSample::IsPreroll() called\n", This);
+ if(((CMediaSample*)This)->isPreroll==0)
+ return 1;//S_FALSE
+ else
+ return 0;//S_OK
+}
+
+HRESULT STDCALL CMediaSample::SetPreroll (
+ IMediaSample * This,
+ long bIsPreroll)
+{
+ Debug printf("%x: CMediaSample::SetPreroll() called\n", This);
+ ((CMediaSample*)This)->isPreroll=bIsPreroll;
+ return 0;
+}
+
+long STDCALL CMediaSample::GetActualDataLength (
+ IMediaSample * This)
+{
+ Debug printf("%x: CMediaSample::GetActualDataLength() called -> %d\n", This, ((CMediaSample*)This)->actual_size);
+ return ((CMediaSample*)This)->actual_size;
+}
+
+HRESULT STDCALL CMediaSample::SetActualDataLength (
+ IMediaSample * This,
+ long __MIDL_0010)
+{
+ Debug printf("%x: CMediaSample::SetActualDataLength(%d) called\n", This, __MIDL_0010);
+ if(__MIDL_0010>((CMediaSample*)This)->size)
+ {
+ printf("%x: ERROR: CMediaSample buffer overflow\n", This);
+ }
+ ((CMediaSample*)This)->actual_size=__MIDL_0010;
+ return 0;
+}
+
+HRESULT STDCALL CMediaSample::GetMediaType (
+ IMediaSample * This,
+ AM_MEDIA_TYPE **ppMediaType)
+{
+ Debug printf("%x: CMediaSample::GetMediaType() called\n", This);
+ if(!ppMediaType)
+ return 0x80004003;
+ if(!((CMediaSample*)This)->type_valid)
+ {
+ *ppMediaType=0;
+ return 1;
+ }
+ AM_MEDIA_TYPE& t=((CMediaSample*)This)->media_type;
+// 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;
+}
+
+HRESULT STDCALL CMediaSample::SetMediaType (
+ IMediaSample * This,
+ AM_MEDIA_TYPE *pMediaType)
+{
+ Debug printf("%x: CMediaSample::SetMediaType() called\n", This);
+ if(!pMediaType)return 0x80004003;
+ AM_MEDIA_TYPE& t=((CMediaSample*)This)->media_type;
+ 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;
+}
+
+HRESULT STDCALL CMediaSample::IsDiscontinuity (
+ IMediaSample * This)
+{
+ Debug printf("%x: CMediaSample::IsDiscontinuity() called\n", This);
+ return 1;
+}
+
+HRESULT STDCALL CMediaSample::SetDiscontinuity (
+ IMediaSample * This,
+ long bDiscontinuity)
+{
+ Debug printf("%x: CMediaSample::SetDiscontinuity() called\n", This);
+ return E_NOTIMPL;
+}
+
+HRESULT STDCALL CMediaSample::GetMediaTime (
+ IMediaSample * This,
+ /* [out] */ LONGLONG *pTimeStart,
+ /* [out] */ LONGLONG *pTimeEnd)
+{
+ Debug printf("%x: CMediaSample::GetMediaTime() called\n", This);
+ return E_NOTIMPL;
+}
+
+HRESULT STDCALL CMediaSample::SetMediaTime (
+ IMediaSample * This,
+ /* [in] */ LONGLONG *pTimeStart,
+ /* [in] */ LONGLONG *pTimeEnd)
+{
+ Debug printf("%x: CMediaSample::SetMediaTime() called\n", This);
+ return E_NOTIMPL;
+}