📄 main.cpp
字号:
// Avisynth v0.3. Copyright 2000 Ben Rudiak-Gould. For distribution
// conditions, please see http://www.math.berkeley.edu/~benrg/avisynth.html .
// This file is adapted from VirtualDub source code. VirtualDub is
// Copyright 2000 Avery Lee.
#include "avisynth.h"
#define INITGUID
#include "internal-filters.h"
PVideoFilter CreateFilterChain(const char filename[]);
static long gRefCnt=0;
class CAVIFileSynth: public IAVIFile, public IPersistFile, public IClassFactory {
friend class CAVIStreamSynth;
private:
long m_refs;
PVideoFilter filter_chain;
VideoInfo vi;
public:
CAVIFileSynth(const CLSID& rclsid);
~CAVIFileSynth();
////////////
static HRESULT Create(const CLSID& rclsid, const IID& riid, void **ppv);
STDMETHODIMP QueryInterface(const IID& iid, void **ppv);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
//////////// IClassFactory
STDMETHODIMP CreateInstance (LPUNKNOWN pUnkOuter, REFIID riid, void * * ppvObj) ;
STDMETHODIMP LockServer (BOOL fLock) ;
//////////// IPersistFile
STDMETHODIMP GetClassID(LPCLSID lpClassID);
STDMETHODIMP IsDirty();
STDMETHODIMP Load(LPCOLESTR lpszFileName, DWORD grfMode);
STDMETHODIMP Save(LPCOLESTR lpszFileName, BOOL fRemember);
STDMETHODIMP SaveCompleted(LPCOLESTR lpszFileName);
STDMETHODIMP GetCurFile(LPOLESTR *lplpszFileName);
//////////// IAVIFile
STDMETHODIMP CreateStream(PAVISTREAM *ppStream, AVISTREAMINFOW *psi);
STDMETHODIMP EndRecord();
STDMETHODIMP GetStream(PAVISTREAM *ppStream, DWORD fccType, LONG lParam);
STDMETHODIMP Info(AVIFILEINFOW *psi, LONG lSize);
STDMETHODIMP Open(LPCSTR szFile, UINT mode, LPCOLESTR lpszFileName);
STDMETHODIMP Save(LPCSTR szFile, AVICOMPRESSOPTIONS FAR *lpOptions,
AVISAVECALLBACK lpfnCallback);
STDMETHODIMP ReadData(DWORD fcc, LPVOID lp, LONG *lpcb);
STDMETHODIMP WriteData(DWORD fcc, LPVOID lpBuffer, LONG cbBuffer);
STDMETHODIMP DeleteStream(DWORD fccType, LONG lParam);
};
///////////////////////////////////
class CAVIStreamSynth;
class CAVIStreamSynth: public IAVIStream {
private:
long m_refs;
CAVIFileSynth *parent;
BOOL fAudio;
unsigned char* myvideobuf;
public:
STDMETHODIMP QueryInterface(const IID& iid, void **ppv);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
CAVIStreamSynth(CAVIFileSynth *parentPtr, bool isAudio);
~CAVIStreamSynth();
STDMETHODIMP Create(LONG lParam1, LONG lParam2);
STDMETHODIMP Delete(LONG lStart, LONG lSamples);
STDMETHODIMP_(LONG) Info(AVISTREAMINFOW *psi, LONG lSize);
STDMETHODIMP_(LONG) FindSample(LONG lPos, LONG lFlags);
STDMETHODIMP Read(LONG lStart, LONG lSamples, LPVOID lpBuffer, LONG cbBuffer, LONG *plBytes, LONG *plSamples);
STDMETHODIMP ReadData(DWORD fcc, LPVOID lp, LONG *lpcb);
STDMETHODIMP ReadFormat(LONG lPos, LPVOID lpFormat, LONG *lpcbFormat);
STDMETHODIMP SetFormat(LONG lPos, LPVOID lpFormat, LONG cbFormat);
STDMETHODIMP Write(LONG lStart, LONG lSamples, LPVOID lpBuffer,
LONG cbBuffer, DWORD dwFlags, LONG FAR *plSampWritten,
LONG FAR *plBytesWritten);
STDMETHODIMP WriteData(DWORD fcc, LPVOID lpBuffer, LONG cbBuffer);
STDMETHODIMP SetInfo(AVISTREAMINFOW *psi, LONG lSize);
};
BOOL APIENTRY DllMain(HANDLE hModule, ULONG ulReason, LPVOID lpReserved) {
switch(ulReason) {
case DLL_PROCESS_ATTACH:
CoInitialize(NULL);
_RPT0(0,"Process attach\n");
break;
case DLL_PROCESS_DETACH:
CoUninitialize();
_RPT0(0,"Process detach\n");
break;
}
return TRUE;
}
extern "C" const GUID CLSID_CAVIFileSynth // {E6D6B700-124D-11D4-86F3-DB80AFD98778}
= {0xe6d6b700, 0x124d, 0x11d4, {0x86, 0xf3, 0xdb, 0x80, 0xaf, 0xd9, 0x87, 0x78}};
extern "C" const GUID CLSID_CAVIStreamSynth // {E6D6B701-124D-11D4-86F3-DB80AFD98778}
= {0xe6d6b701, 0x124d, 0x11d4, {0x86, 0xf3, 0xdb, 0x80, 0xaf, 0xd9, 0x87, 0x78}};
// From the Microsoft AVIFile docs. Dense code...
extern "C" STDAPI DllGetClassObject(const CLSID& rclsid, const IID& riid, void **ppv);
STDAPI DllGetClassObject(const CLSID& rclsid, const IID& riid, void **ppv) {
_RPT0(0,"DllGetClassObject()\n");
HRESULT hresult;
if (rclsid == CLSID_CAVIFileSynth) {
_RPT0(0,"\tCLSID: CAVIFileSynth\n");
hresult = CAVIFileSynth::Create(rclsid, riid, ppv);
} else {
hresult = CLASS_E_CLASSNOTAVAILABLE;
}
_RPT0(0,"DllGetClassObject() exit\n");
return hresult;
}
extern "C" STDAPI DllCanUnloadNow();
STDAPI DllCanUnloadNow() {
_RPT1(0,"DllCanUnloadNow(): gRefCnt = %ld\n", gRefCnt);
return gRefCnt ? S_FALSE : S_OK;
}
///////////////////////////////////////////////////////////////////////////
//
// CAVIFileSynth
//
///////////////////////////////////////////////////////////////////////////
HRESULT CAVIFileSynth::CreateInstance (LPUNKNOWN pUnkOuter, REFIID riid, void * * ppvObj) {
if (pUnkOuter) return CLASS_E_NOAGGREGATION;
return Create(CLSID_CAVIFileSynth, riid, ppvObj);
}
HRESULT CAVIFileSynth::LockServer (BOOL fLock) {
_RPT1(0,"%p->CAVIFileSynth::LockServer()\n", this);
return S_OK;
}
///////////////////////////////////////////////////
STDMETHODIMP CAVIFileSynth::GetClassID(LPCLSID lpClassID) {
_RPT1(0,"%p->CAVIFileSynth::GetClassID()\n", this);
*lpClassID = CLSID_CAVIFileSynth;
return S_OK;
}
STDMETHODIMP CAVIFileSynth::IsDirty() {
_RPT1(0,"%p->CAVIFileSynth::IsDirty()\n", this);
return S_FALSE;
}
STDMETHODIMP CAVIFileSynth::Load(LPCOLESTR lpszFileName, DWORD grfMode) {
char filename[MAX_PATH];
_RPT1(0,"%p->CAVIFileSynth::Load()\n", this);
WideCharToMultiByte(AreFileApisANSI() ? CP_ACP : CP_OEMCP, 0, lpszFileName, -1, filename, sizeof filename, NULL, NULL);
return Open(filename, grfMode, lpszFileName);
}
STDMETHODIMP CAVIFileSynth::Save(LPCOLESTR lpszFileName, BOOL fRemember) {
_RPT1(0,"%p->CAVIFileSynth::Save()\n", this);
return E_FAIL;
}
STDMETHODIMP CAVIFileSynth::SaveCompleted(LPCOLESTR lpszFileName) {
_RPT1(0,"%p->CAVIFileSynth::SaveCompleted()\n", this);
return S_OK;
}
STDMETHODIMP CAVIFileSynth::GetCurFile(LPOLESTR *lplpszFileName) {
_RPT1(0,"%p->CAVIFileSynth::GetCurFile()\n", this);
*lplpszFileName = NULL;
return E_FAIL;
}
///////////////////////////////////////////////////
HRESULT CAVIFileSynth::Create(const CLSID& rclsid, const IID& riid, void **ppv) {
HRESULT hresult;
_RPT0(0,"CAVIFileSynth::Create()\n");
CAVIFileSynth* pAVIFileSynth = new CAVIFileSynth(rclsid);
if (!pAVIFileSynth) return E_OUTOFMEMORY;
hresult = pAVIFileSynth->QueryInterface(riid, ppv);
pAVIFileSynth->Release();
if (FAILED(hresult)) {
_RPT0(0,"failed!\n");
}
_RPT0(0,"CAVIFileSynth::Create() exit\n");
return hresult;
}
STDMETHODIMP CAVIFileSynth::QueryInterface(const IID& iid, void **ppv) {
_RPT1(0,"%08lx->CAVIFileSynth::QueryInterface()\n", this);
_RPT3(0,"\tGUID: {%08lx-%04x-%04x-", iid.Data1, iid.Data2, iid.Data3);
_RPT4(0,"%02x%02x-%02x%02x", iid.Data4[0], iid.Data4[1], iid.Data4[2], iid.Data4[3]);
_RPT4(0,"%02x%02x%02x%02x} (", iid.Data4[4], iid.Data4[5], iid.Data4[6], iid.Data4[7]);
if (iid == IID_IUnknown) {
*ppv = (IUnknown *)(IAVIFile *)this;
_RPT0(0,"IUnknown)\n");
} else if (iid == IID_IClassFactory) {
*ppv = (IClassFactory *)this;
_RPT0(0,"IClassFactory)\n");
} else if (iid == IID_IPersist) {
*ppv = (IPersist *)this;
_RPT0(0,"IPersist)\n");
} else if (iid == IID_IPersistFile) {
*ppv = (IPersistFile *)this;
_RPT0(0,"IPersistFile)\n");
} else if (iid == IID_IAVIFile) {
*ppv = (IAVIFile *)this;
_RPT0(0,"IAVIFile)\n");
} else {
_RPT0(0,"unknown!)\n");
*ppv = NULL;
return E_NOINTERFACE;
}
AddRef();
return NULL;
}
STDMETHODIMP_(ULONG) CAVIFileSynth::AddRef() {
_RPT1(0,"%p->CAVIFileSynth::AddRef()\n", this);
++gRefCnt;
return ++m_refs;
}
STDMETHODIMP_(ULONG) CAVIFileSynth::Release() {
_RPT3(0,"%p->CAVIFileSynth::Release() - former gRefCnt = %d, m_refs = %d\n", this, gRefCnt, m_refs);
--gRefCnt;
if (!--m_refs) {
delete this;
return 0;
}
_RPT0(0,"CAVIFileSynth::Release() exit\n");
return m_refs;
}
///////////////////////
STDMETHODIMP CAVIStreamSynth::QueryInterface(const IID& iid, void **ppv) {
_RPT1(0,"%08lx->CAVIStreamSynth::QueryInterface()\n", this);
_RPT3(0,"\tGUID: {%08lx-%04x-%04x-", iid.Data1, iid.Data2, iid.Data3);
_RPT4(0,"%02x%02x-%02x%02x", iid.Data4[0], iid.Data4[1], iid.Data4[2], iid.Data4[3]);
_RPT4(0,"%02x%02x%02x%02x} (", iid.Data4[4], iid.Data4[5], iid.Data4[6], iid.Data4[7]);
if (iid == IID_IUnknown) {
*ppv = (IUnknown *)this;
_RPT0(0,"IUnknown)\n");
} else if (iid == IID_IAVIStream) {
*ppv = (IAVIStream *)this;
_RPT0(0,"IAVIStream)\n");
} else {
_RPT0(0,"unknown)\n");
*ppv = NULL;
return E_NOINTERFACE;
}
AddRef();
return NULL;
}
STDMETHODIMP_(ULONG) CAVIStreamSynth::AddRef() {
_RPT0(0,"CAVIStreamSynth::AddRef()\n");
++gRefCnt;
return ++m_refs;
}
STDMETHODIMP_(ULONG) CAVIStreamSynth::Release() {
_RPT0(0,"CAVIStreamSynth::Release()\n");
--gRefCnt;
if (!--m_refs) {
delete this;
return 0;
}
_RPT0(0,"CAVIStreamSynth::Release() exit\n");
return m_refs;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -