📄 tpresetenc.cpp
字号:
/*
* Copyright (c) 2002-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 "TpresetEnc.h"
#include "TcodecSettings.h"
#include "ffdshow_constants.h"
const char_t* TpresetsEnc::preset_lavc_vcd_pal=_l("Libavcodec VCD PAL");
const char_t* TpresetsEnc::preset_lavc_vcd_ntsc=_l("Libavcodec VCD NTSC");
const char_t* TpresetsEnc::preset_lavc_svcd_pal=_l("Libavcodec SVCD PAL");
const char_t* TpresetsEnc::preset_lavc_svcd_ntsc=_l("Libavcodec SVCD NTSC");
const char_t* TpresetsEnc::preset_lavc_dvd_pal=_l("Libavcodec DVD PAL");
const char_t* TpresetsEnc::preset_lavc_dvd_ntsc=_l("Libavcodec DVD NTSC");
//================================== TpresetEnc ====================================
void TpresetEnc::initBuiltin(void)
{
strcpy(name,_l("Builtin"));
struct TregOpDefault :public TregOp
{
private:
TpresetEnc *preset;
public:
TregOpDefault(TpresetEnc *Ipreset):preset(Ipreset) {}
virtual bool _REG_OP_N(short int id,const char_t *X,int &Y,const int Z)
{
preset->vals.insert(std::make_pair(X,Tval(Z)));
return true;
}
virtual void _REG_OP_S(short int id,const char_t *X,char_t *Y,size_t buflen,const char_t *Z)
{
preset->vals.insert(std::make_pair(X,Tval(Z)));
}
} t(this);
TcoSettings co(new TintStrColl);
co.reg_op(t);
}
void TpresetEnc::load(const char_t *Iname)
{
char_t key[MAX_PATH];strcpy(key,FFDSHOW_REG_PARENT _l("\\") FFDSHOWENC);
strcpy(name,Iname?Iname:_l("Default"));
if (Iname)
{
strcat(key,_l("\\"));
strcat(key,name);
};
struct TregOpPresetRegRead :public TregOp
{
private:
TpresetEnc *preset;
HKEY hKey;
public:
TregOpPresetRegRead(TpresetEnc *Ipreset,HKEY hive,const char_t *key):preset(Ipreset)
{
hKey=NULL;
RegOpenKeyEx(hive,key,0,KEY_READ,&hKey);
}
virtual ~TregOpPresetRegRead()
{
if (hKey) RegCloseKey(hKey);
}
virtual bool _REG_OP_N(short int id,const char_t *X,int &Y,const int Z)
{
DWORD size=sizeof(int);
int val;
if (hKey && RegQueryValueEx(hKey,X,0,0,(LPBYTE)&val,&size)==ERROR_SUCCESS)
{
preset->vals.insert(std::make_pair(X,Tval(val)));
return true;
}
else
return false;
}
virtual void _REG_OP_S(short int id,const char_t *X,char_t *Y,size_t buflen,const char_t *Z)
{
DWORD size=MAX_PATH*sizeof(char_t);
char_t val[MAX_PATH];
if (hKey && RegQueryValueEx(hKey,X,0,0,(LPBYTE)val,&size)==ERROR_SUCCESS)
preset->vals.insert(std::make_pair(X,Tval(val)));
}
} t(this,HKEY_CURRENT_USER,key);
TcoSettings co(new TintStrColl);
co.reg_op(t);
}
void TpresetEnc::save(void)
{
char_t key[MAX_PATH];strcpy(key,FFDSHOW_REG_PARENT _l("\\") FFDSHOWENC);
strcat(key,_l("\\"));strcat(key,name);
DWORD dispo;
HKEY hKey=NULL;
if (RegCreateKeyEx(HKEY_CURRENT_USER,key,0,FFDSHOW_REG_CLASS,REG_OPTION_NON_VOLATILE,KEY_WRITE,0,&hKey,&dispo)!=ERROR_SUCCESS) return;
for (Tvals::const_iterator v=vals.begin();v!=vals.end();v++)
if (v->second.s.empty())
RegSetValueEx(hKey,v->first,0,REG_DWORD,(LPBYTE)&v->second.i,sizeof(int));
else
RegSetValueEx(hKey,v->first,0,REG_SZ,(LPBYTE)v->second.s.c_str(),DWORD((v->second.s.size()+1)*sizeof(char_t)));
RegCloseKey(hKey);
}
bool TpresetEnc::TregOpCategory::isIn(int id)
{
if (id==0 || !propsIDs) return false;
const int *p=propsIDs;
while (*p)
{
if (*p==id)
return true;
p++;
}
return false;
}
void TpresetEnc::apply(TcoSettings *co,const int *propsIDs)
{
struct TregOpApply :public TregOpCategory
{
public:
TregOpApply(TpresetEnc *Ipreset,TcoSettings *Ico,const int *IpropsIDs):TregOpCategory(Ipreset,Ico,IpropsIDs) {}
virtual bool _REG_OP_N(short int id,const char_t *X,int &Y,const int Z)
{
if (isIn(id))
{
TpresetEnc::Tvals::iterator val=preset->vals.find(X);
if (val!=preset->vals.end())
{
Y=val->second.i;
return false;
}
}
return true;
}
virtual void _REG_OP_S(short int id,const char_t *X,char_t *Y,size_t buflen,const char_t *Z)
{
if (isIn(id))
{
TpresetEnc::Tvals::iterator val=preset->vals.find(X);
if (val!=preset->vals.end())
{
strncpy(Y,val->second.s.c_str(),buflen);
Y[buflen-1]='\0';
}
}
}
} t(this,co,propsIDs);
co->reg_op(t);
}
void TpresetEnc::store(TcoSettings *co,const int *propsIDs)
{
struct TregOpStore :public TregOpCategory
{
public:
TregOpStore(TpresetEnc *Ipreset,TcoSettings *Ico,const int *IpropsIDs):TregOpCategory(Ipreset,Ico,IpropsIDs) {}
virtual bool _REG_OP_N(short int id,const char_t *X,int &Y,const int Z)
{
if (isIn(id))
preset->vals[X]=Tval(Y);
return true;
}
virtual void _REG_OP_S(short int id,const char_t *X,char_t *Y,size_t buflen,const char_t *Z)
{
if (isIn(id))
preset->vals[X]=Tval(Y);
}
} t(this,co,propsIDs);
co->reg_op(t);
}
void TpresetEnc::rename(const char_t *newname)
{
remove();
strcpy(name,newname);
save();
}
void TpresetEnc::remove(void)
{
char_t key[MAX_PATH];
strcpy(key,FFDSHOW_REG_PARENT _l("\\") FFDSHOWENC);strcat(key,_l("\\"));strcat(key,name);
RegDeleteKey(HKEY_CURRENT_USER,key);
}
//================================= TpresetsEnc ====================================
void TpresetsEnc::init(void)
{
if (!empty()) return;
TpresetEnc preset;
preset.initBuiltin();
push_back(preset);
preset.vals.clear();
preset.load(NULL);
push_back(preset);
HKEY hKey;
RegOpenKeyEx(HKEY_CURRENT_USER,FFDSHOW_REG_PARENT _l("\\") FFDSHOWENC,0,KEY_READ,&hKey);
for (int i=0,retCode=ERROR_SUCCESS;retCode==ERROR_SUCCESS;i++)
{
char_t keyName[MAX_PATH];DWORD keyNameSize=MAX_PATH;
FILETIME ftLastWriteTime;
retCode = RegEnumKeyEx(hKey,
i,
keyName,
&keyNameSize,
NULL,
NULL,
NULL,
&ftLastWriteTime
);
if (retCode==ERROR_SUCCESS)
{
if (strcmp(keyName,_l("makeAVIS"))!=0)
{
TpresetEnc presetAVIS;
presetAVIS.load(keyName);
push_back(presetAVIS);
}
}
else
break;
}
RegCloseKey(hKey);
if (!getPreset(preset_lavc_vcd_pal))
{
TpresetEnc pe;
strcpy(pe.name,preset_lavc_vcd_pal);
TcoSettings co(new TintStrColl);
co.mode=ENC_MODE::CBR;
co.codecId=CODEC_ID_MPEG1VIDEO;
co.min_key_interval=1;
co.max_key_interval=15;
co.bitrate1000=1150;
co.ff1_rc_max_rate1000=1150;
co.ff1_rc_min_rate1000=1150;
co.ff1_rc_buffer_size=40*1024*8;
static const int idffs[]={IDFF_enc_min_key_interval,IDFF_enc_max_key_interval,IDFF_enc_mode,IDFF_enc_codecId,IDFF_enc_bitrate1000,IDFF_enc_ff1_rc_max_rate1000,IDFF_enc_ff1_rc_min_rate1000,IDFF_enc_ff1_rc_buffer_size,0};
pe.store(&co,idffs);
push_back(pe);
}
if (!getPreset(preset_lavc_vcd_ntsc))
{
TpresetEnc pe;
strcpy(pe.name,preset_lavc_vcd_ntsc);
TcoSettings co(new TintStrColl);
co.mode=ENC_MODE::CBR;
co.codecId=CODEC_ID_MPEG1VIDEO;
co.min_key_interval=1;
co.max_key_interval=15;
co.bitrate1000=1150;
co.ff1_rc_max_rate1000=1150;
co.ff1_rc_min_rate1000=1150;
co.ff1_rc_buffer_size=40*1024*8;
static const int idffs[]={IDFF_enc_min_key_interval,IDFF_enc_max_key_interval,IDFF_enc_mode,IDFF_enc_codecId,IDFF_enc_bitrate1000,IDFF_enc_ff1_rc_max_rate1000,IDFF_enc_ff1_rc_min_rate1000,IDFF_enc_ff1_rc_buffer_size,0};
pe.store(&co,idffs);
push_back(pe);
}
if (!getPreset(preset_lavc_svcd_pal))
{
TpresetEnc pe;
strcpy(pe.name,preset_lavc_svcd_pal);
TcoSettings co(new TintStrColl);
co.mode=ENC_MODE::CBR;
co.codecId=CODEC_ID_MPEG2VIDEO;
co.min_key_interval=1;
co.max_key_interval=15;
co.bitrate1000=2040;
co.ff1_rc_max_rate1000=2516;
co.ff1_rc_min_rate1000=0;
co.ff1_rc_buffer_size=224*1024*8;
co.svcd_scan_offset=1;
static const int idffs[]={IDFF_enc_min_key_interval,IDFF_enc_max_key_interval,IDFF_enc_mode,IDFF_enc_codecId,IDFF_enc_bitrate1000,IDFF_enc_ff1_rc_max_rate1000,IDFF_enc_ff1_rc_min_rate1000,IDFF_enc_ff1_rc_buffer_size,IDFF_enc_svcd_scan_offset,0};
pe.store(&co,idffs);
push_back(pe);
}
if (!getPreset(preset_lavc_svcd_ntsc))
{
TpresetEnc pe;
strcpy(pe.name,preset_lavc_svcd_ntsc);
TcoSettings co(new TintStrColl);
co.mode=ENC_MODE::CBR;
co.codecId=CODEC_ID_MPEG2VIDEO;
co.min_key_interval=1;
co.max_key_interval=18;
co.bitrate1000=2040;
co.ff1_rc_max_rate1000=2516;
co.ff1_rc_min_rate1000=0;
co.ff1_rc_buffer_size=224*1024*8;
co.svcd_scan_offset=1;
static const int idffs[]={IDFF_enc_min_key_interval,IDFF_enc_max_key_interval,IDFF_enc_mode,IDFF_enc_codecId,IDFF_enc_bitrate1000,IDFF_enc_ff1_rc_max_rate1000,IDFF_enc_ff1_rc_min_rate1000,IDFF_enc_ff1_rc_buffer_size,IDFF_enc_svcd_scan_offset,0};
pe.store(&co,idffs);
push_back(pe);
}
if (!getPreset(preset_lavc_dvd_pal))
{
TpresetEnc pe;
strcpy(pe.name,preset_lavc_dvd_pal);
TcoSettings co(new TintStrColl);
co.mode=ENC_MODE::CBR;
co.codecId=CODEC_ID_MPEG2VIDEO;
co.min_key_interval=1;
co.max_key_interval=15;
co.bitrate1000=6000;
co.ff1_rc_max_rate1000=9000;
co.ff1_rc_min_rate1000=0;
co.ff1_rc_buffer_size=224*1024*8;
co.svcd_scan_offset=0;
static const int idffs[]={IDFF_enc_min_key_interval,IDFF_enc_max_key_interval,IDFF_enc_mode,IDFF_enc_codecId,IDFF_enc_bitrate1000,IDFF_enc_ff1_rc_max_rate1000,IDFF_enc_ff1_rc_min_rate1000,IDFF_enc_ff1_rc_buffer_size,IDFF_enc_svcd_scan_offset,0};
pe.store(&co,idffs);
push_back(pe);
}
if (!getPreset(preset_lavc_dvd_ntsc))
{
TpresetEnc pe;
strcpy(pe.name,preset_lavc_dvd_ntsc);
TcoSettings co(new TintStrColl);
co.mode=ENC_MODE::CBR;
co.codecId=CODEC_ID_MPEG2VIDEO;
co.min_key_interval=1;
co.max_key_interval=18;
co.bitrate1000=6000;
co.ff1_rc_max_rate1000=9000;
co.ff1_rc_min_rate1000=0;
co.ff1_rc_buffer_size=224*1024*8;
co.svcd_scan_offset=0;
static const int idffs[]={IDFF_enc_min_key_interval,IDFF_enc_max_key_interval,IDFF_enc_mode,IDFF_enc_codecId,IDFF_enc_bitrate1000,IDFF_enc_ff1_rc_max_rate1000,IDFF_enc_ff1_rc_min_rate1000,IDFF_enc_ff1_rc_buffer_size,IDFF_enc_svcd_scan_offset,0};
pe.store(&co,idffs);
push_back(pe);
}
}
void TpresetsEnc::save(void)
{
for (size_t i=2;i<size();i++)
at(i).save();
}
TpresetEnc* TpresetsEnc::getPreset(const char_t *name)
{
for (iterator i=begin();i!=end();i++)
if (stricmp(name,i->name)==0)
return &*i;
return NULL;
}
TpresetEnc* TpresetsEnc::createPreset(const char_t *name)
{
TpresetEnc preset;
strcpy(preset.name,name);
push_back(preset);
return &*rbegin();
}
void TpresetsEnc::remove(TpresetEnc *preset)
{
for (iterator p=begin();p!=end();p++)
if (stricmp(p->name,preset->name)==0)
{
p->remove();
erase(p);
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -