summaryrefslogtreecommitdiff
path: root/src/libw32dll/DirectShow/cmediasample.c
diff options
context:
space:
mode:
authorMiguel Freitas <miguelfreitas@users.sourceforge.net>2002-01-06 18:56:19 +0000
committerMiguel Freitas <miguelfreitas@users.sourceforge.net>2002-01-06 18:56:19 +0000
commit8377788b342919ec0ff4c29f048b907abce994d4 (patch)
tree4e68ceae3962d2033d0124c232196f6b896cf25f /src/libw32dll/DirectShow/cmediasample.c
parent3c6d03ef837577db63f9b7f246978a9ccb009aae (diff)
downloadxine-lib-8377788b342919ec0ff4c29f048b907abce994d4.tar.gz
xine-lib-8377788b342919ec0ff4c29f048b907abce994d4.tar.bz2
updating directshow support with avifile/mplayer changes
CVS patchset: 1357 CVS date: 2002/01/06 18:56:19
Diffstat (limited to 'src/libw32dll/DirectShow/cmediasample.c')
-rw-r--r--src/libw32dll/DirectShow/cmediasample.c284
1 files changed, 168 insertions, 116 deletions
diff --git a/src/libw32dll/DirectShow/cmediasample.c b/src/libw32dll/DirectShow/cmediasample.c
index 1f2f2d0ca..eba60dd4a 100644
--- a/src/libw32dll/DirectShow/cmediasample.c
+++ b/src/libw32dll/DirectShow/cmediasample.c
@@ -1,26 +1,25 @@
#include "cmediasample.h"
-#include "../wine/winerror.h"
+#include "wine/winerror.h"
#include <stdio.h>
#include <string.h>
-#include <stdlib.h>
-static long STDCALL CMediaSample_QueryInterface(IUnknown * This,
+static long STDCALL CMediaSample_QueryInterface(IUnknown* This,
/* [in] */ IID* iid,
/* [iid_is][out] */ void **ppv)
{
- Debug printf("CMediaSample_QueryInterface() called\n");
+ Debug printf("CMediaSample_QueryInterface(%p) called\n", This);
if (!ppv)
return E_INVALIDARG;
- if (!memcmp(iid, &IID_IUnknown, 16))
+ if (memcmp(iid, &IID_IUnknown, sizeof(*iid)) == 0)
{
- *ppv=(void*)This;
- ((IMediaSample *)This)->vt->AddRef(This);
+ *ppv = (void*)This;
+ ((IMediaSample*) This)->vt->AddRef(This);
return 0;
}
- if (!memcmp(iid, &IID_IMediaSample, 16))
+ if (memcmp(iid, &IID_IMediaSample, sizeof(*iid)) == 0)
{
- *ppv=(void*)This;
- ((IMediaSample *)This)->vt->AddRef(This);
+ *ppv = (void*)This;
+ ((IMediaSample*) This)->vt->AddRef(This);
return 0;
}
return E_NOINTERFACE;
@@ -28,44 +27,57 @@ static long STDCALL CMediaSample_QueryInterface(IUnknown * This,
static long STDCALL CMediaSample_AddRef(IUnknown* This)
{
- Debug printf("CMediaSample_AddRef() called\n");
+ Debug printf("CMediaSample_AddRef(%p) called\n", This);
((CMediaSample*)This)->refcount++;
return 0;
}
+void CMediaSample_Destroy(CMediaSample* This)
+{
+
+ Debug printf("CMediaSample_Destroy(%p) called (ref:%d)\n", This, This->refcount);
+ free(This->vt);
+ free(This->own_block);
+ if (This->media_type.pbFormat)
+ CoTaskMemFree(This->media_type.pbFormat);
+ free(This);
+}
+
static long STDCALL CMediaSample_Release(IUnknown* This)
{
- CMediaSample* parent=(CMediaSample*)This;
- Debug printf("%p: CMediaSample_Release() called, new refcount %d\n",
+ CMediaSample* parent = (CMediaSample*)This;
+ Debug printf("CMediaSample_Release(%p) called (new ref:%d)\n",
This, ((CMediaSample*)This)->refcount-1);
- if (--((CMediaSample*)This)->refcount==0)
+
+ 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)
+static HRESULT STDCALL CMediaSample_GetPointer(IMediaSample* This,
+ /* [out] */ BYTE** ppBuffer)
{
- Debug printf("%p: CMediaSample_GetPointer() called\n", This);
+ Debug printf("CMediaSample_GetPointer(%p) called -> %p, size: %d %d\n", This, ((CMediaSample*) This)->block, ((CMediaSample*)This)->actual_size, ((CMediaSample*)This)->size);
if (!ppBuffer)
return E_INVALIDARG;
- *ppBuffer=(BYTE *)((CMediaSample*)This)->block;
+ *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;
+ Debug printf("CMediaSample_GetSize(%p) 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);
+ Debug printf("CMediaSample_GetTime(%p) called (UNIMPLIMENTED)\n", This);
return E_NOTIMPL;
}
@@ -73,13 +85,13 @@ static HRESULT STDCALL CMediaSample_SetTime(IMediaSample * This,
/* [in] */ REFERENCE_TIME *pTimeStart,
/* [in] */ REFERENCE_TIME *pTimeEnd)
{
- Debug printf("%p: CMediaSample_SetTime() called\n", This);
+ Debug printf("CMediaSample_SetTime(%p) called (UNIMPLIMENTED)\n", This);
return E_NOTIMPL;
}
static HRESULT STDCALL CMediaSample_IsSyncPoint(IMediaSample * This)
{
- Debug printf("%p: CMediaSample_IsSyncPoint() called\n", This);
+ Debug printf("CMediaSample_IsSyncPoint(%p) called\n", This);
if (((CMediaSample*)This)->isSyncPoint)
return 0;
return 1;
@@ -88,14 +100,14 @@ static HRESULT STDCALL CMediaSample_IsSyncPoint(IMediaSample * This)
static HRESULT STDCALL CMediaSample_SetSyncPoint(IMediaSample * This,
long bIsSyncPoint)
{
- Debug printf("%p: CMediaSample_SetSyncPoint() called\n", This);
- ((CMediaSample*)This)->isSyncPoint=bIsSyncPoint;
+ Debug printf("CMediaSample_SetSyncPoint(%p) called\n", This);
+ ((CMediaSample*)This)->isSyncPoint = bIsSyncPoint;
return 0;
}
static HRESULT STDCALL CMediaSample_IsPreroll(IMediaSample * This)
{
- Debug printf("%p: CMediaSample_IsPreroll() called\n", This);
+ Debug printf("CMediaSample_IsPreroll(%p) called\n", This);
if (((CMediaSample*)This)->isPreroll)
return 0;//S_OK
@@ -106,35 +118,41 @@ static HRESULT STDCALL CMediaSample_IsPreroll(IMediaSample * This)
static HRESULT STDCALL CMediaSample_SetPreroll(IMediaSample * This,
long bIsPreroll)
{
- Debug printf("%p: CMediaSample_SetPreroll() called\n", This);
+ Debug printf("CMediaSample_SetPreroll(%p) called\n", This);
((CMediaSample*)This)->isPreroll=bIsPreroll;
return 0;
}
-static long STDCALL CMediaSample_GetActualDataLength(IMediaSample * This)
+static long STDCALL CMediaSample_GetActualDataLength(IMediaSample* This)
{
- Debug printf("%p: CMediaSample_GetActualDataLength() called -> %d\n", This, ((CMediaSample*)This)->actual_size);
+ Debug printf("CMediaSample_GetActualDataLength(%p) called -> %d\n", This, ((CMediaSample*)This)->actual_size);
return ((CMediaSample*)This)->actual_size;
}
-static HRESULT STDCALL CMediaSample_SetActualDataLength(IMediaSample * This,
+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)
+ CMediaSample* cms = (CMediaSample*)This;
+ Debug printf("CMediaSample_SetActualDataLength(%p, %ld) called\n", This, __MIDL_0010);
+ if (__MIDL_0010 > cms->size)
{
- printf("%p: ERROR: CMediaSample buffer overflow\n", This);
+ char* c = cms->own_block;
+ Debug printf(" CMediaSample - buffer overflow %ld %d %p %p\n",
+ __MIDL_0010, ((CMediaSample*)This)->size, cms->own_block, cms->block);
+ cms->own_block = realloc(cms->own_block, __MIDL_0010);
+ if (c == cms->block)
+ cms->block = cms->own_block;
+ cms->size = __MIDL_0010;
}
- ((CMediaSample*)This)->actual_size=__MIDL_0010;
+ cms->actual_size = __MIDL_0010;
return 0;
}
-static HRESULT STDCALL CMediaSample_GetMediaType(IMediaSample * This,
- AM_MEDIA_TYPE **ppMediaType)
+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);
+ AM_MEDIA_TYPE* t;
+ Debug printf("CMediaSample_GetMediaType(%p) called\n", This);
if(!ppMediaType)
return E_INVALIDARG;
if(!((CMediaSample*)This)->type_valid)
@@ -142,122 +160,156 @@ static HRESULT STDCALL CMediaSample_GetMediaType(IMediaSample * This,
*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);
+
+ t = &((CMediaSample*)This)->media_type;
+ // if(t.pbFormat)CoTaskMemFree(t.pbFormat);
+ (*ppMediaType) = (AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
+ **ppMediaType = *t;
+ (*ppMediaType)->pbFormat = (char*)CoTaskMemAlloc(t->cbFormat);
memcpy((*ppMediaType)->pbFormat, t->pbFormat, t->cbFormat);
-// *ppMediaType=0; //media type was not changed
+ // *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);
+ AM_MEDIA_TYPE* t;
+ Debug printf("CMediaSample_SetMediaType(%p) called\n", This);
if (!pMediaType)
return E_INVALIDARG;
+ 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;
+ if (t->cbFormat)
+ {
+ t->pbFormat = (char*)CoTaskMemAlloc(t->cbFormat);
+ memcpy(t->pbFormat, pMediaType->pbFormat, t->cbFormat);
+ }
+ else
+ t->pbFormat = 0;
+ ((CMediaSample*) This)->type_valid=1;
return 0;
}
static HRESULT STDCALL CMediaSample_IsDiscontinuity(IMediaSample * This)
{
- Debug printf("%p: CMediaSample_IsDiscontinuity() called\n", This);
- return 1;
+ Debug printf("CMediaSample_IsDiscontinuity(%p) called\n", This);
+ return ((CMediaSample*) This)->isDiscontinuity;
}
static HRESULT STDCALL CMediaSample_SetDiscontinuity(IMediaSample * This,
long bDiscontinuity)
{
- Debug printf("%p: CMediaSample_SetDiscontinuity() called\n", This);
- return E_NOTIMPL;
+ Debug printf("CMediaSample_SetDiscontinuity(%p) called (%ld)\n", This, bDiscontinuity);
+ ((CMediaSample*) This)->isDiscontinuity = bDiscontinuity;
+ return 0;
}
static HRESULT STDCALL CMediaSample_GetMediaTime(IMediaSample * This,
/* [out] */ LONGLONG *pTimeStart,
/* [out] */ LONGLONG *pTimeEnd)
{
- Debug printf("%p: CMediaSample_GetMediaTime() called\n", This);
- return E_NOTIMPL;
+ Debug printf("CMediaSample_GetMediaTime(%p) called\n", This);
+ if (pTimeStart)
+ *pTimeStart = ((CMediaSample*) This)->time_start;
+ if (pTimeEnd)
+ *pTimeEnd = ((CMediaSample*) This)->time_end;
+ return 0;
}
static HRESULT STDCALL CMediaSample_SetMediaTime(IMediaSample * This,
/* [in] */ LONGLONG *pTimeStart,
/* [in] */ LONGLONG *pTimeEnd)
{
- Debug printf("%p: CMediaSample_SetMediaTime() called\n", This);
- return E_NOTIMPL;
+ Debug printf("CMediaSample_SetMediaTime(%p) called\n", This);
+ if (pTimeStart)
+ ((CMediaSample*) This)->time_start = *pTimeStart;
+ if (pTimeEnd)
+ ((CMediaSample*) This)->time_end = *pTimeEnd;
+ return 0;
}
-void CMediaSample_SetPointer(CMediaSample *this, char* pointer)
-{ this->block = pointer; }
+// extension for direct memory write or decompressed data
+static void CMediaSample_SetPointer(CMediaSample* This, char* pointer)
+{
+ Debug printf("CMediaSample_SetPointer(%p) called -> %p\n", This, pointer);
+ if (pointer)
+ This->block = pointer;
+ else
+ This->block = This->own_block;
+}
-void CMediaSample_ResetPointer(CMediaSample *this)
-{ this->block = this->own_block; }
-
-CMediaSample * CMediaSample_Create(IMemAllocator* allocator, long _size)
+static void CMediaSample_ResetPointer(CMediaSample* This)
{
- 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;
+ Debug printf("CMediaSample_ResetPointer(%p) called\n", This);
+ This->block = This->own_block;
}
-void CMediaSample_Destroy(CMediaSample *this)
+CMediaSample* CMediaSampleCreate(IMemAllocator* allocator, int _size)
{
- 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 );
+ CMediaSample* This = (CMediaSample*) malloc(sizeof(CMediaSample));
+ if (!This)
+ return NULL;
+
+ // some hack here!
+ // it looks like Acelp decoder is actually accessing
+ // the allocated memory before it sets the new size for it ???
+ // -- maybe it's being initialized with wrong parameters
+ // anyway this is fixes the problem somehow with some reserves
+ //
+ // using different trick for now - in DS_Audio modify sample size
+ //if (_size < 0x1000)
+ // _size = (_size + 0xfff) & ~0xfff;
+
+ This->vt = (IMediaSample_vt*) malloc(sizeof(IMediaSample_vt));
+ This->own_block = (char*) malloc(_size);
+ This->media_type.pbFormat = 0;
+
+ if (!This->vt || !This->own_block)
+ {
+ CMediaSample_Destroy(This);
+ return NULL;
+ }
+
+ 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; // increased by MemAllocator
+ This->actual_size = 0;
+ This->isPreroll = 0;
+ This->isDiscontinuity = 1;
+ This->time_start = 0;
+ This->time_end = 0;
+ This->type_valid = 0;
+ This->block = This->own_block;
+
+ This->SetPointer = CMediaSample_SetPointer;
+ This->ResetPointer = CMediaSample_ResetPointer;
+
+ Debug printf("CMediaSample_Create(%p) called - sample size %d, buffer %p\n",
+ This, This->size, This->block);
+
+ return This;
}