[Mplayer-cvslog] CVS: main/loader/dshow DS_Filter.c,1.12,1.13 DS_Filter.h,1.6,1.7 allocator.c,1.5,1.6 cmediasample.c,1.6,1.7 cmediasample.h,1.5,1.6 guids.c,1.3,1.4 guids.h,1.4,1.5 inputpin.c,1.5,1.6 inputpin.h,1.4,1.5 interfaces.h,1.6,1.7 outputpin.c,1.8,1.9
Arpi of Ize
arpi at mplayer.dev.hu
Wed Dec 12 00:29:26 CET 2001
Update of /cvsroot/mplayer/main/loader/dshow
In directory mplayer:/var/tmp.root/cvs-serv8691
Modified Files:
DS_Filter.c DS_Filter.h allocator.c cmediasample.c
cmediasample.h guids.c guids.h inputpin.c inputpin.h
interfaces.h outputpin.c
Log Message:
avifile sync
Index: DS_Filter.c
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/DS_Filter.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- DS_Filter.c 26 Nov 2001 00:56:11 -0000 1.12
+++ DS_Filter.c 11 Dec 2001 23:29:24 -0000 1.13
@@ -12,7 +12,7 @@
{
HRESULT hr;
- if (This->m_iState != 1)
+ if (This->m_pAll)
return;
//Debug printf("DS_Filter_Start(%p)\n", This);
@@ -30,23 +30,14 @@
return;
}
This->m_pImp->vt->NotifyAllocator(This->m_pImp, This->m_pAll, 0);
- This->m_iState = 2;
}
static void DS_Filter_Stop(DS_Filter* This)
{
- if (This->m_iState == 2)
+ if (This->m_pAll)
{
- This->m_iState = 1;
//Debug printf("DS_Filter_Stop(%p)\n", This);
- if (This->m_pFilter)
- {
- //printf("vt: %p\n", m_pFilter->vt);
- //printf("vtstop %p\n", m_pFilter->vt->Stop);
- This->m_pFilter->vt->Stop(This->m_pFilter); // causes weird crash ??? FIXME
- }
- else
- printf("WARNING: DS_Filter::Stop() m_pFilter is NULL!\n");
+ This->m_pFilter->vt->Stop(This->m_pFilter); // causes weird crash ??? FIXME
This->m_pAll->vt->Release((IUnknown*)This->m_pAll);
This->m_pAll = 0;
}
@@ -56,8 +47,6 @@
{
This->Stop(This);
- This->m_iState = 0;
-
if (This->m_pOurInput)
This->m_pOurInput->vt->Release((IUnknown*)This->m_pOurInput);
if (This->m_pInputPin)
@@ -93,6 +82,9 @@
AM_MEDIA_TYPE* in_fmt,
AM_MEDIA_TYPE* out_fmt)
{
+ int init = 0;
+ char eb[250];
+ const char* em = NULL;
DS_Filter* This = (DS_Filter*) malloc(sizeof(DS_Filter));
if (!This)
return NULL;
@@ -108,7 +100,6 @@
This->m_pOurOutput = NULL;
This->m_pAll = NULL;
This->m_pImp = NULL;
- This->m_iState = 0;
This->Start = DS_Filter_Start;
This->Stop = DS_Filter_Stop;
@@ -127,40 +118,40 @@
This->m_iHandle = LoadLibraryA(dllname);
if (!This->m_iHandle)
{
- printf("Could not open DirectShow DLL: %.200s\n", dllname);
+ em = "could not open DirectShow DLL";
break;
}
func = (GETCLASS)GetProcAddress(This->m_iHandle, "DllGetClassObject");
if (!func)
{
- printf("Illegal or corrupt DirectShow DLL: %.200s\n", dllname);
+ em = "illegal or corrupt DirectShow DLL";
break;
}
result = func(id, &IID_IClassFactory, (void**)&factory);
if (result || !factory)
{
- printf("No such class object\n");
+ em = "no such class object";
break;
}
result = factory->vt->CreateInstance(factory, 0, &IID_IUnknown, (void**)&object);
factory->vt->Release((IUnknown*)factory);
if (result || !object)
{
- printf("Class factory failure\n");
+ em = "class factory failure";
break;
}
result = object->vt->QueryInterface(object, &IID_IBaseFilter, (void**)&This->m_pFilter);
object->vt->Release((IUnknown*)object);
if (result || !This->m_pFilter)
{
- printf("Object does not have IBaseFilter interface\n");
+ em = "object does not have IBaseFilter interface";
break;
}
// enumerate pins
result = This->m_pFilter->vt->EnumPins(This->m_pFilter, &enum_pins);
if (result || !enum_pins)
{
- printf("Could not enumerate pins\n");
+ em = "could not enumerate pins";
break;
}
@@ -186,12 +177,12 @@
}
if (!This->m_pInputPin)
{
- printf("Input pin not found\n");
+ em = "could not find input pin";
break;
}
if (!This->m_pOutputPin)
{
- printf("Output pin not found\n");
+ em = "could not find output pin";
break;
}
result = This->m_pInputPin->vt->QueryInterface((IUnknown*)This->m_pInputPin,
@@ -199,7 +190,7 @@
(void**)&This->m_pImp);
if (result)
{
- printf("Error getting IMemInputPin interface\n");
+ em = "could not get IMemInputPin interface";
break;
}
@@ -208,7 +199,7 @@
result = This->m_pInputPin->vt->QueryAccept(This->m_pInputPin, This->m_pOurType);
if (result)
{
- printf("Source format is not accepted\n");
+ em = "source format is not accepted";
break;
}
This->m_pParentFilter = CBaseFilter2Create();
@@ -221,7 +212,7 @@
This->m_pOurType);
if (result)
{
- printf("Error connecting to input pin\n");
+ em = "could not connect to input pin";
break;
}
@@ -232,19 +223,19 @@
This->m_pDestType);
if (result)
{
- //printf("Tracking ACELP %d 0%x\n", result);
- printf("Error connecting to output pin\n");
+ em = "could not connect to output pin";
break;
}
printf("Using DirectShow codec: %s\n", dllname);
- This->m_iState = 1;
+ init++;
break;
}
- if (This->m_iState != 1)
+ if (!init)
{
DS_Filter_Destroy(This);
+ printf("Warning: DS_Filter() %s. (DLL=%.200s)\n", em, dllname);
This = 0;
}
return This;
Index: DS_Filter.h
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/DS_Filter.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- DS_Filter.h 21 Nov 2001 19:12:39 -0000 1.6
+++ DS_Filter.h 11 Dec 2001 23:29:24 -0000 1.7
@@ -29,7 +29,6 @@
AM_MEDIA_TYPE *m_pOurType, *m_pDestType;
IMemAllocator* m_pAll;
IMemInputPin* m_pImp;
- int m_iState;
void ( *Start )(DS_Filter*);
void ( *Stop )(DS_Filter*);
Index: allocator.c
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/allocator.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- allocator.c 21 Nov 2001 19:12:39 -0000 1.5
+++ allocator.c 11 Dec 2001 23:29:24 -0000 1.6
@@ -69,6 +69,7 @@
static inline avm_list_t* avm_list_del_head(avm_list_t* head)
{
avm_list_t* n = 0;
+
if (head)
{
if (head->next != head)
@@ -77,10 +78,8 @@
head->prev->next = head->next;
head->next->prev = head->prev;
}
-
free(head);
}
-
return n;
}
@@ -130,8 +129,12 @@
return E_FAIL;
if (me->used_list != 0 || me->free_list != 0)
return E_FAIL;
- me->props = *pRequest;
+
*pActual = *pRequest;
+ //if (pActual->cbBuffer == 2)
+ // pActual->cbBuffer = 576;
+
+ me->props = *pActual;
return 0;
}
@@ -162,8 +165,9 @@
{
CMediaSample* sample = CMediaSampleCreate((IMemAllocator*)me,
me->props.cbBuffer);
+ if (!sample)
+ return E_OUTOFMEMORY;
//printf("FREEEEEEEEEEEE ADDED %p\n", sample);
-
me->free_list = avm_list_add_tail(me->free_list, sample);
//avm_list_print(me->free_list);
}
@@ -179,10 +183,8 @@
//printf("Deleted mem %p: %d %d\n", me, me->free_list.size(), me->used_list.size());
while (me->used_list)
{
- CMediaSample* sample = (CMediaSample*) me->used_list->member;
- //printf("****************** Decommiting USED %p\n", sample);
- //sample->vt->Release((IUnknown*)sample);
- CMediaSample_Destroy((CMediaSample*)sample);
+ me->free_list = avm_list_add_tail(me->free_list,
+ (CMediaSample*) me->used_list->member);
me->used_list = avm_list_del_head(me->used_list);
}
@@ -192,7 +194,7 @@
//printf("****************** Decommiting FREE %p\n", sample);
//sample->vt->Release((IUnknown*)sample);
CMediaSample_Destroy((CMediaSample*)sample);
- me->free_list = avm_list_del_head(me->free_list);
+ me->free_list = avm_list_del_head(me->free_list);
}
return 0;
@@ -206,8 +208,9 @@
{
MemAllocator* me = (MemAllocator*)This;
CMediaSample* sample;
- Debug printf("MemAllocator_GetBuffer(%p) called %d %d\n", This,
+ Debug printf("MemAllocator_ReleaseBuffer(%p) called %d %d\n", This,
avm_list_size(me->used_list), avm_list_size(me->free_list));
+
if (!me->free_list)
{
Debug printf("No samples available\n");
@@ -218,8 +221,6 @@
me->free_list = avm_list_del_head(me->free_list);
me->used_list = avm_list_add_tail(me->used_list, sample);
- //printf("MemAllocator getbuffer: %p %d %d\n", sample, avm_list_size(me->used_list), avm_list_size(me->free_list));
-
*ppBuffer = (IMediaSample*) sample;
sample->vt->AddRef((IUnknown*) sample);
if (me->new_pointer)
@@ -236,24 +237,24 @@
static HRESULT STDCALL MemAllocator_ReleaseBuffer(IMemAllocator* This,
/* [in] */ IMediaSample* pBuffer)
{
+ avm_list_t* l;
MemAllocator* me = (MemAllocator*)This;
Debug printf("MemAllocator_ReleaseBuffer(%p) called %d %d\n", This,
avm_list_size(me->used_list), avm_list_size(me->free_list));
- for (;;)
+ l = avm_list_find(me->used_list, pBuffer);
+ if (l)
{
- avm_list_t* l = avm_list_find(me->used_list, pBuffer);
- if (l)
+ CMediaSample* sample = (CMediaSample*) l->member;
+ if (me->modified_sample == sample)
{
- CMediaSample* sample = (CMediaSample*) l->member;
- me->used_list = avm_list_del_head(me->used_list);
- me->free_list = avm_list_add_head(me->free_list, sample);
- //printf("****************** RELEASED OK %p %p\n", me->used_list, me->free_list);
-
- return 0;
+ me->modified_sample->ResetPointer(me->modified_sample);
+ me->modified_sample = 0;
}
- else
- break;
+ me->used_list = avm_list_del_head(me->used_list);
+ me->free_list = avm_list_add_head(me->free_list, sample);
+ //printf("****************** RELEASED OK %p %p\n", me->used_list, me->free_list);
+ return 0;
}
Debug printf("MemAllocator_ReleaseBuffer(%p) releasing unknown buffer!!!! %p\n", This, pBuffer);
return E_FAIL;
@@ -288,6 +289,10 @@
MemAllocator* MemAllocatorCreate()
{
MemAllocator* This = (MemAllocator*) malloc(sizeof(MemAllocator));
+
+ if (!This)
+ return NULL;
+
Debug printf("MemAllocatorCreate() called -> %p\n", This);
This->refcount = 1;
@@ -296,6 +301,13 @@
This->props.cbAlign = This->props.cbPrefix = 0;
This->vt = (IMemAllocator_vt*) malloc(sizeof(IMemAllocator_vt));
+
+ if (!This->vt)
+ {
+ free(This);
+ return NULL;
+ }
+
This->vt->QueryInterface = MemAllocator_QueryInterface;
This->vt->AddRef = MemAllocator_AddRef;
This->vt->Release = MemAllocator_Release;
@@ -309,8 +321,8 @@
This->SetPointer = MemAllocator_SetPointer;
This->ResetPointer = MemAllocator_ResetPointer;
- This->new_pointer = 0;
This->modified_sample = 0;
+ This->new_pointer = 0;
This->used_list = 0;
This->free_list = 0;
Index: cmediasample.c
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/cmediasample.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- cmediasample.c 21 Nov 2001 19:12:39 -0000 1.6
+++ cmediasample.c 11 Dec 2001 23:29:24 -0000 1.7
@@ -45,10 +45,11 @@
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 @@
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 @@
/* [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 @@
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 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 @@
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_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 @@
/* [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 @@
/* [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 @@
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 @@
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;
Index: cmediasample.h
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/cmediasample.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- cmediasample.h 26 Nov 2001 00:56:11 -0000 1.5
+++ cmediasample.h 11 Dec 2001 23:29:24 -0000 1.6
@@ -16,9 +16,12 @@
char* own_block;
int isPreroll;
int isSyncPoint;
+ int isDiscontinuity;
+ LONGLONG time_start;
+ LONGLONG time_end;
AM_MEDIA_TYPE media_type;
int type_valid;
- void ( *SetPointer) (CMediaSample* This,char* pointer);
+ void ( *SetPointer) (CMediaSample* This, char* pointer);
void ( *ResetPointer) (CMediaSample* This); // FIXME replace with Set & 0
};
Index: guids.c
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/guids.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- guids.c 21 Nov 2001 19:12:39 -0000 1.3
+++ guids.c 11 Dec 2001 23:29:24 -0000 1.4
@@ -1,5 +1,5 @@
#include "guids.h"
-int DSHOW_DEBUG=0;
+int DSHOW_DEBUG = 0;
GUID CLSID_DivxDecompressorCF={0x82CCd3E0, 0xF71A, 0x11D0,
{ 0x9f, 0xe5, 0x00, 0x60, 0x97, 0x78, 0xaa, 0xaa}};
Index: guids.h
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/guids.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- guids.h 21 Nov 2001 19:12:39 -0000 1.4
+++ guids.h 11 Dec 2001 23:29:24 -0000 1.5
@@ -2,13 +2,14 @@
#define GUIDS_H
#include "com.h"
-#include "wine/winbase.h"
+#include "wine/module.h"
+#include "wine/windef.h"
#include "wine/vfw.h"
extern int DSHOW_DEBUG;
#define Debug if(DSHOW_DEBUG)
-typedef struct _MediaType
+typedef struct __attribute__((__packed__)) _MediaType
{
GUID majortype; //0x0
GUID subtype; //0x10
@@ -18,30 +19,31 @@
GUID formattype; //0x2c
IUnknown* pUnk; //0x3c
unsigned long cbFormat; //0x40
- char *pbFormat; //0x44
+ char* pbFormat; //0x44
} AM_MEDIA_TYPE;
typedef enum
{
- PINDIR_INPUT = 0,
- PINDIR_OUTPUT = PINDIR_INPUT + 1
+ PINDIR_INPUT = 0,
+ PINDIR_OUTPUT
} PIN_DIRECTION;
typedef long long REFERENCE_TIME;
-typedef struct RECT32
+typedef struct __attribute__((__packed__)) RECT32
{
int left, top, right, bottom;
} RECT32;
-typedef struct tagVIDEOINFOHEADER {
+typedef struct __attribute__((__packed__)) tagVIDEOINFOHEADER {
RECT32 rcSource; // The bit we really want to use
RECT32 rcTarget; // Where the video should go
unsigned long dwBitRate; // Approximate bit data rate
unsigned long dwBitErrorRate; // Bit error rate for this stream
REFERENCE_TIME AvgTimePerFrame; // Average time per frame (100ns units)
- BITMAPINFOHEADER bmiHeader;
+ BITMAPINFOHEADER bmiHeader;
+ //int reserved[3];
} VIDEOINFOHEADER;
typedef struct _AllocatorProperties
Index: inputpin.c
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/inputpin.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- inputpin.c 26 Nov 2001 00:56:11 -0000 1.5
+++ inputpin.c 11 Dec 2001 23:29:24 -0000 1.6
@@ -17,11 +17,11 @@
typedef struct
{
IEnumPins_vt* vt;
+ DECLARE_IUNKNOWN();
IPin* pin1;
IPin* pin2;
int counter;
GUID interfaces[2];
- DECLARE_IUNKNOWN();
} CEnumPins;
static long STDCALL CEnumPins_Next(IEnumPins* This,
@@ -101,12 +101,20 @@
{
CEnumPins* This = (CEnumPins*) malloc(sizeof(CEnumPins));
+ if (!This)
+ return NULL;
+
+ This->refcount = 1;
This->pin1 = p;
This->pin2 = pp;
This->counter = 0;
- This->refcount = 1;
This->vt = (IEnumPins_vt*) malloc(sizeof(IEnumPins_vt));
+ if (!This->vt)
+ {
+ free(This);
+ return NULL;
+ }
This->vt->QueryInterface = CEnumPins_QueryInterface;
This->vt->AddRef = CEnumPins_AddRef;
This->vt->Release = CEnumPins_Release;
@@ -261,11 +269,21 @@
{
CInputPin* This = (CInputPin*) malloc(sizeof(CInputPin));
- This->parent = p;
+ if (!This)
+ return NULL;
+
This->refcount = 1;
+ This->parent = p;
This->type = *amt;
This->vt= (IPin_vt*) malloc(sizeof(IPin_vt));
+
+ if (!This->vt)
+ {
+ free(This);
+ return NULL;
+ }
+
This->vt->QueryInterface = CInputPin_QueryInterface;
This->vt->AddRef = CInputPin_AddRef;
This->vt->Release = CInputPin_Release;
@@ -395,9 +413,12 @@
static void CBaseFilter_Destroy(CBaseFilter* This)
{
- free(This->vt);
- This->pin->vt->Release((IUnknown*)This->pin);
- This->unused_pin->vt->Release((IUnknown*)This->unused_pin);
+ if (This->vt)
+ free(This->vt);
+ if (This->pin)
+ This->pin->vt->Release((IUnknown*)This->pin);
+ if (This->unused_pin)
+ This->unused_pin->vt->Release((IUnknown*)This->unused_pin);
free(This);
}
@@ -406,12 +427,21 @@
CBaseFilter* CBaseFilterCreate(const AM_MEDIA_TYPE* type, CBaseFilter2* parent)
{
CBaseFilter* This = (CBaseFilter*) malloc(sizeof(CBaseFilter));
+ if (!This)
+ return NULL;
+
This->refcount = 1;
This->pin = (IPin*) CInputPinCreate(This, type);
This->unused_pin = (IPin*) CRemotePinCreate(This, parent->GetPin(parent));
This->vt = (IBaseFilter_vt*) malloc(sizeof(IBaseFilter_vt));
+ if (!This->vt || !This->pin || !This->unused_pin)
+ {
+ CBaseFilter_Destroy(This);
+ return NULL;
+ }
+
This->vt->QueryInterface = CBaseFilter_QueryInterface;
This->vt->AddRef = CBaseFilter_AddRef;
This->vt->Release = CBaseFilter_Release;
@@ -541,8 +571,10 @@
static void CBaseFilter2_Destroy(CBaseFilter2* This)
{
Debug printf("CBaseFilter2_Destroy(%p) called\n", This);
- This->pin->vt->Release((IUnknown*) This->pin);
- free(This->vt);
+ if (This->pin)
+ This->pin->vt->Release((IUnknown*) This->pin);
+ if (This->vt)
+ free(This->vt);
free(This);
}
@@ -559,10 +591,20 @@
{
CBaseFilter2* This = (CBaseFilter2*) malloc(sizeof(CBaseFilter2));
+ if (!This)
+ return NULL;
+
This->refcount = 1;
This->pin = (IPin*) CRemotePin2Create(This);
This->vt = (IBaseFilter_vt*) malloc(sizeof(IBaseFilter_vt));
+
+ if (!This->pin || !This->vt)
+ {
+ CBaseFilter2_Destroy(This);
+ return NULL;
+ }
+
memset(This->vt, 0, sizeof(IBaseFilter_vt));
This->vt->QueryInterface = CBaseFilter2_QueryInterface;
This->vt->AddRef = CBaseFilter2_AddRef;
@@ -646,6 +688,10 @@
CRemotePin* CRemotePinCreate(CBaseFilter* pt, IPin* rpin)
{
CRemotePin* This = (CRemotePin*) malloc(sizeof(CRemotePin));
+
+ if (!This)
+ return NULL;
+
Debug printf("CRemotePinCreate() called -> %p\n", This);
This->parent = pt;
@@ -653,6 +699,13 @@
This->refcount = 1;
This->vt = (IPin_vt*) malloc(sizeof(IPin_vt));
+
+ if (!This->vt)
+ {
+ free(This);
+ return NULL;
+ }
+
memset(This->vt, 0, sizeof(IPin_vt));
This->vt->QueryInterface = CRemotePin_QueryInterface;
This->vt->AddRef = CRemotePin_AddRef;
@@ -698,12 +751,23 @@
CRemotePin2* CRemotePin2Create(CBaseFilter2* p)
{
CRemotePin2* This = (CRemotePin2*) malloc(sizeof(CRemotePin2));
+
+ if (!This)
+ return NULL;
+
Debug printf("CRemotePin2Create() called -> %p\n", This);
This->parent = p;
This->refcount = 1;
This->vt = (IPin_vt*) malloc(sizeof(IPin_vt));
+
+ if (!This->vt)
+ {
+ free(This);
+ return NULL;
+ }
+
memset(This->vt, 0, sizeof(IPin_vt));
This->vt->QueryInterface = CRemotePin2_QueryInterface;
This->vt->AddRef = CRemotePin2_AddRef;
Index: inputpin.h
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/inputpin.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- inputpin.h 26 Nov 2001 00:56:11 -0000 1.4
+++ inputpin.h 11 Dec 2001 23:29:24 -0000 1.5
@@ -38,8 +38,8 @@
{
IPin_vt* vt;
DECLARE_IUNKNOWN();
- AM_MEDIA_TYPE type;
CBaseFilter* parent;
+ AM_MEDIA_TYPE type;
GUID interfaces[1];
};
Index: interfaces.h
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/interfaces.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- interfaces.h 21 Nov 2001 19:12:39 -0000 1.6
+++ interfaces.h 11 Dec 2001 23:29:24 -0000 1.7
@@ -84,13 +84,17 @@
{
INHERIT_IUNKNOWN();
+ // retrieves a specified number of pins in the enumeration sequence..
HRESULT STDCALL ( *Next )(IEnumPins* This,
/* [in] */ unsigned long cPins,
/* [size_is][out] */ IPin** ppPins,
/* [out] */ unsigned long* pcFetched);
+ // skips over a specified number of pins.
HRESULT STDCALL ( *Skip )(IEnumPins* This,
/* [in] */ unsigned long cPins);
+ // resets the enumeration sequence to the beginning.
HRESULT STDCALL ( *Reset )(IEnumPins* This);
+ // makes a copy of the enumerator with the same enumeration state.
HRESULT STDCALL ( *Clone )(IEnumPins* This,
/* [out] */ IEnumPins** ppEnum);
} IEnumPins_vt;
@@ -111,25 +115,46 @@
HRESULT STDCALL ( *SetTime )(IMediaSample* This,
/* [in] */ REFERENCE_TIME* pTimeStart,
/* [in] */ REFERENCE_TIME* pTimeEnd);
+
+ // sync-point property. If true, then the beginning of this
+ // sample is a sync-point. (note that if AM_MEDIA_TYPE.bTemporalCompression
+ // is false then all samples are sync points). A filter can start
+ // a stream at any sync point. S_FALSE if not sync-point, S_OK if true.
HRESULT STDCALL ( *IsSyncPoint )(IMediaSample* This);
HRESULT STDCALL ( *SetSyncPoint )(IMediaSample* This,
long bIsSyncPoint);
+
+ // preroll property. If true, this sample is for preroll only and
+ // shouldn't be displayed.
HRESULT STDCALL ( *IsPreroll )(IMediaSample* This);
HRESULT STDCALL ( *SetPreroll )(IMediaSample* This,
long bIsPreroll);
+
LONG STDCALL ( *GetActualDataLength )(IMediaSample* This);
HRESULT STDCALL ( *SetActualDataLength )(IMediaSample* This,
long __MIDL_0010);
+
+ // these allow for limited format changes in band - if no format change
+ // has been made when you receive a sample GetMediaType will return S_FALSE
HRESULT STDCALL ( *GetMediaType )(IMediaSample* This,
AM_MEDIA_TYPE** ppMediaType);
HRESULT STDCALL ( *SetMediaType )(IMediaSample* This,
AM_MEDIA_TYPE* pMediaType);
+
+ // returns S_OK if there is a discontinuity in the data (this frame is
+ // not a continuation of the previous stream of data
+ // - there has been a seek or some dropped samples).
HRESULT STDCALL ( *IsDiscontinuity )(IMediaSample* This);
HRESULT STDCALL ( *SetDiscontinuity )(IMediaSample* This,
long bDiscontinuity);
+
+ // get the media times for this sample
HRESULT STDCALL ( *GetMediaTime )(IMediaSample* This,
/* [out] */ long long* pTimeStart,
/* [out] */ long long* pTimeEnd);
+ // Set the media times for this sample
+ // pTimeStart==pTimeEnd==NULL will invalidate the media time stamps in
+ // this sample
HRESULT STDCALL ( *SetMediaTime )(IMediaSample* This,
/* [in] */ long long* pTimeStart,
/* [in] */ long long* pTimeEnd);
@@ -180,18 +205,24 @@
{
INHERIT_IUNKNOWN();
+ // specifies the number of buffers to allocate and the size of each buffer.
HRESULT STDCALL ( *SetProperties )(IMemAllocator* This,
/* [in] */ ALLOCATOR_PROPERTIES *pRequest,
/* [out] */ ALLOCATOR_PROPERTIES *pActual);
+ // retrieves the number of buffers that the allocator will create, and the buffer properties.
HRESULT STDCALL ( *GetProperties )(IMemAllocator* This,
/* [out] */ ALLOCATOR_PROPERTIES *pProps);
+ // allocates the buffer memory.
HRESULT STDCALL ( *Commit )(IMemAllocator* This);
+ // releases the memory for the buffers.
HRESULT STDCALL ( *Decommit )(IMemAllocator* This);
+ // retrieves a media sample that contains an empty buffer.
HRESULT STDCALL ( *GetBuffer )(IMemAllocator* This,
/* [out] */ IMediaSample** ppBuffer,
/* [in] */ REFERENCE_TIME* pStartTime,
/* [in] */ REFERENCE_TIME* pEndTime,
/* [in] */ unsigned long dwFlags);
+ // releases a media sample.
HRESULT STDCALL ( *ReleaseBuffer )(IMemAllocator* This,
/* [in] */ IMediaSample* pBuffer);
} IMemAllocator_vt;
Index: outputpin.c
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/outputpin.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- outputpin.c 26 Nov 2001 00:56:11 -0000 1.8
+++ outputpin.c 11 Dec 2001 23:29:24 -0000 1.9
@@ -10,12 +10,18 @@
Returned by COutputPin through call IPin::EnumMediaTypes().
*/
+static int unimplemented(const char* s, void* p)
+{
+ Debug printf("%s(%p) called (UNIMPLEMENTED)", s, p);
+ return E_NOTIMPL;
+}
+
typedef struct CEnumMediaTypes
{
IEnumMediaTypes_vt* vt;
+ DECLARE_IUNKNOWN();
AM_MEDIA_TYPE type;
GUID interfaces[2];
- DECLARE_IUNKNOWN();
} CEnumMediaTypes;
@@ -25,7 +31,7 @@
/* [out] */ ULONG *pcFetched)
{
AM_MEDIA_TYPE* type = &((CEnumMediaTypes*)This)->type;
- Debug printf("CEnumMediaTypes::Next() called\n");
+ Debug printf("CEnumMediaTypes::Next(%p) called\n", This);
if (!ppMediaTypes)
return E_INVALIDARG;
if (!pcFetched && (cMediaTypes!=1))
@@ -52,20 +58,20 @@
static HRESULT STDCALL CEnumMediaTypes_Skip(IEnumMediaTypes * This,
/* [in] */ ULONG cMediaTypes)
{
- Debug printf("CEnumMediaTypes::Skip() called\n");
+ Debug unimplemented("CEnumMediaTypes::Skip", This);
return E_NOTIMPL;
}
static HRESULT STDCALL CEnumMediaTypes_Reset(IEnumMediaTypes * This)
{
- Debug printf("CEnumMediaTypes::Reset() called\n");
+ Debug printf("CEnumMediaTypes::Reset(%p) called\n", This);
return 0;
}
static HRESULT STDCALL CEnumMediaTypes_Clone(IEnumMediaTypes * This,
/* [out] */ IEnumMediaTypes **ppEnum)
{
- Debug printf("CEnumMediaTypes::Clone() called\n");
+ Debug printf("CEnumMediaTypes::Clone(%p) called\n", This);
return E_NOTIMPL;
}
@@ -81,10 +87,20 @@
CEnumMediaTypes* CEnumMediaTypesCreate(const AM_MEDIA_TYPE* amt)
{
CEnumMediaTypes *This = (CEnumMediaTypes*) malloc(sizeof(CEnumMediaTypes)) ;
+
+ if (!This)
+ return NULL;
+
+ This->vt = (IEnumMediaTypes_vt*) malloc(sizeof(IEnumMediaTypes_vt));
+ if (!This->vt)
+ {
+ free(This);
+ return NULL;
+ }
+
This->refcount = 1;
This->type = *amt;
- This->vt = (IEnumMediaTypes_vt*) malloc(sizeof(IEnumMediaTypes_vt));
This->vt->QueryInterface = CEnumMediaTypes_QueryInterface;
This->vt->AddRef = CEnumMediaTypes_AddRef;
This->vt->Release = CEnumMediaTypes_Release;
@@ -126,7 +142,7 @@
return 0;
}
- Debug printf("Unknown interface : %08x-%04x-%04x-%02x%02x-" \
+ Debug printf("Unknown interface : %08x-%04x-%04x-%02x%02x-"
"%02x%02x%02x%02x%02x%02x\n",
iid->f1, iid->f2, iid->f3,
(unsigned char)iid->f4[1], (unsigned char)iid->f4[0],
@@ -159,21 +175,21 @@
/* [in] */ IPin *pConnector,
/* [in] */ const AM_MEDIA_TYPE *pmt)
{
- Debug printf("COutputPin_ReceiveConnection() called\n");
- ((COutputPin*)This)->remote=pConnector;
+ Debug printf("COutputPin_ReceiveConnection(%p) called\n", This);
+ ((COutputPin*)This)->remote = pConnector;
return 0;
}
static HRESULT STDCALL COutputPin_Disconnect(IPin * This)
{
- Debug printf("COutputPin_Disconnect() called\n");
+ Debug printf("COutputPin_Disconnect(%p) called\n", This);
return 1;
}
static HRESULT STDCALL COutputPin_ConnectedTo(IPin * This,
/* [out] */ IPin **pPin)
{
- Debug printf("COutputPin_ConnectedTo() called\n");
+ Debug printf("COutputPin_ConnectedTo(%p) called\n", This);
if (!pPin)
return E_INVALIDARG;
*pPin = ((COutputPin*)This)->remote;
@@ -198,14 +214,14 @@
static HRESULT STDCALL COutputPin_QueryPinInfo(IPin * This,
/* [out] */ PIN_INFO *pInfo)
{
- Debug printf("COutputPin_QueryPinInfo() called\n");
+ Debug unimplemented("COutputPin_QueryPinInfo", This);
return E_NOTIMPL;
}
static HRESULT STDCALL COutputPin_QueryDirection(IPin * This,
/* [out] */ PIN_DIRECTION *pPinDir)
{
- Debug printf("COutputPin_QueryDirection() called\n");
+ Debug printf("COutputPin_QueryDirection(%p) called\n", This);
if (!pPinDir)
return E_INVALIDARG;
*pPinDir = PINDIR_INPUT;
@@ -215,14 +231,14 @@
static HRESULT STDCALL COutputPin_QueryId(IPin * This,
/* [out] */ LPWSTR *Id)
{
- Debug printf("COutputPin_QueryId() called\n");
+ Debug unimplemented("COutputPin_QueryId", This);
return E_NOTIMPL;
}
static HRESULT STDCALL COutputPin_QueryAccept(IPin * This,
/* [in] */ const AM_MEDIA_TYPE *pmt)
{
- Debug printf("COutputPin_QueryAccept() called\n");
+ Debug unimplemented("COutputPin_QueryAccept", This);
return E_NOTIMPL;
}
@@ -240,25 +256,25 @@
/* [out] */ IPin **apPin,
/* [out][in] */ ULONG *nPin)
{
- Debug printf("COutputPin_QueryInternalConnections() called\n");
+ Debug unimplemented("COutputPin_QueryInternalConnections", This);
return E_NOTIMPL;
}
static HRESULT STDCALL COutputPin_EndOfStream(IPin * This)
{
- Debug printf("COutputPin_EndOfStream() called\n");
+ Debug unimplemented("COutputPin_EndOfStream", This);
return E_NOTIMPL;
}
static HRESULT STDCALL COutputPin_BeginFlush(IPin * This)
{
- Debug printf("COutputPin_BeginFlush() called\n");
+ Debug unimplemented("COutputPin_BeginFlush", This);
return E_NOTIMPL;
}
static HRESULT STDCALL COutputPin_EndFlush(IPin * This)
{
- Debug printf("COutputPin_EndFlush() called\n");
+ Debug unimplemented("COutputPin_EndFlush", This);
return E_NOTIMPL;
}
@@ -286,7 +302,7 @@
if(!memcmp(iid, &IID_IUnknown, 16))
{
- *ppv=p;
+ *ppv = p;
p->vt->AddRef(This);
return 0;
}
@@ -299,7 +315,7 @@
}*/
if(!memcmp(iid, &IID_IMemInputPin, 16))
{
- *ppv=p->mempin;
+ *ppv = p->mempin;
p->mempin->vt->AddRef(This);
return 0;
}
@@ -335,7 +351,7 @@
static HRESULT STDCALL COutputPin_GetAllocatorRequirements(IMemInputPin* This,
/* [out] */ ALLOCATOR_PROPERTIES* pProps)
{
- Debug printf("COutputPin_GetAllocatorRequirements() called\n");
+ Debug unimplemented("COutputPin_GetAllocatorRequirements", This);
return E_NOTIMPL;
}
@@ -379,13 +395,13 @@
/* [in] */ long nSamples,
/* [out] */ long *nSamplesProcessed)
{
- Debug printf("COutputPin_ReceiveMultiple() called (UNIMPLEMENTED)\n");
+ Debug unimplemented("COutputPin_ReceiveMultiple", This);
return E_NOTIMPL;
}
static HRESULT STDCALL COutputPin_ReceiveCanBlock(IMemInputPin * This)
{
- Debug printf("COutputPin_ReceiveCanBlock() called (UNIMPLEMENTED)\n");
+ Debug unimplemented("COutputPin_ReceiveCanBlock", This);
return E_NOTIMPL;
}
@@ -413,25 +429,26 @@
static void COutputPin_Destroy(COutputPin* This)
{
- free(This->vt);
- free(This->mempin->vt);
- free(This->mempin);
+ if (This->mempin->vt)
+ free(This->mempin->vt);
+ if (This->mempin)
+ free(This->mempin);
+ if (This->vt)
+ free(This->vt);
free(This);
}
static HRESULT STDCALL COutputPin_AddRef(IUnknown* This)
{
- Debug printf("COutputPin_AddRef(%p) called (%d)\n",
- This, ((COutputPin*)This)->refcount);
+ Debug printf("COutputPin_AddRef(%p) called (%d)\n", This, ((COutputPin*)This)->refcount);
((COutputPin*)This)->refcount++;
return 0;
}
static HRESULT STDCALL COutputPin_Release(IUnknown* This)
{
- Debug printf("COutputPin_Release(%p) called (%d)\n",
- This, ((COutputPin*)This)->refcount);
- if (--((COutputPin*)This)->refcount<=0)
+ Debug printf("COutputPin_Release(%p) called (%d)\n", This, ((COutputPin*)This)->refcount);
+ if (--((COutputPin*)This)->refcount <= 0)
COutputPin_Destroy((COutputPin*)This);
return 0;
@@ -440,8 +457,7 @@
static HRESULT STDCALL COutputPin_M_AddRef(IUnknown* This)
{
COutputMemPin* p = (COutputMemPin*) This;
- Debug printf("COutputPin_MAddRef(%p) called (%p, %d)\n",
- p, p->parent, p->parent->refcount);
+ Debug printf("COutputPin_MAddRef(%p) called (%p, %d)\n", p, p->parent, p->parent->refcount);
p->parent->refcount++;
return 0;
}
@@ -459,10 +475,27 @@
COutputPin* COutputPinCreate(const AM_MEDIA_TYPE* amt)
{
COutputPin* This = (COutputPin*) malloc(sizeof(COutputPin));
+ IMemInputPin_vt* ivt;
+
+ if (!This)
+ return NULL;
+
+ This->vt = (IPin_vt*) malloc(sizeof(IPin_vt));
+ This->mempin = (COutputMemPin*) malloc(sizeof(COutputMemPin));
+ ivt = (IMemInputPin_vt*) malloc(sizeof(IMemInputPin_vt));
+
+ if (!This->vt || !This->mempin || !ivt)
+ {
+ COutputPin_Destroy(This);
+ return NULL;
+ }
+
+ This->mempin->vt = ivt;
+
This->refcount = 1;
This->remote = 0;
This->type = *amt;
- This->vt = (IPin_vt*) malloc(sizeof(IPin_vt));
+
This->vt->QueryInterface = COutputPin_QueryInterface;
This->vt->AddRef = COutputPin_AddRef;
This->vt->Release = COutputPin_Release;
@@ -482,8 +515,6 @@
This->vt->EndFlush = COutputPin_EndFlush;
This->vt->NewSegment = COutputPin_NewSegment;
- This->mempin = (COutputMemPin*) malloc(sizeof(COutputMemPin));
- This->mempin->vt = (IMemInputPin_vt*) malloc(sizeof(IMemInputPin_vt));
This->mempin->vt->QueryInterface = COutputPin_M_QueryInterface;
This->mempin->vt->AddRef = COutputPin_M_AddRef;
This->mempin->vt->Release = COutputPin_M_Release;
More information about the MPlayer-cvslog
mailing list