[Mplayer-cvslog] CVS: main/loader/dshow DS_Filter.c,1.10,1.11 DS_Filter.h,1.5,1.6 allocator.c,1.4,1.5 allocator.h,1.3,1.4 cmediasample.c,1.5,1.6 cmediasample.h,1.3,1.4 guids.c,1.2,1.3 guids.h,1.3,1.4 inputpin.c,1.3,1.4 inputpin.h,1.2,1.3 interfaces.h,1.5,1.6 iunk.h,1.2,1.3 outputpin.c,1.6,1.7 outputpin.h,1.3,1.4
Arpi of Ize
arpi at mplayer.dev.hu
Wed Nov 21 20:12:47 CET 2001
Update of /cvsroot/mplayer/main/loader/dshow
In directory mplayer:/var/tmp.root/cvs-serv15575
Modified Files:
DS_Filter.c DS_Filter.h allocator.c allocator.h cmediasample.c
cmediasample.h guids.c guids.h inputpin.c inputpin.h
interfaces.h iunk.h outputpin.c outputpin.h
Log Message:
C++ -> C (import from avifile cvs)
Index: DS_Filter.c
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/DS_Filter.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- DS_Filter.c 30 Oct 2001 23:04:36 -0000 1.10
+++ DS_Filter.c 21 Nov 2001 19:12:39 -0000 1.11
@@ -1,223 +1,251 @@
#include "DS_Filter.h"
-//#include "../loader/loader.h"
-#include "libwin32.h"
-//#include <string>
+#include "driver.h"
+#include "com.h"
#include <stdio.h>
#include <string.h>
-#define __MODULE__ "DirectShow generic filter"
-
-using namespace std;
-
-extern "C" int STDCALL expLoadLibraryA(const char*);
-
typedef long STDCALL (*GETCLASS) (const GUID*, const GUID*, void**);
-//extern "C" int STDCALL LoadLibraryA(const char*);
//extern "C" STDCALL void* GetProcAddress(int, const char*); // STDCALL has to be first NetBSD
-//extern "C" int STDCALL FreeLibrary(int);
-DS_Filter::DS_Filter()
+static void DS_Filter_Start(DS_Filter* This)
{
- m_iHandle = 0;
- m_pFilter = 0;
- m_pInputPin = 0;
- m_pOutputPin = 0;
- m_pSrcFilter = 0;
- m_pParentFilter = 0;
- m_pOurInput = 0;
- m_pOurOutput = 0;
- m_pAll = 0;
- m_pImp = 0;
- m_iState = 0;
+ HRESULT hr;
+
+ if (This->m_iState != 1)
+ return;
+
+ //Debug printf("DS_Filter_Start(%p)\n", This);
+ hr = This->m_pFilter->vt->Run(This->m_pFilter, 0);
+ if (hr != 0)
+ {
+ Debug printf("WARNING: m_Filter->Run() failed, error code %x\n", (int)hr);
+ }
+ hr = This->m_pImp->vt->GetAllocator(This->m_pImp, &This->m_pAll);
+
+ if (hr || !This->m_pAll)
+ {
+ Debug printf("WARNING: error getting IMemAllocator interface %x\n", (int)hr);
+ This->m_pImp->vt->Release((IUnknown*)This->m_pImp);
+ return;
+ }
+ This->m_pImp->vt->NotifyAllocator(This->m_pImp, This->m_pAll, 0);
+ This->m_iState = 2;
}
-DS_Filter::~DS_Filter()
+static void DS_Filter_Stop(DS_Filter* This)
{
- //cout << "Destruction of DS_FILTER" << endl;
- Stop();
- destroy();
- //cout << "Destruction of DS_FILTER done" << endl;
+ if (This->m_iState == 2)
+ {
+ 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_pAll->vt->Release((IUnknown*)This->m_pAll);
+ This->m_pAll = 0;
+ }
}
-void DS_Filter::destroy()
+void DS_Filter_Destroy(DS_Filter* This)
{
- if (m_iState == 0)
- return;
- m_iState = 0;
+ This->Stop(This);
+
+ This->m_iState = 0;
- if (m_pOurInput)
- m_pOurInput->vt->Release((IUnknown*)m_pOurInput);
- if (m_pInputPin)
- m_pInputPin->vt->Disconnect(m_pInputPin);
- if (m_pOutputPin)
- m_pOutputPin->vt->Disconnect(m_pOutputPin);
- if (m_pFilter)
- m_pFilter->vt->Release((IUnknown*)m_pFilter);
- if (m_pOutputPin)
- m_pOutputPin->vt->Release((IUnknown*)m_pOutputPin);
- if (m_pInputPin)
- m_pInputPin->vt->Release((IUnknown*)m_pInputPin);
- if (m_pImp)
- m_pImp->vt->Release((IUnknown*)m_pImp);
-
- delete m_pOurOutput;
- delete m_pParentFilter;
- delete m_pSrcFilter;
+ if (This->m_pOurInput)
+ This->m_pOurInput->vt->Release((IUnknown*)This->m_pOurInput);
+ if (This->m_pInputPin)
+ This->m_pInputPin->vt->Disconnect(This->m_pInputPin);
+ if (This->m_pOutputPin)
+ This->m_pOutputPin->vt->Disconnect(This->m_pOutputPin);
+ if (This->m_pFilter)
+ This->m_pFilter->vt->Release((IUnknown*)This->m_pFilter);
+ if (This->m_pOutputPin)
+ This->m_pOutputPin->vt->Release((IUnknown*)This->m_pOutputPin);
+ if (This->m_pInputPin)
+ This->m_pInputPin->vt->Release((IUnknown*)This->m_pInputPin);
+ if (This->m_pImp)
+ This->m_pImp->vt->Release((IUnknown*)This->m_pImp);
+
+ if (This->m_pOurOutput)
+ This->m_pOurOutput->vt->Release((IUnknown*)This->m_pOurOutput);
+ if (This->m_pParentFilter)
+ This->m_pSrcFilter->vt->Release((IUnknown*)This->m_pParentFilter);
+ if (This->m_pSrcFilter)
+ This->m_pSrcFilter->vt->Release((IUnknown*)This->m_pSrcFilter);
// FIXME - we are still leaving few things allocated!
- if (m_iHandle)
- FreeLibrary(m_iHandle);
+ if (This->m_iHandle)
+ FreeLibrary(This->m_iHandle);
+
+ free(This);
+
+ CodecRelease();
}
-void DS_Filter::Create(const char* dllname, const GUID* id,
- AM_MEDIA_TYPE* in_fmt,
- AM_MEDIA_TYPE* out_fmt)
-{
- try
+DS_Filter* DS_FilterCreate(const char* dllname, const GUID* id,
+ AM_MEDIA_TYPE* in_fmt,
+ AM_MEDIA_TYPE* out_fmt)
+{
+ DS_Filter* This = (DS_Filter*) malloc(sizeof(DS_Filter));
+ if (!This)
+ return NULL;
+
+ CodecAlloc();
+
+ This->m_pFilter = NULL;
+ This->m_pInputPin = NULL;
+ This->m_pOutputPin = NULL;
+ This->m_pSrcFilter = NULL;
+ This->m_pParentFilter = NULL;
+ This->m_pOurInput = NULL;
+ 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;
+
+ for (;;)
{
- m_iHandle = expLoadLibraryA(dllname);
- if (!m_iHandle)
+ HRESULT result;
+ GETCLASS func;
+ struct IClassFactory* factory = NULL;
+ struct IUnknown* object = NULL;
+ IEnumPins* enum_pins = 0;
+ IPin* array[256];
+ ULONG fetched;
+ unsigned int i;
+
+ This->m_iHandle = LoadLibraryA(dllname);
+ if (!This->m_iHandle)
{
- char e[256];
- snprintf((char *)&e[0], 256, "Could not open DirectShow DLL: %.200s", dllname);
- throw FATAL(e);
+ printf("Could not open DirectShow DLL: %.200s\n", dllname);
+ break;
}
- GETCLASS func = (GETCLASS)GetProcAddress(m_iHandle, "DllGetClassObject");
+ func = (GETCLASS)GetProcAddress(This->m_iHandle, "DllGetClassObject");
if (!func)
{
- char e[256];
- snprintf((char *)&e[0], 256, "Illegal or corrupt DirectShow DLL: %.200s", dllname);
- throw FATAL(e);
+ printf("Illegal or corrupt DirectShow DLL: %.200s\n", dllname);
+ break;
}
-
- HRESULT result;
- IClassFactory* factory = 0;
result = func(id, &IID_IClassFactory, (void**)&factory);
if (result || !factory)
- throw FATAL("No such class object");;
-
- IUnknown* object = 0;
+ {
+ printf("No such class object\n");
+ break;
+ }
result = factory->vt->CreateInstance(factory, 0, &IID_IUnknown, (void**)&object);
factory->vt->Release((IUnknown*)factory);
if (result || !object)
- throw FATAL("Class factory failure");
-
- result = object->vt->QueryInterface(object, &IID_IBaseFilter, (void**)&m_pFilter);
+ {
+ printf("Class factory failure\n");
+ break;
+ }
+ result = object->vt->QueryInterface(object, &IID_IBaseFilter, (void**)&This->m_pFilter);
object->vt->Release((IUnknown*)object);
- if (result || !m_pFilter)
- throw FATAL("Object does not have IBaseFilter interface");
-
- IEnumPins* enum_pins = 0;
+ if (result || !This->m_pFilter)
+ {
+ printf("Object does not have IBaseFilter interface\n");
+ break;
+ }
// enumerate pins
- result = m_pFilter->vt->EnumPins(m_pFilter, &enum_pins);
+ result = This->m_pFilter->vt->EnumPins(This->m_pFilter, &enum_pins);
if (result || !enum_pins)
- throw FATAL("Could not enumerate pins");
+ {
+ printf("Could not enumerate pins\n");
+ break;
+ }
- IPin* array[256];
- ULONG fetched;
enum_pins->vt->Reset(enum_pins);
result = enum_pins->vt->Next(enum_pins, (ULONG)256, (IPin**)array, &fetched);
Debug printf("Pins enumeration returned %ld pins, error is %x\n", fetched, (int)result);
- for (unsigned i = 0; i < fetched; i++)
+ for (i = 0; i < fetched; i++)
{
int direction = -1;
array[i]->vt->QueryDirection(array[i], (PIN_DIRECTION*)&direction);
- if (!m_pInputPin && direction == 0)
+ if (!This->m_pInputPin && direction == 0)
{
- m_pInputPin = array[i];
- m_pInputPin->vt->AddRef((IUnknown*)m_pInputPin);
+ This->m_pInputPin = array[i];
+ This->m_pInputPin->vt->AddRef((IUnknown*)This->m_pInputPin);
}
- if (!m_pOutputPin && direction == 1)
+ if (!This->m_pOutputPin && direction == 1)
{
- m_pOutputPin = array[i];
- m_pOutputPin->vt->AddRef((IUnknown*)m_pOutputPin);
+ This->m_pOutputPin = array[i];
+ This->m_pOutputPin->vt->AddRef((IUnknown*)This->m_pOutputPin);
}
array[i]->vt->Release((IUnknown*)(array[i]));
}
- if (!m_pInputPin)
- throw FATAL("Input pin not found");
- if (!m_pOutputPin)
- throw FATAL("Output pin not found");
-
- result = m_pInputPin->vt->QueryInterface((IUnknown*)m_pInputPin,
- &IID_IMemInputPin,
- (void**)&m_pImp);
- if (result)
- throw FATAL("Error getting IMemInputPin interface");
- m_pOurType = in_fmt;
- m_pDestType = out_fmt;
- result = m_pInputPin->vt->QueryAccept(m_pInputPin, m_pOurType);
+ if (!This->m_pInputPin)
+ {
+ printf("Input pin not found\n");
+ break;
+ }
+ if (!This->m_pOutputPin)
+ {
+ printf("Output pin not found\n");
+ break;
+ }
+ result = This->m_pInputPin->vt->QueryInterface((IUnknown*)This->m_pInputPin,
+ &IID_IMemInputPin,
+ (void**)&This->m_pImp);
if (result)
- throw FATAL("Source format is not accepted");
+ {
+ printf("Error getting IMemInputPin interface\n");
+ break;
+ }
- m_pParentFilter = new CBaseFilter2;
- m_pSrcFilter = new CBaseFilter(*m_pOurType, m_pParentFilter);
- m_pOurInput = m_pSrcFilter->GetPin();
- m_pOurInput->vt->AddRef((IUnknown*)m_pOurInput);
-
- result = m_pInputPin->vt->ReceiveConnection(m_pInputPin,
- m_pOurInput,
- m_pOurType);
+ This->m_pOurType = in_fmt;
+ This->m_pDestType = out_fmt;
+ result = This->m_pInputPin->vt->QueryAccept(This->m_pInputPin, This->m_pOurType);
if (result)
- throw FATAL("Error connecting to input pin");
+ {
+ printf("Source format is not accepted\n");
+ break;
+ }
+ This->m_pParentFilter = CBaseFilter2Create();
+ This->m_pSrcFilter = CBaseFilterCreate(This->m_pOurType, This->m_pParentFilter);
+ This->m_pOurInput = This->m_pSrcFilter->GetPin(This->m_pSrcFilter);
+ This->m_pOurInput->vt->AddRef((IUnknown*)This->m_pOurInput);
+
+ result = This->m_pInputPin->vt->ReceiveConnection(This->m_pInputPin,
+ This->m_pOurInput,
+ This->m_pOurType);
+ if (result)
+ {
+ printf("Error connecting to input pin\n");
+ break;
+ }
- m_pOurOutput = new COutputPin(*m_pDestType);
+ This->m_pOurOutput = COutputPinCreate(This->m_pDestType);
- //extern void trapbug();
- //trapbug();
- result = m_pOutputPin->vt->ReceiveConnection(m_pOutputPin,
- m_pOurOutput,
- m_pDestType);
+ result = This->m_pOutputPin->vt->ReceiveConnection(This->m_pOutputPin,
+ (IPin*) This->m_pOurOutput,
+ This->m_pDestType);
if (result)
{
//printf("Tracking ACELP %d 0%x\n", result);
- throw FATAL("Error connecting to output pin");
+ printf("Error connecting to output pin\n");
+ break;
}
printf("Using DirectShow codec: %s\n", dllname);
- m_iState = 1;
- }
- catch (FatalError e)
- {
- //e.PrintAll();
- destroy();
- throw;
- }
-}
-
-void DS_Filter::Start()
-{
- if (m_iState != 1)
- return;
-
- HRESULT hr=m_pFilter->vt->Run(m_pFilter, 0);
- if (hr != 0)
- {
- Debug printf("WARNING: m_Filter->Run() failed, error code %x\n", (int)hr);
+ This->m_iState = 1;
+ break;
}
- hr = m_pImp->vt->GetAllocator(m_pImp, &m_pAll);
- if (hr)
- {
- Debug printf("Error getting IMemAllocator interface %x\n", (int)hr);
- m_pImp->vt->Release((IUnknown*)m_pImp);
- return;
- }
- m_pImp->vt->NotifyAllocator(m_pImp, m_pAll, 0);
- m_iState = 2;
-}
-void DS_Filter::Stop()
-{
- if (m_iState == 2)
+ if (This->m_iState != 1)
{
- m_pAll->vt->Release((IUnknown*)m_pAll);
- if (m_pFilter)
- m_pFilter->vt->Stop(m_pFilter); // causes weird crash ??? FIXME
- else
- printf("m_pFilter is NULL!\n");
- m_pAll = 0;
- m_iState = 1;
+ DS_Filter_Destroy(This);
+ This = 0;
}
+ return This;
}
Index: DS_Filter.h
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/DS_Filter.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- DS_Filter.h 16 Aug 2001 00:50:02 -0000 1.5
+++ DS_Filter.h 21 Nov 2001 19:12:39 -0000 1.6
@@ -1,41 +1,46 @@
#ifndef DS_FILTER_H
#define DS_FILTER_H
-#include "interfaces.h"
#include "inputpin.h"
#include "outputpin.h"
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
/**
User will allocate and fill format structures, call Create(),
and then set up m_pAll.
**/
-struct DS_Filter
+typedef struct _DS_Filter DS_Filter;
+struct _DS_Filter
{
- DS_Filter();
- virtual ~DS_Filter();
- void Start();
- void Stop();
-
int m_iHandle;
IBaseFilter* m_pFilter;
IPin* m_pInputPin;
IPin* m_pOutputPin;
-
+
CBaseFilter* m_pSrcFilter;
CBaseFilter2* m_pParentFilter;
IPin* m_pOurInput;
COutputPin* m_pOurOutput;
-
+
AM_MEDIA_TYPE *m_pOurType, *m_pDestType;
IMemAllocator* m_pAll;
IMemInputPin* m_pImp;
int m_iState;
- void Create(const char* dllname, const GUID* id, AM_MEDIA_TYPE* in_fmt, AM_MEDIA_TYPE* out_fmt);
- void SetPointer(char* pointer);
-
- void destroy();
+ void ( *Start )(DS_Filter*);
+ void ( *Stop )(DS_Filter*);
};
+
+DS_Filter* DS_FilterCreate(const char* dllname, const GUID* id,
+ AM_MEDIA_TYPE* in_fmt, AM_MEDIA_TYPE* out_fmt);
+void DS_Filter_Destroy(DS_Filter* This);
+
+#if defined(__cplusplus)
+}
+#endif
#endif /* DS_FILTER_H */
Index: allocator.c
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/allocator.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- allocator.c 4 Oct 2001 02:21:47 -0000 1.4
+++ allocator.c 21 Nov 2001 19:12:39 -0000 1.5
@@ -3,62 +3,136 @@
#include "wine/winerror.h"
#include <stdio.h>
-//#undef Debug
-//#define Debug
+static int AllocatorKeeper = 0;
-using namespace std;
+static inline int avm_list_size(avm_list_t* head)
+{
+ avm_list_t* it = head;
+ int i = 0;
+ if (it)
+ {
+ for (;;)
+ {
+ i++;
+ it = it->next;
+ if (it == head)
+ break;
+ }
+ }
+ return i;
+}
-class AllocatorKeeper
+static inline int avm_list_print(avm_list_t* head)
{
-public:
- AllocatorKeeper()
+ avm_list_t* it = head;
+ int i = 0;
+ printf("Head: %p\n", head);
+ if (it)
{
- RegisterComClass(&CLSID_MemoryAllocator, MemAllocator::CreateAllocator);
+ for (;;)
+ {
+ i++;
+ printf("%d: member: %p next: %p prev: %p\n",
+ i, it->member, it->next, it->prev);
+ it = it->next;
+ if (it == head)
+ break;
+ }
}
- ~AllocatorKeeper()
+ return i;
+}
+
+static inline avm_list_t* avm_list_add_head(avm_list_t* head, void* member)
+{
+ avm_list_t* n = (avm_list_t*) malloc(sizeof(avm_list_t));
+ n->member = member;
+
+ if (!head)
{
- UnregisterComClass(&CLSID_MemoryAllocator, MemAllocator::CreateAllocator);
+ head = n;
+ head->prev = head;
}
-};
-static AllocatorKeeper keeper;
+ n->prev = head->prev;
+ head->prev = n;
+ n->next = head;
+
+ return n;
+}
-GUID MemAllocator::interfaces[]=
+static inline avm_list_t* avm_list_add_tail(avm_list_t* head, void* member)
{
- IID_IUnknown,
- IID_IMemAllocator,
-};
+ avm_list_t* n = avm_list_add_head(head, member);
+ return (!head) ? n : head;
+}
-IMPLEMENT_IUNKNOWN(MemAllocator)
+static inline avm_list_t* avm_list_del_head(avm_list_t* head)
+{
+ avm_list_t* n = 0;
+ if (head)
+ {
+ if (head->next != head)
+ {
+ n = head->next;
+ head->prev->next = head->next;
+ head->next->prev = head->prev;
+ }
+
+ free(head);
+ }
+
+ return n;
+}
+
+static inline avm_list_t* avm_list_find(avm_list_t* head, void* member)
+{
+ avm_list_t* it = head;
+ if (it)
+ {
+ for (;;)
+ {
+ if (it->member == member)
+ return it;
+ it = it->next;
+ if (it == head)
+ break;
+ }
+ }
+ return NULL;
+}
-long MemAllocator::CreateAllocator(GUID* clsid, GUID* iid, void** ppv)
+static long MemAllocator_CreateAllocator(GUID* clsid, GUID* iid, void** ppv)
{
- if(!ppv)return -1;
- *ppv=0;
- if(memcmp(clsid, &CLSID_MemoryAllocator, sizeof(GUID)))
+ IMemAllocator* p;
+ int result;
+ if (!ppv)
+ return -1;
+ *ppv = 0;
+ if (memcmp(clsid, &CLSID_MemoryAllocator, sizeof(GUID)))
return -1;
- IMemAllocator* p=new MemAllocator;
- int result=p->vt->QueryInterface((IUnknown*)p, iid, ppv);
+ p = (IMemAllocator*) MemAllocatorCreate();
+ result = p->vt->QueryInterface((IUnknown*)p, iid, ppv);
p->vt->Release((IUnknown*)p);
+
return result;
}
-
static HRESULT STDCALL MemAllocator_SetProperties(IMemAllocator * This,
/* [in] */ ALLOCATOR_PROPERTIES *pRequest,
/* [out] */ ALLOCATOR_PROPERTIES *pActual)
{
- Debug printf("MemAllocator_SetProperties() called\n");
+ MemAllocator* me = (MemAllocator*)This;
+ Debug printf("MemAllocator_SetProperties(%p) called\n", This);
if (!pRequest || !pActual)
return E_INVALIDARG;
if (pRequest->cBuffers<=0 || pRequest->cbBuffer<=0)
return E_FAIL;
- MemAllocator* me = (MemAllocator*)This;
- if (me->used_list.size() || me->free_list.size())
+ if (me->used_list != 0 || me->free_list != 0)
return E_FAIL;
me->props = *pRequest;
*pActual = *pRequest;
+
return 0;
}
@@ -71,34 +145,56 @@
if (((MemAllocator*)This)->props.cbBuffer<0)
return E_FAIL;
*pProps=((MemAllocator*)This)->props;
+
return 0;
}
static HRESULT STDCALL MemAllocator_Commit(IMemAllocator * This)
{
+ MemAllocator* me = (MemAllocator*)This;
+ int i;
Debug printf("MemAllocator_Commit(%p) called\n", This);
- MemAllocator* me=(MemAllocator*)This;
if (((MemAllocator*)This)->props.cbBuffer < 0)
return E_FAIL;
- if (me->used_list.size() || me->free_list.size())
+ if (me->used_list || me->free_list)
return E_INVALIDARG;
- for(int i = 0; i<me->props.cBuffers; i++)
- me->free_list.push_back(new CMediaSample(me, me->props.cbBuffer));
+ for (i = 0; i < me->props.cBuffers; i++)
+ {
+ CMediaSample* sample = CMediaSampleCreate((IMemAllocator*)me,
+ me->props.cbBuffer);
+ //printf("FREEEEEEEEEEEE ADDED %p\n", sample);
+ me->free_list = avm_list_add_tail(me->free_list, sample);
+ //avm_list_print(me->free_list);
+ }
+
+ //printf("Added mem %p: lsz: %d %d size: %d\n", me, avm_list_size(me->free_list), me->props.cBuffers, me->props.cbBuffer);
return 0;
}
static HRESULT STDCALL MemAllocator_Decommit(IMemAllocator * This)
{
- Debug printf("MemAllocator_Decommit(%p) called\n", This);
MemAllocator* me=(MemAllocator*)This;
- list<CMediaSample*>::iterator it;
- for(it=me->free_list.begin(); it!=me->free_list.end(); it++)
- delete *it;
- for(it=me->used_list.begin(); it!=me->used_list.end(); it++)
- delete *it;
- me->free_list.clear();
- me->used_list.clear();
+ Debug printf("MemAllocator_Decommit(%p) called\n", This);
+ //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->used_list = avm_list_del_head(me->used_list);
+ }
+
+ while (me->free_list)
+ {
+ CMediaSample* sample = (CMediaSample*) me->free_list->member;
+ //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);
+ }
+
return 0;
}
@@ -108,71 +204,121 @@
/* [in] */ REFERENCE_TIME *pEndTime,
/* [in] */ DWORD dwFlags)
{
- Debug printf("MemAllocator_GetBuffer(%p) called\n", This);
MemAllocator* me = (MemAllocator*)This;
- if (me->free_list.size() == 0)
+ CMediaSample* sample;
+ Debug printf("MemAllocator_GetBuffer(%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");
return E_FAIL;//should block here if no samples are available
}
- list<CMediaSample*>::iterator it = me->free_list.begin();
- me->used_list.push_back(*it);
- *ppBuffer = *it;
- (*ppBuffer)->vt->AddRef((IUnknown*)*ppBuffer);
+
+ sample = (CMediaSample*) me->free_list->member;
+ 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)
{
- if(me->modified_sample)
- me->modified_sample->ResetPointer();
- (*it)->SetPointer(me->new_pointer);
- me->modified_sample=*it;
+ if (me->modified_sample)
+ me->modified_sample->ResetPointer(me->modified_sample);
+ sample->SetPointer(sample, me->new_pointer);
+ me->modified_sample = sample;
me->new_pointer = 0;
}
- me->free_list.remove(*it);
return 0;
}
-static HRESULT STDCALL MemAllocator_ReleaseBuffer(IMemAllocator * This,
- /* [in] */ IMediaSample *pBuffer)
+static HRESULT STDCALL MemAllocator_ReleaseBuffer(IMemAllocator* This,
+ /* [in] */ IMediaSample* pBuffer)
{
- Debug printf("MemAllocator_ReleaseBuffer(%p) called\n", This);
MemAllocator* me = (MemAllocator*)This;
- list<CMediaSample*>::iterator it;
- for (it = me->used_list.begin(); it != me->used_list.end(); it++)
- if (*it == pBuffer)
+ Debug printf("MemAllocator_ReleaseBuffer(%p) called %d %d\n", This,
+ avm_list_size(me->used_list), avm_list_size(me->free_list));
+
+ for (;;)
+ {
+ avm_list_t* l = avm_list_find(me->used_list, pBuffer);
+ if (l)
{
- me->used_list.erase(it);
- me->free_list.push_back((CMediaSample*)pBuffer);
- return 0;
+ 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;
}
- Debug printf("Releasing unknown buffer\n");
+ else
+ break;
+ }
+ Debug printf("MemAllocator_ReleaseBuffer(%p) releasing unknown buffer!!!! %p\n", This, pBuffer);
return E_FAIL;
}
-MemAllocator::MemAllocator()
+
+static void MemAllocator_SetPointer(MemAllocator* This, char* pointer)
{
- Debug printf("MemAllocator::MemAllocator() called\n");
- vt = new IMemAllocator_vt;
- vt->QueryInterface = QueryInterface;
- vt->AddRef = AddRef;
- vt->Release = Release;
- vt->SetProperties = MemAllocator_SetProperties;
- vt->GetProperties = MemAllocator_GetProperties;
- vt->Commit = MemAllocator_Commit;
- vt->Decommit = MemAllocator_Decommit;
- vt->GetBuffer = MemAllocator_GetBuffer;
- vt->ReleaseBuffer = MemAllocator_ReleaseBuffer;
-
- refcount = 1;
- props.cBuffers = 1;
- props.cbBuffer = 65536; /* :/ */
- props.cbAlign = props.cbPrefix = 0;
+ This->new_pointer = pointer;
+}
+
+static void MemAllocator_ResetPointer(MemAllocator* This)
+{
+ if (This->modified_sample)
+ {
+ This->modified_sample->ResetPointer(This->modified_sample);
+ This->modified_sample = 0;
+ }
+}
- new_pointer=0;
- modified_sample=0;
+void MemAllocator_Destroy(MemAllocator* This)
+{
+ Debug printf("MemAllocator_Destroy(%p) called (%d, %d)\n", This, This->refcount, AllocatorKeeper);
+ if (--AllocatorKeeper == 0)
+ UnregisterComClass(&CLSID_MemoryAllocator, MemAllocator_CreateAllocator);
+ free(This->vt);
+ free(This);
}
-MemAllocator::~MemAllocator()
+IMPLEMENT_IUNKNOWN(MemAllocator)
+
+MemAllocator* MemAllocatorCreate()
{
- Debug printf("MemAllocator::~MemAllocator() called\n");
- delete vt;
+ MemAllocator* This = (MemAllocator*) malloc(sizeof(MemAllocator));
+ Debug printf("MemAllocatorCreate() called -> %p\n", This);
+
+ This->refcount = 1;
+ This->props.cBuffers = 1;
+ This->props.cbBuffer = 65536; /* :/ */
+ This->props.cbAlign = This->props.cbPrefix = 0;
+
+ This->vt = (IMemAllocator_vt*) malloc(sizeof(IMemAllocator_vt));
+ This->vt->QueryInterface = MemAllocator_QueryInterface;
+ This->vt->AddRef = MemAllocator_AddRef;
+ This->vt->Release = MemAllocator_Release;
+ This->vt->SetProperties = MemAllocator_SetProperties;
+ This->vt->GetProperties = MemAllocator_GetProperties;
+ This->vt->Commit = MemAllocator_Commit;
+ This->vt->Decommit = MemAllocator_Decommit;
+ This->vt->GetBuffer = MemAllocator_GetBuffer;
+ This->vt->ReleaseBuffer = MemAllocator_ReleaseBuffer;
+
+ This->SetPointer = MemAllocator_SetPointer;
+ This->ResetPointer = MemAllocator_ResetPointer;
+
+ This->new_pointer = 0;
+ This->modified_sample = 0;
+ This->used_list = 0;
+ This->free_list = 0;
+
+ This->interfaces[0]=IID_IUnknown;
+ This->interfaces[1]=IID_IMemAllocator;
+
+ if (AllocatorKeeper++ == 0)
+ RegisterComClass(&CLSID_MemoryAllocator, MemAllocator_CreateAllocator);
+
+ return This;
}
Index: allocator.h
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/allocator.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- allocator.h 16 Aug 2001 00:50:02 -0000 1.3
+++ allocator.h 21 Nov 2001 19:12:39 -0000 1.4
@@ -3,33 +3,30 @@
#include "interfaces.h"
#include "cmediasample.h"
-#include "iunk.h"
-#include <list>
+typedef struct avm_list_t
+{
+ struct avm_list_t* next;
+ struct avm_list_t* prev;
+ void* member;
+} avm_list_t;
-struct MemAllocator: public IMemAllocator
+typedef struct _MemAllocator MemAllocator;
+struct _MemAllocator
{
+ IMemAllocator_vt* vt;
ALLOCATOR_PROPERTIES props;
- std::list<CMediaSample*> used_list;
- std::list<CMediaSample*> free_list;
+ avm_list_t* used_list;
+ avm_list_t* free_list;
char* new_pointer;
CMediaSample* modified_sample;
- static GUID interfaces[];
- DECLARE_IUNKNOWN(MemAllocator)
-
- MemAllocator();
- ~MemAllocator();
- void SetPointer(char* pointer) { new_pointer=pointer; }
- void ResetPointer()
- {
- if (modified_sample)
- {
- modified_sample->ResetPointer();
- modified_sample=0;
- }
- }
+ GUID interfaces[2];
+ DECLARE_IUNKNOWN();
- static long CreateAllocator(GUID* clsid, GUID* iid, void** ppv);
+ void ( *SetPointer )(MemAllocator* This, char* pointer);
+ void ( *ResetPointer )(MemAllocator* This);
};
+
+MemAllocator* MemAllocatorCreate();
#endif /* DS_ALLOCATOR_H */
Index: cmediasample.c
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/cmediasample.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- cmediasample.c 4 Oct 2001 02:21:47 -0000 1.5
+++ cmediasample.c 21 Nov 2001 19:12:39 -0000 1.6
@@ -3,23 +3,23 @@
#include <stdio.h>
#include <string.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;
- 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;
- This->vt->AddRef(This);
+ *ppv = (void*)This;
+ ((IMediaSample*) This)->vt->AddRef(This);
return 0;
}
return E_NOINTERFACE;
@@ -27,26 +27,39 @@
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)
{
- Debug printf("%p: CMediaSample_Release() called, new refcount %d\n",
- This, ((CMediaSample*)This)->refcount-1);
CMediaSample* parent=(CMediaSample*)This;
- if (--((CMediaSample*)This)->refcount==0)
+ Debug printf("CMediaSample_Release(%p) called (new ref:%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);
+ Debug printf("CMediaSample_GetPointer(%p) called\n", This);
if (!ppBuffer)
return E_INVALIDARG;
*ppBuffer=(BYTE *)((CMediaSample*)This)->block;
@@ -55,7 +68,7 @@
static long STDCALL CMediaSample_GetSize(IMediaSample * This)
{
- Debug printf("%p: CMediaSample_GetSize() called -> %d\n",
+ Debug printf("CMediaSample_GetSize(%p) called -> %d\n",
This, ((CMediaSample*)This)->size);
return ((CMediaSample*)This)->size;
}
@@ -64,7 +77,7 @@
/* [out] */ REFERENCE_TIME *pTimeStart,
/* [out] */ REFERENCE_TIME *pTimeEnd)
{
- Debug printf("%p: CMediaSample_GetTime() called\n", This);
+ Debug printf("CMediaSample_GetTime(%p) called\n", This);
return E_NOTIMPL;
}
@@ -72,13 +85,13 @@
/* [in] */ REFERENCE_TIME *pTimeStart,
/* [in] */ REFERENCE_TIME *pTimeEnd)
{
- Debug printf("%p: CMediaSample_SetTime() called\n", This);
+ Debug printf("CMediaSample_SetTime(%p) called\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;
@@ -87,14 +100,14 @@
static HRESULT STDCALL CMediaSample_SetSyncPoint(IMediaSample * This,
long bIsSyncPoint)
{
- Debug printf("%p: CMediaSample_SetSyncPoint() called\n", This);
+ 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
@@ -105,33 +118,34 @@
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);
+ Debug printf("CMediaSample_SetActualDataLength(%p, %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;
+ ((CMediaSample*)This)->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)
{
- 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)
@@ -139,28 +153,30 @@
*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
+
+ 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
return 0;
}
static HRESULT STDCALL CMediaSample_SetMediaType(IMediaSample * This,
AM_MEDIA_TYPE *pMediaType)
{
- 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;
- 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);
+ 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;
@@ -168,14 +184,14 @@
static HRESULT STDCALL CMediaSample_IsDiscontinuity(IMediaSample * This)
{
- Debug printf("%p: CMediaSample_IsDiscontinuity() called\n", This);
+ Debug printf("CMediaSample_IsDiscontinuity(%p) called\n", This);
return 1;
}
static HRESULT STDCALL CMediaSample_SetDiscontinuity(IMediaSample * This,
long bDiscontinuity)
{
- Debug printf("%p: CMediaSample_SetDiscontinuity() called\n", This);
+ Debug printf("CMediaSample_SetDiscontinuity(%p) called\n", This);
return E_NOTIMPL;
}
@@ -183,7 +199,7 @@
/* [out] */ LONGLONG *pTimeStart,
/* [out] */ LONGLONG *pTimeEnd)
{
- Debug printf("%p: CMediaSample_GetMediaTime() called\n", This);
+ Debug printf("CMediaSample_GetMediaTime(%p) called\n", This);
return E_NOTIMPL;
}
@@ -191,54 +207,65 @@
/* [in] */ LONGLONG *pTimeStart,
/* [in] */ LONGLONG *pTimeEnd)
{
- Debug printf("%p: CMediaSample_SetMediaTime() called\n", This);
+ Debug printf("CMediaSample_SetMediaTime(%p) called\n", This);
return E_NOTIMPL;
}
-CMediaSample::CMediaSample(IMemAllocator* allocator, long _size)
+static void CMediaSample_SetPointer(CMediaSample* This, char* pointer)
{
- vt = new IMediaSample_vt;
+ Debug printf("CMediaSample_SetPointer(%p) called -> %p\n", This, pointer);
+ if (pointer)
+ This->block = pointer;
+ else
+ This->block = This->own_block;
+}
+
+static void CMediaSample_ResetPointer(CMediaSample* This)
+{
+ Debug printf("CMediaSample_ResetPointer(%p) called\n", This);
+ This->block = This->own_block;
+}
+
+CMediaSample* CMediaSampleCreate(IMemAllocator* allocator, int _size)
+{
+ CMediaSample* This = (CMediaSample*) malloc(sizeof( CMediaSample ));
+ This->vt = (IMediaSample_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; // increased by MemAllocator
+ This->actual_size = 0;
+ This->media_type.pbFormat = 0;
+ This->isPreroll = 0;
+ This->type_valid = 0;
+ This->own_block = (char*) malloc(This->size);
+ 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);
- vt->QueryInterface = CMediaSample_QueryInterface;
- vt->AddRef = CMediaSample_AddRef;
- vt->Release = CMediaSample_Release;
- vt->GetPointer = CMediaSample_GetPointer;
- vt->GetSize = CMediaSample_GetSize;
- vt->GetTime = CMediaSample_GetTime;
- vt->SetTime = CMediaSample_SetTime;
- vt->IsSyncPoint = CMediaSample_IsSyncPoint;
- vt->SetSyncPoint = CMediaSample_SetSyncPoint;
- vt->IsPreroll = CMediaSample_IsPreroll;
- vt->SetPreroll = CMediaSample_SetPreroll;
- vt->GetActualDataLength = CMediaSample_GetActualDataLength;
- vt->SetActualDataLength = CMediaSample_SetActualDataLength;
- vt->GetMediaType = CMediaSample_GetMediaType;
- vt->SetMediaType = CMediaSample_SetMediaType;
- vt->IsDiscontinuity = CMediaSample_IsDiscontinuity;
- vt->SetDiscontinuity = CMediaSample_SetDiscontinuity;
- vt->GetMediaTime = CMediaSample_GetMediaTime;
- vt->SetMediaTime = CMediaSample_SetMediaTime;
-
- all = allocator;
- size = _size;
- refcount = 0;
- actual_size = 0;
- media_type.pbFormat = 0;
- isPreroll = 0;
- type_valid = 0;
- own_block = new char[size];
- block = own_block;
- Debug printf("%p: Creating media sample with size %ld, buffer %p\n",
- this, _size, block);
-}
-
-CMediaSample::~CMediaSample()
-{
- Debug printf("%p: CMediaSample::~CMediaSample() called\n", this);
- if (!vt)
- printf("Second delete of CMediaSample()!!|\n");
- delete vt;
- delete own_block;
- if (media_type.pbFormat)
- CoTaskMemFree(media_type.pbFormat);
+ return This;
}
Index: cmediasample.h
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/cmediasample.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- cmediasample.h 16 Aug 2001 00:50:02 -0000 1.3
+++ cmediasample.h 21 Nov 2001 19:12:39 -0000 1.4
@@ -4,8 +4,10 @@
#include "interfaces.h"
#include "guids.h"
-struct CMediaSample: public IMediaSample
+typedef struct _CMediaSample CMediaSample;
+struct _CMediaSample
{
+ IMediaSample_vt* vt;
IMemAllocator* all;
int size;
int actual_size;
@@ -16,10 +18,12 @@
int isSyncPoint;
AM_MEDIA_TYPE media_type;
int type_valid;
- CMediaSample(IMemAllocator* allocator, long _size);
- ~CMediaSample();
- void SetPointer(char* pointer) { block = pointer; }
- void ResetPointer() { block = own_block; }
+ void ( *SetPointer) (CMediaSample* This,char* pointer);
+ void ( *ResetPointer) (CMediaSample* This); // FIXME replace with Set & 0
};
+
+CMediaSample* CMediaSampleCreate(IMemAllocator* allocator, int _size);
+// called from allocator
+void CMediaSample_Destroy(CMediaSample* This);
#endif /* DS_CMEDIASAMPLE_H */
Index: guids.c
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/guids.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- guids.c 6 May 2001 21:43:45 -0000 1.2
+++ guids.c 21 Nov 2001 19:12:39 -0000 1.3
@@ -3,6 +3,9 @@
GUID CLSID_DivxDecompressorCF={0x82CCd3E0, 0xF71A, 0x11D0,
{ 0x9f, 0xe5, 0x00, 0x60, 0x97, 0x78, 0xaa, 0xaa}};
+GUID IID_IDivxFilterInterface={0xd132ee97, 0x3e38, 0x4030,
+ {0x8b, 0x17, 0x59, 0x16, 0x3b, 0x30, 0xa1, 0xf5}};
+
GUID CLSID_IV50_Decoder={0x30355649, 0x0000, 0x0010,
{0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};
GUID IID_IBaseFilter={0x56a86895, 0x0ad4, 0x11ce,
@@ -18,15 +21,15 @@
GUID IID_IMediaSample={0x56a8689a, 0x0ad4, 0x11ce,
{0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}};
-GUID MEDIATYPE_Video={0x73646976, 0x0000, 0x0010,
+GUID MEDIATYPE_Video={0x73646976, 0x0000, 0x0010,
{0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};
-GUID GUID_NULL={0x0, 0x0, 0x0,
+GUID GUID_NULL={0x0, 0x0, 0x0,
{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}};
GUID FORMAT_VideoInfo={0x05589f80, 0xc356, 0x11ce,
{0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a}};
GUID MEDIASUBTYPE_RGB565={0xe436eb7b, 0x524f, 0x11ce,
{0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}};
-GUID MEDIASUBTYPE_RGB555={0xe436eb7c, 0x524f, 0x11ce,
+GUID MEDIASUBTYPE_RGB555={0xe436eb7c, 0x524f, 0x11ce,
{0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}};
GUID MEDIASUBTYPE_RGB24={0xe436eb7d, 0x524f, 0x11ce,
{0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}};
@@ -58,3 +61,4 @@
{0xa1, 0xc1, 0x00, 0x60, 0x97, 0x78, 0xaa, 0xaa}};
GUID IID_Iv50Hidden={0x665a4442, 0xd905, 0x11d0,
{0xa3, 0x0e, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}};
+
Index: guids.h
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/guids.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- guids.h 4 Oct 2001 02:21:47 -0000 1.3
+++ guids.h 21 Nov 2001 19:12:39 -0000 1.4
@@ -3,25 +3,22 @@
#include "com.h"
#include "wine/winbase.h"
-#include "wine/windef.h"
-#include "wine/winuser.h"
#include "wine/vfw.h"
extern int DSHOW_DEBUG;
#define Debug if(DSHOW_DEBUG)
-struct IUnknown;
typedef struct _MediaType
{
- GUID majortype; //0x0
- GUID subtype; //0x10
- int bFixedSizeSamples; //0x20
- int bTemporalCompression; //0x24
- unsigned long lSampleSize; //0x28
- GUID formattype; //0x2c
- IUnknown *pUnk; //0x3c
- unsigned long cbFormat; //0x40
- char *pbFormat; //0x44
+ GUID majortype; //0x0
+ GUID subtype; //0x10
+ int bFixedSizeSamples; //0x20
+ int bTemporalCompression; //0x24
+ unsigned long lSampleSize; //0x28
+ GUID formattype; //0x2c
+ IUnknown* pUnk; //0x3c
+ unsigned long cbFormat; //0x40
+ char *pbFormat; //0x44
} AM_MEDIA_TYPE;
typedef enum
@@ -32,10 +29,10 @@
typedef long long REFERENCE_TIME;
-struct RECT32
+typedef struct RECT32
{
int left, top, right, bottom;
-};
+} RECT32;
typedef struct tagVIDEOINFOHEADER {
@@ -55,15 +52,15 @@
long cbPrefix;
} ALLOCATOR_PROPERTIES;
-struct IBaseFilter;
-
+typedef struct _IBaseFilter IBaseFilter;
typedef struct _PinInfo
{
- IBaseFilter *pFilter;
+ IBaseFilter* pFilter;
PIN_DIRECTION dir;
unsigned short achName[128];
} PIN_INFO;
+
extern GUID IID_IBaseFilter;
extern GUID IID_IEnumPins;
extern GUID IID_IEnumMediaTypes;
@@ -73,6 +70,7 @@
extern GUID IID_DivxHidden;
extern GUID IID_Iv50Hidden;
extern GUID CLSID_DivxDecompressorCF;
+extern GUID IID_IDivxFilterInterface;
extern GUID CLSID_IV50_Decoder;
extern GUID CLSID_MemoryAllocator;
extern GUID MEDIATYPE_Video;
Index: inputpin.c
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/inputpin.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- inputpin.c 4 Oct 2001 02:21:47 -0000 1.3
+++ inputpin.c 21 Nov 2001 19:12:39 -0000 1.4
@@ -4,98 +4,46 @@
#include <stdio.h>
#include <stdlib.h>
-GUID CInputPin::interfaces[]=
+static int unimplemented(const char* s, void* p)
{
- IID_IUnknown,
-};
-IMPLEMENT_IUNKNOWN(CInputPin)
-
-GUID CRemotePin::interfaces[]=
[...1025 lines suppressed...]
- vt->AddRef = AddRef;
- vt->Release = Release;
- vt->QueryPinInfo = CRemotePin2_QueryPinInfo;
+ CRemotePin2* This = (CRemotePin2*) malloc(sizeof(CRemotePin2));
+ Debug printf("CRemotePin2Create() called -> %p\n", This);
+
+ This->parent = p;
+ This->refcount = 1;
+
+ This->vt = (IPin_vt*) malloc(sizeof(IPin_vt));
+ memset(This->vt, 0, sizeof(IPin_vt));
+ This->vt->QueryInterface = CRemotePin2_QueryInterface;
+ This->vt->AddRef = CRemotePin2_AddRef;
+ This->vt->Release = CRemotePin2_Release;
+ This->vt->QueryPinInfo = CRemotePin2_QueryPinInfo;
+
+ This->interfaces[0] = IID_IUnknown;
+
+ return This;
}
Index: inputpin.h
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/inputpin.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- inputpin.h 16 Aug 2001 00:50:02 -0000 1.2
+++ inputpin.h 21 Nov 2001 19:12:39 -0000 1.3
@@ -2,215 +2,70 @@
#define DS_INPUTPIN_H
#include "interfaces.h"
-#include "guids.h"
-#include "iunk.h"
-class CBaseFilter2;
-class CBaseFilter: public IBaseFilter
+typedef struct _CBaseFilter2 CBaseFilter2;
+struct _CBaseFilter2
{
+ IBaseFilter_vt* vt;
+ IPin* pin;
+ GUID interfaces[5];
+ DECLARE_IUNKNOWN();
+
+ IPin* ( *GetPin )(CBaseFilter2* This);
+};
+
+CBaseFilter2* CBaseFilter2Create();
+
+
+typedef struct _CBaseFilter CBaseFilter;
+struct _CBaseFilter
+{
+ IBaseFilter_vt* vt;
IPin* pin;
IPin* unused_pin;
- static GUID interfaces[];
- DECLARE_IUNKNOWN(CBaseFilter)
-public:
- CBaseFilter(const AM_MEDIA_TYPE& vhdr, CBaseFilter2* parent);
- ~CBaseFilter(){delete vt;pin->vt->Release((IUnknown*)pin);unused_pin->vt->Release((IUnknown*)unused_pin);}
-
- IPin* GetPin() {return pin;}
- IPin* GetUnusedPin() {return unused_pin;}
-
- static long STDCALL GetClassID (IBaseFilter * This,
- /* [out] */ CLSID *pClassID);
-
- static long STDCALL Stop (IBaseFilter * This);
- static long STDCALL Pause (IBaseFilter * This);
- static long STDCALL Run (IBaseFilter * This, REFERENCE_TIME tStart);
- static long STDCALL GetState (IBaseFilter * This,
- /* [in] */ unsigned long dwMilliSecsTimeout,
- // /* [out] */ FILTER_STATE *State);
- void* State);
-
- static long STDCALL SetSyncSource (IBaseFilter * This,
- /* [in] */ IReferenceClock *pClock);
- static long STDCALL GetSyncSource (IBaseFilter * This,
- /* [out] */ IReferenceClock **pClock);
- static long STDCALL EnumPins (IBaseFilter * This,
- /* [out] */ IEnumPins **ppEnum);
- static long STDCALL FindPin (IBaseFilter * This,
- /* [string][in] */ const unsigned short* Id,
- /* [out] */ IPin **ppPin);
- static long STDCALL QueryFilterInfo (IBaseFilter * This,
- ///* [out] */ FILTER_INFO *pInfo);
- void* pInfo);
- static long STDCALL JoinFilterGraph (IBaseFilter * This,
- /* [in] */ IFilterGraph *pGraph,
- /* [string][in] */
- const unsigned short* pName);
- static long STDCALL QueryVendorInfo (IBaseFilter * This,
- /* [string][out] */
- unsigned short* *pVendorInfo);
+ GUID interfaces[2];
+ DECLARE_IUNKNOWN();
+
+ IPin* ( *GetPin )(CBaseFilter* This);
+ IPin* ( *GetUnusedPin )(CBaseFilter* This);
};
-class CInputPin: public IPin
+CBaseFilter* CBaseFilterCreate(const AM_MEDIA_TYPE* vhdr, CBaseFilter2* parent);
+
+
+typedef struct _CInputPin CInputPin;
+struct _CInputPin
{
+ IPin_vt* vt;
AM_MEDIA_TYPE type;
CBaseFilter* parent;
- static GUID interfaces[];
- DECLARE_IUNKNOWN(CInputPin)
-public:
- CInputPin(CBaseFilter* parent, const AM_MEDIA_TYPE& vhdr);
- ~CInputPin(){delete vt;}
-// IPin* GetPin();
-
-// static long STDCALL QueryInterface(IUnknown* This, GUID* iid, void** ppv);
-// static long STDCALL AddRef(IUnknown* This);
-// static long STDCALL Release(IUnknown* This);
-
- static long STDCALL Connect (
- IPin * This,
- /* [in] */ IPin *pReceivePin,
- /* [in] */ AM_MEDIA_TYPE *pmt);
-
- static long STDCALL ReceiveConnection (
- IPin * This,
- /* [in] */ IPin *pConnector,
- /* [in] */ const AM_MEDIA_TYPE *pmt);
-
- static long STDCALL Disconnect (
- IPin * This);
-
- static long STDCALL ConnectedTo (
- IPin * This,
- /* [out] */ IPin **pPin);
-
- static long STDCALL ConnectionMediaType (
- IPin * This,
- /* [out] */ AM_MEDIA_TYPE *pmt);
-
- static long STDCALL QueryPinInfo (
- IPin * This,
- /* [out] */ PIN_INFO *pInfo);
-
- static long STDCALL QueryDirection (
- IPin * This,
- /* [out] */ PIN_DIRECTION *pPinDir);
-
- static long STDCALL QueryId (
- IPin * This,
- /* [out] */ unsigned short* *Id);
-
- static long STDCALL QueryAccept (
- IPin * This,
- /* [in] */ const AM_MEDIA_TYPE *pmt);
-
- static long STDCALL EnumMediaTypes (
- IPin * This,
- /* [out] */ IEnumMediaTypes **ppEnum);
-
- static long STDCALL QueryInternalConnections (
- IPin * This,
- /* [out] */ IPin **apPin,
- /* [out][in] */ unsigned long *nPin);
-
- static long STDCALL EndOfStream (
- IPin * This);
-
- static long STDCALL BeginFlush (
- IPin * This);
-
- static long STDCALL EndFlush (
- IPin * This);
-
- static long STDCALL NewSegment (
- IPin * This,
- /* [in] */ REFERENCE_TIME tStart,
- /* [in] */ REFERENCE_TIME tStop,
- /* [in] */ double dRate);
+ GUID interfaces[1];
+ DECLARE_IUNKNOWN();
};
-class CBaseFilter2: public IBaseFilter
-{
- IPin* pin;
- static GUID interfaces[];
- DECLARE_IUNKNOWN(CBaseFilter2)
-public:
- CBaseFilter2();
- ~CBaseFilter2(){delete vt;pin->vt->Release((IUnknown*)pin);}
- IPin* GetPin() {return pin;}
-
-// static long STDCALL QueryInterface(IUnknown* This, GUID* iid, void** ppv);
-// static long STDCALL AddRef(IUnknown* This);
-// static long STDCALL Release(IUnknown* This);
- static long STDCALL GetClassID (
- IBaseFilter * This,
- /* [out] */ CLSID *pClassID);
-
- static long STDCALL Stop (
- IBaseFilter * This);
-
- static long STDCALL Pause (
- IBaseFilter * This);
-
- static long STDCALL Run (
- IBaseFilter * This,
- REFERENCE_TIME tStart);
-
- static long STDCALL GetState (
- IBaseFilter * This,
- /* [in] */ unsigned long dwMilliSecsTimeout,
-// /* [out] */ FILTER_STATE *State);
- void* State);
-
- static long STDCALL SetSyncSource (
- IBaseFilter * This,
- /* [in] */ IReferenceClock *pClock);
-
- static long STDCALL GetSyncSource (
- IBaseFilter * This,
- /* [out] */ IReferenceClock **pClock);
-
- static long STDCALL EnumPins (
- IBaseFilter * This,
- /* [out] */ IEnumPins **ppEnum);
-
- static long STDCALL FindPin (
- IBaseFilter * This,
- /* [string][in] */ const unsigned short* Id,
- /* [out] */ IPin **ppPin);
-
- static long STDCALL QueryFilterInfo (
- IBaseFilter * This,
-// /* [out] */ FILTER_INFO *pInfo);
- void* pInfo);
-
- static long STDCALL JoinFilterGraph (
- IBaseFilter * This,
- /* [in] */ IFilterGraph *pGraph,
- /* [string][in] */ const unsigned short* pName);
-
- static long STDCALL QueryVendorInfo (
- IBaseFilter * This,
- /* [string][out] */ unsigned short* *pVendorInfo);
-};
+CInputPin* CInputPinCreate(CBaseFilter* parent, const AM_MEDIA_TYPE* vhdr);
-struct CRemotePin: public IPin
+typedef struct CRemotePin
{
+ IPin_vt* vt;
CBaseFilter* parent;
IPin* remote_pin;
- static GUID interfaces[];
- DECLARE_IUNKNOWN(CRemotePin)
- CRemotePin(CBaseFilter* pt, IPin* rpin);
- ~CRemotePin(){delete vt;}
-};
+ GUID interfaces[1];
+ DECLARE_IUNKNOWN();
+} CRemotePin;
-struct CRemotePin2: public IPin
+CRemotePin* CRemotePinCreate(CBaseFilter* pt, IPin* rpin);
+
+
+typedef struct CRemotePin2
{
+ IPin_vt* vt;
CBaseFilter2* parent;
- static GUID interfaces[];
- DECLARE_IUNKNOWN(CRemotePin2)
- CRemotePin2(CBaseFilter2* parent);
- ~CRemotePin2(){delete vt;}
-};
+ GUID interfaces[1];
+ DECLARE_IUNKNOWN();
+} CRemotePin2;
+
+CRemotePin2* CRemotePin2Create(CBaseFilter2* parent);
#endif /* DS_INPUTPIN_H */
Index: interfaces.h
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/interfaces.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- interfaces.h 4 Oct 2001 02:21:47 -0000 1.5
+++ interfaces.h 21 Nov 2001 19:12:39 -0000 1.6
@@ -9,100 +9,44 @@
*/
+#include "iunk.h"
#include "com.h"
-#include "guids.h"
-#ifndef STDCALL
-#define STDCALL __attribute__((__stdcall__))
-#endif
-
-typedef GUID& REFIID;
+//typedef GUID& REFIID;
typedef GUID CLSID;
typedef GUID IID;
/* Sh*t. MSVC++ and g++ use different methods of storing vtables. */
-struct IBaseFilter;
-struct IReferenceClock;
-struct IEnumPins;
-struct IEnumMediaTypes;
-struct IPin;
-struct IFilterGraph;
-struct IMemInputPin;
-struct IMemAllocator;
-struct IMediaSample;
-struct IHidden;
-struct IHidden2;
+typedef struct _IReferenceClock IReferenceClock;
+typedef struct _IFilterGraph IFilterGraph;
enum PIN_DIRECTION;
-class IClassFactory2
+typedef struct _IEnumMediaTypes IEnumMediaTypes;
+typedef struct IEnumMediaTypes_vt
{
-public:
- virtual long STDCALL QueryInterface(GUID* iid, void** ppv) =0;
- virtual long STDCALL AddRef() =0;
- virtual long STDCALL Release() =0;
- virtual long STDCALL CreateInstance(IUnknown* pUnkOuter, GUID* riid, void** ppvObject) =0;
-};
+ INHERIT_IUNKNOWN();
-struct IBaseFilter_vt: IUnknown_vt
-{
- HRESULT STDCALL ( *GetClassID )(IBaseFilter * This,
- /* [out] */ CLSID *pClassID);
- HRESULT STDCALL ( *Stop )(IBaseFilter * This);
- HRESULT STDCALL ( *Pause )(IBaseFilter * This);
- HRESULT STDCALL ( *Run )(IBaseFilter * This,
- REFERENCE_TIME tStart);
- HRESULT STDCALL ( *GetState )(IBaseFilter * This,
- /* [in] */ unsigned long dwMilliSecsTimeout,
- ///* [out] */ FILTER_STATE *State);
- void* State);
- HRESULT STDCALL ( *SetSyncSource )(IBaseFilter * This,
- /* [in] */ IReferenceClock *pClock);
- HRESULT STDCALL ( *GetSyncSource )(IBaseFilter * This,
- /* [out] */ IReferenceClock **pClock);
- HRESULT STDCALL ( *EnumPins )(IBaseFilter * This,
- /* [out] */ IEnumPins **ppEnum);
- HRESULT STDCALL ( *FindPin )(IBaseFilter * This,
- /* [string][in] */ const unsigned short* Id,
- /* [out] */ IPin **ppPin);
- HRESULT STDCALL ( *QueryFilterInfo )(IBaseFilter * This,
- // /* [out] */ FILTER_INFO *pInfo);
- void* pInfo);
- HRESULT STDCALL ( *JoinFilterGraph )(IBaseFilter * This,
- /* [in] */ IFilterGraph *pGraph,
- /* [string][in] */ const unsigned short* pName);
- HRESULT STDCALL ( *QueryVendorInfo )(IBaseFilter * This,
- /* [string][out] */ unsigned short* *pVendorInfo);
-};
-
-struct IBaseFilter
-{
- struct IBaseFilter_vt *vt;
-};
+ HRESULT STDCALL ( *Next )(IEnumMediaTypes* This,
+ /* [in] */ unsigned long cMediaTypes,
+ /* [size_is][out] */ AM_MEDIA_TYPE** ppMediaTypes,
+ /* [out] */ unsigned long* pcFetched);
+ HRESULT STDCALL ( *Skip )(IEnumMediaTypes* This,
+ /* [in] */ unsigned long cMediaTypes);
+ HRESULT STDCALL ( *Reset )(IEnumMediaTypes* This);
+ HRESULT STDCALL ( *Clone )(IEnumMediaTypes* This,
+ /* [out] */ IEnumMediaTypes** ppEnum);
+} IEnumMediaTypes_vt;
+struct _IEnumMediaTypes { IEnumMediaTypes_vt* vt; };
-struct IEnumPins_vt: IUnknown_vt
-{
- HRESULT STDCALL ( *Next )(IEnumPins * This,
- /* [in] */ unsigned long cPins,
- /* [size_is][out] */ IPin **ppPins,
- /* [out] */ unsigned long *pcFetched);
- HRESULT STDCALL ( *Skip )(IEnumPins * This,
- /* [in] */ unsigned long cPins);
- HRESULT STDCALL ( *Reset )(IEnumPins * This);
- HRESULT STDCALL ( *Clone )(IEnumPins * This,
- /* [out] */ IEnumPins **ppEnum);
-};
-struct IEnumPins
+typedef struct _IPin IPin;
+typedef struct IPin_vt
{
- struct IEnumPins_vt *vt;
-};
+ INHERIT_IUNKNOWN();
-
-struct IPin_vt: IUnknown_vt
-{
HRESULT STDCALL ( *Connect )(IPin * This,
/* [in] */ IPin *pReceivePin,
/* [in] */ /*const*/ AM_MEDIA_TYPE *pmt);
@@ -131,35 +75,135 @@
/* [in] */ REFERENCE_TIME tStart,
/* [in] */ REFERENCE_TIME tStop,
/* [in] */ double dRate);
-};
+} IPin_vt;
+struct _IPin { IPin_vt *vt; };
+
-struct IPin
+typedef struct _IEnumPins IEnumPins;
+typedef struct IEnumPins_vt
{
- IPin_vt *vt;
-};
+ INHERIT_IUNKNOWN();
+ HRESULT STDCALL ( *Next )(IEnumPins* This,
+ /* [in] */ unsigned long cPins,
+ /* [size_is][out] */ IPin** ppPins,
+ /* [out] */ unsigned long* pcFetched);
+ HRESULT STDCALL ( *Skip )(IEnumPins* This,
+ /* [in] */ unsigned long cPins);
+ HRESULT STDCALL ( *Reset )(IEnumPins* This);
+ HRESULT STDCALL ( *Clone )(IEnumPins* This,
+ /* [out] */ IEnumPins** ppEnum);
+} IEnumPins_vt;
+struct _IEnumPins { struct IEnumPins_vt* vt; };
+
+
+typedef struct _IMediaSample IMediaSample;
+typedef struct IMediaSample_vt
+{
+ INHERIT_IUNKNOWN();
+
+ HRESULT STDCALL ( *GetPointer )(IMediaSample* This,
+ /* [out] */ unsigned char** ppBuffer);
+ LONG STDCALL ( *GetSize )(IMediaSample* This);
+ HRESULT STDCALL ( *GetTime )(IMediaSample* This,
+ /* [out] */ REFERENCE_TIME* pTimeStart,
+ /* [out] */ REFERENCE_TIME* pTimeEnd);
+ HRESULT STDCALL ( *SetTime )(IMediaSample* This,
+ /* [in] */ REFERENCE_TIME* pTimeStart,
+ /* [in] */ REFERENCE_TIME* pTimeEnd);
+ HRESULT STDCALL ( *IsSyncPoint )(IMediaSample* This);
+ HRESULT STDCALL ( *SetSyncPoint )(IMediaSample* This,
+ long bIsSyncPoint);
+ 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);
+ HRESULT STDCALL ( *GetMediaType )(IMediaSample* This,
+ AM_MEDIA_TYPE** ppMediaType);
+ HRESULT STDCALL ( *SetMediaType )(IMediaSample* This,
+ AM_MEDIA_TYPE* pMediaType);
+ HRESULT STDCALL ( *IsDiscontinuity )(IMediaSample* This);
+ HRESULT STDCALL ( *SetDiscontinuity )(IMediaSample* This,
+ long bDiscontinuity);
+ HRESULT STDCALL ( *GetMediaTime )(IMediaSample* This,
+ /* [out] */ long long* pTimeStart,
+ /* [out] */ long long* pTimeEnd);
+ HRESULT STDCALL ( *SetMediaTime )(IMediaSample* This,
+ /* [in] */ long long* pTimeStart,
+ /* [in] */ long long* pTimeEnd);
+} IMediaSample_vt;
+struct _IMediaSample { struct IMediaSample_vt* vt; };
-struct IEnumMediaTypes_vt: IUnknown_vt
+
+
+//typedef struct _IBaseFilter IBaseFilter;
+typedef struct IBaseFilter_vt
{
- HRESULT STDCALL ( *Next )(IEnumMediaTypes * This,
- /* [in] */ unsigned long cMediaTypes,
- /* [size_is][out] */ AM_MEDIA_TYPE **ppMediaTypes,
- /* [out] */ unsigned long *pcFetched);
- HRESULT STDCALL ( *Skip )(IEnumMediaTypes * This,
- /* [in] */ unsigned long cMediaTypes);
- HRESULT STDCALL ( *Reset )(IEnumMediaTypes * This);
- HRESULT STDCALL ( *Clone )(IEnumMediaTypes * This,
- /* [out] */ IEnumMediaTypes **ppEnum);
-};
+ INHERIT_IUNKNOWN();
-struct IEnumMediaTypes
+ HRESULT STDCALL ( *GetClassID )(IBaseFilter * This,
+ /* [out] */ CLSID *pClassID);
+ HRESULT STDCALL ( *Stop )(IBaseFilter * This);
+ HRESULT STDCALL ( *Pause )(IBaseFilter * This);
+ HRESULT STDCALL ( *Run )(IBaseFilter * This,
+ REFERENCE_TIME tStart);
+ HRESULT STDCALL ( *GetState )(IBaseFilter * This,
+ /* [in] */ unsigned long dwMilliSecsTimeout,
+ ///* [out] */ FILTER_STATE *State);
+ void* State);
+ HRESULT STDCALL ( *SetSyncSource )(IBaseFilter* This,
+ /* [in] */ IReferenceClock *pClock);
+ HRESULT STDCALL ( *GetSyncSource )(IBaseFilter* This,
+ /* [out] */ IReferenceClock **pClock);
+ HRESULT STDCALL ( *EnumPins )(IBaseFilter* This,
+ /* [out] */ IEnumPins **ppEnum);
+ HRESULT STDCALL ( *FindPin )(IBaseFilter* This,
+ /* [string][in] */ const unsigned short* Id,
+ /* [out] */ IPin** ppPin);
+ HRESULT STDCALL ( *QueryFilterInfo )(IBaseFilter* This,
+ // /* [out] */ FILTER_INFO *pInfo);
+ void* pInfo);
+ HRESULT STDCALL ( *JoinFilterGraph )(IBaseFilter* This,
+ /* [in] */ IFilterGraph* pGraph,
+ /* [string][in] */ const unsigned short* pName);
+ HRESULT STDCALL ( *QueryVendorInfo )(IBaseFilter* This,
+ /* [string][out] */ unsigned short** pVendorInfo);
+} IBaseFilter_vt;
+struct _IBaseFilter { struct IBaseFilter_vt* vt; };
+
+
+
+typedef struct _IMemAllocator IMemAllocator;
+typedef struct IMemAllocator_vt
{
- IEnumMediaTypes_vt *vt;
-};
+ INHERIT_IUNKNOWN();
+
+ HRESULT STDCALL ( *SetProperties )(IMemAllocator* This,
+ /* [in] */ ALLOCATOR_PROPERTIES *pRequest,
+ /* [out] */ ALLOCATOR_PROPERTIES *pActual);
+ HRESULT STDCALL ( *GetProperties )(IMemAllocator* This,
+ /* [out] */ ALLOCATOR_PROPERTIES *pProps);
+ HRESULT STDCALL ( *Commit )(IMemAllocator* This);
+ HRESULT STDCALL ( *Decommit )(IMemAllocator* This);
+ HRESULT STDCALL ( *GetBuffer )(IMemAllocator* This,
+ /* [out] */ IMediaSample** ppBuffer,
+ /* [in] */ REFERENCE_TIME* pStartTime,
+ /* [in] */ REFERENCE_TIME* pEndTime,
+ /* [in] */ unsigned long dwFlags);
+ HRESULT STDCALL ( *ReleaseBuffer )(IMemAllocator* This,
+ /* [in] */ IMediaSample* pBuffer);
+} IMemAllocator_vt;
+struct _IMemAllocator { IMemAllocator_vt* vt; };
-struct IMemInputPin_vt: IUnknown_vt
+
+typedef struct _IMemInputPin IMemInputPin;
+typedef struct IMemInputPin_vt
{
+ INHERIT_IUNKNOWN();
+
HRESULT STDCALL ( *GetAllocator )(IMemInputPin * This,
/* [out] */ IMemAllocator **ppAllocator);
HRESULT STDCALL ( *NotifyAllocator )(IMemInputPin * This,
@@ -174,114 +218,69 @@
/* [in] */ long nSamples,
/* [out] */ long *nSamplesProcessed);
HRESULT STDCALL ( *ReceiveCanBlock )(IMemInputPin * This);
-};
+} IMemInputPin_vt;
+struct _IMemInputPin { IMemInputPin_vt* vt; };
-struct IMemInputPin
-{
- IMemInputPin_vt *vt;
-};
-
-struct IMemAllocator_vt: IUnknown_vt
+typedef struct _IHidden IHidden;
+typedef struct IHidden_vt
{
- HRESULT STDCALL ( *SetProperties )(IMemAllocator * This,
- /* [in] */ ALLOCATOR_PROPERTIES *pRequest,
- /* [out] */ ALLOCATOR_PROPERTIES *pActual);
- HRESULT STDCALL ( *GetProperties )(IMemAllocator * This,
- /* [out] */ ALLOCATOR_PROPERTIES *pProps);
- HRESULT STDCALL ( *Commit )(IMemAllocator * This);
- HRESULT STDCALL ( *Decommit )(IMemAllocator * This);
- HRESULT STDCALL ( *GetBuffer )(IMemAllocator * This,
- /* [out] */ IMediaSample **ppBuffer,
- /* [in] */ REFERENCE_TIME *pStartTime,
- /* [in] */ REFERENCE_TIME *pEndTime,
- /* [in] */ unsigned long dwFlags);
- HRESULT STDCALL ( *ReleaseBuffer )(IMemAllocator * This,
- /* [in] */ IMediaSample *pBuffer);
-};
-
-struct IMemAllocator
-{
- IMemAllocator_vt *vt;
-};
-
-
-struct IMediaSample_vt: IUnknown_vt
-{
- HRESULT STDCALL ( *GetPointer )(IMediaSample * This,
- /* [out] */ unsigned char **ppBuffer);
- long STDCALL ( *GetSize )(IMediaSample * This);
- HRESULT STDCALL ( *GetTime )(IMediaSample * This,
- /* [out] */ REFERENCE_TIME *pTimeStart,
- /* [out] */ REFERENCE_TIME *pTimeEnd);
- HRESULT STDCALL ( *SetTime )(IMediaSample * This,
- /* [in] */ REFERENCE_TIME *pTimeStart,
- /* [in] */ REFERENCE_TIME *pTimeEnd);
- HRESULT STDCALL ( *IsSyncPoint )(IMediaSample * This);
- HRESULT STDCALL ( *SetSyncPoint )(IMediaSample * This,
- long bIsSyncPoint);
- 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);
- HRESULT STDCALL ( *GetMediaType )(IMediaSample * This,
- AM_MEDIA_TYPE **ppMediaType);
- HRESULT STDCALL ( *SetMediaType )(IMediaSample * This,
- AM_MEDIA_TYPE *pMediaType);
- HRESULT STDCALL ( *IsDiscontinuity )(IMediaSample * This);
- HRESULT STDCALL ( *SetDiscontinuity )(IMediaSample * This,
- long bDiscontinuity);
- HRESULT STDCALL ( *GetMediaTime )(IMediaSample * This,
- /* [out] */ long long *pTimeStart,
- /* [out] */ long long *pTimeEnd);
- HRESULT STDCALL ( *SetMediaTime )(IMediaSample * This,
- /* [in] */ long long *pTimeStart,
- /* [in] */ long long *pTimeEnd);
-};
-
-struct IMediaSample
-{
- struct IMediaSample_vt *vt;
-};
-
-
-struct IHidden_vt: IUnknown_vt
-{
- HRESULT STDCALL ( *GetSmth )(IHidden * This, int* pv);
- HRESULT STDCALL ( *SetSmth )(IHidden * This, int v1, int v2);
- HRESULT STDCALL ( *GetSmth2 )(IHidden * This, int* pv);
- HRESULT STDCALL ( *SetSmth2 )(IHidden * This, int v1, int v2);
- HRESULT STDCALL ( *GetSmth3 )(IHidden * This, int* pv);
- HRESULT STDCALL ( *SetSmth3 )(IHidden * This, int v1, int v2);
- HRESULT STDCALL ( *GetSmth4 )(IHidden * This, int* pv);
- HRESULT STDCALL ( *SetSmth4 )(IHidden * This, int v1, int v2);
- HRESULT STDCALL ( *GetSmth5 )(IHidden * This, int* pv);
- HRESULT STDCALL ( *SetSmth5 )(IHidden * This, int v1, int v2);
- HRESULT STDCALL ( *GetSmth6 )(IHidden * This, int* pv);
-};
+ INHERIT_IUNKNOWN();
-struct IHidden
-{
- struct IHidden_vt *vt;
-};
-
-struct IHidden2_vt: IUnknown_vt
-{
- HRESULT STDCALL (*unk1) ();
- HRESULT STDCALL (*unk2) ();
- HRESULT STDCALL (*unk3) ();
- HRESULT STDCALL (*DecodeGet) (IHidden2* This, int* region);
- HRESULT STDCALL (*unk5) ();
- HRESULT STDCALL (*DecodeSet) (IHidden2* This, int* region);
- HRESULT STDCALL (*unk7) ();
- HRESULT STDCALL (*unk8) ();
-};
-
-struct IHidden2
-{
- struct IHidden2_vt *vt;
+ HRESULT STDCALL ( *GetSmth )(IHidden* This, int* pv);
+ HRESULT STDCALL ( *SetSmth )(IHidden* This, int v1, int v2);
+ HRESULT STDCALL ( *GetSmth2 )(IHidden* This, int* pv);
+ HRESULT STDCALL ( *SetSmth2 )(IHidden* This, int v1, int v2);
+ HRESULT STDCALL ( *GetSmth3 )(IHidden* This, int* pv);
+ HRESULT STDCALL ( *SetSmth3 )(IHidden* This, int v1, int v2);
+ HRESULT STDCALL ( *GetSmth4 )(IHidden* This, int* pv);
+ HRESULT STDCALL ( *SetSmth4 )(IHidden* This, int v1, int v2);
+ HRESULT STDCALL ( *GetSmth5 )(IHidden* This, int* pv);
+ HRESULT STDCALL ( *SetSmth5 )(IHidden* This, int v1, int v2);
+ HRESULT STDCALL ( *GetSmth6 )(IHidden* This, int* pv);
+} IHidden_vt;
+struct _IHidden { struct IHidden_vt* vt; };
+
+
+typedef struct _IHidden2 IHidden2;
+typedef struct IHidden2_vt
+{
+ INHERIT_IUNKNOWN();
+
+ HRESULT STDCALL ( *unk1 )(void);
+ HRESULT STDCALL ( *unk2 )(void);
+ HRESULT STDCALL ( *unk3 )(void);
+ HRESULT STDCALL ( *DecodeGet )(IHidden2* This, int* region);
+ HRESULT STDCALL ( *unk5 )(void);
+ HRESULT STDCALL ( *DecodeSet )(IHidden2* This, int* region);
+ HRESULT STDCALL ( *unk7 )(void);
+ HRESULT STDCALL ( *unk8 )(void);
+} IHidden2_vt;
+struct _IHidden2 { struct IHidden2_vt* vt; };
+
+
+// fixme
+typedef struct IDivxFilterInterface {
+ struct IDivxFilterInterface_vt* vt;
+} IDivxFilterInterface;
+
+struct IDivxFilterInterface_vt
+{
+ INHERIT_IUNKNOWN();
+
+ HRESULT STDCALL ( *get_PPLevel )(IDivxFilterInterface* This, int* PPLevel); // current postprocessing level
+ HRESULT STDCALL ( *put_PPLevel )(IDivxFilterInterface* This, int PPLevel); // new postprocessing level
+ HRESULT STDCALL ( *put_DefaultPPLevel )(IDivxFilterInterface* This);
+ HRESULT STDCALL ( *put_MaxDelayAllowed )(IDivxFilterInterface* This, int maxdelayallowed);
+ HRESULT STDCALL ( *put_Brightness )(IDivxFilterInterface* This, int brightness);
+ HRESULT STDCALL ( *put_Contrast )(IDivxFilterInterface* This, int contrast);
+ HRESULT STDCALL ( *put_Saturation )(IDivxFilterInterface* This, int saturation);
+ HRESULT STDCALL ( *get_MaxDelayAllowed )(IDivxFilterInterface* This, int* maxdelayallowed);
+ HRESULT STDCALL ( *get_Brightness)(IDivxFilterInterface* This, int* brightness);
+ HRESULT STDCALL ( *get_Contrast)(IDivxFilterInterface* This, int* contrast);
+ HRESULT STDCALL ( *get_Saturation )(IDivxFilterInterface* This, int* saturation);
+ HRESULT STDCALL ( *put_AspectRatio )(IDivxFilterInterface* This, int x, IDivxFilterInterface* Thisit, int y);
+ HRESULT STDCALL ( *get_AspectRatio )(IDivxFilterInterface* This, int* x, IDivxFilterInterface* Thisit, int* y);
};
#endif /* DS_INTERFACES_H */
Index: iunk.h
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/iunk.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- iunk.h 16 Aug 2001 00:50:02 -0000 1.2
+++ iunk.h 21 Nov 2001 19:12:39 -0000 1.3
@@ -1,48 +1,49 @@
#ifndef DS_IUNK_H
#define DS_IUNK_H
-#include "interfaces.h"
#include "guids.h"
+#include <stdlib.h>
+
+#define INHERIT_IUNKNOWN() \
+ long STDCALL ( *QueryInterface )(IUnknown * This, GUID* riid, void **ppvObject); \
+ long STDCALL ( *AddRef )(IUnknown * This); \
+ long STDCALL ( *Release )(IUnknown * This);
+
+#define DECLARE_IUNKNOWN() \
+ int refcount;
-#define DECLARE_IUNKNOWN(CLASSNAME) \
- int refcount; \
- static long STDCALL QueryInterface(IUnknown * This, GUID* riid, void **ppvObject); \
- static long STDCALL AddRef (IUnknown * This); \
- static long STDCALL Release (IUnknown * This);
-
#define IMPLEMENT_IUNKNOWN(CLASSNAME) \
-long STDCALL CLASSNAME ::QueryInterface(IUnknown * This, GUID* riid, void **ppvObject) \
+static long STDCALL CLASSNAME ## _QueryInterface(IUnknown * This, \
+ GUID* riid, void **ppvObject) \
{ \
- Debug printf(#CLASSNAME "::QueryInterface() called\n");\
- if (!ppvObject) return 0x80004003; \
CLASSNAME * me = (CLASSNAME *)This; \
- unsigned int i = 0; \
- for(const GUID* r=me->interfaces; i<sizeof(CLASSNAME ::interfaces)/sizeof(CLASSNAME ::interfaces[0]); r++, i++) \
- if(!memcmp(r, riid, 16)) \
+ GUID* r; unsigned int i = 0; \
+ Debug printf(#CLASSNAME "_QueryInterface(%p) called\n", This);\
+ if (!ppvObject) return 0x80004003; \
+ for(r=me->interfaces; i<sizeof(me->interfaces)/sizeof(me->interfaces[0]); r++, i++) \
+ if(!memcmp(r, riid, sizeof(*r))) \
{ \
- This->vt->AddRef((IUnknown*)This); \
+ me->vt->AddRef((IUnknown*)This); \
*ppvObject=This; \
return 0; \
} \
- Debug printf("Failed\n"); \
+ Debug printf("Query failed!\n"); \
return E_NOINTERFACE; \
} \
\
-long STDCALL CLASSNAME ::AddRef ( \
- IUnknown * This) \
+static long STDCALL CLASSNAME ## _AddRef(IUnknown * This) \
{ \
- Debug printf(#CLASSNAME "::AddRef() called\n"); \
CLASSNAME * me=( CLASSNAME *)This; \
+ Debug printf(#CLASSNAME "_AddRef(%p) called (ref:%d)\n", This, me->refcount); \
return ++(me->refcount); \
} \
\
-long STDCALL CLASSNAME ::Release ( \
- IUnknown * This) \
+static long STDCALL CLASSNAME ## _Release(IUnknown * This) \
{ \
- Debug printf(#CLASSNAME "::Release() called\n"); \
CLASSNAME* me=( CLASSNAME *)This; \
- if(--(me->refcount) ==0) \
- delete ( CLASSNAME *) This; \
+ Debug printf(#CLASSNAME "_Release(%p) called (new ref:%d)\n", This, me->refcount - 1); \
+ if(--(me->refcount) == 0) \
+ CLASSNAME ## _Destroy(me); \
return 0; \
}
Index: outputpin.c
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/outputpin.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- outputpin.c 4 Oct 2001 11:56:12 -0000 1.6
+++ outputpin.c 21 Nov 2001 19:12:39 -0000 1.7
@@ -1,39 +1,22 @@
-#include "outputpin.h"
-#include "allocator.h"
-#include "iunk.h"
-#include "wine/winerror.h"
-#include "stdio.h"
-//#include "string.h"
-
-//#include <cstdio>
-//#include <cstring>
+#include "wine/winerror.h"
+#include "wine/windef.h"
+#include "outputpin.h"
+#include <stdio.h>
+#include <string.h>
/*
An object beyond interface IEnumMediaTypes.
Returned by COutputPin through call IPin::EnumMediaTypes().
*/
-using namespace std;
-
-class CEnumMediaTypes: public IEnumMediaTypes
+typedef struct CEnumMediaTypes
{
-public:
+ IEnumMediaTypes_vt* vt;
AM_MEDIA_TYPE type;
- static GUID interfaces[];
- DECLARE_IUNKNOWN(CEnumMediaTypes)
- CEnumMediaTypes(const AM_MEDIA_TYPE&);
- ~CEnumMediaTypes() {delete vt;}
-};
-
-GUID CEnumMediaTypes::interfaces[]=
-{
- IID_IUnknown,
- IID_IEnumMediaTypes,
-};
-
-// IPin->IUnknown methods
-IMPLEMENT_IUNKNOWN(CEnumMediaTypes)
+ GUID interfaces[2];
+ DECLARE_IUNKNOWN();
+} CEnumMediaTypes;
static HRESULT STDCALL CEnumMediaTypes_Next(IEnumMediaTypes * This,
@@ -41,7 +24,7 @@
/* [size_is][out] */ AM_MEDIA_TYPE **ppMediaTypes,
/* [out] */ ULONG *pcFetched)
{
- AM_MEDIA_TYPE& type=((CEnumMediaTypes*)This)->type;
+ AM_MEDIA_TYPE* type = &((CEnumMediaTypes*)This)->type;
Debug printf("CEnumMediaTypes::Next() called\n");
if (!ppMediaTypes)
return E_INVALIDARG;
@@ -53,11 +36,12 @@
if (pcFetched)
*pcFetched=1;
ppMediaTypes[0] = (AM_MEDIA_TYPE *)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
- memcpy(*ppMediaTypes, &type, sizeof(AM_MEDIA_TYPE));
+ // copy structures - C can handle this...
+ **ppMediaTypes = *type;
if (ppMediaTypes[0]->pbFormat)
{
ppMediaTypes[0]->pbFormat=(char *)CoTaskMemAlloc(ppMediaTypes[0]->cbFormat);
- memcpy(ppMediaTypes[0]->pbFormat, type.pbFormat, ppMediaTypes[0]->cbFormat);
+ memcpy(ppMediaTypes[0]->pbFormat, type->pbFormat, ppMediaTypes[0]->cbFormat);
}
if (cMediaTypes == 1)
return 0;
@@ -85,72 +69,50 @@
return E_NOTIMPL;
}
-
-CEnumMediaTypes::CEnumMediaTypes(const AM_MEDIA_TYPE& amtype)
+void CEnumMediaTypes_Destroy(CEnumMediaTypes* This)
{
- refcount = 1;
- type = amtype;
-
- vt = new IEnumMediaTypes_vt;
- vt->QueryInterface = QueryInterface;
- vt->AddRef = AddRef;
- vt->Release = Release;
- vt->Next = CEnumMediaTypes_Next;
- vt->Skip = CEnumMediaTypes_Skip;
- vt->Reset = CEnumMediaTypes_Reset;
- vt->Clone = CEnumMediaTypes_Clone;
+ free(This->vt);
+ free(This);
}
+// IPin->IUnknown methods
+IMPLEMENT_IUNKNOWN(CEnumMediaTypes)
-static HRESULT STDCALL COutputPin_AddRef(IUnknown* This)
+CEnumMediaTypes* CEnumMediaTypesCreate(const AM_MEDIA_TYPE* amt)
{
- Debug printf("COutputPin_AddRef(%p) called (%d)\n",
- This, ((COutputPin*)This)->refcount);
- ((COutputPin*)This)->refcount++;
- return 0;
-}
+ CEnumMediaTypes *This = (CEnumMediaTypes*) malloc(sizeof(CEnumMediaTypes)) ;
+ This->refcount = 1;
+ This->type = *amt;
-static HRESULT STDCALL COutputPin_Release(IUnknown* This)
-{
- Debug printf("COutputPin_Release(%p) called (%d)\n",
- This, ((COutputPin*)This)->refcount);
- if (--((COutputPin*)This)->refcount<=0)
- delete (COutputPin*)This;
+ This->vt = (IEnumMediaTypes_vt*) malloc(sizeof(IEnumMediaTypes_vt));
+ This->vt->QueryInterface = CEnumMediaTypes_QueryInterface;
+ This->vt->AddRef = CEnumMediaTypes_AddRef;
+ This->vt->Release = CEnumMediaTypes_Release;
+ This->vt->Next = CEnumMediaTypes_Next;
+ This->vt->Skip = CEnumMediaTypes_Skip;
+ This->vt->Reset = CEnumMediaTypes_Reset;
+ This->vt->Clone = CEnumMediaTypes_Clone;
- return 0;
-}
+ This->interfaces[0] = IID_IUnknown;
+ This->interfaces[1] = IID_IEnumMediaTypes;
-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);
- p->parent->refcount++;
- return 0;
+ return This;
}
-static HRESULT STDCALL COutputPin_M_Release(IUnknown* This)
-{
- COutputMemPin* p = (COutputMemPin*) This;
- Debug printf("COutputPin_MRelease(%p) called (%p, %d)\n",
- p, p->parent, p->parent->refcount);
- if (--p->parent->refcount <= 0)
- delete p->parent;
- return 0;
-}
-/* Implementation of output pin object. */
-// Constructor
+/*************
+ * COutputPin
+ *************/
static HRESULT STDCALL COutputPin_QueryInterface(IUnknown* This, GUID* iid, void** ppv)
{
+ COutputPin* p = (COutputPin*) This;
+
Debug printf("COutputPin_QueryInterface(%p) called\n", This);
if (!ppv)
return E_INVALIDARG;
- COutputPin* p = (COutputPin*) This;
-
if (memcmp(iid, &IID_IUnknown, 16) == 0)
{
*ppv = p;
@@ -186,7 +148,7 @@
{
pmt->pbFormat=CoTaskMemAlloc(pmt->cbFormat);
memcpy(pmt->pbFormat, ((COutputPin*)This)->type.pbFormat, pmt->cbFormat);
- }
+ }
*/
//return E_NOTIMPL;
return 0;// XXXXXXXXXXXXX CHECKME XXXXXXXXXXXXXXX
@@ -270,7 +232,7 @@
Debug printf("COutputPin_EnumMediaTypes() called\n");
if (!ppEnum)
return E_INVALIDARG;
- *ppEnum=new CEnumMediaTypes(((COutputPin*)This)->type);
+ *ppEnum = (IEnumMediaTypes*) CEnumMediaTypesCreate(&((COutputPin*)This)->type);
return 0;
}
@@ -305,7 +267,7 @@
/* [in] */ REFERENCE_TIME tStop,
/* [in] */ double dRate)
{
- Debug printf("COutputPin_NewSegment(%ld,%ld,%f) called\n",
+ Debug printf("COutputPin_NewSegment(%Ld,%Ld,%f) called\n",
tStart, tStop, dRate);
return 0;
}
@@ -316,11 +278,12 @@
static HRESULT STDCALL COutputPin_M_QueryInterface(IUnknown* This, GUID* iid, void** ppv)
{
- Debug printf("COutputPin_M_QueryInterface() called\n");
+ COutputPin* p = (COutputPin*)This;
+
+ Debug printf("COutputPin_M_QueryInterface(%p) called\n", This);
if (!ppv)
return E_INVALIDARG;
- COutputPin* p = (COutputPin*)This;
if(!memcmp(iid, &IID_IUnknown, 16))
{
*ppv=p;
@@ -352,16 +315,16 @@
// IMemInputPin methods
-static HRESULT STDCALL COutputPin_GetAllocator(IMemInputPin * This,
- /* [out] */ IMemAllocator **ppAllocator)
+static HRESULT STDCALL COutputPin_GetAllocator(IMemInputPin* This,
+ /* [out] */ IMemAllocator** ppAllocator)
{
Debug printf("COutputPin_GetAllocator(%p, %p) called\n", This->vt, ppAllocator);
- *ppAllocator=new MemAllocator;
+ *ppAllocator = (IMemAllocator*) MemAllocatorCreate();
return 0;
}
-
-static HRESULT STDCALL COutputPin_NotifyAllocator(IMemInputPin * This,
- /* [in] */ IMemAllocator *pAllocator,
+
+static HRESULT STDCALL COutputPin_NotifyAllocator(IMemInputPin* This,
+ /* [in] */ IMemAllocator* pAllocator,
/* [in] */ int bReadOnly)
{
Debug printf("COutputPin_NotifyAllocator(%p, %p) called\n", This, pAllocator);
@@ -369,28 +332,30 @@
return 0;
}
-static HRESULT STDCALL COutputPin_GetAllocatorRequirements(IMemInputPin * This,
- /* [out] */ ALLOCATOR_PROPERTIES *pProps)
+static HRESULT STDCALL COutputPin_GetAllocatorRequirements(IMemInputPin* This,
+ /* [out] */ ALLOCATOR_PROPERTIES* pProps)
{
Debug printf("COutputPin_GetAllocatorRequirements() called\n");
return E_NOTIMPL;
}
-static HRESULT STDCALL COutputPin_Receive(IMemInputPin * This,
- /* [in] */ IMediaSample *pSample)
+static HRESULT STDCALL COutputPin_Receive(IMemInputPin* This,
+ /* [in] */ IMediaSample* pSample)
{
+ COutputMemPin* mp = (COutputMemPin*)This;
+ char* pointer;
+ int len;
+
Debug printf("COutputPin_Receive(%p) called\n", This);
if (!pSample)
return E_INVALIDARG;
- char* pointer;
- if (pSample->vt->GetPointer(pSample, (BYTE **)&pointer))
+ if (pSample->vt->GetPointer(pSample, (BYTE**) &pointer))
return -1;
- int len = pSample->vt->GetActualDataLength(pSample);
+ len = pSample->vt->GetActualDataLength(pSample);
if (len == 0)
len = pSample->vt->GetSize(pSample);//for iv50
//if(me.frame_pointer)memcpy(me.frame_pointer, pointer, len);
- COutputMemPin* mp= (COutputMemPin*)This;
if (mp->frame_pointer)
*(mp->frame_pointer) = pointer;
if (mp->frame_size_pointer)
@@ -403,8 +368,9 @@
fwrite(&((VIDEOINFOHEADER*)me.type.pbFormat)->bmiHeader, sizeof(BITMAPINFOHEADER), 1, file);
fwrite(pointer, len, 1, file);
fclose(file);
-*/
+*/
// pSample->vt->Release((IUnknown*)pSample);
+
return 0;
}
@@ -423,49 +389,120 @@
return E_NOTIMPL;
}
-COutputPin::COutputPin(const AM_MEDIA_TYPE& vh)
- :refcount(1), type(vh), remote(0)
+static void COutputPin_SetFramePointer(COutputPin* This, char** z)
+{
+ This->mempin->frame_pointer = z;
+}
+
+static void COutputPin_SetPointer2(COutputPin* This, char* p)
+{
+ if (This->mempin->pAllocator)
+ // fixme
+ This->mempin->pAllocator->SetPointer(This->mempin->pAllocator, p);
+}
+
+static void COutputPin_SetFrameSizePointer(COutputPin* This, long* z)
+{
+ This->mempin->frame_size_pointer = z;
+}
+
+static void COutputPin_SetNewFormat(COutputPin* This, const AM_MEDIA_TYPE* amt)
+{
+ This->type = *amt;
+}
+
+static void COutputPin_Destroy(COutputPin* This)
{
- vt = new IPin_vt;
- vt->QueryInterface = COutputPin_QueryInterface;
- vt->AddRef = COutputPin_AddRef;
- vt->Release = COutputPin_Release;
- vt->Connect = COutputPin_Connect;
- vt->ReceiveConnection = COutputPin_ReceiveConnection;
- vt->Disconnect = COutputPin_Disconnect;
- vt->ConnectedTo = COutputPin_ConnectedTo;
- vt->ConnectionMediaType = COutputPin_ConnectionMediaType;
- vt->QueryPinInfo = COutputPin_QueryPinInfo;
- vt->QueryDirection = COutputPin_QueryDirection;
- vt->QueryId = COutputPin_QueryId;
- vt->QueryAccept = COutputPin_QueryAccept;
- vt->EnumMediaTypes = COutputPin_EnumMediaTypes;
- vt->QueryInternalConnections = COutputPin_QueryInternalConnections;
- vt->EndOfStream = COutputPin_EndOfStream;
- vt->BeginFlush = COutputPin_BeginFlush;
- vt->EndFlush = COutputPin_EndFlush;
- vt->NewSegment = COutputPin_NewSegment;
-
- mempin = new COutputMemPin;
- mempin->vt = new IMemInputPin_vt;
- mempin->vt->QueryInterface = COutputPin_M_QueryInterface;
- mempin->vt->AddRef = COutputPin_M_AddRef;
- mempin->vt->Release = COutputPin_M_Release;
- mempin->vt->GetAllocator = COutputPin_GetAllocator;
- mempin->vt->NotifyAllocator = COutputPin_NotifyAllocator;
- mempin->vt->GetAllocatorRequirements = COutputPin_GetAllocatorRequirements;
- mempin->vt->Receive = COutputPin_Receive;
- mempin->vt->ReceiveMultiple = COutputPin_ReceiveMultiple;
- mempin->vt->ReceiveCanBlock = COutputPin_ReceiveCanBlock;
-
- mempin->frame_size_pointer = 0;
- mempin->frame_pointer = 0;
- mempin->pAllocator = 0;
- mempin->parent = this;
+ free(This->vt);
+ free(This->mempin->vt);
+ free(This->mempin);
+ free(This);
}
-COutputPin::~COutputPin()
+static HRESULT STDCALL COutputPin_AddRef(IUnknown* This)
{
- delete vt;
- delete mempin->vt;
+ 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)
+ COutputPin_Destroy((COutputPin*)This);
+
+ return 0;
+}
+
+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);
+ p->parent->refcount++;
+ return 0;
+}
+
+static HRESULT STDCALL COutputPin_M_Release(IUnknown* This)
+{
+ COutputMemPin* p = (COutputMemPin*) This;
+ Debug printf("COutputPin_MRelease(%p) called (%p, %d)\n",
+ p, p->parent, p->parent->refcount);
+ if (--p->parent->refcount <= 0)
+ COutputPin_Destroy(p->parent);
+ return 0;
+}
+
+COutputPin* COutputPinCreate(const AM_MEDIA_TYPE* amt)
+{
+ COutputPin* This = (COutputPin*) malloc(sizeof(COutputPin));
+ 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;
+ This->vt->Connect = COutputPin_Connect;
+ This->vt->ReceiveConnection = COutputPin_ReceiveConnection;
+ This->vt->Disconnect = COutputPin_Disconnect;
+ This->vt->ConnectedTo = COutputPin_ConnectedTo;
+ This->vt->ConnectionMediaType = COutputPin_ConnectionMediaType;
+ This->vt->QueryPinInfo = COutputPin_QueryPinInfo;
+ This->vt->QueryDirection = COutputPin_QueryDirection;
+ This->vt->QueryId = COutputPin_QueryId;
+ This->vt->QueryAccept = COutputPin_QueryAccept;
+ This->vt->EnumMediaTypes = COutputPin_EnumMediaTypes;
+ This->vt->QueryInternalConnections = COutputPin_QueryInternalConnections;
+ This->vt->EndOfStream = COutputPin_EndOfStream;
+ This->vt->BeginFlush = COutputPin_BeginFlush;
+ 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;
+ This->mempin->vt->GetAllocator = COutputPin_GetAllocator;
+ This->mempin->vt->NotifyAllocator = COutputPin_NotifyAllocator;
+ This->mempin->vt->GetAllocatorRequirements = COutputPin_GetAllocatorRequirements;
+ This->mempin->vt->Receive = COutputPin_Receive;
+ This->mempin->vt->ReceiveMultiple = COutputPin_ReceiveMultiple;
+ This->mempin->vt->ReceiveCanBlock = COutputPin_ReceiveCanBlock;
+
+ This->mempin->frame_size_pointer = 0;
+ This->mempin->frame_pointer = 0;
+ This->mempin->pAllocator = 0;
+ This->mempin->parent = This;
+
+ This->SetPointer2 = COutputPin_SetPointer2;
+ This->SetFramePointer = COutputPin_SetFramePointer;
+ This->SetFrameSizePointer = COutputPin_SetFrameSizePointer;
+ This->SetNewFormat = COutputPin_SetNewFormat;
+
+ return This;
}
Index: outputpin.h
===================================================================
RCS file: /cvsroot/mplayer/main/loader/dshow/outputpin.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- outputpin.h 16 Aug 2001 00:50:02 -0000 1.3
+++ outputpin.h 21 Nov 2001 19:12:39 -0000 1.4
@@ -3,35 +3,33 @@
/* "output pin" - the one that connects to output of filter. */
-#include "interfaces.h"
-#include "guids.h"
#include "allocator.h"
-struct COutputPin;
+typedef struct _COutputPin COutputPin;
-struct COutputMemPin : public IMemInputPin
+typedef struct _COutputMemPin COutputMemPin;
+struct _COutputMemPin
{
+ IMemInputPin_vt* vt;
char** frame_pointer;
long* frame_size_pointer;
MemAllocator* pAllocator;
COutputPin* parent;
};
-struct COutputPin : public IPin
+struct _COutputPin
{
+ IPin_vt* vt;
COutputMemPin* mempin;
int refcount;
AM_MEDIA_TYPE type;
IPin* remote;
- COutputPin(const AM_MEDIA_TYPE& vhdr);
- ~COutputPin();
- void SetFramePointer(char** z) { mempin->frame_pointer = z; }
- void SetPointer2(char* p) {
- if (mempin->pAllocator)
- mempin->pAllocator->SetPointer(p);
- }
- void SetFrameSizePointer(long* z) { mempin->frame_size_pointer = z; }
- void SetNewFormat(const AM_MEDIA_TYPE& a) { type = a; }
+ void ( *SetFramePointer )(COutputPin*, char** z);
+ void ( *SetPointer2 )(COutputPin*, char* p);
+ void ( *SetFrameSizePointer )(COutputPin*, long* z);
+ void ( *SetNewFormat )(COutputPin*, const AM_MEDIA_TYPE* a);
};
+
+COutputPin* COutputPinCreate(const AM_MEDIA_TYPE* vhdr);
#endif /* DS_OUTPUTPIN_H */
More information about the MPlayer-cvslog
mailing list