tffdshowbase.cpp.svn-base

来自「ffshow源码」· SVN-BASE 代码 · 共 898 行 · 第 1/2 页

SVN-BASE
898
字号
/* * Copyright (c) 2003-2006 Milan Cutka * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA *//* * Modified by Haruhiko Yamagata <h.yamagata@nifty.com> in 2006. * I modified this to support multi-thread related features. * I am compliant to GNU General Public License. */#include "stdafx.h"#include "TffdshowBase.h"#include "ffdshow_constants.h"#include "TglobalSettings.h"#include "TdialogSettings.h"#include "TcpuUsage.h"#include "Ttranslate.h"#include "Tlibmplayer.h"#include "Tlibavcodec.h"#include "ffdebug.h"#include "dsutil.h"#include "IffdshowParamsEnum.h"#include "TpageSite.h"#include "TinputPin.h"#include "Tinfo.h"#include "TtrayIcon.h"STDMETHODIMP_(int) TffdshowBase::getVersion2(void){ return VERSION;}template<> interfaces<char_t>::IffdshowBase* TffdshowBase::getBaseInterface(void){ return this;}template<> interfaces<tchar_traits<char_t>::other_char_t>::IffdshowBase* TffdshowBase::getBaseInterface(void){ return &base_char;}TffdshowBase::TffdshowBase(LPUNKNOWN pUnk,TintStrColl *Ioptions,TglobalSettingsBase *IglobalSettings,TdialogSettingsBase *IdialogSettings,CmyTransformFilter *Imfilter,TinputPin* &Iminput,CTransformOutputPin* &Imoutput,IFilterGraph* &Igraph,int IcfgDlgCaptionId,int IiconId,DWORD IdefaultMerit): options(Ioptions), cfgDlgCaptionId(IcfgDlgCaptionId), iconId(IiconId), mfilter(Imfilter), minput(Iminput), moutput(Imoutput), graph(Igraph), defaultMerit(IdefaultMerit), Toptions(Ioptions), globalSettings(IglobalSettings), dialogSettings(IdialogSettings), config(Ioptions), info(NULL), base_char(pUnk,this){ DPRINTF(_l("TffdshowBase::Constructor")); randomize();  Ioptions->setSendOnChange(fastdelegate::MakeDelegate(this,&TffdshowBase::sendOnChange));  static const TintOptionT<TffdshowBase> iopts[]=  {   IDFF_alwaysOnTop  ,&TffdshowBase::cfgDlgAlwaysOnTop ,0,0,_l(""),0,NULL,0,   IDFF_notreg       ,&TffdshowBase::notreg            ,0,0,_l(""),0,NULL,0,   IDFF_defaultMerit ,&TffdshowBase::defaultMerit      ,-1,-1,_l(""),0,NULL,0,   IDFF_applying     ,&TffdshowBase::applying          ,0,0,_l(""),0,NULL,0,   0  }; addOptions(iopts); setOnChange(IDFF_lang,this,&TffdshowBase::onLangChange); setOnChange(IDFF_trayIcon,this,&TffdshowBase::onTrayIconChange);  config.init1(g_hInst); globalSettings->load(); config.initCPU(globalSettings->allowedCPUflags); config.init2(); firstdialog=true; trans=NULL; cfgDlgHwnd=NULL;cfgDlgAlwaysOnTop=0; cpu=NULL;cpus=-1; onChangeWnd=NULL;onChangeMsg=0; onFrameWnd=NULL;onFrameMsg=0; applying=0; trayHwnd=NULL;hTrayThread=NULL; libmplayer=NULL;libavcodec=NULL; dbgfile=NULL; notreg=false; moviesecs=-1;  memset(locks,0,sizeof(locks)); pdwROT=0; curEnumInfo=enumInfos.begin(); m_CPUCount=Tconfig::getCPUcount();}TffdshowBase::~TffdshowBase(){ for (int i=0;i<LOCKS_COUNT;i++) if (locks[i]) delete locks[i]; if (trans) trans->release(); if (cpu) delete cpu; if (libavcodec) libavcodec->Release(); delete globalSettings; delete dialogSettings; if (dbgfile) fclose(dbgfile); if (libmplayer) libmplayer->Release(); if (info) delete info;}STDMETHODIMP TffdshowBase::getParam(unsigned int paramID,int* value){ if (!value) return S_FALSE; if (options->get(paramID,value))  return S_OK; else  {   *value=0;   return S_FALSE;  } }STDMETHODIMP_(int) TffdshowBase::getParam2(unsigned int paramID){ int val; return getParam(paramID,&val)==S_OK?val:0; }STDMETHODIMP TffdshowBase::putParam(unsigned int paramID,int val){ return options->set(paramID,val)?S_OK:S_FALSE;}STDMETHODIMP TffdshowBase::invParam(unsigned int paramID){ return options->inv(paramID)?S_OK:S_FALSE;}STDMETHODIMP TffdshowBase::resetParam(unsigned int paramID){ return options->reset(paramID)?S_OK:S_FALSE;}STDMETHODIMP TffdshowBase::getParamStr(unsigned int paramID,char_t *buf,size_t buflen){ if (!buf) return S_FALSE; const char_t *bufPtr; if (getParamStr3(paramID,&bufPtr)==S_OK)  {   strncpy(buf,bufPtr,buflen);   buf[buflen-1]='\0';   return S_OK;  }  else  {   buf[0]='\0';   return S_FALSE;  } }STDMETHODIMP TffdshowBase::getParamStr3(unsigned int paramID,const char_t* *value){ if (!value) return S_FALSE; if (options->get(paramID,value))  return S_OK; else  {   *value=NULL;   return S_FALSE;  } }STDMETHODIMP_(const char_t*) TffdshowBase::getParamStr2(unsigned int paramID){ const char_t *bufPtr=NULL; return getParamStr3(paramID,&bufPtr)==S_OK?bufPtr:NULL;}STDMETHODIMP TffdshowBase::putParamStr(unsigned int paramID,const char_t *buf){ if (!buf) return S_FALSE;  return options->set(paramID,buf)?S_OK:S_FALSE;}STDMETHODIMP TffdshowBase::getParamName(unsigned int paramID,char_t *buf,size_t buflen){ if (!buf) return E_POINTER; const char_t *namePtr; if (getParamName3(paramID,&namePtr)==S_OK)  {   strncpy(buf,namePtr,buflen);   buf[buflen-1]='\0';   return S_OK;  } else  {   buf[0]='\0';   return S_FALSE;  }}STDMETHODIMP TffdshowBase::getParamName3(unsigned int paramID,const char_t* *namePtr){ if (!namePtr) return E_POINTER; TffdshowParamInfo param;memset(&param,0,sizeof(param)); if (getParamInfo(paramID,&param)!=S_OK)  {   *namePtr=_l("");   return S_FALSE;  } else  {   *namePtr=param.namePtr;   return S_OK;  }}STDMETHODIMP TffdshowBase::getParamInfo(unsigned int paramID,TffdshowParamInfo *paramPtr){ if (!paramPtr) return E_POINTER; return options->getInfo(paramID,paramPtr)?S_OK:S_FALSE;}STDMETHODIMP TffdshowBase::notifyParam(int id,int val){ return options->notifyParam(id,val)?S_OK:S_FALSE;}STDMETHODIMP TffdshowBase::notifyParamStr(int id,const char_t *val){ return options->notifyParam(id,val)?S_OK:S_FALSE;}void TffdshowBase::sendOnChange(int paramID,int val){ if (!applying && onChangeWnd && onChangeMsg &&     paramID!=IDFF_lastPage &&     paramID!=IDFF_applying    )  PostMessage(onChangeWnd,onChangeMsg,paramID,val);}STDMETHODIMP TffdshowBase::notifyParamsChanged(void){ options->notifyParamsChanged(); return S_OK;}STDMETHODIMP TffdshowBase::setOnChangeMsg(HWND wnd,unsigned int msg){ onChangeWnd=wnd;onChangeMsg=msg; return S_OK;}STDMETHODIMP TffdshowBase::setOnFrameMsg(HWND wnd,unsigned int msg){ onFrameWnd=wnd;onFrameMsg=msg; return S_OK;}void TffdshowBase::sendOnFrameMsg(void){ if (onFrameMsg)   PostMessage(onFrameWnd,onFrameMsg,0,0);}  STDMETHODIMP TffdshowBase::getGlobalSettings(TglobalSettingsBase* *globalSettingsPtr){ if (!globalSettingsPtr) return E_POINTER; *globalSettingsPtr=globalSettings; return S_OK;}STDMETHODIMP TffdshowBase::saveGlobalSettings(void){ globalSettings->save(); config.save(); return S_OK;}STDMETHODIMP TffdshowBase::loadGlobalSettings(void){ globalSettings->load(); return S_OK;}STDMETHODIMP TffdshowBase::saveDialogSettings(void){ dialogSettings->save(); return S_OK;}STDMETHODIMP TffdshowBase::loadDialogSettings(void){ dialogSettings->load(&config); return S_OK;}STDMETHODIMP TffdshowBase::getConfig(const Tconfig* *configPtr){ if (!configPtr) return E_POINTER; *configPtr=&config; return S_OK;}STDMETHODIMP TffdshowBase::getInstance(HINSTANCE *hi){ if (!hi) return S_FALSE; *hi=g_hInst; return S_OK;}STDMETHODIMP_(HINSTANCE) TffdshowBase::getInstance2(void){ return g_hInst;}void TffdshowBase::onLangChange(int id,const char_t *newval){ if (trans)  trans->init(dialogSettings->lang,dialogSettings->translate);}STDMETHODIMP TffdshowBase::getTranslator(Ttranslate* *transPtr){ if (!transPtr) return E_POINTER; if (!trans || !dialogSettings->loaded)  {   dialogSettings->load(&config);   trans=new Ttranslate(g_hInst,config.pth);   trans->init(dialogSettings->lang,dialogSettings->translate);  } else  onLangChange(0,NULL); trans->addref(); *transPtr=trans; return S_OK;}STDMETHODIMP TffdshowBase::initDialog(void){ if (firstdialog)  {   firstdialog=false;   //loadDialogSettings();   InitCommonControls();   return onInitDialog();  } else   return E_UNEXPECTED;}STDMETHODIMP TffdshowBase::doneDialog(void){ if (!firstdialog)  {   firstdialog=true;   return onDoneDialog();  } else  return E_UNEXPECTED; }STDMETHODIMP TffdshowBase::showCfgDlg(HWND owner){ if (cfgDlgHwnd) return S_FALSE; CoInitialize(NULL); TpageSite site; site.show(this,owner,cfgDlgCaptionId,iconId); CoUninitialize(); return S_OK;}STDMETHODIMP_(int) TffdshowBase::getCpuUsage2(void){ if (!cpu) return 0; cpu->CollectCPUData(); return cpu->GetCPUUsage(0);}STDMETHODIMP TffdshowBase::cpuSupportsMMX(void){ return (Tconfig::cpu_flags&FF_CPU_MMX)?1:0;}STDMETHODIMP TffdshowBase::cpuSupportsMMXEXT(void){ return (Tconfig::cpu_flags&FF_CPU_MMXEXT)?1:0;}STDMETHODIMP TffdshowBase::cpuSupportsSSE(void){ return (Tconfig::cpu_flags&FF_CPU_SSE)?1:0;}STDMETHODIMP TffdshowBase::cpuSupportsSSE2(void){ return (Tconfig::cpu_flags&FF_CPU_SSE2)?1:0;}STDMETHODIMP TffdshowBase::cpuSupports3DNOW(void){ return (Tconfig::cpu_flags&FF_CPU_3DNOW)?1:0;}STDMETHODIMP TffdshowBase::cpuSupports3DNOWEXT(void){ return (Tconfig::cpu_flags&FF_CPU_3DNOWEXT)?1:0;}STDMETHODIMP TffdshowBase::getPostproc(Tlibmplayer* *postprocPtr){ if (!postprocPtr) return E_POINTER; if (!libmplayer)  libmplayer=new Tlibmplayer(&config); libmplayer->AddRef(); *postprocPtr=libmplayer;  return S_OK;}STDMETHODIMP TffdshowBase::dbgInit(void){ dbgDone(); if (globalSettings->outputdebugfile && globalSettings->debugfile)   dbgfile=fopen(globalSettings->debugfile,_l("wt")); return S_OK;}STDMETHODIMP TffdshowBase::dbgError(const char_t *fmt,...){ char_t msg[260]; va_list args; va_start(args,fmt); int len=_vsnprintf(msg,260,fmt,args); va_end(args); dbgWrite(msg); if (globalSettings->errorbox) MessageBox(NULL,msg,_l("ffdshow error"),MB_ICONERROR|MB_OK); return S_OK;}STDMETHODIMP TffdshowBase::dbgWrite(const char_t *fmt,...){ if (!globalSettings->outputdebug && !globalSettings->outputdebugfile) return S_FALSE; char_t s[260]; va_list args; va_start(args,fmt); int len=_vsnprintf(s,256,fmt,args); va_end(args); if (len<-1) return E_INVALIDARG; s[256]='\0'; if (s[len-1]!='\n') {s[len]='\n';s[len+1]='\0';} if (globalSettings->outputdebug) OutputDebugString(s); if (dbgfile && globalSettings->outputdebugfile)  {   fputs(s,dbgfile);   fflush(dbgfile);  } return S_OK;}STDMETHODIMP TffdshowBase::dbgDone(void){ if (dbgfile)   {   fflush(dbgfile);fclose(dbgfile);   dbgfile=NULL;  } return S_OK;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?