changeset 1545:da26060c81ef

big avifile sync - from now we have common code
author arpi
date Thu, 16 Aug 2001 00:50:02 +0000
parents 558c1b03b8d0
children d4cd08b06665
files loader/dshow/DS_AudioDec.c loader/dshow/DS_AudioDecoder.c loader/dshow/DS_AudioDecoder.h loader/dshow/DS_Filter.c loader/dshow/DS_Filter.h loader/dshow/DS_VideoDec.c loader/dshow/DS_VideoDecoder.c loader/dshow/DS_VideoDecoder.h loader/dshow/Makefile loader/dshow/allocator.c loader/dshow/allocator.h loader/dshow/cmediasample.c loader/dshow/cmediasample.h loader/dshow/guids.h loader/dshow/inputpin.c loader/dshow/inputpin.h loader/dshow/interfaces.h loader/dshow/iunk.h loader/dshow/libwin32.h loader/dshow/outputpin.c loader/dshow/outputpin.h
diffstat 21 files changed, 2384 insertions(+), 2123 deletions(-) [+]
line wrap: on
line diff
--- a/loader/dshow/DS_AudioDec.c	Thu Aug 16 00:44:40 2001 +0000
+++ b/loader/dshow/DS_AudioDec.c	Thu Aug 16 00:50:02 2001 +0000
@@ -1,188 +1,63 @@
-/********************************************************
-
-	DirectShow Audio decoder implementation
-	Copyright 2000 Eugene Kuznetsov  (divx@euro.ru)
-        Converted  C++ --> C  :) by A'rpi/ESP-team
-
-*********************************************************/
-
-//#include <config.h>
-
-//#include "DS_AudioDecoder.h"
-//#include <string.h>
-using namespace std;
-#include <stdlib.h>
-#include <except.h>
-#define __MODULE__ "DirectShow_AudioDecoder"
-
-#include <errno.h>
-#ifdef HAVE_MALLOC_H
-#include <malloc.h>
-#endif
-//#include <loader.h>
-//#include <wine/winbase.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <strstream>
-#include <dlfcn.h>
-#include <sys/types.h>
-#include <sys/mman.h>
-
-#include <registry.h>
-#include <wine/winreg.h>
 
 #include "guids.h"
 #include "interfaces.h"
-#include "DS_Filter.h"
+
+#include "DS_AudioDecoder.h"
+#include <wine/winerror.h>
+#include <libwin32.h>
+//#include <cpuinfo.h>
 
-#include "BitmapInfo.h"
-
-#include <string>
-#include <default.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <cstdio>
+#include <iostream>
+#include <strstream>
 
 #include "DS_AudioDec.h"
 
-const GUID FORMAT_WaveFormatEx={
-0x05589f81, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a};
-const GUID MEDIATYPE_Audio={
-0x73647561, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71};
-const GUID MEDIASUBTYPE_PCM={
-0x00000001, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71};
-
-
-extern "C" char* def_path;
-
-    static DS_Filter* dsf=0;
-
-    static AM_MEDIA_TYPE m_sOurType, m_sDestType;
-//    static void* m_pCust;
-    static char* m_sVhdr;
-    static char* m_sVhdr2;
+//    DS_Decoder(const CodecInfo& info, const WAVEFORMATEX*);
+//    virtual ~DS_Decoder();
+//    virtual int Convert(const void*, size_t, void*, size_t, size_t*, size_t*);
+//    virtual int GetSrcSize(int);
 
-    static WAVEFORMATEX in_fmt;
-
-//    int m_iState=0;
-
-extern "C" int DS_AudioDecoder_Open(char* dllname, GUID* guid, WAVEFORMATEX* wf)
-{
+static void* _handle;
 
-    m_sVhdr=new char[18+wf->cbSize];
-    memcpy(m_sVhdr, wf, 18+wf->cbSize);
-    m_sVhdr2=new char[18];
-    memcpy(m_sVhdr2, m_sVhdr, 18);
-    WAVEFORMATEX* pWF=(WAVEFORMATEX*)m_sVhdr2;
-    pWF->wFormatTag=1;
-    pWF->wBitsPerSample=16;
-    pWF->nBlockAlign=2*pWF->nChannels;
-    pWF->cbSize=0;
-    in_fmt=*wf;
+extern "C" void Setup_LDT_Keeper();
+extern "C" void setup_FS_Segment();
 
-    memset(&m_sOurType, 0, sizeof m_sOurType);
-    m_sOurType.majortype=MEDIATYPE_Audio;
-    m_sOurType.subtype=MEDIASUBTYPE_PCM;
-    m_sOurType.subtype.f1=wf->wFormatTag;
-    m_sOurType.formattype=FORMAT_WaveFormatEx;
-    m_sOurType.lSampleSize=wf->nBlockAlign;
-    m_sOurType.bFixedSizeSamples=true;
-    m_sOurType.bTemporalCompression=false;
-    m_sOurType.pUnk=0;
-    m_sOurType.cbFormat=18+wf->cbSize;
-    m_sOurType.pbFormat=m_sVhdr;
+extern "C" int DS_AudioDecoder_Open(char* dllname, GUID* guid, WAVEFORMATEX* wf){
+
+    Setup_LDT_Keeper();
+    setup_FS_Segment();
 
-    memset(&m_sDestType, 0, sizeof m_sDestType);
-    m_sDestType.majortype=MEDIATYPE_Audio;
-    m_sDestType.subtype=MEDIASUBTYPE_PCM;
-    m_sDestType.formattype=FORMAT_WaveFormatEx;
-    m_sDestType.bFixedSizeSamples=true;
-    m_sDestType.bTemporalCompression=false;
-    m_sDestType.lSampleSize=2*wf->nChannels;
-    m_sDestType.pUnk=0;
-    m_sDestType.cbFormat=18;
-    m_sDestType.pbFormat=m_sVhdr2;
-
-    try
-    {
+    CodecInfo ci;
+    ci.dll=dllname;
+    ci.guid=*guid;
 
-        dsf=new DS_Filter();
-	dsf->Create(dllname, guid, &m_sOurType, &m_sDestType);
-        dsf->Start();
-
-	ALLOCATOR_PROPERTIES props, props1;
-	props.cBuffers=1;
-        props.cbBuffer=m_sOurType.lSampleSize;
-	props.cbAlign=props.cbPrefix=0;
-	dsf->m_pAll->vt->SetProperties(dsf->m_pAll, &props, &props1);
-	dsf->m_pAll->vt->Commit(dsf->m_pAll);
-    }
-    catch(FatalError e)
-    {
-	e.PrintAll();
-	delete[] m_sVhdr;
-	delete[] m_sVhdr2;
-        return 1;
-    }
+    DS_AudioDecoder* dec=new DS_AudioDecoder(ci, wf);
+    _handle=(void*)dec;
 
     return 0;
 }
 
 extern "C" void DS_AudioDecoder_Close(){
-    delete[] m_sVhdr;
-    delete[] m_sVhdr2;
 }
 
-extern "C" int DS_AudioDecoder_GetSrcSize(int dest_size)
-{
-    double efficiency=in_fmt.nAvgBytesPerSec/double(in_fmt.nSamplesPerSec*in_fmt.nBlockAlign);
-    int frames=(int)(dest_size*efficiency);
-    if(frames<1)frames=1;
-    return frames*in_fmt.nBlockAlign;
+extern "C" int DS_AudioDecoder_GetSrcSize(int dest_size){
+    DS_AudioDecoder* dec=(DS_AudioDecoder*)_handle;
+    return dec->GetSrcSize(dest_size);
 }
 
-
 extern "C" int DS_AudioDecoder_Convert(unsigned char* in_data, unsigned in_size,
 	     unsigned char* out_data, unsigned out_size,
-	    unsigned* size_read, unsigned* size_written)
-{
-    if(in_data==0)return -1;
-    if(out_data==0)return -1;
-    int written=0;
-    int read=0;
-    in_size-=in_size%in_fmt.nBlockAlign;
-    while(in_size>0)
-    {
-	long frame_size=0;
-	char* frame_pointer;
-//	m_pOurOutput->SetFramePointer(out_data+written);
-	dsf->m_pOurOutput->SetFramePointer(&frame_pointer);
-	dsf->m_pOurOutput->SetFrameSizePointer(&frame_size);
-	IMediaSample* sample=0;
-	dsf->m_pAll->vt->GetBuffer(dsf->m_pAll, &sample, 0, 0, 0);
-	if(!sample)
-	{
-	    cerr<<"ERROR: null sample"<<endl;
-	    break;
-	}
-	char* ptr;
-	sample->vt->GetPointer(sample, (BYTE **)&ptr);
-	memcpy(ptr, in_data+read, in_fmt.nBlockAlign);
-	sample->vt->SetActualDataLength(sample, in_fmt.nBlockAlign);
-	sample->vt->SetSyncPoint(sample, true);
-	sample->vt->SetPreroll(sample, 0);
-        int result=dsf->m_pImp->vt->Receive(dsf->m_pImp, sample);
-        if(result) printf("Error putting data into input pin %x\n", result);
-	if(written+frame_size>out_size)
-	{
-	    sample->vt->Release((IUnknown*)sample);
-	    break;
-	}
-	memcpy(out_data+written, frame_pointer, frame_size);
-        sample->vt->Release((IUnknown*)sample);
-	read+=in_fmt.nBlockAlign;
-	written+=frame_size;
-    }
-    if(size_read) *size_read=read;
-    if(size_written) *size_written=written;
-    return 0;
+	     unsigned* size_read, unsigned* size_written){
+    DS_AudioDecoder* dec=(DS_AudioDecoder*)_handle;
+    setup_FS_Segment();
+    return dec->Convert( (void*)in_data,(size_t)in_size,
+			 (void*)out_data,(size_t)out_size,
+			 (size_t*)size_read, (size_t*)size_written );
 }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loader/dshow/DS_AudioDecoder.c	Thu Aug 16 00:50:02 2001 +0000
@@ -0,0 +1,156 @@
+/********************************************************
+
+         DirectShow audio decoder
+	 Copyright 2001 Eugene Kuznetsov  (divx@euro.ru)
+
+*********************************************************/
+#include "DS_AudioDecoder.h"
+
+#include <cstdio>
+#include <cstring>
+#include <string>
+#include <iostream>
+#define __MODULE__ "DirectShow audio decoder"
+const GUID FORMAT_WaveFormatEx = {
+    0x05589f81, 0xc356, 0x11CE,
+    { 0xBF, 0x01, 0x00, 0xAA, 0x00, 0x55, 0x59, 0x5A }
+};
+const GUID MEDIATYPE_Audio = {
+    0x73647561, 0x0000, 0x0010,
+    { 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 }
+};
+const GUID MEDIASUBTYPE_PCM = {
+    0x00000001, 0x0000, 0x0010,
+    { 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 }
+};
+
+using namespace std;
+
+typedef long STDCALL (*GETCLASS) (GUID*, GUID*, void**);
+
+DS_AudioDecoder::DS_AudioDecoder(const CodecInfo& info, const WAVEFORMATEX* wf)
+    : IAudioDecoder(info, wf), m_pDS_Filter(0), m_sVhdr(0), m_sVhdr2(0)
+{
+    m_sVhdr=new char[18 + wf->cbSize];
+    memcpy(m_sVhdr, wf, 18 + wf->cbSize);
+    m_sVhdr2=new char[18 + wf->cbSize];
+    memcpy(m_sVhdr2, m_sVhdr, 18 + wf->cbSize);
+    WAVEFORMATEX* pWF=(WAVEFORMATEX*)m_sVhdr2;
+    pWF->wFormatTag=1;
+    pWF->wBitsPerSample=16;
+    pWF->nBlockAlign=2*pWF->nChannels;
+    pWF->cbSize=0;
+    in_fmt=*wf;
+
+    memset(&m_sOurType, 0, sizeof(m_sOurType));
+    m_sOurType.majortype=MEDIATYPE_Audio;
+    m_sOurType.subtype=MEDIASUBTYPE_PCM;
+    m_sOurType.subtype.f1=wf->wFormatTag;
+    m_sOurType.formattype=FORMAT_WaveFormatEx;
+    m_sOurType.lSampleSize=wf->nBlockAlign;
+    m_sOurType.bFixedSizeSamples=true;
+    m_sOurType.bTemporalCompression=false;
+    m_sOurType.pUnk=0;
+    m_sOurType.cbFormat=18+wf->cbSize;
+    m_sOurType.pbFormat=m_sVhdr;
+
+    memset(&m_sDestType, 0, sizeof(m_sDestType));
+    m_sDestType.majortype=MEDIATYPE_Audio;
+    m_sDestType.subtype=MEDIASUBTYPE_PCM;
+    m_sDestType.formattype=FORMAT_WaveFormatEx;
+    m_sDestType.bFixedSizeSamples=true;
+    m_sDestType.bTemporalCompression=false;
+    m_sDestType.lSampleSize=2*wf->nChannels;
+    m_sDestType.pUnk=0;
+    m_sDestType.cbFormat=18;
+    m_sDestType.pbFormat=m_sVhdr2;
+
+    try
+    {
+        m_pDS_Filter = new DS_Filter();
+	m_pDS_Filter->Create(info.dll.c_str(), &info.guid, &m_sOurType, &m_sDestType);
+	m_pDS_Filter->Start();
+
+	ALLOCATOR_PROPERTIES props, props1;
+	props.cBuffers=1;
+        props.cbBuffer=m_sOurType.lSampleSize;
+	props.cbAlign=props.cbPrefix=0;
+	m_pDS_Filter->m_pAll->vt->SetProperties(m_pDS_Filter->m_pAll, &props, &props1);
+	m_pDS_Filter->m_pAll->vt->Commit(m_pDS_Filter->m_pAll);
+    }
+    catch (FatalError e)
+    {
+	e.PrintAll();
+	delete[] m_sVhdr;
+	delete[] m_sVhdr2;
+	delete m_pDS_Filter;
+	throw;
+    }
+}
+
+DS_AudioDecoder::~DS_AudioDecoder()
+{
+    delete[] m_sVhdr;
+    delete[] m_sVhdr2;
+    delete m_pDS_Filter;
+}
+
+int DS_AudioDecoder::Convert(const void* in_data, size_t in_size,
+			void* out_data, size_t out_size,
+			size_t* size_read, size_t* size_written)
+{
+    if (!in_data || !out_data)
+	return -1;
+
+    size_t written = 0;
+    size_t read = 0;
+    in_size -= in_size%in_fmt.nBlockAlign;
+    while (in_size>0)
+    {
+	size_t frame_size=0;
+	char* frame_pointer;
+//	m_pOurOutput->SetFramePointer(out_data+written);
+	m_pDS_Filter->m_pOurOutput->SetFramePointer(&frame_pointer);
+	m_pDS_Filter->m_pOurOutput->SetFrameSizePointer((long*)&frame_size);
+	IMediaSample* sample=0;
+	m_pDS_Filter->m_pAll->vt->GetBuffer(m_pDS_Filter->m_pAll, &sample, 0, 0, 0);
+	if(!sample)
+	{
+	    Debug cerr<<"DS_AudioDecoder::Convert() Error: null sample"<<endl;
+	    break;
+	}
+	char* ptr;
+	sample->vt->GetPointer(sample, (BYTE **)&ptr);
+	memcpy(ptr, (const uint8_t*)in_data + read, in_fmt.nBlockAlign);
+	sample->vt->SetActualDataLength(sample, in_fmt.nBlockAlign);
+	sample->vt->SetSyncPoint(sample, true);
+	sample->vt->SetPreroll(sample, 0);
+	int result = m_pDS_Filter->m_pImp->vt->Receive(m_pDS_Filter->m_pImp, sample);
+        if (result)
+	    Debug printf("DS_AudioDecoder::Convert() Error: putting data into input pin %x\n", result);
+	if ((written + frame_size) > out_size)
+	{
+	    sample->vt->Release((IUnknown*)sample);
+	    break;
+	}
+	memcpy((uint8_t*)out_data + written, frame_pointer, frame_size);
+        sample->vt->Release((IUnknown*)sample);
+	read+=in_fmt.nBlockAlign;
+	written+=frame_size;
+    }
+    if (size_read)
+	*size_read = read;
+    if (size_written)
+	*size_written = written;
+    return 0;
+}
+
+int DS_AudioDecoder::GetSrcSize(int dest_size)
+{
+    double efficiency = (double) in_fmt.nAvgBytesPerSec
+	/ (in_fmt.nSamplesPerSec*in_fmt.nBlockAlign);
+    int frames = int(dest_size*efficiency);
+    if (frames < 1)
+	frames = 1;
+    return frames * in_fmt.nBlockAlign;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loader/dshow/DS_AudioDecoder.h	Thu Aug 16 00:50:02 2001 +0000
@@ -0,0 +1,21 @@
+#ifndef AVIFILE_DSHOW_H
+#define AVIFILE_DSHOW_H
+
+#include <libwin32.h>
+#include "DS_Filter.h"
+
+class DS_AudioDecoder : public IAudioDecoder
+{
+public:
+    DS_AudioDecoder(const CodecInfo& info, const WAVEFORMATEX*);
+    virtual ~DS_AudioDecoder();
+    virtual int Convert(const void*, size_t, void*, size_t, size_t*, size_t*);
+    virtual int GetSrcSize(int);
+protected:
+    AM_MEDIA_TYPE m_sOurType, m_sDestType;
+    DS_Filter* m_pDS_Filter;
+    char* m_sVhdr;
+    char* m_sVhdr2;
+};
+
+#endif
--- a/loader/dshow/DS_Filter.c	Thu Aug 16 00:44:40 2001 +0000
+++ b/loader/dshow/DS_Filter.c	Thu Aug 16 00:50:02 2001 +0000
@@ -1,34 +1,49 @@
+#include "DS_Filter.h"
+//#include "../loader/loader.h"
+#include <libwin32.h>
+#include <string>
 #include <stdio.h>
 #include <string.h>
-#include "DS_Filter.h"
-#include <except.h>
-//#include "../loader/loader.h"
-#include <string>
-#include <iostream>
+
 #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" char* def_path;
 
-extern "C" int STDCALL expLoadLibraryA(const char*);
-extern "C" STDCALL void* GetProcAddress(int, const char*);
-extern "C" int STDCALL FreeLibrary(int);
-
-extern "C" void Setup_LDT_Keeper();
-extern "C" void setup_FS_Segment();
+//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()
-    :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)
 {
+    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;
 }
 
-void DS_Filter::clean()
+DS_Filter::~DS_Filter()
 {
+    //cout << "Destruction of DS_FILTER" << endl;
+    Stop();
+    destroy();
+    //cout << "Destruction of DS_FILTER done" << endl;
+}
+
+void DS_Filter::destroy()
+{
+    if (m_iState == 0)
+	return;
     m_iState = 0;
 
     if (m_pOurInput)
@@ -53,67 +68,56 @@
     // FIXME - we are still leaving few things allocated!
     if (m_iHandle)
 	FreeLibrary(m_iHandle);
-
-}
-
-DS_Filter::~DS_Filter()
-{
-    //cout << "Destruction of DS_FILTER" << endl;
-    Stop();
-    if (m_iState == 1)
-	clean();
-    //cout << "Destruction of DS_FILTER done" << endl;
 }
 
-void DS_Filter::Create(char*  dllname, const GUID* id, AM_MEDIA_TYPE* in_fmt, AM_MEDIA_TYPE* out_fmt)
+void DS_Filter::Create(const char* dllname, const GUID* id,
+		       AM_MEDIA_TYPE* in_fmt,
+		       AM_MEDIA_TYPE* out_fmt)
 {
-
-    Setup_LDT_Keeper();
-
     try
     {
-//	string _fullname=def_path;
-//	_fullname+="/";
-//	_fullname+=dllname;
-	m_iHandle= expLoadLibraryA(dllname);
+	m_iHandle = expLoadLibraryA(dllname);
 	if (!m_iHandle)
 	{
-	    char e[1024];
-	    snprintf(e, 1024, "Could not open DirectShow DLL: %s", dllname);
+	    char e[256];
+	    printf("Could not open DirectShow DLL: %.200s", dllname);
 	    throw FATAL(e);
 	}
-        GETCLASS func=(GETCLASS)GetProcAddress(m_iHandle, "DllGetClassObject");
+        GETCLASS func = (GETCLASS)GetProcAddress(m_iHandle, "DllGetClassObject");
 	if (!func)
 	{
-	    char e[1024];
-	    snprintf(e, 1024, "Illegal or corrupt DirectShow DLL: %s", dllname);
+	    char e[256];
+	    printf("Illegal or corrupt DirectShow DLL: %.200s", dllname);
 	    throw FATAL(e);
 	}
 
 	HRESULT result;
-	IClassFactory* factory=0;
-	result=func(id, &IID_IClassFactory, (void**)&factory);
-	if(result || (!factory)) throw FATAL("No such class object");;
+	IClassFactory* factory = 0;
+	result = func(id, &IID_IClassFactory, (void**)&factory);
+	if (result || !factory)
+	    throw FATAL("No such class object");;
 
-	setup_FS_Segment();
-
-	IUnknown* object=0;
-	result=factory->vt->CreateInstance(factory, 0, &IID_IUnknown, (void**)&object);
+	IUnknown* object = 0;
+	result = factory->vt->CreateInstance(factory, 0, &IID_IUnknown, (void**)&object);
 	factory->vt->Release((IUnknown*)factory);
-	if(result || (!object)) throw FATAL("Class factory failure");
+	if (result || !object)
+	    throw FATAL("Class factory failure");
 
-	result=object->vt->QueryInterface(object, &IID_IBaseFilter, (void**)&m_pFilter);
+	result = object->vt->QueryInterface(object, &IID_IBaseFilter, (void**)&m_pFilter);
 	object->vt->Release((IUnknown*)object);
-	if(result || (!m_pFilter)) throw FATAL("Object does not have IBaseFilter interface");
+	if (result || !m_pFilter)
+	    throw FATAL("Object does not have IBaseFilter interface");
 
-	IEnumPins* enum_pins=0;
-    //	enumerate pins
-	result=m_pFilter->vt->EnumPins(m_pFilter, &enum_pins);
-	if(result || (!enum_pins)) throw FATAL("Could not enumerate pins");
+	IEnumPins* enum_pins = 0;
+	// enumerate pins
+	result = m_pFilter->vt->EnumPins(m_pFilter, &enum_pins);
+	if (result || !enum_pins)
+	    throw FATAL("Could not enumerate pins");
+
 	IPin* array[256];
 	ULONG fetched;
 	enum_pins->vt->Reset(enum_pins);
-	result=enum_pins->vt->Next(enum_pins, (ULONG)256, (IPin**)array, &fetched);
+	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++)
@@ -140,38 +144,45 @@
 	result = m_pInputPin->vt->QueryInterface((IUnknown*)m_pInputPin,
 						 &IID_IMemInputPin,
 						 (void**)&m_pImp);
-        if(result)
+        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);
+	m_pOurType = in_fmt;
+	m_pDestType = out_fmt;
+        result = m_pInputPin->vt->QueryAccept(m_pInputPin, m_pOurType);
 	if (result)
 	    throw FATAL("Source format is not accepted");
 
-	m_pParentFilter=new CBaseFilter2;
-        m_pSrcFilter=new CBaseFilter(*m_pOurType, m_pParentFilter);
-	m_pOurInput=m_pSrcFilter->GetPin();
+	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);
+	result = m_pInputPin->vt->ReceiveConnection(m_pInputPin,
+						    m_pOurInput,
+						    m_pOurType);
 	if (result)
 	    throw FATAL("Error connecting to input pin");
 
 	m_pOurOutput = new COutputPin(*m_pDestType);
 
+	//extern void trapbug();
+	//trapbug();
 	result = m_pOutputPin->vt->ReceiveConnection(m_pOutputPin,
 						     m_pOurOutput,
 						     m_pDestType);
 	if (result)
+	{
+	    //printf("Tracking ACELP %d  0%x\n", result);
 	    throw FATAL("Error connecting to output pin");
-	cout << "Using DirectShow codec: " << dllname << endl;
+	}
+
+	printf("Using DirectShow codec: %s\n", dllname);
 	m_iState = 1;
     }
-    catch(FatalError e)
+    catch (FatalError e)
     {
-	e.PrintAll();
-        clean();
+	//e.PrintAll();
+	destroy();
 	throw;
     }
 }
@@ -181,22 +192,19 @@
     if (m_iState != 1)
 	return;
 
-    m_pFilter->vt->Pause(m_pFilter);
-
     HRESULT hr=m_pFilter->vt->Run(m_pFilter, 0);
     if (hr != 0)
     {
-	Debug cerr<<"WARNING: m_Filter->Run() failed, error code "<<hex<<hr<<dec<<endl;
+	Debug printf("WARNING: m_Filter->Run() failed, error code %x\n", (int)hr);
     }
-    hr=m_pImp->vt->GetAllocator(m_pImp, &m_pAll);
+    hr = m_pImp->vt->GetAllocator(m_pImp, &m_pAll);
     if (hr)
     {
-        Debug cerr<<"Error getting IMemAllocator interface "<<hex<<hr<<dec<<endl;
+	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;
 }
 
@@ -205,8 +213,8 @@
     if (m_iState == 2)
     {
 	m_pAll->vt->Release((IUnknown*)m_pAll);
-	m_pAll=0;
-	m_pFilter->vt->Stop(m_pFilter);
-	m_iState=1;
+	m_pFilter->vt->Stop(m_pFilter); // causes weird crash ??? FIXME
+	m_pAll = 0;
+	m_iState = 1;
     }
 }
--- a/loader/dshow/DS_Filter.h	Thu Aug 16 00:44:40 2001 +0000
+++ b/loader/dshow/DS_Filter.h	Thu Aug 16 00:50:02 2001 +0000
@@ -1,22 +1,22 @@
-#ifndef DS_Filter_H
-#define DS_Filter_H
+#ifndef DS_FILTER_H
+#define DS_FILTER_H
 
 #include "interfaces.h"
 #include "inputpin.h"
 #include "outputpin.h"
-#include <string>
 
 /**
-    User will allocate and fill format structures, call Create(),
-    and then set up m_pAll.
-**/    
-class DS_Filter
+   User will allocate and fill format structures, call Create(),
+   and then set up m_pAll.
+ **/
+
+struct DS_Filter
 {
-public:
     DS_Filter();
     virtual ~DS_Filter();
     void Start();
     void Stop();
+
     int m_iHandle;
     IBaseFilter* m_pFilter;
     IPin* m_pInputPin;
@@ -32,10 +32,10 @@
     IMemInputPin* m_pImp;
     int m_iState;
 
-    void Create(char* dllname, const GUID* id, AM_MEDIA_TYPE* in_fmt, AM_MEDIA_TYPE* out_fmt);
+    void Create(const char* dllname, const GUID* id, AM_MEDIA_TYPE* in_fmt, AM_MEDIA_TYPE* out_fmt);
     void SetPointer(char* pointer);
-private:
-    void clean();
+
+    void destroy();
 };
 
-#endif
+#endif /* DS_FILTER_H */
--- a/loader/dshow/DS_VideoDec.c	Thu Aug 16 00:44:40 2001 +0000
+++ b/loader/dshow/DS_VideoDec.c	Thu Aug 16 00:50:02 2001 +0000
@@ -1,414 +1,78 @@
-/********************************************************
-
-	DirectShow Video decoder implementation
-	Copyright 2000 Eugene Kuznetsov  (divx@euro.ru)
-        Converted  C++ --> C  :) by A'rpi/ESP-team
-
-*********************************************************/
-
-//#include <config.h>
+#include "guids.h"
+#include "interfaces.h"
 
-//#include "DS_VideoDecoder.h"
-//#include <string.h>
-using namespace std;
-#include <stdlib.h>
-#include <except.h>
-#define __MODULE__ "DirectShow_VideoDecoder"
-
+#include "DS_VideoDecoder.h"
+#include <wine/winerror.h>
+#include <libwin32.h>
+//#include <cpuinfo.h>
 
-#include <errno.h>
-#ifdef HAVE_MALLOC_H
-#include <malloc.h>
-#endif
-//#include <loader.h>
-//#include <wine/winbase.h>
-#include <stdio.h>
 #include <unistd.h>
 #include <fcntl.h>
-#include <strstream>
-#include <dlfcn.h>
+#include <errno.h>
 #include <sys/types.h>
 #include <sys/mman.h>
+#include <cstdio>
+#include <iostream>
+#include <strstream>
 
 #include <registry.h>
-#include <wine/winreg.h>
-
-#include "guids.h"
-#include "interfaces.h"
-#include "DS_Filter.h"
-
-#include "BitmapInfo.h"
-
-#include <string>
-#include <default.h>
+//#include <wine/winreg.h>
 
 #include "DS_VideoDec.h"
 
