summaryrefslogtreecommitdiffstats
path: root/loader/dshow/cmediasample.c
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-12-11 23:29:24 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-12-11 23:29:24 +0000
commit73226c73b01b80b7fe848500ee862caa73775518 (patch)
tree92536ad555b3e002017a244afa75f58bc279a26d /loader/dshow/cmediasample.c
parente2f3778cb0ba8aa7df837d66a53833bdd3a63bb2 (diff)
downloadmpv-73226c73b01b80b7fe848500ee862caa73775518.tar.bz2
mpv-73226c73b01b80b7fe848500ee862caa73775518.tar.xz
avifile sync
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@3468 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'loader/dshow/cmediasample.c')
-rw-r--r--loader/dshow/cmediasample.c96
1 files changed, 70 insertions, 26 deletions
diff --git a/loader/dshow/cmediasample.c b/loader/dshow/cmediasample.c
index d927bb2264..eba60dd4a0 100644
--- a/loader/dshow/cmediasample.c
+++ b/loader/dshow/cmediasample.c
@@ -45,10 +45,11 @@ void CMediaSample_Destroy(CMediaSample* This)
static long STDCALL CMediaSample_Release(IUnknown* This)
{
- CMediaSample* parent=(CMediaSample*)This;
+ 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);
@@ -56,28 +57,27 @@ static long STDCALL CMediaSample_Release(IUnknown* 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("CMediaSample_GetPointer(%p) 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("CMediaSample_GetSize(%p) 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("CMediaSample_GetTime(%p) called\n", This);
+ Debug printf("CMediaSample_GetTime(%p) called (UNIMPLIMENTED)\n", This);
return E_NOTIMPL;
}
@@ -85,7 +85,7 @@ static HRESULT STDCALL CMediaSample_SetTime(IMediaSample * This,
/* [in] */ REFERENCE_TIME *pTimeStart,
/* [in] */ REFERENCE_TIME *pTimeEnd)
{
- Debug printf("CMediaSample_SetTime(%p) called\n", This);
+ Debug printf("CMediaSample_SetTime(%p) called (UNIMPLIMENTED)\n", This);
return E_NOTIMPL;
}
@@ -101,7 +101,7 @@ static HRESULT STDCALL CMediaSample_SetSyncPoint(IMediaSample * This,
long bIsSyncPoint)
{
Debug printf("CMediaSample_SetSyncPoint(%p) called\n", This);
- ((CMediaSample*)This)->isSyncPoint=bIsSyncPoint;
+ ((CMediaSample*)This)->isSyncPoint = bIsSyncPoint;
return 0;
}
@@ -132,12 +132,19 @@ static long STDCALL CMediaSample_GetActualDataLength(IMediaSample* This)
static HRESULT STDCALL CMediaSample_SetActualDataLength(IMediaSample* This,
long __MIDL_0010)
{
+ CMediaSample* cms = (CMediaSample*)This;
Debug printf("CMediaSample_SetActualDataLength(%p, %ld) called\n", This, __MIDL_0010);
- if (__MIDL_0010 > ((CMediaSample*)This)->size)
+ 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;
}
@@ -175,9 +182,14 @@ static HRESULT STDCALL CMediaSample_SetMediaType(IMediaSample * This,
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;
}
@@ -185,14 +197,15 @@ static HRESULT STDCALL CMediaSample_SetMediaType(IMediaSample * This,
static HRESULT STDCALL CMediaSample_IsDiscontinuity(IMediaSample * This)
{
Debug printf("CMediaSample_IsDiscontinuity(%p) called\n", This);
- return 1;
+ return ((CMediaSample*) This)->isDiscontinuity;
}
static HRESULT STDCALL CMediaSample_SetDiscontinuity(IMediaSample * This,
long bDiscontinuity)
{
- Debug printf("CMediaSample_SetDiscontinuity(%p) 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,
@@ -200,7 +213,11 @@ static HRESULT STDCALL CMediaSample_GetMediaTime(IMediaSample * This,
/* [out] */ LONGLONG *pTimeEnd)
{
Debug printf("CMediaSample_GetMediaTime(%p) called\n", This);
- return E_NOTIMPL;
+ if (pTimeStart)
+ *pTimeStart = ((CMediaSample*) This)->time_start;
+ if (pTimeEnd)
+ *pTimeEnd = ((CMediaSample*) This)->time_end;
+ return 0;
}
static HRESULT STDCALL CMediaSample_SetMediaTime(IMediaSample * This,
@@ -208,9 +225,14 @@ static HRESULT STDCALL CMediaSample_SetMediaTime(IMediaSample * This,
/* [in] */ LONGLONG *pTimeEnd)
{
Debug printf("CMediaSample_SetMediaTime(%p) called\n", This);
- return E_NOTIMPL;
+ if (pTimeStart)
+ ((CMediaSample*) This)->time_start = *pTimeStart;
+ if (pTimeEnd)
+ ((CMediaSample*) This)->time_end = *pTimeEnd;
+ return 0;
}
+// 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);
@@ -228,8 +250,29 @@ static void CMediaSample_ResetPointer(CMediaSample* This)
CMediaSample* CMediaSampleCreate(IMemAllocator* allocator, int _size)
{
- CMediaSample* This = (CMediaSample*) malloc(sizeof( CMediaSample ));
+ 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;
@@ -255,10 +298,11 @@ CMediaSample* CMediaSampleCreate(IMemAllocator* allocator, int _size)
This->size = _size;
This->refcount = 0; // increased by MemAllocator
This->actual_size = 0;
- This->media_type.pbFormat = 0;
This->isPreroll = 0;
+ This->isDiscontinuity = 1;
+ This->time_start = 0;
+ This->time_end = 0;
This->type_valid = 0;
- This->own_block = (char*) malloc(This->size);
This->block = This->own_block;
This->SetPointer = CMediaSample_SetPointer;