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

📄 cout.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 "Cout.h"
#include "TbitrateDlg.h"
#include "Tdll.h"
#include "Tmuxer.h"
#include "TcodecSettings.h"

void ToutPage::init(void)
{
 SendDlgItemMessage(m_hwnd,IDC_BT_ASPECT,WM_SETFONT,WPARAM(parent->arrowsFont),LPARAM(false));
 SendDlgItemMessage(m_hwnd,IDC_BT_FPS,WM_SETFONT,WPARAM(parent->arrowsFont),LPARAM(false));
}

void ToutPage::cfg2dlg(void)
{
 out2dlg();
 stats2dlg();
 fps2dlg();
 aspect2dlg();
}

void ToutPage::out2dlg(void)
{
 setCheck(IDC_CHB_STORE_AVI,cfgGet(IDFF_enc_storeAVI));
 setCheck(IDC_CHB_STORE_EXTERNAL,cfgGet(IDFF_enc_storeExt));
 static const int idStoreExt[]={IDC_CBX_MUXER,IDC_BT_STORE_EXTERNAL,IDC_ED_STORE_EXTERNAL,0};
 setDlgItemText(m_hwnd,IDC_ED_STORE_EXTERNAL,cfgGetStr(IDFF_enc_storeExtFlnm));
 cbxSetCurSel(IDC_CBX_MUXER,cfgGet(IDFF_enc_muxer));
 enable(cfgGet(IDFF_enc_storeExt),idStoreExt);
}
void ToutPage::stats2dlg(void)
{
 bool is=sup_LAVC2PASS(codecId);
 int enc_mode=cfgGet(IDFF_enc_mode);
 int ff1_stats_mode=cfgGet(IDFF_enc_ff1_stats_mode);
 if (is && ff1_stats_mode&FFSTATS::READ && enc_mode!=ENC_MODE::CBR) cfgSet(IDFF_enc_ff1_stats_mode,FFSTATS::UNUSED);
 if ((ff1_stats_mode&FFSTATS::RW)==FFSTATS::RW)
  setCheck(IDC_RBT_LAVC_STATS_RW,1);
 else
  {
   setCheck(IDC_RBT_LAVC_STATS_NONE,ff1_stats_mode==0);
   setCheck(IDC_RBT_LAVC_STATS_WRITE,ff1_stats_mode&FFSTATS::WRITE);
   setCheck(IDC_RBT_LAVC_STATS_READ,ff1_stats_mode&FFSTATS::READ && is);
   setCheck(IDC_RBT_LAVC_STATS_RW,0);
  }
 static const int idStats[]={IDC_LBL_LAVC_STATS,IDC_RBT_LAVC_STATS_NONE,IDC_RBT_LAVC_STATS_WRITE,IDC_RBT_LAVC_STATS_READ,IDC_RBT_LAVC_STATS_RW,IDC_ED_LAVC_STATS,IDC_BT_LAVC_STATS,0};
 enable(is,idStats);
 enable(is && ff1_stats_mode!=0,idStats+5);
 enable(enc_mode==ENC_MODE::CBR && is,IDC_RBT_LAVC_STATS_READ);enable(enc_mode==ENC_MODE::CBR && is,IDC_RBT_LAVC_STATS_RW);
 setDlgItemText(m_hwnd,IDC_ED_LAVC_STATS,cfgGetStr(IDFF_enc_ff1_stats_flnm));
 enable(is && ff1_stats_mode&FFSTATS::READ,IDC_BT_BITRATE);
}
void ToutPage::fps2dlg(void)
{
 setCheck(IDC_CHB_FPS,cfgGet(IDFF_enc_isFPSoverride));
 SetDlgItemInt(m_hwnd,IDC_ED_FPS_NUM,cfgGet(IDFF_enc_fpsOverrideNum),FALSE);
 SetDlgItemInt(m_hwnd,IDC_ED_FPS_DEN,cfgGet(IDFF_enc_fpsOverrideDen),FALSE);
 int is=(filterMode&IDFF_FILTERMODE_VFW)==0;
 enable(is,IDC_CHB_FPS);
 static const int idFps[]={IDC_ED_FPS_NUM,IDC_ED_FPS_DEN,IDC_BT_FPS,0};
 enable(is && cfgGet(IDFF_enc_isFPSoverride),idFps);
}
void ToutPage::aspect2dlg(void)
{
 int is=sup_aspect(codecId);
 static const int idAspects[]={IDC_CBX_ASPECT,IDC_ED_ASPECTX,IDC_LBL_ASPECT,IDC_ED_ASPECTY,IDC_BT_ASPECT,0};
 enable(is,idAspects);
 int aspectmode=cfgGet(IDFF_enc_aspectMode);
 cbxSetCurSel(IDC_CBX_ASPECT,aspectmode);
 setText(IDC_ED_ASPECTX,_l("%g"),cfgGet(aspectmode==TcoSettings::ASPECT_SAR?IDFF_enc_sarX1000:IDFF_enc_darX1000)/1000.0f);
 setText(IDC_ED_ASPECTY,_l("%g"),cfgGet(aspectmode==TcoSettings::ASPECT_SAR?IDFF_enc_sarY1000:IDFF_enc_darY1000)/1000.0f);
}

