📄 cquanttables.cpp
字号:
}
}
void TquantTablesPageBase::writeMatrix(FILE *f,const char *section,const uint8_t *matrix,unsigned int len)
{
fprintf(f,"%s =\n",section);
int cnt=ff_sqrt(len);
for (int i=0;i<cnt;i++)
{
for (int j=0;j<cnt;j++)
fprintf(f,"%i%s",int(*matrix++),--len>0?",":"");
fprintf(f,"\n");
}
fprintf(f,"\n");
}
void TquantTablesPageBase::onSave(void)
{
bool x264=codecId==CODEC_ID_X264 || codecId==CODEC_ID_H264;
if (dlgGetFile(true,m_hwnd,_(-IDD_QUANT_TABLES,_l("Save quantization matrices")),x264?_l("JM matrices file (*.cfg)\0*.cfg\0All files (*.*)\0*.*"):_l("XviD quantization matrices file (*.xcm)\0*.xcm\0ffdshow quantization matrices file (*.qmatrix)\0*.qmatrix\0Custom quantization matrix (*.cqm)\0*.cqm\0All files (*.*)\0*.*\0"),x264?_l("*.cfg"):_l("*.xcm"),matrixflnm,firstdir?matrixdir:_l("."),0))
{
firstdir=false;
FILE *f=fopen(matrixflnm,x264?_l("wt"):_l("wb"));
if (f)
{
if (x264)
{
uint8_t *intra8,*inter8,*intra4Y,*inter4Y,*intra4C,*inter4C;getCustomQuantMatrixes(&intra8,&inter8,&intra4Y,&inter4Y,&intra4C,&inter4C);
writeMatrix(f,"INTRA4X4_LUMA",intra4Y,16);
writeMatrix(f,"INTRA4X4_CHROMAU",intra4C,16);
writeMatrix(f,"INTRA4X4_CHROMAV",intra4C,16);
writeMatrix(f,"INTER4X4_LUMA",inter4Y,16);
writeMatrix(f,"INTER4X4_CHROMAU",inter4C,16);
writeMatrix(f,"INTER4X4_CHROMAV",inter4C,16);
writeMatrix(f,"INTRA8X8_LUMA",intra8,64);
writeMatrix(f,"INTER8X8_LUMA",inter8,64);
}
else
{
uint8_t *qmatrix_intra_custom,*qmatrix_inter_custom;getCustomQuantMatrixes(&qmatrix_intra_custom,&qmatrix_inter_custom,NULL,NULL,NULL,NULL);
if (qmatrix_intra_custom || qmatrix_inter_custom)
{
fwrite(qmatrix_intra_custom?qmatrix_intra_custom:qmatrix_inter_custom,1,64,f);
fwrite(qmatrix_inter_custom?qmatrix_inter_custom:qmatrix_intra_custom,1,64,f);
}
}
fclose(f);
}
else
err(_(-IDD_QUANT_TABLES,_l("Error while saving quantization matrices")));
}
}
INT_PTR TquantTablesPageBase::msgProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_COMMAND:
if (HIWORD(wParam)==EN_CHANGE && !isSetWindowText)
{
HWND hed=GetDlgItem(m_hwnd,LOWORD(wParam));
if (hed!=GetFocus()) return FALSE;
repaint(hed);
TwidgetMatrix *item=(TwidgetMatrix*)Twidget::getDlgItem(hed);
if (item->id)
{
int valI;
if (eval(hed,1,255,&valI))
{
uint8_t *intra8,*inter8,*intra4Y,*inter4Y,*intra4C,*inter4C;getCustomQuantMatrixes(&intra8,&inter8,&intra4Y,&inter4Y,&intra4C,&inter4C);
uint8_t *intra,*inter;
switch (cbxGetCurSel(IDC_CBX_QUANT_TABLE))
{
case 1:intra=intra4Y;inter=inter4Y;break;
case 2:intra=intra4C;inter=inter4C;break;
default:intra=intra8;inter=inter8;break;
}
(item->intra?intra:inter)[item->id-1]=(uint8_t)valI;
setChange();
}
}
return TRUE;
}
break;
case WM_CTLCOLOREDIT:
{
HWND hwnd=HWND(lParam);
if (hwnd==GetDlgItem(m_hwnd,IDC_CBX_QUANT_TABLE)) break;
bool ok=eval(hwnd,1,255);
if (!ok)
{
HDC dc=HDC(wParam);
SetBkColor(dc,RGB(255,0,0));
return INT_PTR(getRed());
}
else return FALSE;
}
}
return Twindow::msgProc(uMsg,wParam,lParam);
}
Twidget* TquantTablesPageBase::createDlgItem(int id,HWND h)
{
char_t cls[256]=_l("");
GetClassName(h,cls,256);
if (stricmp(cls,_l("EDIT"))==0)
return new TwidgetMatrix(h,this);
else
return Twindow::createDlgItem(id,h);
}
void TquantTablesPageBase::translate(void)
{
Twindow::translate();
int sel=cbxGetCurSel(IDC_CBX_QUANT_TABLE);
cbxClear(IDC_CBX_QUANT_TABLE);
for (int i=0;matrices[i];i++)
cbxAdd(IDC_CBX_QUANT_TABLE,_(IDC_CBX_QUANT_TABLE,matrices[i]));
cbxSetCurSel(IDC_CBX_QUANT_TABLE,sel==CB_ERR?0:sel);
}
//============================================ TquantTablesPage ============================================
bool TquantTablesPage::enabled(void)
{
return sup_customQuantTables(codecId) && cfgGet(IDFF_enc_quant_type)==QUANT::CUSTOM;
}
TquantTablesPage::TquantTablesPage(TffdshowPageEnc *Iparent):TconfPageEnc(Iparent),base(new TquantTables(Iparent->deci))
{
dialogId=IDD_QUANT_TABLES;
static const int props[]={IDFF_enc_qmatrix_intra_custom0,IDFF_enc_qmatrix_intra_custom1,IDFF_enc_qmatrix_intra_custom2,IDFF_enc_qmatrix_intra_custom3,IDFF_enc_qmatrix_intra_custom4,IDFF_enc_qmatrix_intra_custom5,IDFF_enc_qmatrix_intra_custom6,IDFF_enc_qmatrix_intra_custom7,IDFF_enc_qmatrix_intra_custom8,IDFF_enc_qmatrix_intra_custom9,IDFF_enc_qmatrix_intra_custom10,IDFF_enc_qmatrix_intra_custom11,IDFF_enc_qmatrix_intra_custom12,IDFF_enc_qmatrix_intra_custom13,IDFF_enc_qmatrix_intra_custom14,IDFF_enc_qmatrix_intra_custom15,IDFF_enc_qmatrix_inter_custom0,IDFF_enc_qmatrix_inter_custom1,IDFF_enc_qmatrix_inter_custom2,IDFF_enc_qmatrix_inter_custom3,IDFF_enc_qmatrix_inter_custom4,IDFF_enc_qmatrix_inter_custom5,IDFF_enc_qmatrix_inter_custom6,IDFF_enc_qmatrix_inter_custom7,IDFF_enc_qmatrix_inter_custom8,IDFF_enc_qmatrix_inter_custom9,IDFF_enc_qmatrix_inter_custom10,IDFF_enc_qmatrix_inter_custom11,IDFF_enc_qmatrix_inter_custom12,IDFF_enc_qmatrix_inter_custom13,IDFF_enc_qmatrix_inter_custom14,IDFF_enc_qmatrix_inter_custom15,IDFF_enc_qmatrix_intra4x4Y_custom0,IDFF_enc_qmatrix_intra4x4Y_custom1,IDFF_enc_qmatrix_intra4x4Y_custom2,IDFF_enc_qmatrix_intra4x4Y_custom3,IDFF_enc_qmatrix_inter4x4Y_custom0,IDFF_enc_qmatrix_inter4x4Y_custom1,IDFF_enc_qmatrix_inter4x4Y_custom2,IDFF_enc_qmatrix_inter4x4Y_custom3,IDFF_enc_qmatrix_intra4x4C_custom0,IDFF_enc_qmatrix_intra4x4C_custom1,IDFF_enc_qmatrix_intra4x4C_custom2,IDFF_enc_qmatrix_intra4x4C_custom3,IDFF_enc_qmatrix_inter4x4C_custom0,IDFF_enc_qmatrix_inter4x4C_custom1,IDFF_enc_qmatrix_inter4x4C_custom2,IDFF_enc_qmatrix_inter4x4C_custom3,0};
propsIDs=props;
base->deciE=deciE;base->parent=parent;
}
TquantTablesPage::~TquantTablesPage()
{
delete base;
}
void TquantTablesPage::init(void)
{
base->create(m_hwnd);
}
void TquantTablesPage::cfg2dlg(void)
{
base->cfg2dlg();
}
void TquantTablesPage::translate(void)
{
TconfPageEnc::translate();
base->translate();
}
int TquantTablesPage::TquantTables::getCodecId(void)
{
return cfgGet(IDFF_enc_codecId);
}
HRESULT TquantTablesPage::TquantTables::getCustomQuantMatrixes(uint8_t* *intra8,uint8_t* *inter8,uint8_t* *intra4Y,uint8_t* *inter4Y,uint8_t* *intra4C,uint8_t* *inter4C)
{
return deciE->getCustomQuantMatrixes(intra8,inter8,intra4Y,inter4Y,intra4C,inter4C);
}
void TquantTablesPage::TquantTables::setChange(void)
{
parent->setChange();
}
//============================================ TcurrentQuantDlg ============================================
TcurrentQuantDlg::TcurrentQuantDlg(HWND IhParent,IffdshowBase *Ideci,uint8_t *Iinter,uint8_t *Iintra,uint8_t *inter4luma,uint8_t *inter4chroma,uint8_t *intra4luma,uint8_t *intra4chroma,TquantTables *Ibase):
TdlgWindow(IDD_QUANT_CURRENT,Ideci),
base(Ibase?Ibase:new TquantTables(Ideci,Iinter,Iintra,inter4luma,inter4chroma,intra4luma,intra4chroma)),
hParent(IhParent)
{
}
TcurrentQuantDlg::~TcurrentQuantDlg()
{
delete base;
}
void TcurrentQuantDlg::show(void)
{
dialogBox(dialogId,hParent);
}
void TcurrentQuantDlg::init(void)
{
base->create(m_hwnd);
translate();
base->cfg2dlg();
}
void TcurrentQuantDlg::translate(void)
{
TdlgWindow::translate();
base->translate();
}
INT_PTR TcurrentQuantDlg::msgProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDCLOSE:
case IDCANCEL:
EndDialog(m_hwnd,LOWORD(wParam));
return TRUE;
}
break;
}
return TdlgWindow::msgProc(uMsg,wParam,lParam);
}
TcurrentQuantDlg::TquantTables::TquantTables(IffdshowBase *Ideci,uint8_t *Iinter,uint8_t *Iintra,uint8_t *Iinter4luma,uint8_t *Iinter4chroma,uint8_t *Iintra4luma,uint8_t *Iintra4chroma):
inter(Iinter),intra(Iintra),inter4luma(Iinter4luma),inter4chroma(Iinter4chroma),intra4luma(Iintra4luma),intra4chroma(Iintra4chroma),
TquantTablesPageBase(Ideci)
{
}
int TcurrentQuantDlg::TquantTables::getCodecId(void)
{
return deci->getCurrentCodecId2();
}
HRESULT TcurrentQuantDlg::TquantTables::getCustomQuantMatrixes(uint8_t* *intra8,uint8_t* *inter8,uint8_t* *intra4Y,uint8_t* *inter4Y,uint8_t* *intra4C,uint8_t* *inter4C)
{
if (intra8) *intra8=intra;
if (inter8) *inter8=inter;
if (intra4C) *intra4C=intra4chroma;
if (intra4Y) *intra4Y=intra4luma;
if (inter4C) *inter4C=inter4chroma;
if (inter4Y) *inter4Y=inter4luma;
return S_OK;
}
void TcurrentQuantDlg::TquantTables::cfg2dlg(void)
{
TquantTablesPageBase::cfg2dlg();
enable(0,IDC_BT_QUANT_TABLE_LOAD);
for (int i=0;idIntra8[i];i++)
edReadOnly(idIntra8[i],true);
for (int i=0;idInter8[i];i++)
edReadOnly(idInter8[i],true);
}
//============================================== TdctQuantDlg ==============================================
const int TdctQuantDlg::idffs[16]={IDFF_dctMatrix0,IDFF_dctMatrix1,IDFF_dctMatrix2,IDFF_dctMatrix3,IDFF_dctMatrix4,IDFF_dctMatrix5,IDFF_dctMatrix6,IDFF_dctMatrix7,IDFF_dctMatrix8,IDFF_dctMatrix9,IDFF_dctMatrix10,IDFF_dctMatrix11,IDFF_dctMatrix12,IDFF_dctMatrix13,IDFF_dctMatrix14,IDFF_dctMatrix15};
TdctQuantDlg::TdctQuantDlg(HWND hParent,IffdshowBase *Ideci):TcurrentQuantDlg(hParent,Ideci,NULL,NULL,NULL,NULL,NULL,NULL,new TdctQuantTables(Ideci,inter,NULL))
{
uint8_t *m=inter;
for (int i=0;i<16;i++,m+=4)
{
int32_t val=cfgGet(idffs[i]);
memcpy(m,&val,sizeof(val));
}
}
TdctQuantDlg::TdctQuantTables::TdctQuantTables(IffdshowBase *Ideci,uint8_t *Iinter,uint8_t *Iintra):TquantTables(Ideci,Iinter,Iintra,NULL,NULL,NULL,NULL)
{
}
void TdctQuantDlg::TdctQuantTables::cfg2dlg(void)
{
TquantTablesPageBase::cfg2dlg();
}
void TdctQuantDlg::TdctQuantTables::setChange(void)
{
uint8_t *m=inter;
for (int i=0;i<16;i++,m+=4)
{
int32_t val;
memcpy(&val,m,sizeof(val));
cfgSet(idffs[i],val);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -