cpostproc.cpp
来自「从FFMPEG转换而来的H264解码程序,VC下编译..」· C++ 代码 · 共 250 行
CPP
250 行
/*
* 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 "CpostProc.h"
#include "Tlibmplayer.h"
#include "Tconfig.h"
const int TpostProcPage::idMplayer[]={IDC_CHB_POSTPROC_MPLAYER,IDC_LBL_PP_LEVELFIX,IDC_CHB_LEVELFIX_LUM,IDC_CHB_FULLYRANGE,IDC_CHB_POSTPROC_MPLAYER_ACCURATE,0};
const int TpostProcPage::idNics[]={IDC_CHB_POSTPROC_NIC,IDC_LBL_POSTPROC_NIC_XTHRES,IDC_TBR_POSTPROC_NIC_XTHRES,IDC_LBL_POSTPROC_NIC_YTHRES,IDC_TBR_POSTPROC_NIC_YTHRES,0};
const int TpostProcPage::idSPP[]={IDC_CHB_POSTPROC_SPP,IDC_CHB_POSTPROC_SPP_SOFT,0};
void TpostProcPage::init(void)
{
tbrSetRange(IDC_TBR_PPQUAL,0,6,1,false);
tbrSetRange(IDC_TBR_DEBLOCKSTRENGTH,0,512,32);
tbrSetRange(IDC_TBR_POSTPROC_NIC_XTHRES,0,255,16);
tbrSetRange(IDC_TBR_POSTPROC_NIC_YTHRES,0,255,16);
}
void TpostProcPage::cfg2dlg(void)
{
postProc2dlg();
}
void TpostProcPage::postProc2dlg(void)
{
tbrSet(IDC_TBR_PPQUAL,cfgGet(IDFF_ppqual));
setCheck(IDC_CHB_AUTOQ,cfgGet(IDFF_autoq));
int method=deci->getParam2(IDFF_postprocMethod);
int isMplayer=0,isNic=0,isSPP=0,isFSPP=0;
switch (method)
{
case 0:isMplayer=1;break;
case 1:isNic=1;break;
case 2:isMplayer=isNic=1;break;
case 4:isSPP=1;break;
case 5:isFSPP=1;break;
}
setCheck(IDC_CHB_POSTPROC_MPLAYER ,isMplayer==1);
setCheck(IDC_CHB_POSTPROC_NIC ,isNic==1);
setCheck(IDC_CHB_POSTPROC_NIC_FIRST,cfgGet(IDFF_postprocMethodNicFirst));
setCheck(IDC_CHB_POSTPROC_SPP ,isSPP==1);enable(isSPP,IDC_CHB_POSTPROC_SPP_SOFT);setCheck(IDC_CHB_POSTPROC_SPP_SOFT,cfgGet(IDFF_postprocSPPmode)==1);
setCheck(IDC_CHB_POSTPROC_FSPP ,isFSPP==1);
enable(isMplayer && isNic,IDC_CHB_POSTPROC_NIC_FIRST);
strength2dlg();
mplayer2dlg(isMplayer);
nic2dlg(isNic);
setPPchbs();
setCheck(IDC_RBT_PPPRESETS,!cfgGet(IDFF_ppIsCustom));
setCheck(IDC_RBT_PPCUSTOM , cfgGet(IDFF_ppIsCustom));
}
void TpostProcPage::strength2dlg(void)
{
int strength=cfgGet(IDFF_deblockStrength);
tbrSet(IDC_TBR_DEBLOCKSTRENGTH,strength);
setText(IDC_LBL_DEBLOCKSTRENGTH,_l("%s %i%%"),_(IDC_LBL_DEBLOCKSTRENGTH),100*strength/256);
}
void TpostProcPage::mplayer2dlg(int is)
{
if (is!=-1) enable(is,idMplayer+1);
bool levelfixlum=!!cfgGet(IDFF_levelFixLum);
setCheck(IDC_CHB_LEVELFIX_LUM,levelfixlum);
if (is!=-1)
enable(is && levelfixlum,IDC_CHB_FULLYRANGE);
else
enable(levelfixlum,IDC_CHB_FULLYRANGE);
setCheck(IDC_CHB_FULLYRANGE,cfgGet(IDFF_fullYrange));
setCheck(IDC_CHB_POSTPROC_MPLAYER_ACCURATE,cfgGet(IDFF_deblockMplayerAccurate));
}
void TpostProcPage::mplayer2dlg_1(void)
{
mplayer2dlg(-1);
}
void TpostProcPage::nic2dlg(int is)
{
if (is!=-1) enable(is,idNics+1);
tbrSet(IDC_TBR_POSTPROC_NIC_XTHRES,cfgGet(IDFF_postprocNicXthresh),IDC_LBL_POSTPROC_NIC_XTHRES);
tbrSet(IDC_TBR_POSTPROC_NIC_YTHRES,cfgGet(IDFF_postprocNicYthresh),IDC_LBL_POSTPROC_NIC_YTHRES);
}
void TpostProcPage::nic2dlg_1(void)
{
nic2dlg(-1);
}
void TpostProcPage::setPPchbs(void)
{
unsigned int ppmode;
static const int idPPcustom[]={IDC_CHB_DEBLOCKV_LUM,IDC_CHB_DEBLOCKH_LUM,IDC_CHB_DEBLOCKV_CHROM,IDC_CHB_DEBLOCKH_CHROM,IDC_CHB_DERING_LUM,IDC_CHB_DERING_CHROM,0};
static const int idPPpresets[]={IDC_TBR_PPQUAL,IDC_CHB_AUTOQ,0};
int method=cfgGet(IDFF_postprocMethod);
int isSPP=method==4 || method==5;
enable(!isSPP,IDC_RBT_PPCUSTOM);
if (isSPP) cfgSet(IDFF_ppIsCustom,0);
if (!isSPP && cfgGet(IDFF_ppIsCustom))
{
enable(true,idPPcustom);
enable(false,idPPpresets);
ppmode=cfgGet(IDFF_ppcustom);
}
else
{
enable(false,idPPcustom);
enable(method!=5,idPPpresets);
enable(method!=5,IDC_RBT_PPPRESETS);
deciV->getPPmode(&ppmode);
}
setCheck(IDC_CHB_DEBLOCKV_LUM ,ppmode&(LUM_V_DEBLOCK|V_A_DEBLOCK));
setCheck(IDC_CHB_DEBLOCKH_LUM ,ppmode&(LUM_H_DEBLOCK|H_A_DEBLOCK));
setCheck(IDC_CHB_DEBLOCKV_CHROM,ppmode&(CHROM_V_DEBLOCK|(V_A_DEBLOCK<<4)));
setCheck(IDC_CHB_DEBLOCKH_CHROM,ppmode&(CHROM_H_DEBLOCK|(H_A_DEBLOCK<<4)));
setCheck(IDC_CHB_DERING_LUM ,ppmode&LUM_DERING);
setCheck(IDC_CHB_DERING_CHROM ,ppmode&CHROM_DERING);
}
void TpostProcPage::onAuto(void)
{
cfgSet(IDFF_currentq,cfgGet(IDFF_ppqual));
postProc2dlg();
}
INT_PTR TpostProcPage::msgProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_HSCROLL:
switch (getId(HWND(lParam)))
{
case IDC_TBR_PPQUAL:
{
int ppqual=tbrGet(IDC_TBR_PPQUAL);
cfgSet(IDFF_ppqual,ppqual);
cfgSet(IDFF_currentq,ppqual);
setPPchbs();
return TRUE;
}
}
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_CHB_DEBLOCKV_LUM:
case IDC_CHB_DEBLOCKH_LUM:
case IDC_CHB_DEBLOCKV_CHROM:
case IDC_CHB_DEBLOCKH_CHROM:
case IDC_CHB_DERING_LUM:
case IDC_CHB_DERING_CHROM:
{
int ppcustom=0;
ppcustom|=getCheck(IDC_CHB_DEBLOCKV_LUM )?LUM_V_DEBLOCK:0;
ppcustom|=getCheck(IDC_CHB_DEBLOCKH_LUM )?LUM_H_DEBLOCK:0;
ppcustom|=getCheck(IDC_CHB_DEBLOCKV_CHROM)?CHROM_V_DEBLOCK:0;
ppcustom|=getCheck(IDC_CHB_DEBLOCKH_CHROM)?CHROM_H_DEBLOCK:0;
ppcustom|=getCheck(IDC_CHB_DERING_LUM )?LUM_DERING:0;
ppcustom|=getCheck(IDC_CHB_DERING_CHROM )?CHROM_DERING:0;
cfgSet(IDFF_ppcustom,ppcustom);
setPPchbs();
return TRUE;
}
case IDC_CHB_POSTPROC_MPLAYER:
case IDC_CHB_POSTPROC_NIC:
setCheck(IDC_CHB_POSTPROC_SPP,0);
setCheck(IDC_CHB_POSTPROC_FSPP,0);
case IDC_CHB_POSTPROC_SPP:
setCheck(IDC_CHB_POSTPROC_FSPP,0);
case IDC_CHB_POSTPROC_FSPP:
{
int isMplayer=getCheck(IDC_CHB_POSTPROC_MPLAYER),isNic=getCheck(IDC_CHB_POSTPROC_NIC),isSPP=getCheck(IDC_CHB_POSTPROC_SPP),isFSPP=getCheck(IDC_CHB_POSTPROC_FSPP);
if ( isFSPP) cfgSet(IDFF_postprocMethod,5);
else if ( isSPP ) cfgSet(IDFF_postprocMethod,4);
else if (!isMplayer && !isNic && !isSPP) cfgSet(IDFF_postprocMethod,3);
else if ( isMplayer && !isNic && !isSPP) cfgSet(IDFF_postprocMethod,0);
else if (!isMplayer && isNic && !isSPP) cfgSet(IDFF_postprocMethod,1);
else if ( isMplayer && isNic && !isSPP) cfgSet(IDFF_postprocMethod,2);
cfg2dlg();
return TRUE;
}
}
break;
}
return TconfPageDecVideo::msgProc(uMsg,wParam,lParam);
}
void TpostProcPage::onFrame(void)
{
SendDlgItemMessage(m_hwnd,IDC_TBR_PPQUAL,TBM_SETSELEND,TRUE,cfgGet(IDFF_currentq));
setPPchbs();
}
void TpostProcPage::translate(void)
{
TconfPageDecVideo::translate();
}
TpostProcPage::TpostProcPage(TffdshowPageDec *Iparent,const TfilterIDFF *idff):TconfPageDecVideo(Iparent,idff)
{
resInter=IDC_CHB_POSTPROC;
static const TbindCheckbox<TpostProcPage> chb[]=
{
IDC_CHB_LEVELFIX_LUM,IDFF_levelFixLum,&TpostProcPage::mplayer2dlg_1,
//IDC_CHB_LEVELFIX_CHROM,IDFF_levelFixChrom,&TpostProcPage::mplayer2dlg_1,
IDC_CHB_FULLYRANGE,IDFF_fullYrange,NULL,
IDC_CHB_POSTPROC_MPLAYER_ACCURATE,IDFF_deblockMplayerAccurate,NULL,
IDC_CHB_POSTPROC_NIC_FIRST,IDFF_postprocMethodNicFirst,NULL,
IDC_CHB_POSTPROC_SPP_SOFT,IDFF_postprocSPPmode,NULL,
IDC_CHB_AUTOQ,IDFF_autoq,&TpostProcPage::onAuto,
0,NULL,NULL
};
bindCheckboxes(chb);
static const TbindTrackbar<TpostProcPage> htbr[]=
{
IDC_TBR_DEBLOCKSTRENGTH,IDFF_deblockStrength,&TpostProcPage::strength2dlg,
IDC_TBR_POSTPROC_NIC_XTHRES,IDFF_postprocNicXthresh,&TpostProcPage::nic2dlg_1,
IDC_TBR_POSTPROC_NIC_YTHRES,IDFF_postprocNicYthresh,&TpostProcPage::nic2dlg_1,
0,0,NULL
};
bindHtracks(htbr);
static const TbindRadiobutton<TpostProcPage> rbt[]=
{
IDC_RBT_PPPRESETS,IDFF_ppIsCustom,0,&TpostProcPage::postProc2dlg,
IDC_RBT_PPCUSTOM,IDFF_ppIsCustom,1,&TpostProcPage::postProc2dlg,
0,0,0,NULL
};
bindRadioButtons(rbt);
static const TbindCombobox<TpostProcPage> cbx[]=
{
0
};
bindComboboxes(cbx);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?