-
-extern "C" char* def_path;
-
-    static char** m_destptr=0;
-
-    static DS_Filter* dsf=0;
-
-    static AM_MEDIA_TYPE m_sOurType, m_sDestType;
-    static VIDEOINFOHEADER *m_sVhdr;
-    static VIDEOINFOHEADER *m_sVhdr2;
-    static void* m_pCust;
-
-    static BITMAPINFOHEADER *m_bh;//format of input data
-    static BitmapInfo m_decoder;//format of decoder output
-    static BitmapInfo m_obh;  //format of returned frames
-//    CImage* m_outFrame;
-
-//    int m_iState=0;
-
-extern "C" int DS_VideoDecoder_Open(char* dllname, GUID* guid, BITMAPINFOHEADER* format, int flip,char** d_ptr)
-//    :IVideoDecoder(info), m_sVhdr2(0)
-{
+static void* _handle; // will be parameter later...
+static char** _d_ptr;  // will be parameter later...
 
-    m_destptr=d_ptr;
-    
-    //m_outFrame=0;
-    //decpos = 0;
-    //playpos = 0;
-    //realtime = 0;
+extern "C" void Setup_LDT_Keeper();
+extern "C" void setup_FS_Segment();
 
-    try
-    {
-	m_bh=format;
-	memset(&m_obh, 0, sizeof(m_obh));
-	m_obh.biSize=sizeof(m_obh);
+extern "C" int DS_VideoDecoder_Open(char* dllname, GUID* guid, BITMAPINFOHEADER* format, int flip,char** d_ptr){
 
-#if 0
-	memset(&m_sVhdr, 0, sizeof(m_sVhdr));
-	m_sVhdr.bmiHeader=m_bh;
-	m_sVhdr.rcSource.left=m_sVhdr.rcSource.top=0;
-	m_sVhdr.rcSource.right=m_sVhdr.bmiHeader.biWidth;
-        m_sVhdr.rcSource.bottom=m_sVhdr.bmiHeader.biHeight;
-	m_sVhdr.rcTarget=m_sVhdr.rcSource;
-#else
-        unsigned bihs = (format->biSize < (int) sizeof(BITMAPINFOHEADER)) ?
-            sizeof(BITMAPINFOHEADER) : format->biSize;
-         bihs = sizeof(VIDEOINFOHEADER) - sizeof(BITMAPINFOHEADER) + bihs;
+    Setup_LDT_Keeper();
 
-        m_sVhdr = (VIDEOINFOHEADER*) new char[bihs];
-        memset(m_sVhdr, 0, bihs);
-        memcpy(&m_sVhdr->bmiHeader, m_bh, m_bh->biSize);
-	
-        m_sVhdr->rcSource.left = m_sVhdr->rcSource.top = 0;
-        m_sVhdr->rcSource.right = m_sVhdr->bmiHeader.biWidth;
-        m_sVhdr->rcSource.bottom = m_sVhdr->bmiHeader.biHeight;
-        m_sVhdr->rcTarget = m_sVhdr->rcSource;
-#endif
-        m_sOurType.majortype=MEDIATYPE_Video;
-	m_sOurType.subtype=MEDIATYPE_Video;
-        m_sOurType.subtype.f1=m_sVhdr->bmiHeader.biCompression;
-	m_sOurType.formattype=FORMAT_VideoInfo;
-        m_sOurType.bFixedSizeSamples=false;
-	m_sOurType.bTemporalCompression=true;
-	m_sOurType.pUnk=0;
-//        m_sOurType.cbFormat=sizeof(m_sVhdr);
-//        m_sOurType.pbFormat=(char*)&m_sVhdr;
-        m_sOurType.cbFormat = bihs;
-        m_sOurType.pbFormat = (char*)m_sVhdr;
-
-	m_sVhdr2=(VIDEOINFOHEADER*)(new char[sizeof(VIDEOINFOHEADER)+12]);
-//	*m_sVhdr2=m_sVhdr;
-        memcpy(m_sVhdr2, m_sVhdr, sizeof(VIDEOINFOHEADER)+12);
-	m_sVhdr2->bmiHeader.biCompression=0;
-	m_sVhdr2->bmiHeader.biBitCount=24;
+    CodecInfo ci;
+    ci.dll=dllname;
+    ci.guid=*guid;
+    
+    DS_VideoDecoder* dec=new DS_VideoDecoder(ci, *format, flip);
+    
+    _d_ptr=d_ptr;
+    _handle=(void*)dec;
 
-	memset(&m_sDestType, 0, sizeof(m_sDestType));
-	m_sDestType.majortype=MEDIATYPE_Video;
-	m_sDestType.subtype=MEDIASUBTYPE_RGB24;
-	m_sDestType.formattype=FORMAT_VideoInfo;
-	m_sDestType.bFixedSizeSamples=true;
-	m_sDestType.bTemporalCompression=false;
-	m_sDestType.lSampleSize=abs(m_sVhdr2->bmiHeader.biWidth*m_sVhdr2->bmiHeader.biHeight*
-	((m_sVhdr2->bmiHeader.biBitCount+7)/8));
-	m_sVhdr2->bmiHeader.biSizeImage=m_sDestType.lSampleSize;
-	m_sDestType.pUnk=0;
-	m_sDestType.cbFormat=sizeof(VIDEOINFOHEADER);
-        m_sDestType.pbFormat=(char*)m_sVhdr2;
-	m_obh = *m_bh;
-	m_obh.setBits(24);	
-        
-	HRESULT result;
-
-        dsf=new DS_Filter();
-	dsf->Create(dllname, guid, &m_sOurType, &m_sDestType);
-
-	if(!flip)
-	{
-	    m_sVhdr2->bmiHeader.biHeight*=-1;
-	    m_obh.biHeight*=-1;
-	    result=dsf->m_pOutputPin->vt->QueryAccept(dsf->m_pOutputPin, &m_sDestType);
-	    if(result){
-                printf("DShow: Decoder does not support upside-down frames");
-                m_obh.biHeight*=-1;
-            }
-	}	
-
-#if 0
-	m_sVhdr2->bmiHeader.biBitCount=16;
-	m_sVhdr2->bmiHeader.biCompression=fccYUY2;
-	m_sDestType.subtype=MEDIASUBTYPE_YUY2;
-	result=dsf->m_pOutputPin->vt->QueryAccept(dsf->m_pOutputPin, &m_sDestType);
-//	if(!result) caps=(CAPS)(caps | CAP_YUY2);
-#endif
-
-	m_sVhdr2->bmiHeader.biBitCount=24;
-	m_sVhdr2->bmiHeader.biCompression=0;
-	m_sDestType.subtype=MEDIASUBTYPE_RGB24;
-	m_decoder=m_obh;	
-	//qual = 0-1;
-    }
-    catch(FatalError& error)
-    {
-	delete[] m_sVhdr2;
-        return 1;
-    }	    
     return 0;
 }
 
 extern "C" void DS_VideoDecoder_Start(){
-    if(dsf->m_iState!=1) return;
-    dsf->Start();
-
-    ALLOCATOR_PROPERTIES props, props1;
-    props.cBuffers=1;
-    props.cbBuffer=1024*1024; //m_sDestType.lSampleSize;//don't know how to do this correctly
-    props.cbAlign=props.cbPrefix=0;
-    dsf->m_pAll->vt->SetProperties(dsf->m_pAll, &props, &props1);
-    dsf->m_pAll->vt->Commit(dsf->m_pAll);
-
-//    m_outFrame=new CImage(&m_decoder,(unsigned char *)malloc(m_sDestType.lSampleSize),false);
-    //m_outFrame=new CImage(&m_decoder, 0, false);
-//    printf("Datap %x\n",m_outFrame->getaddr());
-
-
-//    dsf->m_pOurOutput->SetFramePointer((char **)m_outFrame->getaddr()); //!FIXME!
-    dsf->m_pOurOutput->SetFramePointer(m_destptr); //!FIXME!
-
-//    filling = realtime;
-    
-    dsf->m_iState=2;
-    return;
+    DS_VideoDecoder* dec=(DS_VideoDecoder*) _handle;
+    dec->StartInternal();
 }
 
 extern "C" void DS_VideoDecoder_Stop(){
-    if(dsf->m_iState!=2) return;
-    dsf->Stop();
-//    dsf->m_pOurOutput->SetFramePointer(0);
-//    free(m_outFrame->data());
-    //m_outFrame->release();//just in case
-    //m_outFrame=0;
-//    FlushCache();
-    dsf->m_iState=1;
-    return;
+    DS_VideoDecoder* dec=(DS_VideoDecoder*) _handle;
+    dec->StopInternal();
 }
 
 extern "C" void DS_VideoDecoder_Restart(){
-    if(dsf->m_iState!=2) return;
-
-    dsf->Stop();
-    dsf->Start();
-
-    ALLOCATOR_PROPERTIES props, props1;
-    props.cBuffers=1;
-    props.cbBuffer=m_sDestType.lSampleSize;//don't know how to do this correctly
-    props.cbAlign=props.cbPrefix=0;
-    dsf->m_pAll->vt->SetProperties(dsf->m_pAll, &props, &props1);
-    dsf->m_pAll->vt->Commit(dsf->m_pAll);
 }
 
 extern "C" void DS_VideoDecoder_Close(){
-    if(dsf->m_iState==0) return;
-    if(dsf->m_iState==2) DS_VideoDecoder_Stop();
-    delete[] m_sVhdr2;
-//    delete m_outFrame;
 }
 
 extern "C" int DS_VideoDecoder_DecodeFrame(char* src, int size, int is_keyframe, int render){
-
-    if(!size)return 0;
-
-        m_bh->biSizeImage=size;
-
-        IMediaSample* sample=0;
-        //printf("GetBuffer... (m_pAll=%X) ",dsf->m_pAll);fflush(stdout);
-	dsf->m_pAll->vt->GetBuffer(dsf->m_pAll, &sample, 0, 0, 0);
-        //printf("OK!\n");
-	if(!sample)
-	{
-	    Debug cerr<<"ERROR: null sample"<<endl;
-	    return -1;
-	}
-        char* ptr;
-        //printf("GetPtr...");fflush(stdout);
-	sample->vt->GetPointer(sample, (BYTE **)&ptr);
-        //printf("OK!\n");
-	memcpy(ptr, src, size);
-        //printf("memcpy OK!\n");
-	sample->vt->SetActualDataLength(sample, size);
-        //printf("SetActualDataLength OK!\n");
-        sample->vt->SetSyncPoint(sample, is_keyframe);
-        //printf("SetSyncPoint OK!\n");
-	sample->vt->SetPreroll(sample, !render);
-//    sample->vt->SetMediaType(sample, &m_sOurType);
-        int result=dsf->m_pImp->vt->Receive(dsf->m_pImp, sample);
-	if(result)
-	    printf("Error putting data into input pin %x\n", result);
-
-        sample->vt->Release((IUnknown*)sample);
-
-        return 0;
+    DS_VideoDecoder* dec=(DS_VideoDecoder*) _handle;
+    CImage image;
+    image.ptr=*_d_ptr;
+    return dec->DecodeInternal((void*)src,(size_t)size,is_keyframe,&image);
 }
 
 extern "C" int DS_VideoDecoder_SetDestFmt(int bits, int csp){
-    if(dsf->m_iState==0) return -1;
-//    if(!CImage::supported(csp, bits)) return -1;
-    HRESULT result;
-//    BitmapInfo temp=m_obh;
-    if(csp==0)
-    {
-	switch(bits)
-        {
-	case 15:
-	    m_sDestType.subtype=MEDIASUBTYPE_RGB555;
-    	    break;	    
-	case 16:
-	    m_sDestType.subtype=MEDIASUBTYPE_RGB565;
-	    break;	    
-	case 24:
-	    m_sDestType.subtype=MEDIASUBTYPE_RGB24;
-	    break;
-	case 32:
-	    m_sDestType.subtype=MEDIASUBTYPE_RGB32;
-	    break;
-        default:
-	    break;
-        }
-	m_obh.setBits(bits);
-//        .biSizeImage=abs(temp.biWidth*temp.biHeight*((temp.biBitCount+7)/8));
-    }	
-    else
-    {
-	m_obh.setSpace(csp,bits);
-	switch(csp)
-	{
-	    case fccYUY2:
-		m_sDestType.subtype=MEDIASUBTYPE_YUY2;
-                printf("DShow: using YUY2 colorspace\n");
-		break;
-	    case fccYV12:
-		m_sDestType.subtype=MEDIASUBTYPE_YV12;
-                printf("DShow: using YV12 colorspace\n");
-		break;
-	    case fccIYUV:
-		m_sDestType.subtype=MEDIASUBTYPE_IYUV;
-                printf("DShow: using IYUV colorspace\n");
-		break;
-	    case fccUYVY:
-		m_sDestType.subtype=MEDIASUBTYPE_UYVY;
-                printf("DShow: using UYVY colorspace\n");
-		break;
-	    case fccYVYU:
-		m_sDestType.subtype=MEDIASUBTYPE_YVYU;
-                printf("DShow: using YVYU colorspace\n");
-		break;
-	}
-    }
-
-    m_sDestType.lSampleSize=m_obh.biSizeImage;
-    memcpy(&(m_sVhdr2->bmiHeader), &m_obh, sizeof(m_obh));
-    m_sVhdr2->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
-    if(m_sVhdr2->bmiHeader.biCompression==3)
-        m_sDestType.cbFormat=sizeof(VIDEOINFOHEADER)+12;
-    else
-        m_sDestType.cbFormat=sizeof(VIDEOINFOHEADER);
-    
-    result=dsf->m_pOutputPin->vt->QueryAccept(dsf->m_pOutputPin, &m_sDestType);
-
-    if(result!=0)
-    {
-	if(csp)
-	    cerr<<"Warning: unsupported color space"<<endl;
-	else
-	    cerr<<"Warning: unsupported bit depth"<<endl;
-
-	m_sDestType.lSampleSize=m_decoder.biSizeImage;
-	memcpy(&(m_sVhdr2->bmiHeader), &m_decoder, sizeof(m_decoder));
-	m_sVhdr2->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
-	if(m_sVhdr2->bmiHeader.biCompression==3)
-    	    m_sDestType.cbFormat=sizeof(VIDEOINFOHEADER)+12;
-	else
-    	    m_sDestType.cbFormat=sizeof(VIDEOINFOHEADER);
-	return 1;
-    }   
-    
-    m_decoder=m_obh; 
-//    m_obh=temp;
-//    if(csp)
-//	m_obh.biBitCount=BitmapInfo::BitCount(csp);
-    m_bh->biBitCount=bits;
-    if(dsf->m_iState>0)
-    {
-	int old_state=dsf->m_iState;
-	if(dsf->m_iState==2) DS_VideoDecoder_Stop();
-	dsf->m_pInputPin->vt->Disconnect(dsf->m_pInputPin);
-	dsf->m_pOutputPin->vt->Disconnect(dsf->m_pOutputPin);
-	dsf->m_pOurOutput->SetNewFormat(m_sDestType);
-    	result=dsf->m_pInputPin->vt->ReceiveConnection(dsf->m_pInputPin, dsf->m_pOurInput, &m_sOurType);
-	if(result)
-	{
-	    cerr<<"Error reconnecting input pin "<<hex<<result<<dec<<endl;
-	    return -1;
-	}	
-        result=dsf->m_pOutputPin->vt->ReceiveConnection(dsf->m_pOutputPin,
-	     dsf->m_pOurOutput, &m_sDestType);
-	if(result)
-	{
-	    cerr<<"Error reconnecting output pin "<<hex<<result<<dec<<endl;
-	    return -1;
-	}		
-	if(old_state==2) DS_VideoDecoder_Start();
-    }
-    return 0; 
+    DS_VideoDecoder* dec=(DS_VideoDecoder*) _handle;
+    return dec->SetDestFmt(bits,(fourcc_t)csp);
 }
 
-
 extern "C" int DS_SetValue_DivX(char* name, int value){
-	int temp;
-	if(dsf->m_iState!=2) return VFW_E_NOT_RUNNING;
-// brightness 87
-// contrast 74
-// hue 23
-// saturation 20
-// post process mode 0
-// get1 0x01
-// get2 10
-// get3=set2 86
-// get4=set3 73
-// get5=set4 19
-// get6=set5 23
-//        printf("DivX setting: %s = %d\n",name,value);
-
-    	IHidden* hidden=(IHidden*)((int)dsf->m_pFilter+0xb8);
-	if(strcmp(name, "Brightness")==0)
-	    return hidden->vt->SetSmth2(hidden, value, 0);
-	if(strcmp(name, "Contrast")==0)
-	    return hidden->vt->SetSmth3(hidden, value, 0);
-	if(strcmp(name, "Hue")==0)
-	    return hidden->vt->SetSmth5(hidden, value, 0);
-	if(strcmp(name, "Saturation")==0)
-	    return hidden->vt->SetSmth4(hidden, value, 0);
-	if(strcmp(name, "Quality")==0)
-	    return hidden->vt->SetSmth(hidden, value, 0);
-            
-        printf("Invalid setting!\n");
-        return -200;
+    DS_VideoDecoder* dec=(DS_VideoDecoder*) _handle;
+    return (int) dec->SetValue(name,value);
 }
 
 extern "C" int DS_SetAttr_DivX(char* attribute, int value){
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loader/dshow/DS_VideoDecoder.c	Thu Aug 16 00:50:02 2001 +0000
@@ -0,0 +1,625 @@
+/********************************************************
+
+	DirectShow Video decoder implementation
+	Copyright 2000 Eugene Kuznetsov  (divx@euro.ru)
+
+*********************************************************/
+
+#include "guids.h"
+#include "interfaces.h"
+
+#include "DS_VideoDecoder.h"
+#include <wine/winerror.h>
+#include <libwin32.h>
+//#include <cpuinfo.h>
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <cstdio>
+#include <iostream>
+#include <strstream>
+
+#define __MODULE__ "DirectShow_VideoDecoder"
+
+extern "C" char* def_path;
+extern "C" void setup_FS_Segment();
+
+using namespace std;
+
+DS_VideoDecoder::DS_VideoDecoder(const CodecInfo& info, const BITMAPINFOHEADER& format, int flip)
+    :IVideoDecoder(info, format)
+{
+    m_sVhdr2 = 0;
+    m_iLastQuality = -1;
+    //memset(&m_obh, 0, sizeof(m_obh));
+    //m_obh.biSize = sizeof(m_obh);
+    try
+    {
+	m_pDS_Filter = new DS_Filter();
+
+	unsigned bihs = (format.biSize < (int) sizeof(BITMAPINFOHEADER)) ?
+	    sizeof(BITMAPINFOHEADER) : format.biSize;
+        bihs = sizeof(VIDEOINFOHEADER) - sizeof(BITMAPINFOHEADER) + bihs;
+
+	m_sVhdr = (VIDEOINFOHEADER*) new char[bihs];
+	memset(m_sVhdr, 0, bihs);
+	memcpy(&m_sVhdr->bmiHeader, m_bh, m_bh->biSize);
+	m_sVhdr->rcSource.left = m_sVhdr->rcSource.top = 0;
+	m_sVhdr->rcSource.right = m_sVhdr->bmiHeader.biWidth;
+        m_sVhdr->rcSource.bottom = m_sVhdr->bmiHeader.biHeight;
+	m_sVhdr->rcTarget = m_sVhdr->rcSource;
+
+	m_sOurType.majortype = MEDIATYPE_Video;
+	m_sOurType.subtype = MEDIATYPE_Video;
+        m_sOurType.subtype.f1 = m_sVhdr->bmiHeader.biCompression;
+	m_sOurType.formattype = FORMAT_VideoInfo;
+        m_sOurType.bFixedSizeSamples = false;
+	m_sOurType.bTemporalCompression = true;
+	m_sOurType.pUnk = 0;
+        m_sOurType.cbFormat = bihs;
+        m_sOurType.pbFormat = (char*)m_sVhdr;
+
+	m_sVhdr2 = (VIDEOINFOHEADER*)(new char[sizeof(VIDEOINFOHEADER)+12]);
+	memcpy(m_sVhdr2, m_sVhdr, sizeof(VIDEOINFOHEADER)+12);
+	m_sVhdr2->bmiHeader.biCompression = 0;
+	m_sVhdr2->bmiHeader.biBitCount = 24;
+
+	memset(&m_sDestType, 0, sizeof(m_sDestType));
+	m_sDestType.majortype = MEDIATYPE_Video;
+	m_sDestType.subtype = MEDIASUBTYPE_RGB24;
+	m_sDestType.formattype = FORMAT_VideoInfo;
+	m_sDestType.bFixedSizeSamples = true;
+	m_sDestType.bTemporalCompression = false;
+	m_sDestType.lSampleSize = abs(m_sVhdr2->bmiHeader.biWidth*m_sVhdr2->bmiHeader.biHeight
+				      * ((m_sVhdr2->bmiHeader.biBitCount + 7) / 8));
+	m_sVhdr2->bmiHeader.biSizeImage = m_sDestType.lSampleSize;
+	m_sDestType.pUnk = 0;
+	m_sDestType.cbFormat = sizeof(VIDEOINFOHEADER);
+        m_sDestType.pbFormat = (char*)m_sVhdr2;
+	memcpy(&m_obh, m_bh, sizeof(m_obh));
+	m_obh.SetBits(24);
+
+	HRESULT result;
+
+	m_pDS_Filter->Create(info.dll.c_str(), &info.guid, &m_sOurType, &m_sDestType);
+
+	if (!flip)
+	{
+	    m_sVhdr2->bmiHeader.biHeight *= -1;
+	    m_obh.biHeight *= -1;
+	    result = m_pDS_Filter->m_pOutputPin->vt->QueryAccept(m_pDS_Filter->m_pOutputPin, &m_sDestType);
+	    if (result)
+	    {
+		cerr << "Decoder does not support upside-down frames" << endl;
+		m_sVhdr2->bmiHeader.biHeight *= -1;
+		m_obh.biHeight *= -1;
+	    }
+	}
+
+	m_decoder = m_obh;
+
+	switch (m_bh->biCompression)
+	{
+	case fccDIV3:
+	case fccDIV4:
+	case fccDIV5:
+	case fccMP42:
+	case fccWMV2:
+	    //YV12 seems to be broken for DivX :-) codec
+	case fccIV50:
+	    //produces incorrect picture
+	    //m_Caps = (CAPS) (m_Caps & ~CAP_YV12);
+	    m_Caps = CAP_YUY2; // | CAP_I420;
+	    break;
+	default:
+	    struct ct {
+		unsigned int bits;
+		fourcc_t fcc;
+		GUID subtype;
+		CAPS cap;
+	    } check[] = {
+		{16, fccYUY2, MEDIASUBTYPE_YUY2, CAP_YUY2},
+		{12, fccIYUV, MEDIASUBTYPE_IYUV, CAP_IYUV},
+		{16, fccUYVY, MEDIASUBTYPE_UYVY, CAP_UYVY},
+		{12, fccYV12, MEDIASUBTYPE_YV12, CAP_YV12},
+		{16, fccYV12, MEDIASUBTYPE_YV12, CAP_YV12},
+		{16, fccYVYU, MEDIASUBTYPE_YVYU, CAP_YVYU},
+		//{12, fccI420, MEDIASUBTYPE_I420, CAP_I420},
+		{0},
+	    };
+
+	    m_Caps = CAP_NONE;
+
+	    for (ct* c = check; c->bits; c++)
+	    {
+		m_sVhdr2->bmiHeader.biBitCount = c->bits;
+		m_sVhdr2->bmiHeader.biCompression = c->fcc;
+		m_sDestType.subtype = c->subtype;
+		result = m_pDS_Filter->m_pOutputPin->vt->QueryAccept(m_pDS_Filter->m_pOutputPin, &m_sDestType);
+		if (!result)
+		    m_Caps = (CAPS)(m_Caps | c->cap);
+	    }
+	}
+
+	if (m_Caps != CAP_NONE)
+	    cout << "Decoder is capable of YUV output ( flags 0x"<<hex<<(int)m_Caps<<dec<<" )"<<endl;
+
+	m_sVhdr2->bmiHeader.biBitCount = 24;
+	m_sVhdr2->bmiHeader.biCompression = 0;
+	m_sDestType.subtype = MEDIASUBTYPE_RGB24;
+
+	m_bIsDivX = ((info.dll == string("divxcvki.ax"))
+		     || (info.dll == string("divx_c32.ax"))
+		     || (info.dll == string("wmvds32.ax"))
+		     || (info.dll == string("wmv8ds32.ax")));
+    }
+    catch (FatalError& error)
+    {
+	delete[] m_sVhdr2;
+        delete m_pDS_Filter;
+	throw;
+    }
+}
+
+DS_VideoDecoder::~DS_VideoDecoder()
+{
+    Stop();
+    delete[] m_sVhdr2;
+    delete m_pDS_Filter;
+}
+
+void DS_VideoDecoder::StartInternal()
+{
+    //cout << "DSSTART" << endl;
+    m_pDS_Filter->Start();
+    ALLOCATOR_PROPERTIES props, props1;
+    props.cBuffers = 1;
+    props.cbBuffer = m_sDestType.lSampleSize;
+    //don't know how to do this correctly
+    props.cbAlign = props.cbPrefix = 0;
+    m_pDS_Filter->m_pAll->vt->SetProperties(m_pDS_Filter->m_pAll, &props, &props1);
+    m_pDS_Filter->m_pAll->vt->Commit(m_pDS_Filter->m_pAll);
+}
+
+void DS_VideoDecoder::StopInternal()
+{
+    //cout << "DSSTOP" << endl;
+    m_pDS_Filter->Stop();
+    //??? why was this here ??? m_pOurOutput->SetFramePointer(0);
+}
+
+int DS_VideoDecoder::DecodeInternal(void* src, size_t size, int is_keyframe, CImage* pImage)
+{
+    IMediaSample* sample = 0;
+
+    m_pDS_Filter->m_pAll->vt->GetBuffer(m_pDS_Filter->m_pAll, &sample, 0, 0, 0);
+
+    if (!sample)
+    {
+	Debug cerr << "ERROR: null sample" << endl;
+	return -1;
+    }
+
+    //cout << "DECODE " << (void*) pImage << "   d: " << (void*) pImage->Data() << endl;
+    if (pImage)
+    {
+	if (!(pImage->Data()))
+	{
+	    Debug cout << "no m_outFrame??" << endl;
+	}
+	else
+	    m_pDS_Filter->m_pOurOutput->SetPointer2((char*)pImage->Data());
+    }
+
+    char* ptr;
+    sample->vt->GetPointer(sample, (BYTE **)&ptr);
+    memcpy(ptr, src, size);
+    sample->vt->SetActualDataLength(sample, size);
+    sample->vt->SetSyncPoint(sample, is_keyframe);
+    sample->vt->SetPreroll(sample, pImage ? 0 : 1);
+    // sample->vt->SetMediaType(sample, &m_sOurType);
+
+    // FIXME: - crashing with YV12 at this place decoder will crash
+    //          while doing this call
+    // %FS register was not setup for calling into win32 dll. Are all
+    // crashes inside ...->Receive() fixed now?
+    //
+    // nope - but this is surely helpfull - I'll try some more experiments
+    setup_FS_Segment();
+#if 0
+    if (!m_pDS_Filter || !m_pDS_Filter->m_pImp
+	|| !m_pDS_Filter->m_pImp->vt
+	|| !m_pDS_Filter->m_pImp->vt->Receive)
+	printf("DecodeInternal ERROR???\n");
+#endif
+    int result = m_pDS_Filter->m_pImp->vt->Receive(m_pDS_Filter->m_pImp, sample);
+    if (result)
+    {
+	Debug printf("DS_VideoDecoder::DecodeInternal() error putting data into input pin %x\n", result);
+    }
+
+    sample->vt->Release((IUnknown*)sample);
+
+    if (m_bIsDivX)
+    {
+	int q;
+	IHidden* hidden=(IHidden*)((int)m_pDS_Filter->m_pFilter + 0xb8);
+	// always check for actual value
+	// this seems to be the only way to know the actual value
+	hidden->vt->GetSmth2(hidden, &m_iLastQuality);
+	if (m_iLastQuality > 9)
+	    m_iLastQuality -= 10;
+
+	if (m_iLastQuality < 0)
+	    m_iLastQuality = 0;
+	else if (m_iLastQuality > 4)
+	    m_iLastQuality = 4;
+
+	//cout << " Qual: " << m_iLastQuality << endl;
+	m_fQuality = m_iLastQuality / 4.0;
+    }
+
+    // FIXME: last_quality currently works only for DivX movies
+    // more general approach is needed here
+    // cout << "Q: " << m_iLastQuality << "  rt: " << m_Mode << " dp: " << decpos << endl;
+    // also accesing vbuf doesn't look very nice at this place
+    // FIXME later - do it as a virtual method
+
+    if (m_Mode == IVideoDecoder::REALTIME_QUALITY_AUTO)
+    {
+	// adjust Quality - depends on how many cached frames we have
+	int buffered = m_iDecpos - m_iPlaypos;
+
+	if (m_bIsDivX)
+	{
+	    //cout << "qual " << q << "  " << buffered << endl;
+	    if (buffered < (m_iLastQuality * 2 + QMARKLO - 1)
+		|| buffered > ((m_iLastQuality + 1) * 2 + QMARKLO))
+	    {
+		// removed old code which was present here
+		// and replaced with this new uptodate one
+
+		int to = (buffered - QMARKLO) / 2;
+		if (to < 0)
+		    to = 0;
+		else if (to > 4)
+		    to = 4;
+		if (m_iLastQuality != to)
+		{
+		    IHidden* hidden=(IHidden*)((int)m_pDS_Filter->m_pFilter + 0xb8);
+		    hidden->vt->SetSmth(hidden, to, 0);
+#ifndef QUIET
+		    //cout << "Switching quality " << m_iLastQuality <<  " -> " << to << "  b:" << buffered << endl;
+#endif
+		}
+	    }
+	}
+    }
+
+
+    return 0;
+}
+
+/*
+ * bits == 0   - leave unchanged
+ */
+int DS_VideoDecoder::SetDestFmt(int bits, fourcc_t csp)
+{
+    if (!CImage::Supported(csp, bits))
+	return -1;
+
+    // BitmapInfo temp = m_obh;
+    if (bits != 0)
+    {
+	bool ok = true;
+
+	switch (bits)
+        {
+	case 15:
+	    m_sDestType.subtype = MEDIASUBTYPE_RGB555;
+    	    break;
+	case 16:
+	    m_sDestType.subtype = MEDIASUBTYPE_RGB565;
+	    break;
+	case 24:
+	    m_sDestType.subtype = MEDIASUBTYPE_RGB24;
+	    break;
+	case 32:
+	    m_sDestType.subtype = MEDIASUBTYPE_RGB32;
+	    break;
+	default:
+            ok = false;
+	    break;
+	}
+
+        if (ok)
+	    m_obh.SetBits(bits);
+	//.biSizeImage=abs(temp.biWidth*temp.biHeight*((temp.biBitCount+7)/8));
+    }
+
+    if (csp != 0)
+    {
+        bool ok = true;
+	switch (csp)
+	{
+	case fccYUY2:
+	    m_sDestType.subtype = MEDIASUBTYPE_YUY2;
+	    break;
+	case fccYV12:
+	    m_sDestType.subtype = MEDIASUBTYPE_YV12;
+	    break;
+	case fccIYUV:
+	    m_sDestType.subtype = MEDIASUBTYPE_IYUV;
+	    break;
+	case fccUYVY:
+	    m_sDestType.subtype = MEDIASUBTYPE_UYVY;
+	    break;
+	case fccYVYU:
+	    m_sDestType.subtype = MEDIASUBTYPE_YVYU;
+	    break;
+	default:
+	    ok = false;
+            break;
+	}
+
+        if (ok)
+	    m_obh.SetSpace(csp);
+    }
+    m_sDestType.lSampleSize = m_obh.biSizeImage;
+    memcpy(&(m_sVhdr2->bmiHeader), &m_obh, sizeof(m_obh));
+    m_sVhdr2->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+    if (m_sVhdr2->bmiHeader.biCompression == 3)
+        m_sDestType.cbFormat = sizeof(VIDEOINFOHEADER) + 12;
+    else
+        m_sDestType.cbFormat = sizeof(VIDEOINFOHEADER);
+
+    HRESULT result;
+    bool should_test=true;
+    switch(csp)
+    {
+    case fccYUY2:
+	if(!(m_Caps & CAP_YUY2))
+	    should_test=false;
+	break;
+    case fccYV12:
+	if(!(m_Caps & CAP_YV12))
+	    should_test=false;
+	break;
+    case fccIYUV:
+	if(!(m_Caps & CAP_IYUV))
+	    should_test=false;
+	break;
+    case fccUYVY:
+	if(!(m_Caps & CAP_UYVY))
+	    should_test=false;
+	break;
+    case fccYVYU:
+	if(!(m_Caps & CAP_YVYU))
+	    should_test=false;
+	break;
+    }
+    if(should_test)
+	result = m_pDS_Filter->m_pOutputPin->vt->QueryAccept(m_pDS_Filter->m_pOutputPin, &m_sDestType);
+    else
+	result = -1;
+
+    if (result != 0)
+    {
+	if (csp)
+	    cerr << "Warning: unsupported color space" << endl;
+	else
+	    cerr << "Warning: unsupported bit depth" << endl;
+
+	m_sDestType.lSampleSize = m_decoder.biSizeImage;
+	memcpy(&(m_sVhdr2->bmiHeader), &m_decoder, sizeof(m_decoder));
+	m_sVhdr2->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+	if(m_sVhdr2->bmiHeader.biCompression == 3)
+    	    m_sDestType.cbFormat = sizeof(VIDEOINFOHEADER) + 12;
+	else
+    	    m_sDestType.cbFormat = sizeof(VIDEOINFOHEADER);
+
+	return 1;
+    }
+
+    m_decoder = m_obh;
+
+//    m_obh=temp;
+//    if(csp)
+//	m_obh.biBitCount=BitmapInfo::BitCount(csp);
+    m_bh->biBitCount = bits;
+
+    //Restart();
+    bool stoped = false;
+    if (m_State == START)
+    {
+	Stop();
+        stoped = true;
+    }
+
+    m_pDS_Filter->m_pInputPin->vt->Disconnect(m_pDS_Filter->m_pInputPin);
+    m_pDS_Filter->m_pOutputPin->vt->Disconnect(m_pDS_Filter->m_pOutputPin);
+    m_pDS_Filter->m_pOurOutput->SetNewFormat(m_sDestType);
+    result = m_pDS_Filter->m_pInputPin->vt->ReceiveConnection(m_pDS_Filter->m_pInputPin,
+							      m_pDS_Filter->m_pOurInput,
+							      &m_sOurType);
+    if (result)
+    {
+	cerr<<"Error reconnecting input pin "<<hex<<result<<dec<<endl;
+	return -1;
+    }
+    result = m_pDS_Filter->m_pOutputPin->vt->ReceiveConnection(m_pDS_Filter->m_pOutputPin,
+							       m_pDS_Filter->m_pOurOutput,
+							       &m_sDestType);
+    if (result)
+    {
+	cerr<<"Error reconnecting output pin "<<hex<<result<<dec<<endl;
+	return -1;
+    }
+
+    if (stoped)
+	Start();
+
+    return 0;
+}
+
+HRESULT DS_VideoDecoder::GetValue(const char* name, int& value)
+{
+    if (m_bIsDivX)
+    {
+	if (m_State != START)
+	    return VFW_E_NOT_RUNNING;
+// brightness 87
+// contrast 74
+// hue 23
+// saturation 20
+// post process mode 0
+// get1 0x01
+// get2 10
+// get3=set2 86
+// get4=set3 73
+// get5=set4 19
+// get6=set5 23
+	IHidden* hidden=(IHidden*)((int)m_pDS_Filter->m_pFilter+0xb8);
+	if (strcmp(name, "Brightness") == 0)
+	    return hidden->vt->GetSmth3(hidden, &value);
+	if (strcmp(name, "Contrast") == 0)
+	    return hidden->vt->GetSmth4(hidden, &value);
+	if (strcmp(name, "Hue") == 0)
+	    return hidden->vt->GetSmth6(hidden, &value);
+	if (strcmp(name, "Saturation") == 0)
+	    return hidden->vt->GetSmth5(hidden, &value);
+	if (strcmp(name, "Quality") == 0)
+	{
+#warning NOT SURE
+	    int r = hidden->vt->GetSmth2(hidden, &value);
+	    if (value >= 10)
+		value -= 10;
+	    return 0;
+	}
+    }
+    else if (record.dll == string("ir50_32.dll"))
+    {
+	IHidden2* hidden = 0;
+	if (m_pDS_Filter->m_pFilter->vt->QueryInterface((IUnknown*)m_pDS_Filter->m_pFilter, &IID_Iv50Hidden, (void**)&hidden))
+	{
+	    cerr << "No such interface" << endl;
+	    return -1;
+	}
+#warning FIXME
+	int recordpar[30];
+	recordpar[0]=0x7c;
+	recordpar[1]=fccIV50;
+	recordpar[2]=0x10005;
+	recordpar[3]=2;
+	recordpar[4]=1;
+	recordpar[5]=0x80000000;
+
+	if (strcmp(name, "Brightness") == 0)
+	    recordpar[5]|=0x20;
+	else if (strcmp(name, "Saturation") == 0)
+	    recordpar[5]|=0x40;
+	else if (strcmp(name, "Contrast") == 0)
+	    recordpar[5]|=0x80;
+	if (!recordpar[5])
+	{
+	    hidden->vt->Release((IUnknown*)hidden);
+	    return -1;
+	}
+	if (hidden->vt->DecodeSet(hidden, recordpar))
+	    return -1;
+
+	if (strcmp(name, "Brightness") == 0)
+	    value = recordpar[18];
+	else if (strcmp(name, "Saturation") == 0)
+	    value = recordpar[19];
+	else if (strcmp(name, "Contrast") == 0)
+	    value = recordpar[20];
+
+	hidden->vt->Release((IUnknown*)hidden);
+    }
+
+    return 0;
+}
+
+HRESULT DS_VideoDecoder::SetValue(const char* name, int value)
+{
+    if (m_bIsDivX)
+    {
+	if (m_State != START)
+	    return VFW_E_NOT_RUNNING;
+
+	//cout << "set value " << name << "  " << value << endl;
+// brightness 87
+// contrast 74
+// hue 23
+// saturation 20
+// post process mode 0
+// get1 0x01
+// get2 10
+// get3=set2 86
+// get4=set3 73
+// get5=set4 19
+// get6=set5 23
+    	IHidden* hidden = (IHidden*)((int)m_pDS_Filter->m_pFilter + 0xb8);
+	if (strcmp(name, "Quality") == 0)
+	{
+            m_iLastQuality = value;
+	    return hidden->vt->SetSmth(hidden, value, 0);
+	}
+	if (strcmp(name, "Brightness") == 0)
+	    return hidden->vt->SetSmth2(hidden, value, 0);
+	if (strcmp(name, "Contrast") == 0)
+	    return hidden->vt->SetSmth3(hidden, value, 0);
+	if (strcmp(name, "Saturation") == 0)
+	    return hidden->vt->SetSmth4(hidden, value, 0);
+	if (strcmp(name, "Hue") == 0)
+	    return hidden->vt->SetSmth5(hidden, value, 0);
+    }
+    else if (record.dll == string("ir50_32.dll"))
+    {
+	IHidden2* hidden = 0;
+	if (m_pDS_Filter->m_pFilter->vt->QueryInterface((IUnknown*)m_pDS_Filter->m_pFilter, &IID_Iv50Hidden, (void**)&hidden))
+	{
+	    Debug cerr << "No such interface" << endl;
+	    return -1;
+	}
+	int recordpar[30];
+	recordpar[0]=0x7c;
+	recordpar[1]=fccIV50;
+	recordpar[2]=0x10005;
+	recordpar[3]=2;
+	recordpar[4]=1;
+	recordpar[5]=0x80000000;
+	if (strcmp(name, "Brightness") == 0)
+	{
+	    recordpar[5]|=0x20;
+	    recordpar[18]=value;
+	}
+	else if (strcmp(name, "Saturation") == 0)
+	{
+	    recordpar[5]|=0x40;
+	    recordpar[19]=value;
+	}
+	else if (strcmp(name, "Contrast") == 0)
+	{
+	    recordpar[5]|=0x80;
+	    recordpar[20]=value;
+	}
+	if(!recordpar[5])
+	{
+	    hidden->vt->Release((IUnknown*)hidden);
+    	    return -1;
+	}
+	HRESULT result = hidden->vt->DecodeSet(hidden, recordpar);
+	hidden->vt->Release((IUnknown*)hidden);
+
+	return result;
+    }
+    return 0;
+}
+/*
+vim: tabstop=8
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loader/dshow/DS_VideoDecoder.h	Thu Aug 16 00:50:02 2001 +0000
@@ -0,0 +1,37 @@
+#ifndef AVIFILE_DS_VIDEODECODER_H
+#define AVIFILE_DS_VIDEODECODER_H
+
+#include <libwin32.h>
+#include <DS_Filter.h>
+
+class DS_VideoDecoder: public IVideoDecoder, public IRtConfig
+{
+public:
+    DS_VideoDecoder(const CodecInfo& info, const BITMAPINFOHEADER& format, int flip);
+    ~DS_VideoDecoder();
+    int SetDestFmt(int bits = 24, fourcc_t csp = 0);
+    CAPS GetCapabilities() const {return m_Caps;}
+    int DecodeInternal(void* src, size_t size, int is_keyframe, CImage* pImage);
+    void StartInternal();
+    void StopInternal();
+    //void Restart();
+    int SetDirection(int d)
+    {
+	m_obh.biHeight = d ? m_bh->biHeight : -m_bh->biHeight;
+	m_sVhdr2->bmiHeader.biHeight = m_obh.biHeight;
+	return 0;
+    }
+    // IRtConfig interface
+    virtual HRESULT GetValue(const char*, int&);
+    virtual HRESULT SetValue(const char*, int);
+protected:
+    DS_Filter* m_pDS_Filter;
+    AM_MEDIA_TYPE m_sOurType, m_sDestType;
+    VIDEOINFOHEADER* m_sVhdr;
+    VIDEOINFOHEADER* m_sVhdr2;
+    CAPS m_Caps;                // capabilities of DirectShow decoder
+    int m_iLastQuality;         // remember last quality as integer
+    bool m_bIsDivX;             // for speed
+};
+
+#endif /* AVIFILE_DS_VIDEODECODER_H */
--- a/loader/dshow/Makefile	Thu Aug 16 00:44:40 2001 +0000
+++ b/loader/dshow/Makefile	Thu Aug 16 00:50:02 2001 +0000
@@ -3,12 +3,13 @@
 
 include ../../config.mak
 
-SRCS	= DS_AudioDec.cpp DS_VideoDec.cpp DS_Filter.cpp allocator.cpp cmediasample.cpp guids.cpp inputpin.cpp outputpin.cpp
+# DS_AudioDec.cpp 
+SRCS	= DS_AudioDec.cpp DS_AudioDecoder.cpp DS_VideoDec.cpp DS_Filter.cpp DS_VideoDecoder.cpp allocator.cpp cmediasample.cpp guids.cpp inputpin.cpp outputpin.cpp
 OBJS = $(SRCS:.cpp=.o)
 
 # OBJS	= DS_AudioDec.o DS_VideoDec.o DS_Filter.o allocator.o cmediasample.o guids.o inputpin.o outputpin.o
 
-INCLUDE = -I. -I.. -I../wine $(EXTRA_INC)
+INCLUDE = -I. -I.. $(EXTRA_INC) -DNOAVIFILE_HEADERS
 CFLAGS  = $(OPTFLAGS) $(INCLUDE) -fexceptions 
 
 .SUFFIXES: .cpp .o
@@ -43,3 +44,4 @@
 ifneq ($(wildcard .depend),)
 include .depend
 endif
+
--- a/loader/dshow/allocator.c	Thu Aug 16 00:44:40 2001 +0000
+++ b/loader/dshow/allocator.c	Thu Aug 16 00:50:02 2001 +0000
@@ -1,55 +1,43 @@
-#include <stdio.h>
 #include "allocator.h"
 #include <com.h>
-#define E_NOTIMPL 0x80004001
+#include <wine/winerror.h>
+#include <stdio.h>
+
+//#undef Debug
+//#define Debug
+
 using namespace std;
 
 class AllocatorKeeper
 {
 public:
     AllocatorKeeper()
-    {	
+    {
 	RegisterComClass(&CLSID_MemoryAllocator, MemAllocator::CreateAllocator);
     }
+    ~AllocatorKeeper()
+    {
+	UnregisterComClass(&CLSID_MemoryAllocator, MemAllocator::CreateAllocator);
+    }
 };
 static AllocatorKeeper keeper;
+
+
 GUID MemAllocator::interfaces[]=
 {
     IID_IUnknown,
     IID_IMemAllocator,
 };
+
 IMPLEMENT_IUNKNOWN(MemAllocator)
 
-MemAllocator::MemAllocator()
-    :refcount(1)
-{
-    Debug printf("MemAllocator::MemAllocator() called\n");
-    vt=new IMemAllocator_vt;
-    vt->QueryInterface = QueryInterface;
-    vt->AddRef = AddRef;
-    vt->Release = Release;
-    vt->SetProperties = SetProperties;
-    vt->GetProperties = GetProperties;
-    vt->Commit = Commit;
-    vt->Decommit = Decommit;
-    vt->GetBuffer = GetBuffer;
-    vt->ReleaseBuffer = ReleaseBuffer;
-    
-    props.cBuffers=1;
-    props.cbBuffer=65536;/* :/ */
-    props.cbAlign=props.cbPrefix=0;
-    
-    new_pointer=0;
-    modified_sample=0;
-}
-
 long MemAllocator::CreateAllocator(GUID* clsid, GUID* iid, void** ppv)
 {
     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->vt->Release((IUnknown*)p);
@@ -57,56 +45,52 @@
 }
 
 
-/*
-    long cBuffers;
-    long cbBuffer;
-    long cbAlign;
-    long cbPrefix;
-*/
-HRESULT STDCALL MemAllocator::SetProperties ( 
-    IMemAllocator * This,
-    /* [in] */ ALLOCATOR_PROPERTIES *pRequest,
-    /* [out] */ ALLOCATOR_PROPERTIES *pActual)
+static HRESULT STDCALL MemAllocator_SetProperties(IMemAllocator * This,
+						  /* [in] */ ALLOCATOR_PROPERTIES *pRequest,
+						  /* [out] */ ALLOCATOR_PROPERTIES *pActual)
 {
-    Debug printf("MemAllocator::SetProperties() called\n");
-    if(!pRequest)return 0x80004003;
-    if(!pActual)return 0x80004003;
-    if(pRequest->cBuffers<=0)return -1;
-    if(pRequest->cbBuffer<=0)return -1;
-    MemAllocator* me=(MemAllocator*)This;
-    if(me->used_list.size() || me->free_list.size())return -1;
-    me->props=*pRequest;
-    *pActual=*pRequest;
+    Debug printf("MemAllocator_SetProperties() called\n");
+    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())
+	return E_FAIL;
+    me->props = *pRequest;
+    *pActual = *pRequest;
     return 0;
 }
 
-HRESULT STDCALL MemAllocator::GetProperties ( 
-    IMemAllocator * This,
-    /* [out] */ ALLOCATOR_PROPERTIES *pProps)
+static HRESULT STDCALL MemAllocator_GetProperties(IMemAllocator * This,
+						  /* [out] */ ALLOCATOR_PROPERTIES *pProps)
 {
-    Debug printf("MemAllocator::GetProperties() called\n");
-    if(!pProps)return -1;
-    if(((MemAllocator*)This)->props.cbBuffer<0)return -1;
+    Debug printf("MemAllocator_GetProperties(%p) called\n", This);
+    if (!pProps)
+	return E_INVALIDARG;
+    if (((MemAllocator*)This)->props.cbBuffer<0)
+	return E_FAIL;
     *pProps=((MemAllocator*)This)->props;
     return 0;
 }
 
-HRESULT STDCALL MemAllocator::Commit ( 
-    IMemAllocator * This)
+static HRESULT STDCALL MemAllocator_Commit(IMemAllocator * This)
 {
-    Debug printf("MemAllocator::Commit() called\n");
+    Debug printf("MemAllocator_Commit(%p) called\n", This);
     MemAllocator* me=(MemAllocator*)This;
-    if(((MemAllocator*)This)->props.cbBuffer<0)return -1;
-    if(me->used_list.size() || me->free_list.size())return -1;
-    for(int i=0; i<me->props.cBuffers; i++)
+    if (((MemAllocator*)This)->props.cbBuffer < 0)
+	return E_FAIL;
+    if (me->used_list.size() || me->free_list.size())
+	return E_INVALIDARG;
+    for(int i = 0; i<me->props.cBuffers; i++)
 	me->free_list.push_back(new CMediaSample(me, me->props.cbBuffer));
+
     return 0;
 }
 
-HRESULT STDCALL MemAllocator::Decommit ( 
-    IMemAllocator * This)
+static HRESULT STDCALL MemAllocator_Decommit(IMemAllocator * This)
 {
-    Debug printf("MemAllocator::Decommit() called\n");
+    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++)
@@ -114,54 +98,81 @@
     for(it=me->used_list.begin(); it!=me->used_list.end(); it++)
 	delete *it;
     me->free_list.clear();
-    me->used_list.clear();	
+    me->used_list.clear();
     return 0;
 }
 
-HRESULT STDCALL MemAllocator::GetBuffer ( 
-    IMemAllocator * This,
-    /* [out] */ IMediaSample **ppBuffer,
-    /* [in] */ REFERENCE_TIME *pStartTime,
-    /* [in] */ REFERENCE_TIME *pEndTime,
-    /* [in] */ DWORD dwFlags)
+static HRESULT STDCALL MemAllocator_GetBuffer(IMemAllocator * This,
+					      /* [out] */ IMediaSample **ppBuffer,
+					      /* [in] */ REFERENCE_TIME *pStartTime,
+					      /* [in] */ REFERENCE_TIME *pEndTime,
+					      /* [in] */ DWORD dwFlags)
 {
-    Debug printf("%x: MemAllocator::GetBuffer() called\n", This);
-    MemAllocator* me=(MemAllocator*)This;
-    if(me->free_list.size()==0)
+    Debug printf("MemAllocator_GetBuffer(%p) called\n", This);
+    MemAllocator* me = (MemAllocator*)This;
+    if (me->free_list.size() == 0)
     {
 	Debug printf("No samples available\n");
-	return -1;//should block here if no samples are available
-    }	
-    list<CMediaSample*>::iterator it=me->free_list.begin();
+	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 = *it;
     (*ppBuffer)->vt->AddRef((IUnknown*)*ppBuffer);
-    if(me->new_pointer)
+    if (me->new_pointer)
     {
 	if(me->modified_sample)
 	    me->modified_sample->ResetPointer();
-        (*it)->SetPointer(me->new_pointer);
+	(*it)->SetPointer(me->new_pointer);
 	me->modified_sample=*it;
-	me->new_pointer=0;
+	me->new_pointer = 0;
     }
     me->free_list.remove(*it);
     return 0;
 }
 
-HRESULT STDCALL MemAllocator::ReleaseBuffer ( 
-    IMemAllocator * This,
-    /* [in] */ IMediaSample *pBuffer)
+static HRESULT STDCALL MemAllocator_ReleaseBuffer(IMemAllocator * This,
+						  /* [in] */ IMediaSample *pBuffer)
 {
-    Debug printf("%x: MemAllocator::ReleaseBuffer() called\n", This);
-    MemAllocator* me=(MemAllocator*)This;
+    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)
+    for (it = me->used_list.begin(); it != me->used_list.end(); it++)
+	if (*it == pBuffer)
 	{
 	    me->used_list.erase(it);
 	    me->free_list.push_back((CMediaSample*)pBuffer);
 	    return 0;
 	}
     Debug printf("Releasing unknown buffer\n");
-    return -1;
+    return E_FAIL;
 }
+
+MemAllocator::MemAllocator()
+{
+    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;
+
+    new_pointer=0;
+    modified_sample=0;
+}
+
+MemAllocator::~MemAllocator()
+{
+    Debug printf("MemAllocator::~MemAllocator() called\n");
+    delete vt;
+}
--- a/loader/dshow/allocator.h	Thu Aug 16 00:44:40 2001 +0000
+++ b/loader/dshow/allocator.h	Thu Aug 16 00:50:02 2001 +0000
@@ -1,13 +1,13 @@
-#ifndef ALLOCATOR_H
-#define ALLOCATOR_H
+#ifndef DS_ALLOCATOR_H
+#define DS_ALLOCATOR_H
 
 #include "interfaces.h"
 #include "cmediasample.h"
+#include "iunk.h"
+
 #include <list>
-#include "iunk.h"
-#include "default.h"
 
-class MemAllocator: public IMemAllocator
+struct MemAllocator: public IMemAllocator
 {
     ALLOCATOR_PROPERTIES props;
     std::list<CMediaSample*> used_list;
@@ -16,44 +16,20 @@
     CMediaSample* modified_sample;
     static GUID interfaces[];
     DECLARE_IUNKNOWN(MemAllocator)
-public:
+
     MemAllocator();
-    ~MemAllocator(){delete vt;}
-    static long CreateAllocator(GUID* clsid, GUID* iid, void** ppv);
+    ~MemAllocator();
     void SetPointer(char* pointer) { new_pointer=pointer; }
     void ResetPointer() 
     { 
-	if(modified_sample) 
+	if (modified_sample)
 	{
 	    modified_sample->ResetPointer(); 
 	    modified_sample=0;
 	}
     }
-    static HRESULT STDCALL SetProperties ( 
-        IMemAllocator * This,
-        /* [in] */ ALLOCATOR_PROPERTIES *pRequest,
-        /* [out] */ ALLOCATOR_PROPERTIES *pActual);
-    
-    static HRESULT STDCALL GetProperties ( 
-        IMemAllocator * This,
-        /* [out] */ ALLOCATOR_PROPERTIES *pProps);
-    
-    static HRESULT STDCALL Commit ( 
-        IMemAllocator * This);
-    
-    static HRESULT STDCALL Decommit ( 
-        IMemAllocator * This);
-    
-    static HRESULT STDCALL GetBuffer ( 
-        IMemAllocator * This,
-        /* [out] */ IMediaSample **ppBuffer,
-        /* [in] */ REFERENCE_TIME *pStartTime,
-        /* [in] */ REFERENCE_TIME *pEndTime,
-        /* [in] */ DWORD dwFlags);
-    
-    static HRESULT STDCALL ReleaseBuffer ( 
-        IMemAllocator * This,
-        /* [in] */ IMediaSample *pBuffer);
+
+    static long CreateAllocator(GUID* clsid, GUID* iid, void** ppv);
 };
 
-#endif
+#endif /* DS_ALLOCATOR_H */
--- a/loader/dshow/cmediasample.c	Thu Aug 16 00:44:40 2001 +0000
+++ b/loader/dshow/cmediasample.c	Thu Aug 16 00:50:02 2001 +0000
@@ -1,195 +1,139 @@
+#include "cmediasample.h"
+#include <wine/winerror.h>
 #include <stdio.h>
 #include <string.h>
-#include "cmediasample.h"
-//#define E_NOTIMPL 0x80004003
-CMediaSample::CMediaSample(IMemAllocator* allocator, long _size):refcount(0)
+
+static long STDCALL CMediaSample_QueryInterface(IUnknown * This,
+						/* [in] */ IID* iid,
+						/* [iid_is][out] */ void **ppv)
 {
-    vt=new IMediaSample_vt;
-    
-    vt->QueryInterface=QueryInterface;
-    vt->AddRef=AddRef;
-    vt->Release=Release;
-    vt->GetPointer=GetPointer ; 
-    vt->GetSize=GetSize ; 
-    vt->GetTime=GetTime ; 
-    vt->SetTime=SetTime ; 
-    vt->IsSyncPoint=IsSyncPoint ; 
-    vt->SetSyncPoint=SetSyncPoint; 
-    vt->IsPreroll=IsPreroll; 
-    vt->SetPreroll=SetPreroll; 
-    vt->GetActualDataLength=GetActualDataLength; 
-    vt->SetActualDataLength=SetActualDataLength; 
-    vt->GetMediaType=GetMediaType; 
-    vt->SetMediaType=SetMediaType; 
-    vt->IsDiscontinuity=IsDiscontinuity; 
-    vt->SetDiscontinuity=SetDiscontinuity; 
-    vt->GetMediaTime=GetMediaTime; 
-    vt->SetMediaTime=SetMediaTime; 
-    
-    all=allocator;
-    size=_size;
-    actual_size=0;
-    media_type.pbFormat=0;
-    isPreroll=0;
-    type_valid=0;
-    block=new char[size];    
-    old_block=0;
-    Debug printf("%x: Creating media sample with size %d, buffer 0x%x\n", this, _size, block);
-}
-CMediaSample::~CMediaSample()
-{
-    Debug printf("%x: CMediaSample::~CMediaSample() called\n", this);
-    delete vt;
-    if(old_block)
-	block=old_block;
-    delete[] block;
-    if(media_type.pbFormat)
-	CoTaskMemFree(media_type.pbFormat);
-}
-
-long STDCALL CMediaSample::QueryInterface ( 
-    IUnknown * This,
-    /* [in] */ IID* iid,
-    /* [iid_is][out] */ void **ppv)
-{
-    Debug printf("CMediaSample::QueryInterface() called\n");
-    if(!ppv)return 0x80004003;
-    if(!memcmp(iid, &IID_IUnknown, 16))
+    Debug printf("CMediaSample_QueryInterface() called\n");
+    if (!ppv)
+	return E_INVALIDARG;
+    if (!memcmp(iid, &IID_IUnknown, 16))
     {
 	*ppv=(void*)This;
 	This->vt->AddRef(This);
 	return 0;
     }
-    if(!memcmp(iid, &IID_IMediaSample, 16))
+    if (!memcmp(iid, &IID_IMediaSample, 16))
     {
 	*ppv=(void*)This;
 	This->vt->AddRef(This);
 	return 0;
     }
-    return 0x80004002;
+    return E_NOINTERFACE;
 }
 
-long STDCALL CMediaSample::AddRef ( 
-    IUnknown * This)
+static long STDCALL CMediaSample_AddRef(IUnknown* This)
 {
-    Debug printf("CMediaSample::AddRef() called\n");
+    Debug printf("CMediaSample_AddRef() called\n");
     ((CMediaSample*)This)->refcount++;
     return 0;
 }
-        
-long STDCALL CMediaSample::Release ( 
-    IUnknown * This)
+
+static long STDCALL CMediaSample_Release(IUnknown* This)
 {
-    Debug printf("%x: CMediaSample::Release() called, new refcount %d\n", This, 
-	((CMediaSample*)This)->refcount-1);
+    Debug printf("%p: CMediaSample_Release() called, new refcount %d\n",
+		 This, ((CMediaSample*)This)->refcount-1);
     CMediaSample* parent=(CMediaSample*)This;
-    if(--((CMediaSample*)This)->refcount==0)
-	parent->
-	    all->
-		vt->
-		    ReleaseBuffer(
-			(IMemAllocator*)(parent->all), 
-			    (IMediaSample*)This);
+    if (--((CMediaSample*)This)->refcount==0)
+	parent->all->vt->ReleaseBuffer((IMemAllocator*)(parent->all),
+				       (IMediaSample*)This);
     return 0;
 }
-HRESULT STDCALL CMediaSample::GetPointer ( 
-    IMediaSample * This,
-    /* [out] */ BYTE **ppBuffer)
+
+static HRESULT STDCALL CMediaSample_GetPointer(IMediaSample * This,
+					       /* [out] */ BYTE **ppBuffer)
 {
-    Debug printf("%x: CMediaSample::GetPointer() called\n", This);
-    if(!ppBuffer)return 0x80004003;
+    Debug printf("%p: CMediaSample_GetPointer() called\n", This);
+    if (!ppBuffer)
+	return E_INVALIDARG;
     *ppBuffer=(BYTE *)((CMediaSample*)This)->block;
     return 0;
 }
 
-long STDCALL CMediaSample::GetSize ( 
-    IMediaSample * This)
+static long STDCALL CMediaSample_GetSize(IMediaSample * This)
 {
-    Debug printf("%x: CMediaSample::GetSize() called -> %d\n", This, ((CMediaSample*)This)->size);
+    Debug printf("%p: CMediaSample_GetSize() called -> %d\n",
+		 This, ((CMediaSample*)This)->size);
     return ((CMediaSample*)This)->size;
 }
 
-HRESULT STDCALL CMediaSample::GetTime ( 
-    IMediaSample * This,
-    /* [out] */ REFERENCE_TIME *pTimeStart,
-    /* [out] */ REFERENCE_TIME *pTimeEnd)
+static HRESULT STDCALL CMediaSample_GetTime(IMediaSample * This,
+					    /* [out] */ REFERENCE_TIME *pTimeStart,
+					    /* [out] */ REFERENCE_TIME *pTimeEnd)
 {
-    Debug printf("%x: CMediaSample::GetTime() called\n", This);
+    Debug printf("%p: CMediaSample_GetTime() called\n", This);
     return E_NOTIMPL;
 }
 
-HRESULT STDCALL CMediaSample::SetTime ( 
-    IMediaSample * This,
-    /* [in] */ REFERENCE_TIME *pTimeStart,
-    /* [in] */ REFERENCE_TIME *pTimeEnd)
+static HRESULT STDCALL CMediaSample_SetTime(IMediaSample * This,
+					    /* [in] */ REFERENCE_TIME *pTimeStart,
+					    /* [in] */ REFERENCE_TIME *pTimeEnd)
 {
-    Debug printf("%x: CMediaSample::SetTime() called\n", This);
+    Debug printf("%p: CMediaSample_SetTime() called\n", This);
     return E_NOTIMPL;
 }
 
-HRESULT STDCALL CMediaSample::IsSyncPoint ( 
-    IMediaSample * This)
+static HRESULT STDCALL CMediaSample_IsSyncPoint(IMediaSample * This)
 {
-    Debug printf("%x: CMediaSample::IsSyncPoint() called\n", This);
-    if(((CMediaSample*)This)->isSyncPoint)return 0;
+    Debug printf("%p: CMediaSample_IsSyncPoint() called\n", This);
+    if (((CMediaSample*)This)->isSyncPoint)
+	return 0;
     return 1;
 }
 
-HRESULT STDCALL CMediaSample::SetSyncPoint ( 
-    IMediaSample * This,
-    long bIsSyncPoint)
+static HRESULT STDCALL CMediaSample_SetSyncPoint(IMediaSample * This,
+						 long bIsSyncPoint)
 {
-    Debug printf("%x: CMediaSample::SetSyncPoint() called\n", This);
+    Debug printf("%p: CMediaSample_SetSyncPoint() called\n", This);
     ((CMediaSample*)This)->isSyncPoint=bIsSyncPoint;
     return 0;
 }
 
-HRESULT STDCALL CMediaSample::IsPreroll ( 
-    IMediaSample * This)
+static HRESULT STDCALL CMediaSample_IsPreroll(IMediaSample * This)
 {
-    Debug printf("%x: CMediaSample::IsPreroll() called\n", This);
-    if(((CMediaSample*)This)->isPreroll==0)
-	return 1;//S_FALSE
-    else
+    Debug printf("%p: CMediaSample_IsPreroll() called\n", This);
+
+    if (((CMediaSample*)This)->isPreroll)
 	return 0;//S_OK
+
+    return 1;//S_FALSE
 }
 
-HRESULT STDCALL CMediaSample::SetPreroll ( 
-    IMediaSample * This,
-    long bIsPreroll)
+static HRESULT STDCALL CMediaSample_SetPreroll(IMediaSample * This,
+					       long bIsPreroll)
 {
-    Debug printf("%x: CMediaSample::SetPreroll() called\n", This);
+    Debug printf("%p: CMediaSample_SetPreroll() called\n", This);
     ((CMediaSample*)This)->isPreroll=bIsPreroll;
     return 0;
 }
 
-long STDCALL CMediaSample::GetActualDataLength ( 
-    IMediaSample * This)
+static long STDCALL CMediaSample_GetActualDataLength(IMediaSample * This)
 {
-    Debug printf("%x: CMediaSample::GetActualDataLength() called -> %d\n", This, ((CMediaSample*)This)->actual_size);
+    Debug printf("%p: CMediaSample_GetActualDataLength() called -> %d\n", This, ((CMediaSample*)This)->actual_size);
     return ((CMediaSample*)This)->actual_size;
 }
 
-HRESULT STDCALL CMediaSample::SetActualDataLength ( 
-    IMediaSample * This,
-    long __MIDL_0010)
+static HRESULT STDCALL CMediaSample_SetActualDataLength(IMediaSample * This,
+							long __MIDL_0010)
 {
-    Debug printf("%x: CMediaSample::SetActualDataLength(%d) called\n", This, __MIDL_0010);
-    if(__MIDL_0010>((CMediaSample*)This)->size)
+    Debug printf("%p: CMediaSample_SetActualDataLength(%ld) called\n", This, __MIDL_0010);
+    if (__MIDL_0010 > ((CMediaSample*)This)->size)
     {
-	printf("%x: ERROR: CMediaSample buffer overflow\n", This);
+	printf("%p: ERROR: CMediaSample buffer overflow\n", This);
     }
     ((CMediaSample*)This)->actual_size=__MIDL_0010;
     return 0;
 }
 
-HRESULT STDCALL CMediaSample::GetMediaType ( 
-    IMediaSample * This,
-    AM_MEDIA_TYPE **ppMediaType)
+static HRESULT STDCALL CMediaSample_GetMediaType(IMediaSample * This,
+						 AM_MEDIA_TYPE **ppMediaType)
 {
-    Debug printf("%x: CMediaSample::GetMediaType() called\n", This);
+    Debug printf("%p: CMediaSample_GetMediaType() called\n", This);
     if(!ppMediaType)
-	return 0x80004003;
+	return E_INVALIDARG;
     if(!((CMediaSample*)This)->type_valid)
     {
 	*ppMediaType=0;
@@ -200,55 +144,101 @@
     (*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);    
+    memcpy((*ppMediaType)->pbFormat, t.pbFormat, t.cbFormat);
 //    *ppMediaType=0; //media type was not changed
-    return 0;    
+    return 0;
 }
 
-HRESULT STDCALL CMediaSample::SetMediaType ( 
-    IMediaSample * This,
-    AM_MEDIA_TYPE *pMediaType)
+static HRESULT STDCALL CMediaSample_SetMediaType(IMediaSample * This,
+						 AM_MEDIA_TYPE *pMediaType)
 {
-    Debug printf("%x: CMediaSample::SetMediaType() called\n", This);
-    if(!pMediaType)return 0x80004003;
-    AM_MEDIA_TYPE& t=((CMediaSample*)This)->media_type;
-    if(t.pbFormat)CoTaskMemFree(t.pbFormat);
-    t=*pMediaType;
-    t.pbFormat=(char*)CoTaskMemAlloc(t.cbFormat);
-    memcpy(t.pbFormat, pMediaType->pbFormat, t.cbFormat);     
+    Debug printf("%p: CMediaSample_SetMediaType() 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);
     ((CMediaSample*)This)->type_valid=1;
+
     return 0;
 }
 
-HRESULT STDCALL CMediaSample::IsDiscontinuity ( 
-    IMediaSample * This)
+static HRESULT STDCALL CMediaSample_IsDiscontinuity(IMediaSample * This)
 {
-    Debug printf("%x: CMediaSample::IsDiscontinuity() called\n", This);
+    Debug printf("%p: CMediaSample_IsDiscontinuity() called\n", This);
     return 1;
 }
 
-HRESULT STDCALL CMediaSample::SetDiscontinuity ( 
-    IMediaSample * This,
-    long bDiscontinuity)
+static HRESULT STDCALL CMediaSample_SetDiscontinuity(IMediaSample * This,
+						     long bDiscontinuity)
 {
-    Debug printf("%x: CMediaSample::SetDiscontinuity() called\n", This);
+    Debug printf("%p: CMediaSample_SetDiscontinuity() called\n", This);
+    return E_NOTIMPL;
+}
+
+static HRESULT STDCALL CMediaSample_GetMediaTime(IMediaSample * This,
+						 /* [out] */ LONGLONG *pTimeStart,
+						 /* [out] */ LONGLONG *pTimeEnd)
+{
+    Debug printf("%p: CMediaSample_GetMediaTime() called\n", This);
+    return E_NOTIMPL;
+}
+
+static HRESULT STDCALL CMediaSample_SetMediaTime(IMediaSample * This,
+						 /* [in] */ LONGLONG *pTimeStart,
+						 /* [in] */ LONGLONG *pTimeEnd)
+{
+    Debug printf("%p: CMediaSample_SetMediaTime() called\n", This);
     return E_NOTIMPL;
 }
 
-HRESULT STDCALL CMediaSample::GetMediaTime ( 
-    IMediaSample * This,
-    /* [out] */ LONGLONG *pTimeStart,
-    /* [out] */ LONGLONG *pTimeEnd)
+CMediaSample::CMediaSample(IMemAllocator* allocator, long _size)
 {
-    Debug printf("%x: CMediaSample::GetMediaTime() called\n", This);
-    return E_NOTIMPL;
+    vt = new IMediaSample_vt;
+
+    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);
 }
 
-HRESULT STDCALL CMediaSample::SetMediaTime ( 
-    IMediaSample * This,
-    /* [in] */ LONGLONG *pTimeStart,
-    /* [in] */ LONGLONG *pTimeEnd)    
+CMediaSample::~CMediaSample()
 {
-    Debug printf("%x: CMediaSample::SetMediaTime() called\n", This);
-    return E_NOTIMPL;
+    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);
 }
--- a/loader/dshow/cmediasample.h	Thu Aug 16 00:44:40 2001 +0000
+++ b/loader/dshow/cmediasample.h	Thu Aug 16 00:50:02 2001 +0000
@@ -1,99 +1,25 @@
-#ifndef _CMEDIASAMPLE_H
-#define _CMEDIASAMPLE_H
+#ifndef DS_CMEDIASAMPLE_H
+#define DS_CMEDIASAMPLE_H
 
 #include "interfaces.h"
 #include "guids.h"
-#include "default.h"
-class CMediaSample: public IMediaSample
+
+struct CMediaSample: public IMediaSample
 {
     IMemAllocator* all;
     int size;
     int actual_size;
     char* block;
-    char* old_block;
+    char* own_block;
     int refcount;
     int isPreroll;
     int isSyncPoint;
     AM_MEDIA_TYPE media_type;
     int type_valid;
-public:
     CMediaSample(IMemAllocator* allocator, long _size);
     ~CMediaSample();
-    void SetPointer(char* pointer) { old_block=block; block=pointer; }
-    void ResetPointer() { block=old_block; old_block=0; }
+    void SetPointer(char* pointer) { block = pointer; }
+    void ResetPointer() { block = own_block; }
+};
 
-    static long STDCALL QueryInterface ( 
-        IUnknown * This,
-        /* [in] */ IID* riid,
-        /* [iid_is][out] */ void **ppvObject);
-    
-    static long STDCALL AddRef ( 
-        IUnknown * This);
-        
-    static long STDCALL Release ( 
-        IUnknown * This);
-    
-    static HRESULT STDCALL GetPointer ( 
-        IMediaSample * This,
-        /* [out] */ BYTE **ppBuffer);
-    
-    static long STDCALL GetSize ( 
-        IMediaSample * This);
-    
-    static HRESULT STDCALL GetTime ( 
-        IMediaSample * This,
-        /* [out] */ REFERENCE_TIME *pTimeStart,
-        /* [out] */ REFERENCE_TIME *pTimeEnd);
-    
-    static HRESULT STDCALL SetTime ( 
-        IMediaSample * This,
-        /* [in] */ REFERENCE_TIME *pTimeStart,
-        /* [in] */ REFERENCE_TIME *pTimeEnd);
-    
-    static HRESULT STDCALL IsSyncPoint ( 
-        IMediaSample * This);
-    
-    static HRESULT STDCALL SetSyncPoint ( 
-        IMediaSample * This,
-        long bIsSyncPoint);
-    
-    static HRESULT STDCALL IsPreroll ( 
-        IMediaSample * This);
-    
-    static HRESULT STDCALL SetPreroll ( 
-        IMediaSample * This,
-        long bIsPreroll);
-    
-    static long STDCALL GetActualDataLength ( 
-        IMediaSample * This);
-    
-    static HRESULT STDCALL SetActualDataLength ( 
-        IMediaSample * This,
-        long __MIDL_0010);
-    
-    static HRESULT STDCALL GetMediaType ( 
-        IMediaSample * This,
-        AM_MEDIA_TYPE **ppMediaType);
-    
-    static HRESULT STDCALL SetMediaType ( 
-        IMediaSample * This,
-        AM_MEDIA_TYPE *pMediaType);
-    
-    static HRESULT STDCALL IsDiscontinuity ( 
-        IMediaSample * This);
-    
-    static HRESULT STDCALL SetDiscontinuity ( 
-        IMediaSample * This,
-        long bDiscontinuity);
-    
-    static HRESULT STDCALL GetMediaTime ( 
-        IMediaSample * This,
-        /* [out] */ LONGLONG *pTimeStart,
-        /* [out] */ LONGLONG *pTimeEnd);
-    
-    static HRESULT STDCALL SetMediaTime ( 
-        IMediaSample * This,
-        /* [in] */ LONGLONG *pTimeStart,
-        /* [in] */ LONGLONG *pTimeEnd);    
-};
-#endif
+#endif /* DS_CMEDIASAMPLE_H */
--- a/loader/dshow/guids.h	Thu Aug 16 00:44:40 2001 +0000
+++ b/loader/dshow/guids.h	Thu Aug 16 00:50:02 2001 +0000
@@ -1,9 +1,12 @@
 #ifndef GUIDS_H
 #define GUIDS_H
-//#include <loader.h>
-//#include <wine/winbase.h>
+
 #include <com.h>
-#include <formats.h>
+#include <wine/winbase.h>
+#include <wine/windef.h>
+#include <wine/winuser.h>
+#include <wine/vfw.h>
+//#include <formats.h>
 extern int DSHOW_DEBUG;
 #define Debug if(DSHOW_DEBUG)
 
@@ -20,43 +23,46 @@
     unsigned long     cbFormat;		//0x40
     char *pbFormat;			//0x44
 } AM_MEDIA_TYPE;
+
 typedef enum
 {
     PINDIR_INPUT	= 0,
     PINDIR_OUTPUT	= PINDIR_INPUT + 1
 } PIN_DIRECTION;
+
 typedef long long REFERENCE_TIME;
-//typedef long long LONGLONG;
+
 struct RECT32
 {
     int left, top, right, bottom;
 };
+
 typedef struct 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)
-
+    REFERENCE_TIME    AvgTimePerFrame;   // Average time per frame (100ns units)
     BITMAPINFOHEADER bmiHeader;
+} VIDEOINFOHEADER;
 
-} VIDEOINFOHEADER;
 typedef struct _AllocatorProperties
 {
     long cBuffers;
     long cbBuffer;
     long cbAlign;
     long cbPrefix;
-}   ALLOCATOR_PROPERTIES;
+} ALLOCATOR_PROPERTIES;
+
 struct IBaseFilter;
+
 typedef struct _PinInfo
 {
     IBaseFilter *pFilter;
     PIN_DIRECTION dir;
-    unsigned short achName[ 128 ];
-}   PIN_INFO;
-
+    unsigned short achName[128];
+} PIN_INFO;
 
 extern GUID IID_IBaseFilter;
 extern GUID IID_IEnumPins;
--- a/loader/dshow/inputpin.c	Thu Aug 16 00:44:40 2001 +0000
+++ b/loader/dshow/inputpin.c	Thu Aug 16 00:50:02 2001 +0000
@@ -1,40 +1,41 @@
 #include "inputpin.h"
+#include <wine/winerror.h>
+#include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
-#define E_NOTIMPL 0x80004001
+
 GUID CInputPin::interfaces[]=
 {
- IID_IUnknown,
+    IID_IUnknown,
 };
-IMPLEMENT_IUNKNOWN(CInputPin) 
+IMPLEMENT_IUNKNOWN(CInputPin)
 
 GUID CRemotePin::interfaces[]=
-{ 
- IID_IUnknown,
+{
+    IID_IUnknown,
 };
 IMPLEMENT_IUNKNOWN(CRemotePin)
- 
+
 GUID CRemotePin2::interfaces[]=
 {
- IID_IUnknown,
-}; 
+    IID_IUnknown,
+};
 IMPLEMENT_IUNKNOWN(CRemotePin2)
- 
+
 GUID CBaseFilter::interfaces[]=
 {
- IID_IUnknown,
- IID_IBaseFilter,
+    IID_IUnknown,
+    IID_IBaseFilter,
 };
 IMPLEMENT_IUNKNOWN(CBaseFilter)
 
 GUID CBaseFilter2::interfaces[]=
 {
- IID_IUnknown,
- IID_IBaseFilter,
- {0x76c61a30, 0xebe1, 0x11cf, {0x89, 0xf9, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xcb}}, 
- {0xaae7e4e2, 0x6388, 0x11d1, {0x8d, 0x93, 0x00, 0x60, 0x97, 0xc9, 0xa2, 0xb2}}, 
- {0x02ef04dd, 0x7580, 0x11d1, {0xbe, 0xce, 0x00, 0xc0, 0x4f, 0xb6, 0xe9, 0x37}}, 
+    IID_IUnknown,
+    IID_IBaseFilter,
+    {0x76c61a30, 0xebe1, 0x11cf, {0x89, 0xf9, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xcb}},
+    {0xaae7e4e2, 0x6388, 0x11d1, {0x8d, 0x93, 0x00, 0x60, 0x97, 0xc9, 0xa2, 0xb2}},
+    {0x02ef04dd, 0x7580, 0x11d1, {0xbe, 0xce, 0x00, 0xc0, 0x4f, 0xb6, 0xe9, 0x37}},
 };
 IMPLEMENT_IUNKNOWN(CBaseFilter2)
 
@@ -48,20 +49,20 @@
 public:
     CEnumPins(IPin*, IPin* =0);
     ~CEnumPins(){delete vt;}
-    static long STDCALL Next ( 
+    static long STDCALL Next (
         IEnumPins * This,
         /* [in] */ unsigned long cMediaTypes,
         /* [size_is][out] */ IPin **ppMediaTypes,
         /* [out] */ unsigned long *pcFetched);
-    
-    static long STDCALL Skip ( 
+
+    static long STDCALL Skip (
         IEnumPins * This,
         /* [in] */ unsigned long cMediaTypes);
-    
-    static long STDCALL Reset ( 
+
+    static long STDCALL Reset (
         IEnumPins * This);
-    
-    static long STDCALL Clone ( 
+
+    static long STDCALL Clone (
         IEnumPins * This,
         /* [out] */ IEnumPins **ppEnum);
 
@@ -79,74 +80,79 @@
     vt->QueryInterface = QueryInterface;
     vt->AddRef = AddRef;
     vt->Release = Release;
-    vt->Next = Next; 
-    vt->Skip = Skip; 
+    vt->Next = Next;
+    vt->Skip = Skip;
     vt->Reset = Reset;
-    vt->Clone = Clone; 
+    vt->Clone = Clone;
 }
 
-long STDCALL CEnumPins::Next ( 
-    IEnumPins * This,
-    /* [in] */ unsigned long cMediaTypes,
-    /* [size_is][out] */ IPin **ppMediaTypes,
-    /* [out] */ unsigned long *pcFetched)
+long STDCALL CEnumPins::Next(IEnumPins * This,
+			     /* [in] */ unsigned long cMediaTypes,
+			     /* [size_is][out] */ IPin **ppMediaTypes,
+			     /* [out] */ unsigned long *pcFetched)
 {
-    IPin* pin1=((CEnumPins*)This)->pin1;
-    IPin* pin2=((CEnumPins*)This)->pin2;
     Debug printf("CEnumPins::Next() called\n");
-    if(!ppMediaTypes)return 0x80004003;
-    if(!pcFetched && (cMediaTypes!=1))return 0x80004003;
-    if(cMediaTypes<=0)return 0;
-    int& counter=((CEnumPins*)This)->counter;
-    if(((counter==2) && pin2) || ((counter==1) && !pin2))
+    if (!ppMediaTypes)
+	return E_INVALIDARG;
+    if (!pcFetched && (cMediaTypes!=1))
+	return E_INVALIDARG;
+    if (cMediaTypes<=0)
+	return 0;
+    int& lcounter=((CEnumPins*)This)->counter;
+
+    IPin* lpin1=((CEnumPins*)This)->pin1;
+    IPin* lpin2=((CEnumPins*)This)->pin2;
+    if (((lcounter == 2) && lpin2) || ((lcounter == 1) && !lpin2))
     {
-	if(pcFetched)*pcFetched=0;
+	if (pcFetched)
+	    *pcFetched=0;
 	return 1;
     }
-    
-    if(pcFetched)*pcFetched=1;
-    if(counter==0)
+
+    if (pcFetched)
+	*pcFetched=1;
+    if (lcounter==0)
     {
-	*ppMediaTypes=pin1;
-	pin1->vt->AddRef((IUnknown*)pin1);
+	*ppMediaTypes = lpin1;
+	lpin1->vt->AddRef((IUnknown*)lpin1);
     }
     else
     {
-	*ppMediaTypes=pin2;
-	pin2->vt->AddRef((IUnknown*)pin2);
+	*ppMediaTypes = lpin2;
+	lpin2->vt->AddRef((IUnknown*)lpin2);
     }
-    counter++;
-    if(cMediaTypes==1)return 0;
+    lcounter++;
+    if (cMediaTypes == 1)
+	return 0;
     return 1;
 }
 
-long STDCALL CEnumPins::Skip ( 
-    IEnumPins * This,
-    /* [in] */ unsigned long cMediaTypes)
+long STDCALL CEnumPins::Skip(IEnumPins * This,
+			     /* [in] */ unsigned long cMediaTypes)
 {
     Debug printf("CEnumPins::Skip() called\n");
     return E_NOTIMPL;
 }
 
-long STDCALL CEnumPins::Reset ( 
-    IEnumPins * This)
+long STDCALL CEnumPins::Reset(IEnumPins * This)
 {
     Debug printf("CEnumPins::Reset() called\n");
     ((CEnumPins*)This)->counter=0;
     return 0;
 }
 
-long STDCALL CEnumPins::Clone ( 
-    IEnumPins * This,
-    /* [out] */ IEnumPins **ppEnum)
+long STDCALL CEnumPins::Clone(IEnumPins * This,
+			      /* [out] */ IEnumPins **ppEnum)
 {
     Debug printf("CEnumPins::Clone() called\n");
     return E_NOTIMPL;
 }
- 
+
 CInputPin::CInputPin(CBaseFilter* p, const AM_MEDIA_TYPE& vh)
-     : refcount(1), type(vh), parent(p)
+     : type(vh)
 {
+    refcount = 1;
+    parent = p;
     vt=new IPin_vt;
     vt->QueryInterface = QueryInterface;
     vt->AddRef = AddRef;
@@ -168,7 +174,7 @@
     vt->NewSegment = NewSegment;
 }
 
-long STDCALL CInputPin::Connect ( 
+long STDCALL CInputPin::Connect (
     IPin * This,
     /* [in] */ IPin *pReceivePin,
     /* [in] */ AM_MEDIA_TYPE *pmt)
@@ -177,90 +183,74 @@
     return E_NOTIMPL;
 }
 
-long STDCALL CInputPin::ReceiveConnection ( 
-    IPin * This,
-    /* [in] */ IPin *pConnector,
-    /* [in] */ const AM_MEDIA_TYPE *pmt)
+long STDCALL CInputPin::ReceiveConnection(IPin * This,
+					  /* [in] */ IPin *pConnector,
+					  /* [in] */ const AM_MEDIA_TYPE *pmt)
 {
     Debug printf("CInputPin::ReceiveConnection() called\n");
     return E_NOTIMPL;
 }
-	    
-long STDCALL CInputPin::Disconnect ( 
-    IPin * This)
+
+long STDCALL CInputPin::Disconnect(IPin * This)
 {
     Debug printf("CInputPin::Disconnect() called\n");
     return E_NOTIMPL;
 }
 
-
-long STDCALL CInputPin::ConnectedTo ( 
-    IPin * This,
-    /* [out] */ IPin **pPin)
+long STDCALL CInputPin::ConnectedTo(IPin * This, /* [out] */ IPin **pPin)
 {
     Debug printf("CInputPin::ConnectedTo() called\n");
     return E_NOTIMPL;
 }
 
-
-long STDCALL CInputPin::ConnectionMediaType ( 
-    IPin * This,
-    /* [out] */ AM_MEDIA_TYPE *pmt)
+long STDCALL CInputPin::ConnectionMediaType(IPin * This,
+					    /* [out] */ AM_MEDIA_TYPE *pmt)
 {
     Debug printf("CInputPin::ConnectionMediaType() called\n");
-    if(!pmt)return 0x80004003;
+    if(!pmt)return E_INVALIDARG;
     *pmt=((CInputPin*)This)->type;
     if(pmt->cbFormat>0)
     {
 	pmt->pbFormat=(char *)CoTaskMemAlloc(pmt->cbFormat);
 	memcpy(pmt->pbFormat, ((CInputPin*)This)->type.pbFormat, pmt->cbFormat);
-    }	
+    }
     return 0;
 }
 
-long STDCALL CInputPin::QueryPinInfo ( 
-    IPin * This,
-    /* [out] */ PIN_INFO *pInfo)
+long STDCALL CInputPin::QueryPinInfo(IPin * This, /* [out] */ PIN_INFO *pInfo)
 {
     Debug printf("CInputPin::QueryPinInfo() called\n");
     pInfo->dir=PINDIR_OUTPUT;
-    CBaseFilter* parent=((CInputPin*)This)->parent;
-    pInfo->pFilter=parent;
-    parent->vt->AddRef((IUnknown*)parent);
+    CBaseFilter* lparent=((CInputPin*)This)->parent;
+    pInfo->pFilter = lparent;
+    lparent->vt->AddRef((IUnknown*)lparent);
     pInfo->achName[0]=0;
     return 0;
 }
 
-
-long STDCALL CInputPin::QueryDirection ( 
-    IPin * This,
-    /* [out] */ PIN_DIRECTION *pPinDir)
+long STDCALL CInputPin::QueryDirection(IPin * This,
+				       /* [out] */ PIN_DIRECTION *pPinDir)
 {
     *pPinDir=PINDIR_OUTPUT;
     Debug printf("CInputPin::QueryDirection() called\n");
     return 0;
 }
 
-
-long STDCALL CInputPin::QueryId ( 
-    IPin * This,
-    /* [out] */ unsigned short* *Id)
+long STDCALL CInputPin::QueryId(IPin * This, /* [out] */ unsigned short* *Id)
 {
     Debug printf("CInputPin::QueryId() called\n");
     return E_NOTIMPL;
 }
 
-
-long STDCALL CInputPin::QueryAccept ( 
-    IPin * This,
-    /* [in] */ const AM_MEDIA_TYPE *pmt)
+long STDCALL CInputPin::QueryAccept(IPin * This,
+				    /* [in] */ const AM_MEDIA_TYPE *pmt)
 {
     Debug printf("CInputPin::QueryAccept() called\n");
     return E_NOTIMPL;
 }
 
 
-long STDCALL CInputPin::EnumMediaTypes ( 
+long STDCALL CInputPin::EnumMediaTypes (
     IPin * This,
     /* [out] */ IEnumMediaTypes **ppEnum)
 {
@@ -269,56 +259,46 @@
 }
 
 
-long STDCALL CInputPin::QueryInternalConnections ( 
-    IPin * This,
-    /* [out] */ IPin **apPin,
-    /* [out][in] */ unsigned long *nPin)
+long STDCALL CInputPin::QueryInternalConnections(IPin * This,
+						 /* [out] */ IPin **apPin,
+						 /* [out][in] */ unsigned long *nPin)
 {
     Debug printf("CInputPin::QueryInternalConnections() called\n");
     return E_NOTIMPL;
 }
 
-long STDCALL CInputPin::EndOfStream ( 
-    IPin * This)
+long STDCALL CInputPin::EndOfStream (IPin * This)
 {
     Debug printf("CInputPin::EndOfStream() called\n");
     return E_NOTIMPL;
 }
-    
-    
-long STDCALL CInputPin::BeginFlush ( 
-IPin * This)
+
+
+long STDCALL CInputPin::BeginFlush(IPin * This)
 {
     Debug printf("CInputPin::BeginFlush() called\n");
     return E_NOTIMPL;
 }
 
 
-long STDCALL CInputPin::EndFlush ( 
-    IPin * This)
+long STDCALL CInputPin::EndFlush(IPin * This)
 {
     Debug printf("CInputPin::EndFlush() called\n");
     return E_NOTIMPL;
 }
 
-long STDCALL CInputPin::NewSegment ( 
-    IPin * This,
-    /* [in] */ REFERENCE_TIME tStart,
-    /* [in] */ REFERENCE_TIME tStop,
-    /* [in] */ double dRate)
+long STDCALL CInputPin::NewSegment(IPin * This,
+				   /* [in] */ REFERENCE_TIME tStart,
+				   /* [in] */ REFERENCE_TIME tStop,
+				   /* [in] */ double dRate)
 {
     Debug printf("CInputPin::NewSegment() called\n");
     return E_NOTIMPL;
 }
 
-
-
-
-
-
 CBaseFilter::CBaseFilter(const AM_MEDIA_TYPE& type, CBaseFilter2* parent)
-    : refcount(1)
 {
+    refcount = 1;
     pin=new CInputPin(this, type);
     unused_pin=new CRemotePin(this, parent->GetPin());
     vt=new IBaseFilter_vt;
@@ -329,7 +309,7 @@
     vt->Stop = Stop;
     vt->Pause = Pause;
     vt->Run = Run;
-    vt->GetState = GetState; 
+    vt->GetState = GetState;
     vt->SetSyncSource = SetSyncSource;
     vt->GetSyncSource = GetSyncSource;
     vt->EnumPins = EnumPins;
@@ -339,114 +319,104 @@
     vt->QueryVendorInfo = QueryVendorInfo;
 }
 
-long STDCALL CBaseFilter::GetClassID ( 
-        IBaseFilter * This,
-        /* [out] */ CLSID *pClassID)
+long STDCALL CBaseFilter::GetClassID(IBaseFilter * This,
+				      /* [out] */ CLSID *pClassID)
 {
     Debug printf("CBaseFilter::GetClassID() called\n");
     return E_NOTIMPL;
-}    
+}
 
-long STDCALL CBaseFilter::Stop ( 
-        IBaseFilter * This)
+long STDCALL CBaseFilter::Stop(IBaseFilter * This)
 {
     Debug printf("CBaseFilter::Stop() called\n");
     return E_NOTIMPL;
-}    
+}
 
-    
-long STDCALL CBaseFilter::Pause ( 
-        IBaseFilter * This)
+long STDCALL CBaseFilter::Pause(IBaseFilter * This)
 {
     Debug printf("CBaseFilter::Pause() called\n");
     return E_NOTIMPL;
-}    
-    
-long STDCALL CBaseFilter::Run ( 
-        IBaseFilter * This,
-        REFERENCE_TIME tStart)
+}
+
+long STDCALL CBaseFilter::Run(IBaseFilter * This,
+			      REFERENCE_TIME tStart)
 {
     Debug printf("CBaseFilter::Run() called\n");
     return E_NOTIMPL;
-}    
+}
 
