tffdshowdec.cpp.svn-base

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

SVN-BASE
958
字号
/* * 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 */#include "stdafx.h"#include "TffdshowDec.h"#include "TdialogSettings.h"#include "TglobalSettings.h"#include "Tpresets.h"#include "TpresetSettings.h"#include "Ttranslate.h"#include "TkeyboardDirect.h"#include "ffdebug.h"#include "ffdshowRemoteAPIimpl.h"#include "Tfilters.h"STDMETHODIMP_(int) TffdshowDec::getVersion2(void){ return VERSION;}template<> interfaces<char_t>::IffdshowDec* TffdshowDec::getDecInterface(void){ return this;}template<> interfaces<tchar_traits<char_t>::other_char_t>::IffdshowDec* TffdshowDec::getDecInterface(void){ return &dec_char;}STDMETHODIMP TffdshowDec::NonDelegatingQueryInterface(REFIID riid,void **ppv){ if (globalSettings->isBlacklist && (riid==IID_IBaseFilter || riid==IID_IMediaFilter) && globalSettings->inBlacklist(getExeflnm()))  return E_NOINTERFACE; if (riid==IID_IffdshowBaseA)  return GetInterface<IffdshowBaseA>(getBaseInterface<IffdshowBaseA>(),ppv); if (riid==IID_IffdshowBaseW)  return GetInterface<IffdshowBaseW>(getBaseInterface<IffdshowBaseW>(),ppv); else if (riid==IID_IffdshowDecA)  return GetInterface<IffdshowDecA>(getDecInterface<IffdshowDecA>(),ppv); else if (riid==IID_IffdshowDecW)  return GetInterface<IffdshowDecW>(getDecInterface<IffdshowDecW>(),ppv); else if (riid==IID_ISpecifyPropertyPages)   return GetInterface<ISpecifyPropertyPages>(this,ppv); else if (riid==IID_IAMStreamSelect && isStreamsMenu())  return GetInterface<IAMStreamSelect>(this,ppv); else if (riid==IID_IffdshowParamsEnum)  return GetInterface<IffdshowParamsEnum>(this,ppv); else   return CTransformFilter::NonDelegatingQueryInterface(riid,ppv);}TffdshowDec::TffdshowDec(TintStrColl *Ioptions,const TCHAR *name,LPUNKNOWN punk,REFCLSID clsid,TglobalSettingsDec *IglobalSettings,TdialogSettingsDec *IdialogSettings,Tpresets *Ipresets,Tpreset* &IpresetSettings,CmyTransformFilter *Imfilter,TinputPin* &Iminput,CTransformOutputPin* &Imoutput,IFilterGraph* &Igraph,Tfilters* &Ifilters,const CLSID &Iproppageid,int IcfgDlgCaptionId,int IiconId,DWORD IdefaultMerit): presets(Ipresets), presetSettings(IpresetSettings), filters(Ifilters), CmyTransformFilter(name,punk,clsid), TffdshowBase(  punk,  Ioptions,  globalSettings=IglobalSettings,  dialogSettings=IdialogSettings,  Imfilter,  Iminput,  Imoutput,  Igraph,  IcfgDlgCaptionId,IiconId,  IdefaultMerit), proppageid(Iproppageid), dec_char(punk,this){ static const TintOptionT<TffdshowDec> iopts[]=  {   IDFF_movieDuration ,&TffdshowDec::moviesecs,-1,-1,_l(""),0,NULL,0,   0  }; addOptions(iopts);  keys=NULL;mouse=NULL; remote=NULL; hereSeek=false; presetSettings=NULL; firsttransform=true;discontinuity=true; filters=NULL; onNewFiltersWnd=NULL;onNewFiltersMsg=0;}TffdshowDec::~TffdshowDec(){ if (presets) delete presets; if (keys) delete keys; if (mouse) delete mouse; if (remote) delete remote;}STDMETHODIMP TffdshowDec::getGraph(IFilterGraph* *graphPtr){ return TffdshowBase::getGraph(graphPtr);}STDMETHODIMP_(int) TffdshowDec::getState2(void){ return TffdshowBase::getState2();}HRESULT TffdshowDec::onInitDialog(void){ initPresets(); if (!presetSettings) setActivePreset(globalSettings->defaultPreset,false); return TffdshowBase::onInitDialog();}//tell and seekSTDMETHODIMP TffdshowDec::tell(int *seconds){ return TffdshowBase::tell(seconds);}STDMETHODIMP TffdshowDec::seek(int seconds){ return TffdshowBase::seek(seconds);}STDMETHODIMP TffdshowDec::stop(void){ return TffdshowBase::stop();}STDMETHODIMP_(int) TffdshowDec::getCurTime2(void){ return TffdshowBase::getCurTime2();}STDMETHODIMP TffdshowDec::run(void){ return TffdshowBase::run();}STDMETHODIMP TffdshowDec::getDuration(int *duration){ return E_NOTIMPL;}STDMETHODIMP TffdshowDec::initKeys(void){ if (!keys) keys=new Tkeyboard(options,this); return S_OK;}STDMETHODIMP TffdshowDec::saveKeysSettings(void){ if (!keys) return S_FALSE; keys->save(); return S_OK;}STDMETHODIMP TffdshowDec::loadKeysSettings(void){ if (!keys) return S_FALSE; keys->load(); return S_OK;}STDMETHODIMP_(int) TffdshowDec::getKeyParamCount2(void){ return keys?(int)keys->keysParams.size():0;}STDMETHODIMP TffdshowDec::getKeyParamDescr(unsigned int i,const char_t **descr){ if (!keys || i>=keys->keysParams.size())   {   *descr=_l("");   return S_FALSE;  }; *descr=keys->keysParams[i].descr; return S_OK;}STDMETHODIMP_(int) TffdshowDec::getKeyParamKey2(unsigned int i){ if (!keys || i>=keys->keysParams.size()) return 0; return keys->keysParams[i].key;}STDMETHODIMP TffdshowDec::setKeyParamKey(unsigned int i,int key){ if (!keys || i>=keys->keysParams.size()) return S_FALSE; keys->keysParams[i].key=key; sendOnChange(IDFF_keysSeek1/*just not to send 0*/,key); return S_OK;}STDMETHODIMP TffdshowDec::setKeyParamKeyCheck(unsigned int i,int key,int *prev,const char_t* *prevDescr){ if (key!=0 && (prev || prevDescr))  for (unsigned int previ=0;previ<keys->keysParams.size();previ++)   if (previ!=i && keys->keysParams[previ].key==key)    {     if (prev) *prev=previ;     if (prevDescr) *prevDescr=keys->keysParams[previ].descr;     return E_INVALIDARG;    } return setKeyParamKey(i,key);   }STDMETHODIMP TffdshowDec::resetKeys(void){ if (!keys) return S_FALSE; keys->reset(); return S_OK;}STDMETHODIMP TffdshowDec::exportKeysToGML(const char_t *flnm){ return keys->exportToGML(flnm)?S_OK:E_FAIL;}STDMETHODIMP TffdshowDec::initMouse(void){ if (!mouse) mouse=new Tmouse(options,this); return S_OK;}STDMETHODIMP TffdshowDec::initRemote(void){ if (!remote) remote=new Tremote(options,this); return S_OK;}STDMETHODIMP TffdshowDec::saveRemoteSettings(void){ if (!remote) return S_FALSE; remote->save(); return S_OK;}STDMETHODIMP TffdshowDec::loadRemoteSettings(void){ if (!remote) return S_FALSE; remote->load(); return S_OK;}void TffdshowDec::onTrayIconChange(int id,int newval){ if (!firsttransform && (globalSettings->filtermode&IDFF_FILTERMODE_PROC)==0)  TffdshowBase::onTrayIconChange(id,newval);}STDMETHODIMP TffdshowDec::getNumPresets(unsigned int *value){ if (!value) return E_POINTER; *value=(unsigned int)presets->size(); return S_OK;}STDMETHODIMP TffdshowDec::getPresetName(unsigned int i,char_t *buf,size_t len){ if (!buf) return E_POINTER; if (i>=presets->size()) return S_FALSE; if (len<strlen((*presets)[i]->presetName)+1) return E_OUTOFMEMORY; strcpy(buf,(*presets)[i]->presetName); return S_OK;}STDMETHODIMP TffdshowDec::getActivePresetName(char_t *buf,size_t len){ if (!buf) return E_POINTER; if (!presetSettings) return S_FALSE; if (len<strlen(presetSettings->presetName)+1) return E_OUTOFMEMORY; strcpy(buf,presetSettings->presetName); return S_OK;}STDMETHODIMP_(const char_t*) TffdshowDec::getActivePresetName2(void){ return presetSettings?presetSettings->presetName:NULL;}STDMETHODIMP TffdshowDec::setActivePreset(const char_t *name,int create){ if (!name) return S_FALSE; Tpreset *preset=presets->getPreset(name,!!create); if (preset)  {   setPresetPtr(preset);   return S_OK;  } else   return S_FALSE;}STDMETHODIMP TffdshowDec::saveActivePreset(const char_t *name){ if (!presetSettings) return E_INVALIDARG; presets->savePreset(presetSettings,name); return S_OK;}STDMETHODIMP TffdshowDec::saveActivePresetToFile(const char_t *flnm){ if (!flnm || !presetSettings) return E_INVALIDARG; return presets->savePresetFile(presetSettings,flnm)?S_OK:E_FAIL;}STDMETHODIMP TffdshowDec::loadActivePresetFromFile(const char_t *flnm){ if (!flnm) return E_INVALIDARG; if (!presetSettings)  presetSettings=presets->newPreset(); if (presetSettings->loadFile(flnm))  {   presets->storePreset(presetSettings);   notifyParamsChanged();   return S_OK;  }  else return E_FAIL;}STDMETHODIMP TffdshowDec::savePresetMem(void *buf,size_t len){ if (!presetSettings) return E_UNEXPECTED; if (!buf) return E_POINTER; TregOpIDstreamWrite t; presetSettings->reg_op(t);  if (len==0)   *(int*)buf=(int)t.size(); else  memcpy(buf,&*t.begin(),std::min(size_t(len),t.size())); return S_OK;}STDMETHODIMP TffdshowDec::loadPresetMem(const void *buf,size_t len){ if (!presetSettings) return E_UNEXPECTED; TregOpIDstreamRead t(buf,len); presetSettings->reg_op(t); return 0;}STDMETHODIMP TffdshowDec::removePreset(const char_t *name){ if (stricmp(presetSettings->presetName,globalSettings->defaultPreset)==0)  putParamStr(IDFF_defaultPreset,(*presets)[0]->presetName); return presets->removePreset(name)?S_OK:S_FALSE;}STDMETHODIMP TffdshowDec::getPresets(Tpresets *presets2){ if (!presets2) return E_INVALIDARG; presets2->done(); for (Tpresets::iterator i=presets->begin();i!=presets->end();i++)  presets2->push_back((*i)->copy()); return S_OK;}STDMETHODIMP TffdshowDec::setPresets(const Tpresets *presets2){ if (!presets2) return E_POINTER; presets->done(); for (Tpresets::const_iterator i=presets2->begin();i!=presets2->end();i++)  presets->push_back((*i)->copy()); return S_OK;}STDMETHODIMP TffdshowDec::savePresets(void){ presets->saveRegAll(); return S_OK;}STDMETHODIMP TffdshowDec::setPresetPtr(Tpreset *preset){ if (!preset) return E_POINTER; if (presetSettings!=preset)  {   lock(IDFF_lockPresetPtr);   presetSettings=preset;   presetSettings->options->setSendOnChange(fastdelegate::MakeDelegate(this,&TffdshowDec::sendOnChange));    notifyParamsChanged();   sendOnChange(0,0);   unlock(IDFF_lockPresetPtr);  } return S_OK;}STDMETHODIMP TffdshowDec::getPresetPtr(Tpreset**preset){ if (!preset) return E_POINTER; *preset=presetSettings; return S_OK;}void TffdshowDec::getColls(TintStrColls &colls){ if (presetSettings)  colls.push_back(presetSettings->options); TffdshowBase::getColls(colls); }STDMETHODIMP TffdshowDec::getParam(unsigned int paramID,int* value){ if (!value) return S_FALSE; if (presetSettings && presetSettings->options->get(paramID,value))  return S_OK; else  return TffdshowBase::getParam(paramID,value);} STDMETHODIMP TffdshowDec::putParam(unsigned int paramID,int val){ return presetSettings && presetSettings->options->set(paramID,val)?S_OK:TffdshowBase::putParam(paramID,val);}STDMETHODIMP TffdshowDec::invParam(unsigned int paramID){ return presetSettings && presetSettings->options->inv(paramID)?S_OK:TffdshowBase::invParam(paramID);}STDMETHODIMP TffdshowDec::resetParam(unsigned int paramID){ return presetSettings && presetSettings->options->reset(paramID)?S_OK:TffdshowBase::resetParam(paramID);}STDMETHODIMP TffdshowDec::getParamStr3(unsigned int paramID,const char_t* *value){ if (!value) return S_FALSE; if (presetSettings && presetSettings->options->get(paramID,value))  return S_OK; else  return TffdshowBase::getParamStr3(paramID,value);}STDMETHODIMP TffdshowDec::putParamStr(unsigned int paramID,const char_t *buf){ if (!buf) return S_FALSE;  return presetSettings && presetSettings->options->set(paramID,buf)?S_OK:TffdshowBase::putParamStr(paramID,buf);}STDMETHODIMP TffdshowDec::getParamInfo(unsigned int paramID,TffdshowParamInfo *paramPtr){ if (!paramPtr) return E_POINTER; return presetSettings && presetSettings->options->getInfo(paramID,paramPtr)?S_OK:TffdshowBase::getParamInfo(paramID,paramPtr);}STDMETHODIMP TffdshowDec::notifyParam(int id,int val){ return presetSettings && presetSettings->options->notifyParam(id,val)?S_OK:TffdshowBase::notifyParam(id,val);}STDMETHODIMP TffdshowDec::notifyParamStr(int id,const char_t *val){ return presetSettings && presetSettings->options->notifyParam(id,val)?S_OK:TffdshowBase::notifyParamStr(id,val);}STDMETHODIMP TffdshowDec::notifyParamsChanged(void){ if (filters) filters->onQueueChange(0,0); return TffdshowBase::notifyParamsChanged();}STDMETHODIMP TffdshowDec::renameActivePreset(const char_t *newName){ if (!newName) return E_POINTER; if (strlen(newName)>260) return E_OUTOFMEMORY; int res=stricmp(presetSettings->presetName,globalSettings->defaultPreset); strcpy(presetSettings->presetName,newName); if (res==0) putParamStr(IDFF_defaultPreset,newName); sendOnChange(0,0); return S_OK;}STDMETHODIMP TffdshowDec::isDefaultPreset(const char_t *presetName){ return stricmp(globalSettings->defaultPreset,presetName)==0?1:0;}STDMETHODIMP TffdshowDec::initPresets(void){ if (!presets->empty()) return E_UNEXPECTED; presets->init(); return S_OK;}void TffdshowDec::initPreset(void){ DPRINTF(_l("initPreset")); if (presets->empty()) initPresets(); getSourceName();  if (globalSettings->autoPreset)  if (Tpreset *preset=presets->getAutoPreset(this,!!globalSettings->autoPresetFileFirst))   {    setPresetPtr(preset);    return;   }  setActivePreset(globalSettings->defaultPreset,false);}STDMETHODIMP TffdshowDec::createTempPreset(const char_t *presetName){

⌨️ 快捷键说明

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