INT_PTR ToutPage::msgProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 switch (uMsg)
  {
   case WM_COMMAND:
    switch (LOWORD(wParam))
     {
      case IDC_ED_STORE_EXTERNAL:
       if (HIWORD(wParam)==EN_CHANGE && !isSetWindowText)
        {
         char_t storeExtFlnm[MAX_PATH];
         GetDlgItemText(m_hwnd,IDC_ED_STORE_EXTERNAL,storeExtFlnm,MAX_PATH);
         cfgSet(IDFF_enc_storeExtFlnm,storeExtFlnm);
         return TRUE;
        }
       break;
      case IDC_ED_LAVC_STATS:
       if (HIWORD(wParam)==EN_CHANGE && !isSetWindowText)
        {
         char_t stats_flnm[MAX_PATH];
         GetDlgItemText(m_hwnd,IDC_ED_LAVC_STATS,stats_flnm,MAX_PATH);
         cfgSet(IDFF_enc_ff1_stats_flnm,stats_flnm);
         return TRUE;
        }
       break;
      case IDC_ED_ASPECTX:
      case IDC_ED_ASPECTY:
      case IDC_ED_FPS_NUM:
      case IDC_ED_FPS_DEN:
       if (HIWORD(wParam)==EN_CHANGE && !isSetWindowText)
        {
         HWND hed=GetDlgItem(m_hwnd,LOWORD(wParam));
         if (hed!=GetFocus()) return FALSE;
         repaint(hed);
         int aspectmode=cbxGetCurSel(IDC_CBX_ASPECT);
         switch (LOWORD(wParam))
          {
           case IDC_ED_ASPECTX:eval(hed,0.1,255.0,aspectmode==TcoSettings::ASPECT_SAR?IDFF_enc_sarX1000:IDFF_enc_darX1000,1000.0);break;
           case IDC_ED_ASPECTY:eval(hed,0.1,255.0,aspectmode==TcoSettings::ASPECT_SAR?IDFF_enc_sarY1000:IDFF_enc_darY1000,1000.0);break;
           case IDC_ED_FPS_NUM:eval(hed,1,200*1000,IDFF_enc_fpsOverrideNum);break;
           case IDC_ED_FPS_DEN:eval(hed,1,200*1000,IDFF_enc_fpsOverrideDen);break;
          }
         return TRUE;
        }
       break;
     }
    break;
   case WM_CTLCOLOREDIT:
    {
     HWND hwnd=HWND(lParam);
     bool ok;
     switch (getId(hwnd))
      {
       case IDC_ED_ASPECTX:
       case IDC_ED_ASPECTY:
        ok=eval(hwnd,0.1,255.0);
        break;
       case IDC_ED_FPS_NUM:
       case IDC_ED_FPS_DEN:
        ok=eval(hwnd,1,200*1000);
        break;
       default:return FALSE;
      }
     if (!ok)
      {
       HDC dc=HDC(wParam);
       SetBkColor(dc,RGB(255,0,0));
       return INT_PTR(getRed());
      }
     else return FALSE;
    }
  }
 return TconfPageEnc::msgProc(uMsg,wParam,lParam);
}

void ToutPage::onStoreExternal(void)
{
 char_t storeExtFlnm[MAX_PATH];cfgGet(IDFF_enc_storeExtFlnm,storeExtFlnm,MAX_PATH);
 if (dlgGetFile(true,m_hwnd,_(-IDD_OUT,_l("Select file for storing frames")),_l("All files (*.*)\0*.*\0"),_l(""),storeExtFlnm,_l("."),0))
  {
   cfgSet(IDFF_enc_storeExtFlnm,storeExtFlnm);
   out2dlg();
  }
}
void ToutPage::onLavcStats(void)
{
 char_t stats_flnm[MAX_PATH];cfgGet(IDFF_enc_ff1_stats_flnm,stats_flnm,MAX_PATH);
 if (dlgGetFile(cfgGet(IDFF_enc_ff1_stats_mode)==1,m_hwnd,_(-IDD_OUT,cfgGet(IDFF_enc_ff1_stats_mode)==1?_l("Select file for storing encoding statistics"):_l("Select file with stored encoding statistics")),_l("Libavcodec stats file (*.ffstats)\0*.ffstats\0All files (*.*)\0*.*\0"),_l("ffstats"),stats_flnm,_l("."),0))
  {
   cfgSet(IDFF_enc_ff1_stats_flnm,stats_flnm);
   cfg2dlg();
  }
}
void ToutPage::onBitrate(void)
{
 if (fileexists(cfgGetStr(IDFF_enc_ff1_stats_flnm)))
  {
   TbitrateDlg dlg(m_hwnd,deci);
   parentE->quick2dlg(true);
  }
}
void ToutPage::onAspect(void)
{
 RECT r;
 GetWindowRect(GetDlgItem(m_hwnd,IDC_BT_ASPECT),&r);
 int aspectmode=cbxGetCurSel(IDC_CBX_ASPECT);
 HMENU hmn=CreatePopupMenu();
 const Taspect *aspects=aspectmode==0?sampleAspects:displayAspects;
 for (int ord=0;aspects[ord].caption;)
  insertMenuItem(hmn,ord,ord+100,aspects[ord].caption,false);
 int cmd=TrackPopupMenu(_(hmn),TPM_LEFTALIGN|TPM_TOPALIGN|TPM_RETURNCMD,r.left-1,r.bottom,0,m_hwnd,0);
 if (cmd>=100)
  {
   const Taspect &a=aspects[cmd-100];
   cfgSet(aspectmode==TcoSettings::ASPECT_SAR?IDFF_enc_sarX1000:IDFF_enc_darX1000,int(a.x*1000));
   cfgSet(aspectmode==TcoSettings::ASPECT_SAR?IDFF_enc_sarY1000:IDFF_enc_darY1000,int(a.y*1000));
   aspect2dlg();
  }
 DestroyMenu(hmn);
}
void ToutPage::onFps(void)
{
 strings mitems;
 for (int i=0;TbitrateDlg::mpeg12_frame_rate_tab[i][0];i++)
  {
   char_t pomS[30];tsprintf(pomS,_l("%g"),float(TbitrateDlg::mpeg12_frame_rate_tab[i][0])/TbitrateDlg::mpeg12_frame_rate_tab[i][1]);
   mitems.push_back(pomS);
  }
 int idx=selectFromMenu(mitems,IDC_BT_FPS,false,20);
 if (idx>=0)
  {
   cfgSet(IDFF_enc_fpsOverrideNum,TbitrateDlg::mpeg12_frame_rate_tab[idx][0]);
   cfgSet(IDFF_enc_fpsOverrideDen,TbitrateDlg::mpeg12_frame_rate_tab[idx][1]);
   fps2dlg();
  }
}
void ToutPage::translate(void)
{
 TconfPageEnc::translate();

 cbxTranslate(IDC_CBX_MUXER,Tmuxer::muxers);
 cbxTranslate(IDC_CBX_ASPECT,TcoSettings::aspectModes);
}

ToutPage::ToutPage(TffdshowPageEnc *Iparent):TconfPageEnc(Iparent),parentE(Iparent)
{
 dialogId=IDD_OUT;
 static const int props[]={IDFF_enc_storeAVI,IDFF_enc_storeExt,IDFF_enc_storeExtFlnm,IDFF_enc_muxer,IDFF_enc_ff1_stats_mode,IDFF_enc_ff1_stats_flnm,IDFF_enc_aspectMode,IDFF_enc_isFPSoverride,IDFF_enc_fpsOverrideNum,IDFF_enc_fpsOverrideDen,IDFF_enc_sarX1000,IDFF_enc_sarY1000,IDFF_enc_darX1000,IDFF_enc_darY1000,0};
 propsIDs=props;
 static const TbindCheckbox<ToutPage> chb[]=
  {
   IDC_CHB_STORE_EXTERNAL,IDFF_enc_storeExt,&ToutPage::out2dlg,
   IDC_CHB_STORE_AVI,IDFF_enc_storeAVI,NULL,
   IDC_CHB_FPS,IDFF_enc_isFPSoverride,&ToutPage::fps2dlg,
   0,NULL,NULL
  };
 bindCheckboxes(chb);
 static const TbindRadiobutton<ToutPage> rbt[]=
  {
   IDC_RBT_LAVC_STATS_NONE,IDFF_enc_ff1_stats_mode,FFSTATS::UNUSED,&ToutPage::stats2dlg,
   IDC_RBT_LAVC_STATS_WRITE,IDFF_enc_ff1_stats_mode,FFSTATS::WRITE,&ToutPage::stats2dlg,
   IDC_RBT_LAVC_STATS_READ,IDFF_enc_ff1_stats_mode,FFSTATS::READ,&ToutPage::stats2dlg,
   IDC_RBT_LAVC_STATS_RW,IDFF_enc_ff1_stats_mode,FFSTATS::RW,&ToutPage::stats2dlg,
   0,0,0,NULL
  };
 bindRadioButtons(rbt);
 static const TbindCombobox<ToutPage> cbx[]=
  {
   IDC_CBX_MUXER,IDFF_enc_muxer,BINDCBX_SEL,NULL,
   IDC_CBX_ASPECT,IDFF_enc_aspectMode,BINDCBX_SEL,&ToutPage::aspect2dlg,
   0
  };
 bindComboboxes(cbx);
 static const TbindButton<ToutPage> bt[]=
  {
   IDC_BT_STORE_EXTERNAL,&ToutPage::onStoreExternal,
   IDC_BT_LAVC_STATS,&ToutPage::onLavcStats,
   IDC_BT_BITRATE,&ToutPage::onBitrate,
   IDC_BT_ASPECT,&ToutPage::onAspect,
   IDC_BT_FPS,&ToutPage::onFps,
   0,NULL
  };
 bindButtons(bt);
}

⌨️ 快捷键说明

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