-    
-long STDCALL CBaseFilter::GetState ( 
-        IBaseFilter * This,
-        /* [in] */ unsigned long dwMilliSecsTimeout,
-//        /* [out] */ FILTER_STATE *State)
-    	void* State)
+long STDCALL CBaseFilter::GetState(IBaseFilter * This,
+				   /* [in] */ unsigned long dwMilliSecsTimeout,
+				   // /* [out] */ FILTER_STATE *State)
+				   void* State)
 {
     Debug printf("CBaseFilter::GetState() called\n");
     return E_NOTIMPL;
-}    
+}
 
-    
-long STDCALL CBaseFilter::SetSyncSource ( 
-        IBaseFilter * This,
-        /* [in] */ IReferenceClock *pClock)
+long STDCALL CBaseFilter::SetSyncSource(IBaseFilter * This,
+					/* [in] */ IReferenceClock *pClock)
 {
     Debug printf("CBaseFilter::SetSyncSource() called\n");
     return E_NOTIMPL;
-}    
+}
 
-    
-long STDCALL CBaseFilter::GetSyncSource ( 
+long STDCALL CBaseFilter::GetSyncSource (
         IBaseFilter * This,
         /* [out] */ IReferenceClock **pClock)
 {
     Debug printf("CBaseFilter::GetSyncSource() called\n");
     return E_NOTIMPL;
-}    
+}
 
-    
-long STDCALL CBaseFilter::EnumPins ( 
+
+long STDCALL CBaseFilter::EnumPins (
         IBaseFilter * This,
         /* [out] */ IEnumPins **ppEnum)
 {
     Debug printf("CBaseFilter::EnumPins() called\n");
     *ppEnum=new CEnumPins(((CBaseFilter*)This)->pin, ((CBaseFilter*)This)->unused_pin);
     return 0;
-}    
+}
 
-    
-long STDCALL CBaseFilter::FindPin ( 
+
+long STDCALL CBaseFilter::FindPin (
         IBaseFilter * This,
         /* [string][in] */ const unsigned short* Id,
         /* [out] */ IPin **ppPin)
 {
     Debug printf("CBaseFilter::FindPin() called\n");
     return E_NOTIMPL;
-}    
+}
 
-    
-long STDCALL CBaseFilter::QueryFilterInfo ( 
+
+long STDCALL CBaseFilter::QueryFilterInfo (
         IBaseFilter * This,
 //        /* [out] */ FILTER_INFO *pInfo)
 	void* pInfo)
 {
     Debug printf("CBaseFilter::QueryFilterInfo() called\n");
     return E_NOTIMPL;
-}    
+}
 
-    
-long STDCALL CBaseFilter::JoinFilterGraph ( 
+
+long STDCALL CBaseFilter::JoinFilterGraph (
         IBaseFilter * This,
         /* [in] */ IFilterGraph *pGraph,
         /* [string][in] */ const unsigned short* pName)
 {
     Debug printf("CBaseFilter::JoinFilterGraph() called\n");
     return E_NOTIMPL;
-}    
+}
 
-    
-long STDCALL CBaseFilter::QueryVendorInfo ( 
+
+long STDCALL CBaseFilter::QueryVendorInfo (
         IBaseFilter * This,
         /* [string][out] */ unsigned short* *pVendorInfo)
 {
     Debug printf("CBaseFilter::QueryVendorInfo() called\n");
     return E_NOTIMPL;
-}    
+}
 
 
 CBaseFilter2::CBaseFilter2() : refcount(1)
@@ -461,7 +431,7 @@
     vt->Stop = Stop;
     vt->Pause = Pause;
     vt->Run = Run;
-    vt->GetState = GetState; 
+    vt->GetState = GetState;
     vt->SetSyncSource = SetSyncSource;
     vt->GetSyncSource = GetSyncSource;
     vt->EnumPins = EnumPins;
@@ -470,74 +440,40 @@
     vt->JoinFilterGraph = JoinFilterGraph;
     vt->QueryVendorInfo = QueryVendorInfo;
 }
-CRemotePin2::CRemotePin2(CBaseFilter2* p):parent(p),
-    refcount(1)
-{
-    vt=new IPin_vt;
-    memset(vt, 0, sizeof (IPin_vt));
-    vt->QueryInterface = QueryInterface;
-    vt->AddRef = AddRef;
-    vt->Release = Release;
-    vt->QueryPinInfo=QueryPinInfo;
-}
-CRemotePin::CRemotePin(CBaseFilter* pt, IPin* rpin): parent(pt), remote_pin(rpin),
-    refcount(1)
-{
-    vt=new IPin_vt;
-    memset(vt, 0, sizeof (IPin_vt));
-    vt->QueryInterface = QueryInterface;
-    vt->AddRef = AddRef;
-    vt->Release = Release;
-    vt->QueryDirection = QueryDirection;
-    vt->ConnectedTo = ConnectedTo;
-    vt->ConnectionMediaType = ConnectionMediaType;
-    vt->QueryPinInfo = QueryPinInfo;
-}
 
 
 
 
-
-
-
-
-
-
-
-
-long STDCALL CBaseFilter2::GetClassID ( 
+long STDCALL CBaseFilter2::GetClassID (
         IBaseFilter * This,
         /* [out] */ CLSID *pClassID)
 {
     Debug printf("CBaseFilter2::GetClassID() called\n");
     return E_NOTIMPL;
-}    
+}
 
-long STDCALL CBaseFilter2::Stop ( 
+long STDCALL CBaseFilter2::Stop (
         IBaseFilter * This)
 {
     Debug printf("CBaseFilter2::Stop() called\n");
     return E_NOTIMPL;
-}    
+}
 
-    
-long STDCALL CBaseFilter2::Pause ( 
-        IBaseFilter * This)
+
+long STDCALL CBaseFilter2::Pause (IBaseFilter * This)
 {
     Debug printf("CBaseFilter2::Pause() called\n");
     return E_NOTIMPL;
-}    
-    
-long STDCALL CBaseFilter2::Run ( 
-        IBaseFilter * This,
-        REFERENCE_TIME tStart)
+}
+
+long STDCALL CBaseFilter2::Run (IBaseFilter * This, REFERENCE_TIME tStart)
 {
     Debug printf("CBaseFilter2::Run() called\n");
     return E_NOTIMPL;
-}    
+}
 
-    
-long STDCALL CBaseFilter2::GetState ( 
+
+long STDCALL CBaseFilter2::GetState (
         IBaseFilter * This,
         /* [in] */ unsigned long dwMilliSecsTimeout,
 //        /* [out] */ FILTER_STATE *State)
@@ -545,123 +481,145 @@
 {
     Debug printf("CBaseFilter2::GetState() called\n");
     return E_NOTIMPL;
-}    
+}
 
-    
-long STDCALL CBaseFilter2::SetSyncSource ( 
+
+long STDCALL CBaseFilter2::SetSyncSource (
         IBaseFilter * This,
         /* [in] */ IReferenceClock *pClock)
 {
     Debug printf("CBaseFilter2::SetSyncSource() called\n");
     return E_NOTIMPL;
-}    
+}
 
-    
-long STDCALL CBaseFilter2::GetSyncSource ( 
+
+long STDCALL CBaseFilter2::GetSyncSource (
         IBaseFilter * This,
         /* [out] */ IReferenceClock **pClock)
 {
     Debug printf("CBaseFilter2::GetSyncSource() called\n");
     return E_NOTIMPL;
-}    
+}
 
-    
-long STDCALL CBaseFilter2::EnumPins ( 
+
+long STDCALL CBaseFilter2::EnumPins (
         IBaseFilter * This,
         /* [out] */ IEnumPins **ppEnum)
 {
     Debug printf("CBaseFilter2::EnumPins() called\n");
     *ppEnum=new CEnumPins(((CBaseFilter2*)This)->pin);
     return 0;
-}    
+}
 
-    
-long STDCALL CBaseFilter2::FindPin ( 
+
+long STDCALL CBaseFilter2::FindPin (
         IBaseFilter * This,
         /* [string][in] */ const unsigned short* Id,
         /* [out] */ IPin **ppPin)
 {
     Debug printf("CBaseFilter2::FindPin() called\n");
     return E_NOTIMPL;
-}    
+}
 
-    
-long STDCALL CBaseFilter2::QueryFilterInfo ( 
+
+long STDCALL CBaseFilter2::QueryFilterInfo (
         IBaseFilter * This,
 //        /* [out] */ FILTER_INFO *pInfo)
 	void* pInfo)
 {
     Debug printf("CBaseFilter2::QueryFilterInfo() called\n");
     return E_NOTIMPL;
-}    
+}
+
 
-    
-long STDCALL CBaseFilter2::JoinFilterGraph ( 
-        IBaseFilter * This,
-        /* [in] */ IFilterGraph *pGraph,
-        /* [string][in] */ const unsigned short* pName)
+long STDCALL CBaseFilter2::JoinFilterGraph(IBaseFilter * This,
+					   /* [in] */ IFilterGraph *pGraph,
+					   /* [string][in] */
+					   const unsigned short* pName)
 {
     Debug printf("CBaseFilter2::JoinFilterGraph() called\n");
     return E_NOTIMPL;
-}    
+}
 
-    
-long STDCALL CBaseFilter2::QueryVendorInfo ( 
-        IBaseFilter * This,
-        /* [string][out] */ unsigned short* *pVendorInfo)
+long STDCALL CBaseFilter2::QueryVendorInfo(IBaseFilter * This,
+					   /* [string][out] */
+					   unsigned short* *pVendorInfo)
 {
     Debug printf("CBaseFilter2::QueryVendorInfo() called\n");
     return E_NOTIMPL;
-}    
+}
+
+static long STDCALL CRemotePin_ConnectedTo(IPin * This, /* [out] */ IPin **pPin)
+{
+    Debug printf("CRemotePin::ConnectedTo called\n");
+    if (!pPin)
+	return E_INVALIDARG;
+    *pPin=((CRemotePin*)This)->remote_pin;
+    (*pPin)->vt->AddRef((IUnknown*)(*pPin));
+    return 0;
+}
 
-long STDCALL CRemotePin::ConnectionMediaType ( 
-    IPin * This,
-    /* [out] */ AM_MEDIA_TYPE *pmt)
+static long STDCALL CRemotePin_QueryDirection(IPin * This,
+					      /* [out] */ PIN_DIRECTION *pPinDir)
+{
+    Debug printf("CRemotePin::QueryDirection called\n");
+    if (!pPinDir)
+	return E_INVALIDARG;
+    *pPinDir=PINDIR_INPUT;
+    return 0;
+}
+
+static long STDCALL CRemotePin_ConnectionMediaType(IPin* This, /* [out] */ AM_MEDIA_TYPE* pmt)
 {
     Debug printf("CRemotePin::ConnectionMediaType() called\n");
     return E_NOTIMPL;
 }
 
-long STDCALL CRemotePin::QueryPinInfo ( 
-    IPin * This,
-    /* [out] */ PIN_INFO *pInfo)
+static long STDCALL CRemotePin_QueryPinInfo(IPin* This, /* [out] */ PIN_INFO* pInfo)
 {
     Debug printf("CRemotePin::QueryPinInfo() called\n");
     pInfo->dir=PINDIR_INPUT;
-    CBaseFilter* parent=((CRemotePin*)This)->parent;
-    pInfo->pFilter=parent;
-    parent->vt->AddRef((IUnknown*)parent);
+    CBaseFilter* lparent = ((CRemotePin*)This)->parent;
+    pInfo->pFilter = lparent;
+    lparent->vt->AddRef((IUnknown*)lparent);
+    pInfo->achName[0]=0;
+    return 0;
+}
+
+
+static long STDCALL CRemotePin2_QueryPinInfo(IPin * This,
+				       /* [out] */ PIN_INFO *pInfo)
+{
+    Debug printf("CRemotePin2::QueryPinInfo called\n");
+    CBaseFilter2* lparent=((CRemotePin2*)This)->parent;
+    pInfo->pFilter=(IBaseFilter*)lparent;
+    lparent->vt->AddRef((IUnknown*)lparent);
+    pInfo->dir=PINDIR_OUTPUT;
     pInfo->achName[0]=0;
     return 0;
 }
-    long STDCALL CRemotePin2::QueryPinInfo ( 
-        IPin * This,
-        /* [out] */ PIN_INFO *pInfo)
-    {
-	Debug printf("CRemotePin2::QueryPinInfo called\n");
-	CBaseFilter2* parent=((CRemotePin2*)This)->parent;	
-	pInfo->pFilter=(IBaseFilter*)parent;
-	parent->vt->AddRef((IUnknown*)parent);
-	pInfo->dir=PINDIR_OUTPUT;
-	pInfo->achName[0]=0;
-	return 0;	
-    }
-    long STDCALL CRemotePin::ConnectedTo ( 
-        IPin * This,
-        /* [out] */ IPin **pPin)
-    {
-    	Debug printf("CRemotePin::ConnectedTo called\n");
-	if(!pPin)return 0x80004003;
-	*pPin=((CRemotePin*)This)->remote_pin;
-	(*pPin)->vt->AddRef((IUnknown*)(*pPin));
-	return 0;
-    }
-    long STDCALL CRemotePin::QueryDirection (
-        IPin * This,
-        /* [out] */ PIN_DIRECTION *pPinDir)
-    {
-	Debug printf("CRemotePin::QueryDirection called\n");
-	if(!pPinDir)return 0x80004003;
-	*pPinDir=PINDIR_INPUT;
-	return 0;
-    }
+
+CRemotePin::CRemotePin(CBaseFilter* pt, IPin* rpin): parent(pt), remote_pin(rpin),
+    refcount(1)
+{
+    vt = new IPin_vt;
+    memset(vt, 0, sizeof(IPin_vt));
+    vt->QueryInterface = QueryInterface;
+    vt->AddRef = AddRef;
+    vt->Release = Release;
+    vt->QueryDirection = CRemotePin_QueryDirection;
+    vt->ConnectedTo = CRemotePin_ConnectedTo;
+    vt->ConnectionMediaType = CRemotePin_ConnectionMediaType;
+    vt->QueryPinInfo = CRemotePin_QueryPinInfo;
+}
+
+CRemotePin2::CRemotePin2(CBaseFilter2* p):parent(p),
+    refcount(1)
+{
+    vt = new IPin_vt;
+    memset(vt, 0, sizeof(IPin_vt));
+    vt->QueryInterface = QueryInterface;
+    vt->AddRef = AddRef;
+    vt->Release = Release;
+    vt->QueryPinInfo = CRemotePin2_QueryPinInfo;
+}
--- a/loader/dshow/inputpin.h	Thu Aug 16 00:44:40 2001 +0000
+++ b/loader/dshow/inputpin.h	Thu Aug 16 00:50:02 2001 +0000
@@ -1,5 +1,6 @@
-#ifndef INPUTPIN_H
-#define INPUTPIN_H
+#ifndef DS_INPUTPIN_H
+#define DS_INPUTPIN_H
+
 #include "interfaces.h"
 #include "guids.h"
 #include "iunk.h"
@@ -17,61 +18,39 @@
     
     IPin* GetPin() {return pin;}
     IPin* GetUnusedPin() {return unused_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 GetClassID (IBaseFilter * This,
+				    /* [out] */ CLSID *pClassID);
     
-    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);
+    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);
 };
+
 class CInputPin: public IPin
 {
     AM_MEDIA_TYPE type;
@@ -214,52 +193,24 @@
         /* [string][out] */ unsigned short* *pVendorInfo);
 };
 
-class CRemotePin: public IPin
+
+struct CRemotePin: public IPin
 {
     CBaseFilter* parent;
     IPin* remote_pin;
     static GUID interfaces[];
     DECLARE_IUNKNOWN(CRemotePin)
-public:
     CRemotePin(CBaseFilter* pt, IPin* rpin);
     ~CRemotePin(){delete vt;}
-
-//    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 ConnectedTo ( 
-        IPin * This,
-        /* [out] */ IPin **pPin);
-
-    static long STDCALL QueryDirection (
-        IPin * This,
-        /* [out] */ PIN_DIRECTION *pPinDir);
-
-    static long STDCALL ConnectionMediaType ( 
-        IPin * This,
-        /* [out] */ AM_MEDIA_TYPE *pmt);
-    
-    static long STDCALL QueryPinInfo ( 
-        IPin * This,
-        /* [out] */ PIN_INFO *pInfo);
-    
 };
 
-
-class CRemotePin2: public IPin
+struct CRemotePin2: public IPin
 {
     CBaseFilter2* parent;
     static GUID interfaces[];
     DECLARE_IUNKNOWN(CRemotePin2)
-public:
     CRemotePin2(CBaseFilter2* parent);
     ~CRemotePin2(){delete vt;}
-    
-    static long STDCALL QueryPinInfo ( 
-        IPin * This,
-        /* [out] */ PIN_INFO *pInfo);
 };
 
-
-#endif
+#endif /* DS_INPUTPIN_H */
--- a/loader/dshow/interfaces.h	Thu Aug 16 00:44:40 2001 +0000
+++ b/loader/dshow/interfaces.h	Thu Aug 16 00:50:02 2001 +0000
@@ -1,18 +1,19 @@
+#ifndef DS_INTERFACES_H
+#define DS_INTERFACES_H
+
 /*
 
-    Definition of important DirectShow interfaces.
-    Created using freely-available DirectX 8.0 SDK
-    ( http://msdn.microsoft.com )
+Definition of important DirectShow interfaces.
+Created using freely-available DirectX 8.0 SDK
+( http://msdn.microsoft.com )
 
 */
-#ifndef INTERFACES_H
-#define INTERFACES_H
 
+#include <com.h>
 #include "guids.h"
-#include "default.h"
-#include <com.h>
+
 #ifndef STDCALL
-#define STDCALL __attribute__((__stdcall__))	
+#define STDCALL __attribute__((__stdcall__))
 #endif
 
 typedef GUID& REFIID;
@@ -30,6 +31,8 @@
 struct IMemInputPin;
 struct IMemAllocator;
 struct IMediaSample;
+struct IHidden;
+struct IHidden2;
 
 enum PIN_DIRECTION;
 
@@ -44,57 +47,33 @@
 
 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);
-    
+    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
@@ -102,96 +81,56 @@
     struct IBaseFilter_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);
-        
+    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
 {
-     struct IEnumPins_vt *vt;
+    struct IEnumPins_vt *vt;
 };
 
 
 struct IPin_vt: IUnknown_vt
 {
-        HRESULT STDCALL ( *Connect )( 
-            IPin * This,
-            /* [in] */ IPin *pReceivePin,
-            /* [in] */ /*const*/ AM_MEDIA_TYPE *pmt);
-        
-        HRESULT STDCALL ( *ReceiveConnection )( 
-            IPin * This,
-            /* [in] */ IPin *pConnector,
-            /* [in] */ const AM_MEDIA_TYPE *pmt);
-        
-        HRESULT STDCALL ( *Disconnect )( 
-            IPin * This);
-        
-        HRESULT STDCALL ( *ConnectedTo )( 
-            IPin * This,
-            /* [out] */ IPin **pPin);
-        
-        HRESULT STDCALL ( *ConnectionMediaType )( 
-            IPin * This,
-            /* [out] */ AM_MEDIA_TYPE *pmt);
-        
-        HRESULT STDCALL ( *QueryPinInfo )( 
-            IPin * This,
-            /* [out] */ PIN_INFO *pInfo);
-        
-        HRESULT STDCALL ( *QueryDirection )( 
-            IPin * This,
-            /* [out] */ PIN_DIRECTION *pPinDir);
-        
-        HRESULT STDCALL ( *QueryId )( 
-            IPin * This,
-            /* [out] */ unsigned short* *Id);
-        
-        HRESULT STDCALL ( *QueryAccept )( 
-            IPin * This,
-            /* [in] */ const AM_MEDIA_TYPE *pmt);
-        
-        HRESULT STDCALL ( *EnumMediaTypes )( 
-            IPin * This,
-            /* [out] */ IEnumMediaTypes **ppEnum);
-        
-        HRESULT STDCALL ( *QueryInternalConnections )( 
-            IPin * This,
-            /* [out] */ IPin **apPin,
-            /* [out][in] */ unsigned long *nPin);
-        
-        HRESULT STDCALL ( *EndOfStream )( 
-            IPin * This);
-        
-        HRESULT STDCALL ( *BeginFlush )( 
-            IPin * This);
-        
-        HRESULT STDCALL ( *EndFlush )( 
-            IPin * This);
-        
-        HRESULT STDCALL ( *NewSegment )( 
-            IPin * This,
-            /* [in] */ REFERENCE_TIME tStart,
-            /* [in] */ REFERENCE_TIME tStop,
-            /* [in] */ double dRate);
-        
+    HRESULT STDCALL ( *Connect )(IPin * This,
+				 /* [in] */ IPin *pReceivePin,
+				 /* [in] */ /*const*/ AM_MEDIA_TYPE *pmt);
+    HRESULT STDCALL ( *ReceiveConnection )(IPin * This,
+					   /* [in] */ IPin *pConnector,
+					   /* [in] */ const AM_MEDIA_TYPE *pmt);
+    HRESULT STDCALL ( *Disconnect )(IPin * This);
+    HRESULT STDCALL ( *ConnectedTo )(IPin * This, /* [out] */ IPin **pPin);
+    HRESULT STDCALL ( *ConnectionMediaType )(IPin * This,
+					     /* [out] */ AM_MEDIA_TYPE *pmt);
+    HRESULT STDCALL ( *QueryPinInfo )(IPin * This, /* [out] */ PIN_INFO *pInfo);
+    HRESULT STDCALL ( *QueryDirection )(IPin * This,
+					/* [out] */ PIN_DIRECTION *pPinDir);
+    HRESULT STDCALL ( *QueryId )(IPin * This, /* [out] */ unsigned short* *Id);
+    HRESULT STDCALL ( *QueryAccept )(IPin * This,
+				     /* [in] */ const AM_MEDIA_TYPE *pmt);
+    HRESULT STDCALL ( *EnumMediaTypes )(IPin * This,
+					/* [out] */ IEnumMediaTypes **ppEnum);
+    HRESULT STDCALL ( *QueryInternalConnections )(IPin * This,
+						  /* [out] */ IPin **apPin,
+						  /* [out][in] */ unsigned long *nPin);
+    HRESULT STDCALL ( *EndOfStream )(IPin * This);
+    HRESULT STDCALL ( *BeginFlush )(IPin * This);
+    HRESULT STDCALL ( *EndFlush )(IPin * This);
+    HRESULT STDCALL ( *NewSegment )(IPin * This,
+				    /* [in] */ REFERENCE_TIME tStart,
+				    /* [in] */ REFERENCE_TIME tStop,
+				    /* [in] */ double dRate);
 };
 
 struct IPin
@@ -199,24 +138,18 @@
     IPin_vt *vt;
 };
 
+
 struct IEnumMediaTypes_vt: IUnknown_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);
+    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);
 };
 
 struct IEnumMediaTypes
@@ -224,34 +157,23 @@
     IEnumMediaTypes_vt *vt;
 };
 
-    
+
 struct IMemInputPin_vt: IUnknown_vt
 {
-    HRESULT STDCALL ( *GetAllocator )( 
-        IMemInputPin * This,
-        /* [out] */ IMemAllocator **ppAllocator);
-    
-    HRESULT STDCALL ( *NotifyAllocator )( 
-        IMemInputPin * This,
-        /* [in] */ IMemAllocator *pAllocator,
-        /* [in] */ int bReadOnly);
-    
-    HRESULT STDCALL ( *GetAllocatorRequirements )( 
-            IMemInputPin * This,
-        /* [out] */ ALLOCATOR_PROPERTIES *pProps);
-    
-    HRESULT STDCALL ( *Receive )( 
-        IMemInputPin * This,
-        /* [in] */ IMediaSample *pSample);
-    
-    HRESULT STDCALL ( *ReceiveMultiple )( 
-        IMemInputPin * This,
-        /* [size_is][in] */ IMediaSample **pSamples,
-        /* [in] */ long nSamples,
-        /* [out] */ long *nSamplesProcessed);
-    
-    HRESULT STDCALL ( *ReceiveCanBlock )( 
-        IMemInputPin * This);
+    HRESULT STDCALL ( *GetAllocator )(IMemInputPin * This,
+				      /* [out] */ IMemAllocator **ppAllocator);
+    HRESULT STDCALL ( *NotifyAllocator )(IMemInputPin * This,
+					 /* [in] */ IMemAllocator *pAllocator,
+					 /* [in] */ int bReadOnly);
+    HRESULT STDCALL ( *GetAllocatorRequirements )(IMemInputPin * This,
+						  /* [out] */ ALLOCATOR_PROPERTIES *pProps);
+    HRESULT STDCALL ( *Receive )(IMemInputPin * This,
+				 /* [in] */ IMediaSample *pSample);
+    HRESULT STDCALL ( *ReceiveMultiple )(IMemInputPin * This,
+					 /* [size_is][in] */ IMediaSample **pSamples,
+					 /* [in] */ long nSamples,
+					 /* [out] */ long *nSamplesProcessed);
+    HRESULT STDCALL ( *ReceiveCanBlock )(IMemInputPin * This);
 };
 
 struct IMemInputPin
@@ -259,35 +181,23 @@
     IMemInputPin_vt *vt;
 };
 
-    
 
 struct IMemAllocator_vt: IUnknown_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);
+    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
@@ -295,70 +205,40 @@
     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);
+    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
@@ -366,39 +246,27 @@
     struct IMediaSample_vt *vt;
 };
 
-struct IHidden;    
+
 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);
+    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);
 };
-    
+
 struct IHidden
 {
     struct IHidden_vt *vt;
 };
 
-struct IHidden2;
 struct IHidden2_vt: IUnknown_vt
 {
     HRESULT STDCALL (*unk1) ();
@@ -410,8 +278,10 @@
     HRESULT STDCALL (*unk7) ();
     HRESULT STDCALL (*unk8) ();
 };
+
 struct IHidden2
 {
     struct IHidden2_vt *vt;
 };
-#endif
+
+#endif  /* DS_INTERFACES_H */
--- a/loader/dshow/iunk.h	Thu Aug 16 00:44:40 2001 +0000
+++ b/loader/dshow/iunk.h	Thu Aug 16 00:50:02 2001 +0000
@@ -1,20 +1,22 @@
-#ifndef _iunk_h
-#define _iunk_h
+#ifndef DS_IUNK_H
+#define DS_IUNK_H
+
 #include "interfaces.h"
 #include "guids.h"
+
 #define DECLARE_IUNKNOWN(CLASSNAME) \
     int refcount; \
-    static long STDCALL QueryInterface (IUnknown * This, GUID* riid, void **ppvObject); \
+    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) \
+long STDCALL CLASSNAME ::QueryInterface(IUnknown * This, GUID* riid, void **ppvObject) \
 { \
     Debug printf(#CLASSNAME "::QueryInterface() called\n");\
-    if(!ppvObject)return 0x80004003; 		\
-    CLASSNAME * me=( CLASSNAME *)This; 		\
-    int i=0; 					\
+    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)) 		\
 	{ 					\
@@ -23,7 +25,7 @@
 	    return 0; 				\
 	} 					\
     Debug printf("Failed\n");			\
-    return 0x80004002; 				\
+    return E_NOINTERFACE;			\
 } 						\
 						\
 long STDCALL CLASSNAME ::AddRef ( 		\
@@ -44,4 +46,4 @@
     return 0; 					\
 }
 
-#endif
+#endif /* DS_IUNK_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loader/dshow/libwin32.h	Thu Aug 16 00:50:02 2001 +0000
@@ -0,0 +1,306 @@
+#ifndef __LIBWIN32_H
+#define __LIBWIN32_H
+
+#define VFW_E_INVALIDMEDIATYPE  	0x80040200
+#define VFW_E_INVALIDSUBTYPE    	0x80040201
+#define VFW_E_ALREADY_CONNECTED         0x80040204
+#define VFW_E_FILTER_ACTIVE             0x80040205
+#define VFW_E_NO_ACCEPTABLE_TYPES       0x80040207
+#define VFW_E_NOT_CONNECTED             0x80040209
+#define VFW_E_NO_ALLOCATOR              0x8004020A
+#define VFW_E_NOT_RUNNING               0x80040226
+#define VFW_E_TYPE_NOT_ACCEPTED         0x8004022A
+#define VFW_E_SAMPLE_REJECTED           0x8004022B
+
+#include <sys/types.h>
+#include <inttypes.h>
+
+#ifndef NOAVIFILE_HEADERS
+#include <audiodecoder.h>
+#include <audioencoder.h>
+#include <videodecoder.h>
+#include <videoencoder.h>
+#include <except.h>
+#include <fourcc.h>
+
+#else
+// code for mplayer team
+
+#define FATAL(a)  // you don't need exception - if you want - just fill more code
+#include <wine/mmreg.h>
+#include <wine/winreg.h>
+#include <wine/vfw.h>
+#include <com.h>
+#include <string>
+
+typedef unsigned int fourcc_t;
+struct FatalError
+{
+    FatalError();
+    void PrintAll() {}
+};
+
+struct CodecInfo
+{
+    std::string dll;
+    GUID guid;
+};
+
+struct CImage { // public  your_libvo_mem
+    char* ptr;
+    char* Data() { return ptr; }  // pointer to memory block
+	/* if you support such surface: */
+    static bool Supported(fourcc_t csp, int bits) { return true; }
+};
+
+// might be minimalized to contain just those which are needed by DS_VideoDecoder
+
+#ifndef mmioFOURCC
+#define mmioFOURCC( ch0, ch1, ch2, ch3 )				\
+		( (long)(unsigned char)(ch0) | ( (long)(unsigned char)(ch1) << 8 ) |	\
+		( (long)(unsigned char)(ch2) << 16 ) | ( (long)(unsigned char)(ch3) << 24 ) )
+#endif /* mmioFOURCC */
+
+/* OpenDivX */
+#define fccMP4S	mmioFOURCC('M', 'P', '4', 'S')
+#define fccmp4s	mmioFOURCC('m', 'p', '4', 's')
+#define fccDIVX	mmioFOURCC('D', 'I', 'V', 'X')
+#define fccdivx	mmioFOURCC('d', 'i', 'v', 'x')
+#define fccDIV1	mmioFOURCC('D', 'I', 'V', '1')
+#define fccdiv1	mmioFOURCC('d', 'i', 'v', '1')
+
+/* DivX codecs */
+#define fccDIV2 mmioFOURCC('D', 'I', 'V', '2')
+#define fccdiv2 mmioFOURCC('d', 'i', 'v', '2')
+#define fccDIV3 mmioFOURCC('D', 'I', 'V', '3')
+#define fccdiv3 mmioFOURCC('d', 'i', 'v', '3')
+#define fccDIV4 mmioFOURCC('D', 'I', 'V', '4')
+#define fccdiv4 mmioFOURCC('d', 'i', 'v', '4')
+#define fccDIV5 mmioFOURCC('D', 'I', 'V', '5')
+#define fccdiv5 mmioFOURCC('d', 'i', 'v', '5')
+#define fccDIV6 mmioFOURCC('D', 'I', 'V', '6')
+#define fccdiv6 mmioFOURCC('d', 'i', 'v', '6')
+#define fccMP41	mmioFOURCC('M', 'P', '4', '1')
+#define fccmp41	mmioFOURCC('m', 'p', '4', '1')
+#define fccMP43	mmioFOURCC('M', 'P', '4', '3')
+#define fccmp43 mmioFOURCC('m', 'p', '4', '3')
+/* old ms mpeg-4 codecs */
+#define fccMP42	mmioFOURCC('M', 'P', '4', '2')
+#define fccmp42	mmioFOURCC('m', 'p', '4', '2')
+#define fccMPG4	mmioFOURCC('M', 'P', 'G', '4')
+#define fccmpg4	mmioFOURCC('m', 'p', 'g', '4')
+/* Windows media codecs */
+#define fccWMV1 mmioFOURCC('W', 'M', 'V', '1')
+#define fccwmv1 mmioFOURCC('w', 'm', 'v', '1')
+#define fccWMV2 mmioFOURCC('W', 'M', 'V', '2')
+#define fccwmv2 mmioFOURCC('w', 'm', 'v', '2')
+#define fccMWV1 mmioFOURCC('M', 'W', 'V', '1')
+
+/* Angel codecs */
+#define fccAP41	mmioFOURCC('A', 'P', '4', '1')
+#define fccap41	mmioFOURCC('a', 'p', '4', '1')
+#define fccAP42	mmioFOURCC('A', 'P', '4', '2')
+#define fccap42	mmioFOURCC('a', 'p', '4', '2')
+
+/* other codecs	*/
+#define fccIV31 mmioFOURCC('I', 'V', '3', '1')
+#define fcciv31 mmioFOURCC('i', 'v', '3', '1')
+#define fccIV32 mmioFOURCC('I', 'V', '3', '2')
+#define fcciv32 mmioFOURCC('i', 'v', '3', '2')
+#define fccIV41 mmioFOURCC('I', 'V', '4', '1')
+#define fcciv41 mmioFOURCC('i', 'v', '4', '1')
+#define fccIV50 mmioFOURCC('I', 'V', '5', '0')
+#define fcciv50 mmioFOURCC('i', 'v', '5', '0')
+#define fccI263 mmioFOURCC('I', '2', '6', '3')
+#define fcci263 mmioFOURCC('i', '2', '6', '3')
+
+#define fccMJPG mmioFOURCC('M', 'J', 'P', 'G')
+#define fccmjpg mmioFOURCC('m', 'j', 'p', 'g')
+
+#define fccHFYU mmioFOURCC('H', 'F', 'Y', 'U')
+
+#define fcccvid mmioFOURCC('c', 'v', 'i', 'd')
+#define fccdvsd mmioFOURCC('d', 'v', 's', 'd')
+
+/* Ati codecs */
+#define fccVCR2 mmioFOURCC('V', 'C', 'R', '2')
+#define fccVCR1 mmioFOURCC('V', 'C', 'R', '1')
+#define fccVYUY mmioFOURCC('V', 'Y', 'U', 'Y')
+#define fccYVU9 mmioFOURCC('I', 'Y', 'U', '9')
+
+/* Asus codecs */
+#define fccASV1 mmioFOURCC('A', 'S', 'V', '1')
+#define fccASV2 mmioFOURCC('A', 'S', 'V', '2')
+
+/* Microsoft video */
+#define fcccram mmioFOURCC('c', 'r', 'a', 'm')
+#define fccCRAM mmioFOURCC('C', 'R', 'A', 'M')
+#define fccMSVC mmioFOURCC('M', 'S', 'V', 'C')
+
+
+#define fccMSZH mmioFOURCC('M', 'S', 'Z', 'H')
+
+#define fccZLIB mmioFOURCC('Z', 'L', 'I', 'B')
+
+#define fccTM20 mmioFOURCC('T', 'M', '2', '0')
+
+#define fccYUV  mmioFOURCC('Y', 'U', 'V', ' ')
+#define fccYUY2 mmioFOURCC('Y', 'U', 'Y', '2')
+#define fccYV12 mmioFOURCC('Y', 'V', '1', '2')/* Planar mode: Y + V + U  (3 planes) */
+#define fccI420 mmioFOURCC('I', '4', '2', '0')
+#define fccIYUV mmioFOURCC('I', 'Y', 'U', 'V')/* Planar mode: Y + U + V  (3 planes) */
+#define fccUYVY mmioFOURCC('U', 'Y', 'V', 'Y')/* Packed mode: U0+Y0+V0+Y1 (1 plane) */
+#define fccYVYU mmioFOURCC('Y', 'V', 'Y', 'U')/* Packed mode: Y0+V0+Y1+U0 (1 plane) */
+
+
+struct BitmapInfo : public BITMAPINFOHEADER
+{
+    int colors[3];
+
+    void SetBitFields16(){	
+	biSize=sizeof(BITMAPINFOHEADER)+12;
+	biCompression=3;//BI_BITFIELDS
+	biBitCount=16;
+	biSizeImage=abs((int)(2*biWidth*biHeight));
+	colors[0]=0xF800;
+	colors[1]=0x07E0;
+	colors[2]=0x001F;
+    }	
+    void SetBitFields15(){	
+	biSize=sizeof(BITMAPINFOHEADER)+12;
+	biCompression=3;//BI_BITFIELDS
+	biBitCount=16;
+	biSizeImage=abs((int)(2*biWidth*biHeight));
+	colors[0]=0x7C00;
+	colors[1]=0x03E0;
+	colors[2]=0x001F;
+    }	
+    void SetRGB(){
+	biSize = sizeof(BITMAPINFOHEADER);
+	biCompression = 0;	//BI_RGB
+	//biHeight = labs(biHeight);
+	biSizeImage = labs(biWidth * biHeight) * ((biBitCount + 7) / 8);
+    }
+    void SetBits(int bits) { 
+        switch (bits){
+	    case 15: SetBitFields15();break;
+	    case 16: SetBitFields16();break;
+	    default: biBitCount = bits; SetRGB();break;
+        }
+    }
+    void SetSpace(int csp,int bits) {
+	biSize = sizeof(BITMAPINFOHEADER);
+	biCompression=csp;
+	biBitCount=bits;
+	biSizeImage=labs(biBitCount*biWidth*biHeight)>>3;
+    }
+    void SetSpace(int csp) {
+	int bits=0;
+	switch(csp){
+	case fccYUV:
+	    bits=24;break;
+	case fccYUY2:
+	case fccUYVY:
+	case fccYVYU:
+	    bits=16;break;
+	case fccYV12:
+	case fccIYUV:
+	case fccI420:
+	    bits=12;break;
+	}
+	if (csp != 0 && csp != 3 && biHeight > 0)
+    	    biHeight *= -1; // YUV formats uses should have height < 0
+	SetSpace(csp,bits);
+    }
+
+};
+
+struct IAudioDecoder
+{
+    WAVEFORMATEX in_fmt;
+    const CodecInfo& record;
+    IAudioDecoder(const CodecInfo& r, const WAVEFORMATEX* w) : record(r)
+    {
+        in_fmt = *w;
+    }
+};
+
+struct IAudioEncoder
+{
+    IAudioEncoder(const CodecInfo&, WAVEFORMATEX*) {}
+    // you do not need this one...
+};
+
+struct IVideoDecoder
+{
+    int VBUFSIZE;
+    int QMARKHI;
+    int QMARKLO;
+    int DMARKHI;
+    int DMARKLO;
+
+    enum CAPS
+    {
+	CAP_NONE = 0,
+	CAP_YUY2 = 1,
+	CAP_YV12 = 2,
+	CAP_IYUV = 4,
+	CAP_UYVY = 8,
+	CAP_YVYU = 16,
+	CAP_I420 = 32,
+    };
+    enum DecodingMode
+    {
+	DIRECT = 0,
+	REALTIME,
+	REALTIME_QUALITY_AUTO,
+    };
+    enum DecodingState
+    {
+	STOP = 0,
+	START,
+    };
+    IVideoDecoder(const CodecInfo& info, const BITMAPINFOHEADER& format) : record(info)
+    {
+        // implement init part
+     unsigned bihs = (format.biSize < (int) sizeof(BITMAPINFOHEADER)) ?
+	  sizeof(BITMAPINFOHEADER) : format.biSize;
+     m_bh = (BITMAPINFOHEADER*) new char[bihs];
+     memcpy(m_bh, &format, bihs);
+     m_State = STOP;
+     //m_pFrame = 0;
+     m_Mode = DIRECT;
+     m_iDecpos = 0;
+     m_iPlaypos = -1;
+     m_fQuality = 0.0f;
+     m_bCapable16b = true;
+
+    }
+    virtual ~IVideoDecoder(){};
+    virtual void StartInternal()=0;
+    virtual void StopInternal()=0;
+    void Stop(){ StopInternal();}
+    void Start(){StartInternal();}
+
+    const CodecInfo& record;
+    DecodingMode m_Mode;	// should we do precaching (or even change Quality on the fly)
+    DecodingState m_State;
+    int m_iDecpos;
+    int m_iPlaypos;
+    float m_fQuality;           // quality for the progress bar 0..1(best)
+    bool m_bCapable16b;
+
+    BITMAPINFOHEADER* m_bh;	// format of input data (might be larger - e.g. huffyuv)
+    BitmapInfo m_decoder;	// format of decoder output
+    BitmapInfo m_obh;		// format of returned frames
+};
+
+struct IRtConfig
+{
+};
+
+
+
+#endif
+
+#endif
--- a/loader/dshow/outputpin.c	Thu Aug 16 00:44:40 2001 +0000
+++ b/loader/dshow/outputpin.c	Thu Aug 16 00:50:02 2001 +0000
@@ -1,13 +1,10 @@
-
-#include <cstdio>
-#include <cstring>
-//#include <string>
-
 #include "outputpin.h"
 #include "allocator.h"
 #include "iunk.h"
+#include <wine/winerror.h>
+#include <cstdio>
+#include <cstring>
 
-#define E_NOTIMPL 0x80004001
 /*
     An object beyond interface IEnumMediaTypes.
     Returned by COutputPin through call IPin::EnumMediaTypes().
@@ -17,164 +14,149 @@
 
 class CEnumMediaTypes: public IEnumMediaTypes
 {
+public:
     AM_MEDIA_TYPE type;
     static GUID interfaces[];
     DECLARE_IUNKNOWN(CEnumMediaTypes)
-public:
     CEnumMediaTypes(const AM_MEDIA_TYPE&);
-    ~CEnumMediaTypes(){delete vt;}
-    static HRESULT STDCALL Next ( 
-        IEnumMediaTypes * This,
-        /* [in] */ ULONG cMediaTypes,
-        /* [size_is][out] */ AM_MEDIA_TYPE **ppMediaTypes,
-        /* [out] */ ULONG *pcFetched);
-    
-    static HRESULT STDCALL Skip ( 
-        IEnumMediaTypes * This,
-        /* [in] */ ULONG cMediaTypes);
-    
-    static HRESULT STDCALL Reset ( 
-        IEnumMediaTypes * This);
-    
-    static HRESULT STDCALL Clone ( 
-        IEnumMediaTypes * This,
-        /* [out] */ IEnumMediaTypes **ppEnum);
+    ~CEnumMediaTypes() {delete vt;}
+};
 
-};
 GUID CEnumMediaTypes::interfaces[]=
 {
     IID_IUnknown,
     IID_IEnumMediaTypes,
 };
+
+// IPin->IUnknown methods
 IMPLEMENT_IUNKNOWN(CEnumMediaTypes)
-CEnumMediaTypes::CEnumMediaTypes(const AM_MEDIA_TYPE& type)
-    :refcount(1)
-{
-    this->type=type;
-    vt=new IEnumMediaTypes_vt;
-    vt->QueryInterface = QueryInterface;
-    vt->AddRef = AddRef;
-    vt->Release = Release;
-    vt->Next = Next; 
-    vt->Skip = Skip; 
-    vt->Reset = Reset;
-    vt->Clone = Clone; 
-}
+
 
-HRESULT STDCALL CEnumMediaTypes::Next ( 
-    IEnumMediaTypes * This,
-    /* [in] */ ULONG cMediaTypes,
-    /* [size_is][out] */ AM_MEDIA_TYPE **ppMediaTypes,
-    /* [out] */ ULONG *pcFetched)
+static HRESULT STDCALL CEnumMediaTypes_Next(IEnumMediaTypes * This,
+					    /* [in] */ ULONG cMediaTypes,
+					    /* [size_is][out] */ AM_MEDIA_TYPE **ppMediaTypes,
+					    /* [out] */ ULONG *pcFetched)
 {
     AM_MEDIA_TYPE& type=((CEnumMediaTypes*)This)->type;
     Debug printf("CEnumMediaTypes::Next() called\n");
-    if(!ppMediaTypes)return 0x80004003;
-    if(!pcFetched && (cMediaTypes!=1))return 0x80004003;
-    if(cMediaTypes<=0)return 0;
-    
-    if(pcFetched)*pcFetched=1;
-    ppMediaTypes[0]=(AM_MEDIA_TYPE *)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
+    if (!ppMediaTypes)
+	return E_INVALIDARG;
+    if (!pcFetched && (cMediaTypes!=1))
+	return E_INVALIDARG;
+    if (cMediaTypes <= 0)
+	return 0;
+
+    if (pcFetched)
+	*pcFetched=1;
+    ppMediaTypes[0] = (AM_MEDIA_TYPE *)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
     memcpy(*ppMediaTypes, &type, sizeof(AM_MEDIA_TYPE));
-    if(ppMediaTypes[0]->pbFormat)
+    if (ppMediaTypes[0]->pbFormat)
     {
 	ppMediaTypes[0]->pbFormat=(char *)CoTaskMemAlloc(ppMediaTypes[0]->cbFormat);
 	memcpy(ppMediaTypes[0]->pbFormat, type.pbFormat, ppMediaTypes[0]->cbFormat);
     }
-    if(cMediaTypes==1)return 0;
+    if (cMediaTypes == 1)
+	return 0;
     return 1;
 }
-/*
-    I expect that these methods are unused.
-*/
-HRESULT STDCALL CEnumMediaTypes::Skip ( 
-    IEnumMediaTypes * This,
-    /* [in] */ ULONG cMediaTypes)
+
+/* I expect that these methods are unused. */
+static HRESULT STDCALL CEnumMediaTypes_Skip(IEnumMediaTypes * This,
+					    /* [in] */ ULONG cMediaTypes)
 {
     Debug printf("CEnumMediaTypes::Skip() called\n");
     return E_NOTIMPL;
 }
 
-HRESULT STDCALL CEnumMediaTypes::Reset ( 
-    IEnumMediaTypes * This)
+static HRESULT STDCALL CEnumMediaTypes_Reset(IEnumMediaTypes * This)
 {
     Debug printf("CEnumMediaTypes::Reset() called\n");
     return 0;
 }
 
-HRESULT STDCALL CEnumMediaTypes::Clone ( 
-    IEnumMediaTypes * This,
-    /* [out] */ IEnumMediaTypes **ppEnum)
+static HRESULT STDCALL CEnumMediaTypes_Clone(IEnumMediaTypes * This,
+				      /* [out] */ IEnumMediaTypes **ppEnum)
 {
     Debug printf("CEnumMediaTypes::Clone() called\n");
     return E_NOTIMPL;
 }
 
-/*
-    Implementation of output pin object.
-*/
+
+CEnumMediaTypes::CEnumMediaTypes(const AM_MEDIA_TYPE& amtype)
+{
+    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;
+}
+
+
+static HRESULT STDCALL COutputPin_AddRef(IUnknown* This)
+{
+    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)
+	delete (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)
+	delete p->parent;
+    return 0;
+}
+
+/* Implementation of output pin object. */
 // Constructor
 
-COutputPin::COutputPin(const AM_MEDIA_TYPE& vh) :refcount(1), type(vh), remote(0), frame_pointer(0), frame_size_pointer(0)
+
+static HRESULT STDCALL COutputPin_QueryInterface(IUnknown* This, GUID* iid, void** ppv)
 {
-    IPin::vt = new IPin_vt;
-    IPin::vt->QueryInterface = QueryInterface;
-    IPin::vt->AddRef = AddRef;
-    IPin::vt->Release = Release;
-    IPin::vt->Connect = Connect;
-    IPin::vt->ReceiveConnection = ReceiveConnection;
-    IPin::vt->Disconnect=Disconnect;
-    IPin::vt->ConnectedTo = ConnectedTo;
-    IPin::vt->ConnectionMediaType = ConnectionMediaType;
-    IPin::vt->QueryPinInfo = QueryPinInfo;
-    IPin::vt->QueryDirection = QueryDirection;
-    IPin::vt->QueryId = QueryId;
-    IPin::vt->QueryAccept = QueryAccept;
-    IPin::vt->EnumMediaTypes = EnumMediaTypes;
-    IPin::vt->QueryInternalConnections = QueryInternalConnections;
-    IPin::vt->EndOfStream = EndOfStream;
-    IPin::vt->BeginFlush = BeginFlush;
-    IPin::vt->EndFlush = EndFlush;
-    IPin::vt->NewSegment = NewSegment;
+    Debug printf("COutputPin_QueryInterface(%p) called\n", This);
+    if (!ppv)
+	return E_INVALIDARG;
+
+    COutputPin* p = (COutputPin*) This;
 
-    IMemInputPin::vt=new IMemInputPin_vt;
-    IMemInputPin::vt->QueryInterface = M_QueryInterface;
-    IMemInputPin::vt->AddRef = M_AddRef;
-    IMemInputPin::vt->Release = M_Release;
-    IMemInputPin::vt->GetAllocator = GetAllocator;
-    IMemInputPin::vt->NotifyAllocator = NotifyAllocator;
-    IMemInputPin::vt->GetAllocatorRequirements = GetAllocatorRequirements;
-    IMemInputPin::vt->Receive = Receive;
-    IMemInputPin::vt->ReceiveMultiple = ReceiveMultiple;
-    IMemInputPin::vt->ReceiveCanBlock = ReceiveCanBlock;
-    
-    pAllocator = 0;
-    frame_pointer = 0;
-}
-
-COutputPin::~COutputPin()
-{
-    delete IPin::vt;
-    delete IMemInputPin::vt;
-}
-
-// IPin->IUnknown methods
-
-HRESULT STDCALL COutputPin::QueryInterface(IUnknown* This, GUID* iid, void** ppv)
-{
-    Debug printf("COutputPin::QueryInterface() called\n");
-    if(!ppv)return 0x80004003;
-    if(!memcmp(iid, &IID_IUnknown, 16))
+    if (memcmp(iid, &IID_IUnknown, 16) == 0)
     {
-	*ppv=(void*)This;
-	This->vt->AddRef(This);
-	return 0;
+	*ppv = p;
+	p->vt->AddRef(This);
+        return 0;
     }
-    if(!memcmp(iid, &IID_IMemInputPin, 16))
+    if (memcmp(iid, &IID_IMemInputPin, 16) == 0)
     {
-	*ppv=(void*)(This+1);
-	This->vt->AddRef(This);
+	*ppv = p->mempin;
+	p->mempin->vt->AddRef((IUnknown*)*ppv);
 	return 0;
     }
 
@@ -185,32 +167,15 @@
 		 (unsigned char)iid->f4[2], (unsigned char)iid->f4[3],
 		 (unsigned char)iid->f4[4], (unsigned char)iid->f4[5],
 		 (unsigned char)iid->f4[6], (unsigned char)iid->f4[7]);
-    return 0x80004002;
-}
-
-HRESULT STDCALL COutputPin::AddRef(IUnknown* This)
-{
-    Debug printf("COutputPin::AddRef() called\n");
-    ((COutputPin*)This)->refcount++;
-    return 0;
-}
-
-HRESULT STDCALL COutputPin::Release(IUnknown* This)
-{
-    Debug printf("COutputPin::Release() called\n");
-    if(--((COutputPin*)This)->refcount==0)
-	delete (COutputPin*)This;
-    return 0;
+    return E_NOINTERFACE;
 }
 
 // IPin methods
-
-HRESULT STDCALL COutputPin::Connect ( 
-    IPin * This,
-    /* [in] */ IPin *pReceivePin,
-    /* [in] */ /* const */ AM_MEDIA_TYPE *pmt)
+static HRESULT STDCALL COutputPin_Connect(IPin * This,
+				    /* [in] */ IPin *pReceivePin,
+				    /* [in] */ /* const */ AM_MEDIA_TYPE *pmt)
 {
-    Debug printf("COutputPin::Connect() called\n");
+    Debug printf("COutputPin_Connect() called\n");
 /*
     *pmt=((COutputPin*)This)->type;
     if(pmt->cbFormat>0)
@@ -219,176 +184,146 @@
 	memcpy(pmt->pbFormat, ((COutputPin*)This)->type.pbFormat, pmt->cbFormat);
     }	
 */
-    return E_NOTIMPL;
+    //return E_NOTIMPL;
+    return 0;// XXXXXXXXXXXXX CHECKME XXXXXXXXXXXXXXX
     // if I put return 0; here, it crashes
 }
 
-HRESULT STDCALL COutputPin::ReceiveConnection ( 
-    IPin * This,
-    /* [in] */ IPin *pConnector,
-    /* [in] */ const AM_MEDIA_TYPE *pmt)
+static HRESULT STDCALL COutputPin_ReceiveConnection(IPin * This,
+						    /* [in] */ IPin *pConnector,
+						    /* [in] */ const AM_MEDIA_TYPE *pmt)
 {
-    Debug printf("COutputPin::ReceiveConnection() called\n");
+    Debug printf("COutputPin_ReceiveConnection() called\n");
     ((COutputPin*)This)->remote=pConnector;
     return 0;
 }
-	    
-HRESULT STDCALL COutputPin::Disconnect ( 
-    IPin * This)
+
+static HRESULT STDCALL COutputPin_Disconnect(IPin * This)
 {
-    Debug printf("COutputPin::Disconnect() called\n");
+    Debug printf("COutputPin_Disconnect() called\n");
     return 1;
 }
 
+static HRESULT STDCALL COutputPin_ConnectedTo(IPin * This,
+					/* [out] */ IPin **pPin)
+{
+    Debug printf("COutputPin_ConnectedTo() called\n");
+    if (!pPin)
+	return E_INVALIDARG;
+    *pPin = ((COutputPin*)This)->remote;
+    return 0;
+}
 
-HRESULT STDCALL COutputPin::ConnectedTo ( 
-    IPin * This,
-    /* [out] */ IPin **pPin)
+static HRESULT STDCALL COutputPin_ConnectionMediaType(IPin * This,
+						      /* [out] */ AM_MEDIA_TYPE *pmt)
+{
+    Debug printf("CInputPin::ConnectionMediaType() called\n");
+    if (!pmt)
+	return E_INVALIDARG;
+    *pmt = ((COutputPin*)This)->type;
+    if (pmt->cbFormat>0)
+    {
+	pmt->pbFormat=(char *)CoTaskMemAlloc(pmt->cbFormat);
+	memcpy(pmt->pbFormat, ((COutputPin*)This)->type.pbFormat, pmt->cbFormat);
+    }
+    return 0;
+}
+
+static HRESULT STDCALL COutputPin_QueryPinInfo(IPin * This,
+					       /* [out] */ PIN_INFO *pInfo)
+{
+    Debug printf("COutputPin_QueryPinInfo() called\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT STDCALL COutputPin_QueryDirection(IPin * This,
+					   /* [out] */ PIN_DIRECTION *pPinDir)
+{
+    Debug printf("COutputPin_QueryDirection() called\n");
+    if (!pPinDir)
+	return E_INVALIDARG;
+    *pPinDir = PINDIR_INPUT;
+    return 0;
+}
+
+static HRESULT STDCALL COutputPin_QueryId(IPin * This,
+					  /* [out] */ LPWSTR *Id)
+{
+    Debug printf("COutputPin_QueryId() called\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT STDCALL COutputPin_QueryAccept(IPin * This,
+					      /* [in] */ const AM_MEDIA_TYPE *pmt)
 {
-    Debug printf("COutputPin::ConnectedTo() called\n");
-    if(!pPin)return 0x80004003;
-    *pPin=((COutputPin*)This)->remote;
+    Debug printf("COutputPin_QueryAccept() called\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT STDCALL COutputPin_EnumMediaTypes(IPin * This,
+					   /* [out] */ IEnumMediaTypes **ppEnum)
+{
+    Debug printf("COutputPin_EnumMediaTypes() called\n");
+    if (!ppEnum)
+	return E_INVALIDARG;
+    *ppEnum=new CEnumMediaTypes(((COutputPin*)This)->type);
+    return 0;
+}
+
+static HRESULT STDCALL COutputPin_QueryInternalConnections(IPin * This,
+						     /* [out] */ IPin **apPin,
+						     /* [out][in] */ ULONG *nPin)
+{
+    Debug printf("COutputPin_QueryInternalConnections() called\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT STDCALL COutputPin_EndOfStream(IPin * This)
+{
+    Debug printf("COutputPin_EndOfStream() called\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT STDCALL COutputPin_BeginFlush(IPin * This)
+{
+    Debug printf("COutputPin_BeginFlush() called\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT STDCALL COutputPin_EndFlush(IPin * This)
+{
+    Debug printf("COutputPin_EndFlush() called\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT STDCALL COutputPin_NewSegment(IPin * This,
+				       /* [in] */ REFERENCE_TIME tStart,
+				       /* [in] */ REFERENCE_TIME tStop,
+				       /* [in] */ double dRate)
+{
+    Debug printf("COutputPin_NewSegment(%ld,%ld,%f) called\n",
+		 tStart, tStop, dRate);
     return 0;
 }
 
 
 
-HRESULT STDCALL COutputPin::ConnectionMediaType ( 
-    IPin * This,
-    /* [out] */ AM_MEDIA_TYPE *pmt)
-{
-    Debug printf("CInputPin::ConnectionMediaType() called\n");
-    if(!pmt)return 0x80004003;
-    *pmt=((COutputPin*)This)->type;
-    if(pmt->cbFormat>0)
-    {
-	pmt->pbFormat=(char *)CoTaskMemAlloc(pmt->cbFormat);
-	memcpy(pmt->pbFormat, ((COutputPin*)This)->type.pbFormat, pmt->cbFormat);
-    }	
-    return 0;
-}
-
-HRESULT STDCALL COutputPin::QueryPinInfo ( 
-    IPin * This,
-    /* [out] */ PIN_INFO *pInfo)
-{
-    Debug printf("COutputPin::QueryPinInfo() called\n");
-    return E_NOTIMPL;
-}
-
-
-HRESULT STDCALL COutputPin::QueryDirection ( 
-    IPin * This,
-    /* [out] */ PIN_DIRECTION *pPinDir)
-{
-    Debug printf("COutputPin::QueryDirection() called\n");
-    if(!pPinDir)return -1;
-    *pPinDir=PINDIR_INPUT;
-    return 0;
-}
-
-
-HRESULT STDCALL COutputPin::QueryId ( 
-    IPin * This,
-    /* [out] */ LPWSTR *Id)
-{
-    Debug printf("COutputPin::QueryId() called\n");
-    return E_NOTIMPL;
-}
-
-HRESULT STDCALL COutputPin::QueryAccept ( 
-    IPin * This,
-    /* [in] */ const AM_MEDIA_TYPE *pmt)
-{
-    Debug printf("COutputPin::QueryAccept() called\n");
-    return E_NOTIMPL;
-}
-
-
-HRESULT STDCALL COutputPin::EnumMediaTypes ( 
-    IPin * This,
-    /* [out] */ IEnumMediaTypes **ppEnum)
-{
-    Debug printf("COutputPin::EnumMediaTypes() called\n");
-    if(!ppEnum)return 0x80004003;
-    *ppEnum=new CEnumMediaTypes(((COutputPin*)This)->type);
-    return 0;
-}
-
-
-HRESULT STDCALL COutputPin::QueryInternalConnections ( 
-    IPin * This,
-    /* [out] */ IPin **apPin,
-    /* [out][in] */ ULONG *nPin)
-{
-    Debug printf("COutputPin::QueryInternalConnections() called\n");
-    return E_NOTIMPL;
-}
-
-HRESULT STDCALL COutputPin::EndOfStream ( 
-    IPin * This)
-{
-    Debug printf("COutputPin::EndOfStream() called\n");
-    return E_NOTIMPL;
-}
-    
-    
-HRESULT STDCALL COutputPin::BeginFlush ( 
-IPin * This)
-{
-    Debug printf("COutputPin::BeginFlush() called\n");
-    return E_NOTIMPL;
-}
-
-
-HRESULT STDCALL COutputPin::EndFlush ( 
-    IPin * This)
-{
-    Debug printf("COutputPin::EndFlush() called\n");
-    return E_NOTIMPL;
-}
-
-HRESULT STDCALL COutputPin::NewSegment ( 
-    IPin * This,
-    /* [in] */ REFERENCE_TIME tStart,
-    /* [in] */ REFERENCE_TIME tStop,
-    /* [in] */ double dRate)
-{
-    Debug printf("COutputPin::NewSegment(%ld,%ld,%f) called\n",tStart,tStop,dRate);
-    return 0;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 // IMemInputPin->IUnknown methods
 
-HRESULT STDCALL COutputPin::M_QueryInterface(IUnknown* This, GUID* iid, void** ppv)
+static HRESULT STDCALL COutputPin_M_QueryInterface(IUnknown* This, GUID* iid, void** ppv)
 {
-    Debug printf("COutputPin::QueryInterface() called\n");
-    if(!ppv)return 0x80004003;
+    Debug printf("COutputPin_M_QueryInterface() called\n");
+    if (!ppv)
+	return E_INVALIDARG;
+
+    COutputPin* p = (COutputPin*)This;
     if(!memcmp(iid, &IID_IUnknown, 16))
     {
-	COutputPin* ptr=(COutputPin*)(This-1);
-	*ppv=(void*)ptr;
-	AddRef((IUnknown*)ptr);
+	*ppv=p;
+	p->vt->AddRef(This);
 	return 0;
     }
-/*    if(!memcmp(iid, &IID_IPin, 16))
+    /*if(!memcmp(iid, &IID_IPin, 16))
     {
 	COutputPin* ptr=(COutputPin*)(This-1);
 	*ppv=(void*)ptr;
@@ -397,81 +332,65 @@
     }*/
     if(!memcmp(iid, &IID_IMemInputPin, 16))
     {
-	*ppv=(void*)This;
-	This->vt->AddRef(This);
+	*ppv=p->mempin;
+	p->mempin->vt->AddRef(This);
 	return 0;
     }
     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],
-	(unsigned char)iid->f4[2],(unsigned char)iid->f4[3],(unsigned char)iid->f4[4],	  
-	(unsigned char)iid->f4[5],(unsigned char)iid->f4[6],(unsigned char)iid->f4[7]);
-    return 0x80004002;
+		 "%02x%02x%02x%02x%02x%02x\n",
+		 iid->f1,  iid->f2,  iid->f3,
+		 (unsigned char)iid->f4[1], (unsigned char)iid->f4[0],
+		 (unsigned char)iid->f4[2], (unsigned char)iid->f4[3],
+		 (unsigned char)iid->f4[4], (unsigned char)iid->f4[5],
+		 (unsigned char)iid->f4[6], (unsigned char)iid->f4[7]);
+    return E_NOINTERFACE;
 }
-HRESULT STDCALL COutputPin::M_AddRef(IUnknown* This)
-{
-    Debug printf("COutputPin::AddRef() called\n");
-    ((COutputPin*)(This-1))->refcount++;
-    return 0;
-}
-HRESULT STDCALL COutputPin::M_Release(IUnknown* This)
-{
-    Debug printf("COutputPin::Release() called\n");
-    if(--((COutputPin*)(This-1))->refcount==0)
-	delete (COutputPin*)This;
-    return 0;
-}
-
-
-
 
 // IMemInputPin methods
 
-HRESULT STDCALL COutputPin::GetAllocator( 
-        IMemInputPin * This,
-    /* [out] */ IMemAllocator **ppAllocator) 
+static HRESULT STDCALL COutputPin_GetAllocator(IMemInputPin * This,
+					 /* [out] */ IMemAllocator **ppAllocator)
 {
-    Debug printf("COutputPin::GetAllocator(%x,%x) called\n",This->vt,ppAllocator);
+    Debug printf("COutputPin_GetAllocator(%p, %p) called\n", This->vt, ppAllocator);
     *ppAllocator=new MemAllocator;
     return 0;
 }
     
-HRESULT STDCALL COutputPin::NotifyAllocator( 
-        IMemInputPin * This,
-    /* [in] */ IMemAllocator *pAllocator,
-    /* [in] */ int bReadOnly)
+static HRESULT STDCALL COutputPin_NotifyAllocator(IMemInputPin * This,
+						  /* [in] */ IMemAllocator *pAllocator,
+						  /* [in] */ int bReadOnly)
 {
-    Debug printf("COutputPin::NotifyAllocator() called\n");
-    COutputPin* pPin=(COutputPin*)This;
-    pPin->pAllocator=(MemAllocator*)pAllocator;
+    Debug printf("COutputPin_NotifyAllocator(%p, %p) called\n", This, pAllocator);
+    ((COutputMemPin*)This)->pAllocator = (MemAllocator*) pAllocator;
     return 0;
 }
 
-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");
+    Debug printf("COutputPin_GetAllocatorRequirements() called\n");
     return E_NOTIMPL;
 }
 
-HRESULT STDCALL COutputPin::Receive( 
-        IMemInputPin * This,
-    /* [in] */ IMediaSample *pSample) 
+static HRESULT STDCALL COutputPin_Receive(IMemInputPin * This,
+				    /* [in] */ IMediaSample *pSample)
 {
-    Debug printf("COutputPin::Receive() called\n");
-    COutputPin& me=*(COutputPin*)This;
-    if(!pSample)return 0x80004003;
+    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);
-    if(len==0)len=pSample->vt->GetSize(pSample);//for iv50
+    int 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);
-    if(me.frame_pointer)
-	*me.frame_pointer=pointer;
-    if(me.frame_size_pointer)*me.frame_size_pointer=len;
+
+    COutputMemPin* mp= (COutputMemPin*)This;
+    if (mp->frame_pointer)
+	*(mp->frame_pointer) = pointer;
+    if (mp->frame_size_pointer)
+	*(mp->frame_size_pointer) = len;
 /*
     FILE* file=fopen("./uncompr.bmp", "wb");
     char head[14]={0x42, 0x4D, 0x36, 0x10, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00};
@@ -485,19 +404,64 @@
     return 0;
 }
 
-HRESULT STDCALL COutputPin::ReceiveMultiple( 
-        IMemInputPin * This,
-    /* [size_is][in] */ IMediaSample **pSamples,
-    /* [in] */ long nSamples,
-    /* [out] */ long *nSamplesProcessed)
+static HRESULT STDCALL COutputPin_ReceiveMultiple(IMemInputPin * This,
+					    /* [size_is][in] */ IMediaSample **pSamples,
+					    /* [in] */ long nSamples,
+					    /* [out] */ long *nSamplesProcessed)
 {
-    Debug printf("COutputPin::ReceiveMultiple() called\n");
+    Debug printf("COutputPin_ReceiveMultiple() called (UNIMPLEMENTED)\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT STDCALL COutputPin_ReceiveCanBlock(IMemInputPin * This)
+{
+    Debug printf("COutputPin_ReceiveCanBlock() called (UNIMPLEMENTED)\n");
     return E_NOTIMPL;
 }
 
-HRESULT STDCALL COutputPin::ReceiveCanBlock(
-        IMemInputPin * This) 
+COutputPin::COutputPin(const AM_MEDIA_TYPE& vh)
+    :refcount(1), type(vh), remote(0)
 {
-    Debug printf("COutputPin::ReceiveCanBlock() called\n");
-    return E_NOTIMPL;
+    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;
 }
+
+COutputPin::~COutputPin()
+{
+    delete vt;
+    delete mempin->vt;
+}
--- a/loader/dshow/outputpin.h	Thu Aug 16 00:44:40 2001 +0000
+++ b/loader/dshow/outputpin.h	Thu Aug 16 00:50:02 2001 +0000
@@ -1,124 +1,37 @@
-/*	"output pin" - the one that connects to output of filter.     */
+#ifndef DS_OUTPUTPIN_H
+#define DS_OUTPUTPIN_H
 
-#ifndef OUTPUTPIN_H
-#define OUTPUTPIN_H
+/* "output pin" - the one that connects to output of filter. */
+
 #include "interfaces.h"
 #include "guids.h"
-#include "default.h"
 #include "allocator.h"
-class COutputPin: public IPin, public IMemInputPin
+
+struct COutputPin;
+
+struct COutputMemPin : public IMemInputPin
 {
-    int refcount;
-    AM_MEDIA_TYPE type;
-    IPin* remote;
     char** frame_pointer;
     long* frame_size_pointer;
     MemAllocator* pAllocator;
-public:
+    COutputPin* parent;
+};
+
+struct COutputPin : public IPin
+{
+    COutputMemPin* mempin;
+    int refcount;
+    AM_MEDIA_TYPE type;
+    IPin* remote;
     COutputPin(const AM_MEDIA_TYPE& vhdr);
     ~COutputPin();
-    void SetFramePointer(char** z){frame_pointer=z;}
-    void SetPointer2(char* p) { if(pAllocator) pAllocator->SetPointer(p); }
-    void SetFrameSizePointer(long* z){frame_size_pointer=z;}
-    void SetNewFormat(const AM_MEDIA_TYPE& a){type=a;}
-    static HRESULT STDCALL QueryInterface(IUnknown* This, GUID* iid, void** ppv);
-    static HRESULT STDCALL AddRef(IUnknown* This);
-    static HRESULT STDCALL Release(IUnknown* This);
-
-    static HRESULT STDCALL M_QueryInterface(IUnknown* This, GUID* iid, void** ppv);
-    static HRESULT STDCALL M_AddRef(IUnknown* This);
-    static HRESULT STDCALL M_Release(IUnknown* This);
+    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; }
+};
 
-    static HRESULT STDCALL Connect ( 
-	IPin * This,
-        /* [in] */ IPin *pReceivePin,
-        /* [in] */ /*const */AM_MEDIA_TYPE *pmt);
-        
-    static HRESULT STDCALL ReceiveConnection ( 
-        IPin * This,
-        /* [in] */ IPin *pConnector,
-        /* [in] */ const AM_MEDIA_TYPE *pmt);
-    
-    static HRESULT STDCALL Disconnect ( 
-        IPin * This);
-    
-    static HRESULT STDCALL ConnectedTo ( 
-        IPin * This,
-        /* [out] */ IPin **pPin);
-    
-    static HRESULT STDCALL ConnectionMediaType ( 
-        IPin * This,
-        /* [out] */ AM_MEDIA_TYPE *pmt);
-    
-    static HRESULT STDCALL QueryPinInfo ( 
-        IPin * This,
-        /* [out] */ PIN_INFO *pInfo);
-    
-    static HRESULT STDCALL QueryDirection ( 
-        IPin * This,
-        /* [out] */ PIN_DIRECTION *pPinDir);
-    
-    static HRESULT STDCALL QueryId ( 
-        IPin * This,
-        /* [out] */ LPWSTR *Id);
-    
-    static HRESULT STDCALL QueryAccept ( 
-        IPin * This,
-        /* [in] */ const AM_MEDIA_TYPE *pmt);
-    
-    static HRESULT STDCALL EnumMediaTypes ( 
-        IPin * This,
-        /* [out] */ IEnumMediaTypes **ppEnum);
-    
-    static HRESULT STDCALL QueryInternalConnections ( 
-        IPin * This,
-        /* [out] */ IPin **apPin,
-        /* [out][in] */ ULONG *nPin);
-    
-    static HRESULT STDCALL EndOfStream ( 
-        IPin * This);
-    
-    static HRESULT STDCALL BeginFlush ( 
-        IPin * This);
-    
-    static HRESULT STDCALL EndFlush ( 
-        IPin * This);
-    
-    static HRESULT STDCALL NewSegment ( 
-        IPin * This,
-        /* [in] */ REFERENCE_TIME tStart,
-        /* [in] */ REFERENCE_TIME tStop,
-        /* [in] */ double dRate);
-	
-
-
-
-
-
-    static HRESULT STDCALL GetAllocator( 
-        IMemInputPin * This,
-        /* [out] */ IMemAllocator **ppAllocator) ;
-    
-    static HRESULT STDCALL NotifyAllocator( 
-        IMemInputPin * This,
-        /* [in] */ IMemAllocator *pAllocator,
-        /* [in] */ int bReadOnly) ;
-    
-    static HRESULT STDCALL GetAllocatorRequirements( 
-        IMemInputPin * This,
-        /* [out] */ ALLOCATOR_PROPERTIES *pProps) ;
-    
-    static HRESULT STDCALL Receive( 
-        IMemInputPin * This,
-        /* [in] */ IMediaSample *pSample) ;
-    
-    static HRESULT STDCALL ReceiveMultiple( 
-        IMemInputPin * This,
-        /* [size_is][in] */ IMediaSample **pSamples,
-        /* [in] */ long nSamples,
-        /* [out] */ long *nSamplesProcessed) ;
-    
-    static HRESULT STDCALL ReceiveCanBlock(
-            IMemInputPin * This) ;
-};
-#endif
+#endif /* DS_OUTPUTPIN_H */