📄 cquanttables.cpp
字号:
/*
* 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 "CquantTables.h"
#include "Tconfig.h"
//========================================== TquantTablesPageBase ==========================================
const char_t* TquantTablesPageBase::matrices[]=
{
_l("8x8"),
_l("4x4 luma"),
_l("4x4 chroma"),
NULL
};
const int TquantTablesPageBase::idIntra8[]=
{
IDC_ED_QUANT_TABLE_INTRA1 ,IDC_ED_QUANT_TABLE_INTRA2 ,IDC_ED_QUANT_TABLE_INTRA3 ,IDC_ED_QUANT_TABLE_INTRA4 ,IDC_ED_QUANT_TABLE_INTRA5 ,IDC_ED_QUANT_TABLE_INTRA6 ,IDC_ED_QUANT_TABLE_INTRA7 ,IDC_ED_QUANT_TABLE_INTRA8 ,
IDC_ED_QUANT_TABLE_INTRA9 ,IDC_ED_QUANT_TABLE_INTRA10,IDC_ED_QUANT_TABLE_INTRA11,IDC_ED_QUANT_TABLE_INTRA12,IDC_ED_QUANT_TABLE_INTRA13,IDC_ED_QUANT_TABLE_INTRA14,IDC_ED_QUANT_TABLE_INTRA15,IDC_ED_QUANT_TABLE_INTRA16,
IDC_ED_QUANT_TABLE_INTRA17,IDC_ED_QUANT_TABLE_INTRA18,IDC_ED_QUANT_TABLE_INTRA19,IDC_ED_QUANT_TABLE_INTRA20,IDC_ED_QUANT_TABLE_INTRA21,IDC_ED_QUANT_TABLE_INTRA22,IDC_ED_QUANT_TABLE_INTRA23,IDC_ED_QUANT_TABLE_INTRA24,
IDC_ED_QUANT_TABLE_INTRA25,IDC_ED_QUANT_TABLE_INTRA26,IDC_ED_QUANT_TABLE_INTRA27,IDC_ED_QUANT_TABLE_INTRA28,IDC_ED_QUANT_TABLE_INTRA29,IDC_ED_QUANT_TABLE_INTRA30,IDC_ED_QUANT_TABLE_INTRA31,IDC_ED_QUANT_TABLE_INTRA32,
IDC_ED_QUANT_TABLE_INTRA33,IDC_ED_QUANT_TABLE_INTRA34,IDC_ED_QUANT_TABLE_INTRA35,IDC_ED_QUANT_TABLE_INTRA36,IDC_ED_QUANT_TABLE_INTRA37,IDC_ED_QUANT_TABLE_INTRA38,IDC_ED_QUANT_TABLE_INTRA39,IDC_ED_QUANT_TABLE_INTRA40,
IDC_ED_QUANT_TABLE_INTRA41,IDC_ED_QUANT_TABLE_INTRA42,IDC_ED_QUANT_TABLE_INTRA43,IDC_ED_QUANT_TABLE_INTRA44,IDC_ED_QUANT_TABLE_INTRA45,IDC_ED_QUANT_TABLE_INTRA46,IDC_ED_QUANT_TABLE_INTRA47,IDC_ED_QUANT_TABLE_INTRA48,
IDC_ED_QUANT_TABLE_INTRA49,IDC_ED_QUANT_TABLE_INTRA50,IDC_ED_QUANT_TABLE_INTRA51,IDC_ED_QUANT_TABLE_INTRA52,IDC_ED_QUANT_TABLE_INTRA53,IDC_ED_QUANT_TABLE_INTRA54,IDC_ED_QUANT_TABLE_INTRA55,IDC_ED_QUANT_TABLE_INTRA56,
IDC_ED_QUANT_TABLE_INTRA57,IDC_ED_QUANT_TABLE_INTRA58,IDC_ED_QUANT_TABLE_INTRA59,IDC_ED_QUANT_TABLE_INTRA60,IDC_ED_QUANT_TABLE_INTRA61,IDC_ED_QUANT_TABLE_INTRA62,IDC_ED_QUANT_TABLE_INTRA63,IDC_ED_QUANT_TABLE_INTRA64,0
};
const int TquantTablesPageBase::idInter8[]=
{
IDC_ED_QUANT_TABLE_INTER1 ,IDC_ED_QUANT_TABLE_INTER2 ,IDC_ED_QUANT_TABLE_INTER3 ,IDC_ED_QUANT_TABLE_INTER4 ,IDC_ED_QUANT_TABLE_INTER5 ,IDC_ED_QUANT_TABLE_INTER6 ,IDC_ED_QUANT_TABLE_INTER7 ,IDC_ED_QUANT_TABLE_INTER8 ,
IDC_ED_QUANT_TABLE_INTER9 ,IDC_ED_QUANT_TABLE_INTER10,IDC_ED_QUANT_TABLE_INTER11,IDC_ED_QUANT_TABLE_INTER12,IDC_ED_QUANT_TABLE_INTER13,IDC_ED_QUANT_TABLE_INTER14,IDC_ED_QUANT_TABLE_INTER15,IDC_ED_QUANT_TABLE_INTER16,
IDC_ED_QUANT_TABLE_INTER17,IDC_ED_QUANT_TABLE_INTER18,IDC_ED_QUANT_TABLE_INTER19,IDC_ED_QUANT_TABLE_INTER20,IDC_ED_QUANT_TABLE_INTER21,IDC_ED_QUANT_TABLE_INTER22,IDC_ED_QUANT_TABLE_INTER23,IDC_ED_QUANT_TABLE_INTER24,
IDC_ED_QUANT_TABLE_INTER25,IDC_ED_QUANT_TABLE_INTER26,IDC_ED_QUANT_TABLE_INTER27,IDC_ED_QUANT_TABLE_INTER28,IDC_ED_QUANT_TABLE_INTER29,IDC_ED_QUANT_TABLE_INTER30,IDC_ED_QUANT_TABLE_INTER31,IDC_ED_QUANT_TABLE_INTER32,
IDC_ED_QUANT_TABLE_INTER33,IDC_ED_QUANT_TABLE_INTER34,IDC_ED_QUANT_TABLE_INTER35,IDC_ED_QUANT_TABLE_INTER36,IDC_ED_QUANT_TABLE_INTER37,IDC_ED_QUANT_TABLE_INTER38,IDC_ED_QUANT_TABLE_INTER39,IDC_ED_QUANT_TABLE_INTER40,
IDC_ED_QUANT_TABLE_INTER41,IDC_ED_QUANT_TABLE_INTER42,IDC_ED_QUANT_TABLE_INTER43,IDC_ED_QUANT_TABLE_INTER44,IDC_ED_QUANT_TABLE_INTER45,IDC_ED_QUANT_TABLE_INTER46,IDC_ED_QUANT_TABLE_INTER47,IDC_ED_QUANT_TABLE_INTER48,
IDC_ED_QUANT_TABLE_INTER49,IDC_ED_QUANT_TABLE_INTER50,IDC_ED_QUANT_TABLE_INTER51,IDC_ED_QUANT_TABLE_INTER52,IDC_ED_QUANT_TABLE_INTER53,IDC_ED_QUANT_TABLE_INTER54,IDC_ED_QUANT_TABLE_INTER55,IDC_ED_QUANT_TABLE_INTER56,
IDC_ED_QUANT_TABLE_INTER57,IDC_ED_QUANT_TABLE_INTER58,IDC_ED_QUANT_TABLE_INTER59,IDC_ED_QUANT_TABLE_INTER60,IDC_ED_QUANT_TABLE_INTER61,IDC_ED_QUANT_TABLE_INTER62,IDC_ED_QUANT_TABLE_INTER63,IDC_ED_QUANT_TABLE_INTER64,0
};
const int TquantTablesPageBase::idIntra4[]=
{
IDC_ED_QUANT_TABLE_INTRA1 ,IDC_ED_QUANT_TABLE_INTRA2 ,IDC_ED_QUANT_TABLE_INTRA3 ,IDC_ED_QUANT_TABLE_INTRA4 ,
IDC_ED_QUANT_TABLE_INTRA9 ,IDC_ED_QUANT_TABLE_INTRA10,IDC_ED_QUANT_TABLE_INTRA11,IDC_ED_QUANT_TABLE_INTRA12,
IDC_ED_QUANT_TABLE_INTRA17,IDC_ED_QUANT_TABLE_INTRA18,IDC_ED_QUANT_TABLE_INTRA19,IDC_ED_QUANT_TABLE_INTRA20,
IDC_ED_QUANT_TABLE_INTRA25,IDC_ED_QUANT_TABLE_INTRA26,IDC_ED_QUANT_TABLE_INTRA27,IDC_ED_QUANT_TABLE_INTRA28,0
};
const int TquantTablesPageBase::idInter4[]=
{
IDC_ED_QUANT_TABLE_INTER1 ,IDC_ED_QUANT_TABLE_INTER2 ,IDC_ED_QUANT_TABLE_INTER3 ,IDC_ED_QUANT_TABLE_INTER4 ,
IDC_ED_QUANT_TABLE_INTER9 ,IDC_ED_QUANT_TABLE_INTER10,IDC_ED_QUANT_TABLE_INTER11,IDC_ED_QUANT_TABLE_INTER12,
IDC_ED_QUANT_TABLE_INTER17,IDC_ED_QUANT_TABLE_INTER18,IDC_ED_QUANT_TABLE_INTER19,IDC_ED_QUANT_TABLE_INTER20,
IDC_ED_QUANT_TABLE_INTER25,IDC_ED_QUANT_TABLE_INTER26,IDC_ED_QUANT_TABLE_INTER27,IDC_ED_QUANT_TABLE_INTER28,0
};
TquantTablesPageBase::TquantTablesPageBase(IffdshowBase *Ideci):Twindow(Ideci)
{
dialogId=IDD_QUANT_TABLES_BASE;
static const TbindButton<TquantTablesPageBase> bt[]=
{
IDC_BT_QUANT_TABLE_LOAD,&TquantTablesPageBase::onLoad,
IDC_BT_QUANT_TABLE_SAVE,&TquantTablesPageBase::onSave,
0,NULL
};
bindButtons(bt);
static const TbindCombobox<TquantTablesPageBase> cbx[]=
{
IDC_CBX_QUANT_TABLE,0,BINDCBX_NONE,&TquantTablesPageBase::table2dlg,
0
};
bindComboboxes(cbx);
}
void TquantTablesPageBase::create(HWND parent)
{
createDialog(dialogId,parent);SetParent(m_hwnd,parent);
setPos(0,0);
show(true);
matrixflnm[0]='\0';
_makepath(matrixdir,NULL,config->pth,_l("custom matrices"),NULL);
firstdir=true;
}
void TquantTablesPageBase::cfg2dlg(void)
{
codecId=getCodecId();
if (codecId==CODEC_ID_X264 || codecId==CODEC_ID_H264)
enable(1,IDC_CBX_QUANT_TABLE);
else
{
enable(0,IDC_CBX_QUANT_TABLE);
cbxSetCurSel(IDC_CBX_QUANT_TABLE,0);
}
table2dlg();
}
void TquantTablesPageBase::table2dlg(void)
{
uint8_t *intra8,*inter8,*intra4Y,*inter4Y,*intra4C,*inter4C;getCustomQuantMatrixes(&intra8,&inter8,&intra4Y,&inter4Y,&intra4C,&inter4C);
const int *idIntra,*idInter;uint8_t *intra,*inter;int cnt;
switch (cbxGetCurSel(IDC_CBX_QUANT_TABLE))
{
case 1:idIntra=idIntra4;idInter=idInter4;intra=intra4Y;inter=inter4Y;cnt=16;break;
case 2:idIntra=idIntra4;idInter=idInter4;intra=intra4C;inter=inter4C;cnt=16;break;
default:idIntra=idIntra8;idInter=idInter8;intra=intra8;inter=inter8;cnt=64;break;
}
enable(0,idIntra8);
enable(0,idInter8);
for (int i=0;i<cnt;i++)
{
if (intra)
{
edLimitText(idIntra[i],3);
SetDlgItemInt(m_hwnd,idIntra[i],intra[i],FALSE);
((TwidgetMatrix*)Twidget::getDlgItem(GetDlgItem(m_hwnd,idIntra[i])))->set(true ,i+1);
}
else
edReadOnly(idIntra[i],true);
if (inter)
{
edLimitText(idInter[i],3);
SetDlgItemInt(m_hwnd,idInter[i],inter[i],FALSE);
((TwidgetMatrix*)Twidget::getDlgItem(GetDlgItem(m_hwnd,idInter[i])))->set(false,i+1);
}
else
edReadOnly(idInter[i],true);
}
enable(1,cnt==64?idIntra8:idIntra4);
enable(1,cnt==64?idInter8:idInter4);
enable(codecId==CODEC_ID_X264 || codecId==CODEC_ID_H264,IDC_ED_QUANT_TABLE_INTRA1);
}
const char_t* TquantTablesPageBase::parse_jmlist(char_t *buf,const char_t *name,uint8_t *cqm,const uint8_t *jvt,int length)
{
char_t *p=strstr(buf,name);
if (!p)
{
memset(cqm,16,length);
return NULL;
}
p+=strlen( name );
if (*p=='U' || *p=='V')
p++;
char_t *nextvar=strstr(p,_l("INT"));
int i;
for(i=0;i<length && (p=strpbrk(p,_l(" \t\n,") ))!=NULL && (p=strpbrk(p,_l("0123456789")))!=NULL;i++)
{
int coef=-1;
tsscanf(p,_l("%d"),&coef);
if (i==0 && coef==0)
{
memcpy(cqm,jvt,length);
return NULL;
}
if (coef<1 || coef>255)
return _l("Bad coefficient in list.");
cqm[i]=(uint8_t)coef;
}
if ((nextvar && p>nextvar) || i!=length)
return _l("Not enough coefficients in list.");
return NULL;
}
void TquantTablesPageBase::onLoad(void)
{
bool x264=codecId==CODEC_ID_X264 || codecId==CODEC_ID_H264;
if (dlgGetFile(false,m_hwnd,_(-IDD_QUANT_TABLES,_l("Load quantization matrices")),x264?_l("JM matrices file (*.cfg)\0*.cfg\0All files (*.*)\0*.*"):_l("All matrix files (*.xcm;*.qmatrix;*.cqm;*.txt)\0*.xcm;*.qmatrix;*.txt\0XviD quantization matrices file (*.xcm)\0*.xcm\0ffdshow quantization matrices file (*.qmatrix;*.txt)\0*.qmatrix;*.txt\0Custom quantization matrix (*.cqm)\0*.cqm\0All files (*.*)\0*.*\0"),x264?_l("*.cfg"):_l("*.xcm"),matrixflnm,firstdir?matrixdir:_l("."),0))
{
firstdir=false;
const char_t *error=NULL;size_t readed=0;
if (x264)
{
char_t *buf=readTextFile(matrixflnm);
if (buf)
{
static const uint8_t jvt4i[16] =
{
6,13,20,28,
13,20,28,32,
20,28,32,37,
28,32,37,42
};
static const uint8_t jvt4p[16] =
{
10,14,20,24,
14,20,24,27,
20,24,27,30,
24,27,30,34
};
static const uint8_t jvt8i[64] =
{
6,10,13,16,18,23,25,27,
10,11,16,18,23,25,27,29,
13,16,18,23,25,27,29,31,
16,18,23,25,27,29,31,33,
18,23,25,27,29,31,33,36,
23,25,27,29,31,33,36,38,
25,27,29,31,33,36,38,40,
27,29,31,33,36,38,40,42
};
static const uint8_t jvt8p[64] =
{
9,13,15,17,19,21,22,24,
13,13,17,19,21,22,24,25,
15,17,19,21,22,24,25,27,
17,19,21,22,24,25,27,28,
19,21,22,24,25,27,28,30,
21,22,24,25,27,28,30,32,
22,24,25,27,28,30,32,33,
24,25,27,28,30,32,33,35
};
uint8_t *intra8,*inter8,*intra4Y,*inter4Y,*intra4C,*inter4C;getCustomQuantMatrixes(&intra8,&inter8,&intra4Y,&inter4Y,&intra4C,&inter4C);
if ((error=parse_jmlist(buf,_l("INTRA4X4_LUMA") ,intra4Y,jvt4i,16))==NULL)
if ((error=parse_jmlist(buf,_l("INTRA4X4_CHROMA"),intra4C,jvt4i,16))==NULL)
if ((error=parse_jmlist(buf,_l("INTER4X4_LUMA") ,inter4Y,jvt4p,16))==NULL)
if ((error=parse_jmlist(buf,_l("INTER4X4_CHROMA"),inter4C,jvt4p,16))==NULL)
if ((error=parse_jmlist(buf,_l("INTRA8X8_LUMA") ,intra8,jvt8i,64))==NULL)
if ((error=parse_jmlist(buf,_l("INTER8X8_LUMA") ,inter8,jvt8p,64))==NULL)
readed=1;
free(buf);
}
}
else
{
FILE *f=fopen(matrixflnm,x264?_l("rt"):_l("rb"));
if (f)
{
uint8_t *qmatrix_intra_custom,*qmatrix_inter_custom;getCustomQuantMatrixes(&qmatrix_intra_custom,&qmatrix_inter_custom,NULL,NULL,NULL,NULL);
if (qmatrix_intra_custom)
readed+=fread(qmatrix_intra_custom,1,64,f);
else
{
fseek(f,64,SEEK_CUR);
readed+=64;
}
if (qmatrix_inter_custom)
readed+=fread(qmatrix_inter_custom,1,64,f);
else
{
fseek(f,64,SEEK_CUR);
readed+=64;
}
fclose(f);
if (readed!=128)
error=_l("Error while loading quantization matrices");
}
}
if (error)
err(_(-IDD_QUANT_TABLES,error));
else
{
if (readed)
setChange();
cfg2dlg();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -