⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cme.cpp

📁 从FFMPEG转换而来的H264解码程序,VC下编译..
💻 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 "Cme.h"
#include "Tlibavcodec.h"

const char_t* TmePage::mb_decisions[]=
{
 _l("simple"),
 _l("fewest bits"),
 _l("rate distortion"),
 NULL
};
const char_t* TmePage::me_cmps[]=
{
 _l("SAD"),
 _l("SSE"),
 _l("SATD"),
 _l("DCT"),
 _l("PSNR"),
 _l("BIT"),
 _l("RD"),
 _l("ZERO"),
 _l("VSAD"),
 _l("VSSE"),
 _l("NSSE"),
 _l("W53"),
 _l("W97"),
 _l("DCTMAX"),
 _l("DCT264"),
 NULL
};
const char_t* TmePage::me_prepasses[]=
{
 _l("never"),
 _l("after I frames"),
 _l("always"),
 NULL
};

void TmePage::init(void)
{
 for (int i=0;me_cmps[i];i++)
  {
   cbxAdd(IDC_CBX_ME_CMP,me_cmps[i]);
   cbxAdd(IDC_CBX_ME_SUBCMP,me_cmps[i]);
   cbxAdd(IDC_CBX_MB_CMP,me_cmps[i]);
   cbxAdd(IDC_CBX_ME_PRECMP,me_cmps[i]);
  }
}

bool TmePage::enabled(void)
{
 return sup_lavcme(codecId);
}

void TmePage::cfg2dlg(void)
{
 cbxSetCurSel(IDC_CBX_ME_CMP,cfgGet(IDFF_enc_me_cmp));setCheck(IDC_CHB_ME_CMP_CHROMA,cfgGet(IDFF_enc_me_cmp_chroma));
 cbxSetCurSel(IDC_CBX_ME_SUBCMP,cfgGet(IDFF_enc_me_subcmp));setCheck(IDC_CHB_ME_SUBCMP_CHROMA,cfgGet(IDFF_enc_me_subcmp_chroma));
 cbxSetCurSel(IDC_CBX_MB_CMP,cfgGet(IDFF_enc_mb_cmp));setCheck(IDC_CHB_MB_CMP_CHROMA,cfgGet(IDFF_enc_mb_cmp_chroma));
 cbxSetCurSel(IDC_CBX_DIA_SIZE,cfgGet(IDFF_enc_dia_size));
 static const int idDiaSize[]={IDC_LBL_DIA_SIZE,IDC_CBX_DIA_SIZE,0};enable(codecId!=CODEC_ID_SNOW,idDiaSize);
 cbxSetCurSel(IDC_CBX_MB_DECISION,cfgGet(IDFF_enc_me_hq));
 static const int idMbDesision[]={IDC_LBL_MB_DECISION,IDC_CBX_MB_DECISION,0};enable(codecId!=CODEC_ID_SNOW && codecId!=CODEC_ID_H261,idMbDesision);

 setCheck(IDC_CHB_4MV,cfgGet(IDFF_enc_me_4mv));enable(sup_4mv(codecId),IDC_CHB_4MV);
 setCheck(IDC_CHB_MV0,cfgGet(IDFF_enc_me_mv0));enable(sup_me_mv0(codecId) && cfgGet(IDFF_enc_me_hq)>0,IDC_CHB_MV0);
 setCheck(IDC_CHB_CBP_RD,cfgGet(IDFF_enc_me_cbp_rd));enable(sup_trellisQuant(codecId) && cfgGet(IDFF_enc_trellisquant),IDC_CHB_CBP_RD);

 prepass2dlg();
 qpel2dlg();

 SetDlgItemInt(m_hwnd,IDC_ED_ME_LAST_PRED_COUNT,cfgGet(IDFF_enc_me_last_predictor_count),FALSE);
 static const int idLastPredCount[]={IDC_LBL_ME_LAST_PRED_COUNT,IDC_ED_ME_LAST_PRED_COUNT,0};enable(codecId!=CODEC_ID_SNOW,idLastPredCount);
 cbxSetCurSel(IDC_CBX_ME_PREPASS,cfgGet(IDFF_enc_me_prepass));
 static const int idNotGray[]={IDC_CHB_ME_CMP_CHROMA,IDC_CHB_ME_SUBCMP_CHROMA,IDC_CHB_MB_CMP_CHROMA,0};
 enable(!sup_gray(codecId) || !cfgGet(IDFF_enc_gray),idNotGray);
 setCheck(IDC_CHB_ME_ITERATIVE,cfgGet(IDFF_enc_me_iterative));enable(codecId==CODEC_ID_SNOW,IDC_CHB_ME_ITERATIVE);
}
void TmePage::qpel2dlg(void)
{
 setCheck(IDC_CHB_QPEL,cfgGet(IDFF_enc_me_qpel));
 int is=sup_qpel(codecId);
 enable(is,IDC_CHB_QPEL);
 static const int idQpel[]={IDC_LBL_ME_SUBQ,IDC_ED_ME_SUBQ,0};
 SetDlgItemInt(m_hwnd,IDC_ED_ME_SUBQ,cfgGet(IDFF_enc_me_subq),FALSE);
 enable(is && cfgGet(IDFF_enc_me_qpel),idQpel);
}
void TmePage::prepass2dlg(void)
{
 static const int idPrepass0[]={IDC_LBL_ME_PREPASS,IDC_CBX_ME_PREPASS,0};
 enable(codecId!=CODEC_ID_SNOW,idPrepass0);
 cbxSetCurSel(IDC_CBX_ME_PRECMP,cfgGet(IDFF_enc_me_precmp));setCheck(IDC_CHB_ME_PRECMP_CHROMA,cfgGet(IDFF_enc_me_precmp_chroma));
 cbxSetCurSel(IDC_CBX_DIA_SIZE_PRE,cfgGet(IDFF_enc_dia_size_pre));
 static const int idPrepass[]={IDC_LBL_ME_PRECMP,IDC_CBX_ME_PRECMP,IDC_LBL_DIA_SIZE_PRE,IDC_CBX_DIA_SIZE_PRE,IDC_CHB_ME_PRECMP_CHROMA,0};
 int is=cfgGet(IDFF_enc_me_prepass) && codecId!=CODEC_ID_SNOW;
 enable(is,idPrepass);
 enable(is && (!sup_gray(codecId) || !cfgGet(IDFF_enc_gray)),IDC_CHB_ME_PRECMP_CHROMA);
}

void TmePage::translate(void)
{
 TconfPageEnc::translate();

 cbxTranslate(IDC_CBX_MB_DECISION,mb_decisions);
 cbxTranslate(IDC_CBX_ME_PREPASS,me_prepasses);

 int sel1=cbxGetCurSel(IDC_CBX_DIA_SIZE),sel2=cbxGetCurSel(IDC_CBX_DIA_SIZE_PRE);
 cbxClear(IDC_CBX_DIA_SIZE);cbxClear(IDC_CBX_DIA_SIZE_PRE);
 for (int i=0;Tlibavcodec::dia_sizes[i].descr;i++)
  {
   const char_t *descr=_(IDC_CBX_DIA_SIZE,Tlibavcodec::dia_sizes[i].descr);
   cbxAdd(IDC_CBX_DIA_SIZE,descr);
   cbxAdd(IDC_CBX_DIA_SIZE_PRE,descr);
  }
 cbxSetCurSel(IDC_CBX_DIA_SIZE,sel1);cbxSetCurSel(IDC_CBX_DIA_SIZE_PRE,sel2);
}

TmePage::TmePage(TffdshowPageEnc *Iparent):TconfPageEnc(Iparent)
{
 dialogId=IDD_ME;
 helpURL=_l("Motion+estimation.html");
 static const int props[]={IDFF_enc_me_hq,IDFF_enc_me_4mv,IDFF_enc_me_qpel,IDFF_enc_me_cmp,IDFF_enc_me_cmp_chroma,IDFF_enc_me_subcmp,IDFF_enc_me_subcmp_chroma,IDFF_enc_mb_cmp,IDFF_enc_mb_cmp_chroma,IDFF_enc_dia_size,IDFF_enc_me_last_predictor_count,IDFF_enc_me_prepass,IDFF_enc_me_precmp,IDFF_enc_me_precmp_chroma,IDFF_enc_dia_size_pre,IDFF_enc_me_subq,IDFF_enc_me_mv0,0};
 propsIDs=props;
 static const TbindCheckbox<TmePage> chb[]=
  {
   IDC_CHB_QPEL,IDFF_enc_me_qpel,&TmePage::qpel2dlg,
   IDC_CHB_4MV,IDFF_enc_me_4mv,NULL,
   IDC_CHB_MV0,IDFF_enc_me_mv0,NULL,
   IDC_CHB_CBP_RD,IDFF_enc_me_cbp_rd,NULL,
   IDC_CHB_ME_PRECMP_CHROMA,IDFF_enc_me_precmp_chroma,NULL,
   IDC_CHB_MB_CMP_CHROMA,IDFF_enc_mb_cmp_chroma,NULL,
   IDC_CHB_ME_SUBCMP_CHROMA,IDFF_enc_me_subcmp_chroma,NULL,
   IDC_CHB_ME_CMP_CHROMA,IDFF_enc_me_cmp_chroma,NULL,
   IDC_CHB_ME_ITERATIVE,IDFF_enc_me_iterative,NULL,
   0,NULL,NULL
  };
 bindCheckboxes(chb);
 static const TbindEditInt<TmePage> edInt[]=
  {
   IDC_ED_ME_LAST_PRED_COUNT,0,99,IDFF_enc_me_last_predictor_count,NULL,
   IDC_ED_ME_SUBQ,1,8,IDFF_enc_me_subq,NULL,
   0
  };
 bindEditInts(edInt);
 static const TbindCombobox<TmePage> cbx[]=
  {
   IDC_CBX_ME_CMP,IDFF_enc_me_cmp,BINDCBX_SEL,NULL,
   IDC_CBX_ME_SUBCMP,IDFF_enc_me_subcmp,BINDCBX_SEL,NULL,
   IDC_CBX_DIA_SIZE,IDFF_enc_dia_size,BINDCBX_SEL,NULL,
   IDC_CBX_MB_CMP,IDFF_enc_mb_cmp,BINDCBX_SEL,NULL,
   IDC_CBX_ME_PRECMP,IDFF_enc_me_precmp,BINDCBX_SEL,NULL,
   IDC_CBX_ME_PREPASS,IDFF_enc_me_prepass,BINDCBX_SEL,&TmePage::prepass2dlg,
   IDC_CBX_DIA_SIZE_PRE,IDFF_enc_dia_size_pre,BINDCBX_SEL,NULL,
   IDC_CBX_MB_DECISION,IDFF_enc_me_hq,BINDCBX_SEL,&TmePage::cfg2dlg,
   0
  };
 bindComboboxes(cbx);
}

⌨️ 快捷键说明

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