diff loader/dshow/DS_Filter.c @ 1545:da26060c81ef

big avifile sync - from now we have common code
author arpi
date Thu, 16 Aug 2001 00:50:02 +0000
parents 9525bff8bea8
children ce45cce7f7a5
line wrap: on
line diff
--- 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;
     }
 }