www.pudn.com > mediator15src.zip > OptionsDlg.cpp


/* 
 * OptionsDlg.cpp 
 * Copyright (C) 2002 Arno Hornberger  
 * 
 * This file is part of MPEG Mediator, a free MPEG stream converter. 
 * 
 * MPEG Mediator 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. 
 * 
 * MPEG Mediator 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 */ 
 
#include "stdafx.h" 
#include "OpenDMLAVIOutput.h" 
#include "OptionsDlg.h" 
#include "vfw.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// COptionsDlg dialog 
 
 
COptionsDlg::COptionsDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(COptionsDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(COptionsDlg) 
	//}}AFX_DATA_INIT 
} 
 
 
void COptionsDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(COptionsDlg) 
	DDX_Control(pDX, IDC_QUALITYSLIDER, m_QualitySlider); 
	DDX_Control(pDX, IDC_CONFIGURE, m_Configure); 
	DDX_Control(pDX, IDC_HQAUDIO, m_hqAudio); 
	DDX_Control(pDX, IDC_AUDIOCODECCOMBO, m_AudioCombo); 
	DDX_Control(pDX, IDC_VIDEOCODECCOMBO, m_VideoCombo); 
	DDX_Control(pDX, IDC_AUDIOFORMATLIST, m_lAudioFormatListBox); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(COptionsDlg, CDialog) 
	//{{AFX_MSG_MAP(COptionsDlg) 
	ON_LBN_SELCHANGE(IDC_AUDIOFORMATLIST, OnSelchangeAudioformatlist) 
	ON_CBN_SELCHANGE(IDC_VIDEOCODECCOMBO, OnSelchangeVideocodeccombo) 
	ON_CBN_SELCHANGE(IDC_AUDIOCODECCOMBO, OnSelchangeAudiocodeccombo) 
	ON_BN_CLICKED(IDC_CONFIGURE, OnConfigure) 
	ON_WM_HSCROLL() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// COptionsDlg message handlers 
 
int COptionsDlg::DoModal()  
{ 
	// TODO: Add your specialized code here and/or call the base class 
 
	return CDialog::DoModal(); 
} 
 
BOOL COptionsDlg::OnInitDialog()  
{ 
	int tabs[1]; 
	char buf[8]; 
	int i; 
	 
	CDialog::OnInitDialog(); 
 
  // video codecs 
 
  for (i = 0; i < m_vVideoCodecList.GetSize(); i++) 
    m_VideoCombo.AddString(CString(m_vVideoCodecList[i].szDescription)); 
 
	if (m_sResult.status & VIDEO_ALLOWRGB) 
		m_VideoCombo.AddString(CString("Uncompressed (RGB)")); 
 
  if (m_sResult.status & VIDEO_DEFAULT) 
    m_VideoCombo.SetCurSel(m_VideoCombo.GetCount() - 1); 
  else 
    m_VideoCombo.SetCurSel(m_sResult.videoSelected); 
 
	m_QualitySlider.SetRange(0, 100, TRUE); 
	m_QualitySlider.SetPos((int)m_sResult.lQuality); 
 
	sprintf(buf, "%d%%", (int)m_sResult.lQuality);	 
	SetDlgItemText(IDC_QUALITY, buf); 
 
	if (m_sResult.lKeyRate) 
	{ 
		CheckDlgButton(IDC_FORCEKEYFRAMES, BST_CHECKED); 
		SetDlgItemInt(IDC_KEYRATE, m_sResult.lKeyRate, FALSE); 
	} 
	else 
		CheckDlgButton(IDC_FORCEKEYFRAMES, BST_UNCHECKED); 
			 
	if (m_sResult.lDataRate) 
	{ 
		CheckDlgButton(IDC_USEDATARATE, BST_CHECKED); 
		SetDlgItemInt(IDC_DATARATE, m_sResult.lDataRate, FALSE); 
	} 
	else 
		CheckDlgButton(IDC_USEDATARATE, BST_UNCHECKED); 
 
	OnSelchangeVideocodeccombo(); 
 
	// audio codecs 
 
	if (m_sResult.status & AUDIO_DISABLE) 
	{ 
		m_AudioCombo.EnableWindow(FALSE); 
		m_lAudioFormatListBox.EnableWindow(FALSE); 
		m_hqAudio.EnableWindow(FALSE); 
	} 
	else 
	{ 
		for (i = 0; i < m_vAudioCodecList.GetSize(); i++) 
			m_AudioCombo.AddString(CString(m_vAudioCodecList[i].szFormatTag)); 
 
	  m_AudioCombo.AddString(CString("Uncompressed (PCM)")); 
 
	  if (m_sResult.status & AUDIO_DEFAULT) 
		  m_AudioCombo.SetCurSel(m_vAudioCodecList.GetSize()); 
		else 
		{ 
			m_AudioCombo.SetCurSel(m_sResult.audioTagSelected); 
			m_lAudioFormatListBox.SetCurSel(m_sResult.audioFormatSelected); 
		} 
 
		if (m_sResult.status & AUDIO_HQ) 
			m_hqAudio.SetCheck(1); 
		else 
			m_hqAudio.SetCheck(0); 
 
		tabs[0] = 160; 
		m_lAudioFormatListBox.SetTabStops(1, tabs); 
 
		OnSelchangeAudiocodeccombo(); 
	  OnSelchangeAudioformatlist(); 
	} 
		 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
void COptionsDlg::OnOK()  
{ 
	int idx; 
	bool disable_audio = !!(m_sResult.status & AUDIO_DISABLE); 
	 
  m_sResult.status = 0; 
 
	idx = m_VideoCombo.GetCurSel(); 
  
  if ((idx != CB_ERR) && (idx < m_vVideoCodecList.GetSize())) 
    m_sResult.videoSelected = idx; 
  else 
    m_sResult.status |= VIDEO_UNCOMPRESSED; 
   
	m_sResult.lQuality = (long)m_QualitySlider.GetPos(); 
   
	if (GetDlgItem(IDC_FORCEKEYFRAMES)->IsWindowEnabled() && IsDlgButtonChecked(IDC_FORCEKEYFRAMES)) 
		m_sResult.lKeyRate = GetDlgItemInt(IDC_KEYRATE, NULL, FALSE); 
	else 
		m_sResult.lKeyRate = 0; 
 
	if (GetDlgItem(IDC_USEDATARATE)->IsWindowEnabled() && IsDlgButtonChecked(IDC_USEDATARATE)) 
		m_sResult.lDataRate = GetDlgItemInt(IDC_DATARATE, NULL, FALSE); 
	else 
		m_sResult.lDataRate = 0; 
 
	if (!disable_audio) 
	{ 
		idx = m_AudioCombo.GetCurSel(); 
 
		if ((idx != CB_ERR) && (idx < m_vAudioCodecList.GetSize())) 
		{  
			m_sResult.audioTagSelected = idx; 
			m_sResult.audioFormatSelected = m_lAudioFormatListBox.GetCurSel(); 
		} 
		else 
			m_sResult.status |= AUDIO_UNCOMPRESSED; 
 
		if (m_hqAudio.GetCheck()) 
			m_sResult.status |= AUDIO_HQ; 
	} 
 
	CDialog::OnOK(); 
} 
 
void COptionsDlg::OnSelchangeAudioformatlist()  
{ 
  m_sResult.audioFormatSelected = m_lAudioFormatListBox.GetCurSel(); // redundant 
} 
 
void COptionsDlg::OnSelchangeVideocodeccombo()  
{ 
	int idx = m_VideoCombo.GetCurSel(); 
  HIC hic = 0; 
 
	if ((idx != CB_ERR) && (idx < m_vVideoCodecList.GetSize())) 
		hic = m_vVideoCodecList[idx].hic; 
	 
	ReenableOptions(hic); 
 
	return; 
} 
 
void COptionsDlg::OnSelchangeAudiocodeccombo()  
{ 
	char buf[280]; 
	int band; 
 
  int idx = m_AudioCombo.GetCurSel(); 
   
  m_lAudioFormatListBox.ResetContent(); 
 
  // pcm was selected? 
 
  if ((idx == CB_ERR) || (idx >= m_vAudioCodecList.GetSize())) 
		return; 
 
  int formatSize = m_vAudioCodecList[idx].m_vFormatDetailsList.GetSize(); 
 
  for (int i = 0; i < formatSize; i++) { 
		band = (m_vAudioCodecList[idx].m_vWaveFormatExList[i].Get()->nAvgBytesPerSec + 1023) / 1024; 
		sprintf(buf, "%s\t(%d KB/s)", m_vAudioCodecList[idx].m_vFormatDetailsList[i].szFormat, band); 
     
		m_lAudioFormatListBox.AddString(buf); 
	} 
 
  if (m_lAudioFormatListBox.SetCurSel(m_sResult.audioFormatSelected) == LB_ERR) 
    m_lAudioFormatListBox.SetCurSel(0); 
 
//  UpdateData(FALSE); 
} 
 
void COptionsDlg::ReenableOptions(HIC hic) 
{ 
	BOOL fSupports; 
	ICINFO ici; 
	DWORD dwFlags; 
   
	if (hic) 
  { 
		ICGetInfo(hic, &ici, sizeof(ICINFO)); 
		dwFlags = ici.dwFlags; 
 
		fSupports = !!(dwFlags & VIDCF_CRUNCH); 
 
		GetDlgItem(IDC_USEDATARATE)->EnableWindow(fSupports); 
		GetDlgItem(IDC_DATARATE)->EnableWindow(fSupports); 
		GetDlgItem(IDC_DATARATESTATIC)->EnableWindow(fSupports); 
 
		fSupports = !!(dwFlags & VIDCF_TEMPORAL); 
 
		GetDlgItem(IDC_FORCEKEYFRAMES)->EnableWindow(fSupports); 
		GetDlgItem(IDC_KEYRATE)->EnableWindow(fSupports); 
		GetDlgItem(IDC_KEYFRAMESSTATIC)->EnableWindow(fSupports); 
 
		fSupports = !!(dwFlags & VIDCF_QUALITY); 
 
		GetDlgItem(IDC_QUALITYSTATIC)->EnableWindow(fSupports); 
		GetDlgItem(IDC_QUALITYSLIDER)->EnableWindow(fSupports); 
		GetDlgItem(IDC_QUALITY)->EnableWindow(fSupports); 
 
		m_Configure.EnableWindow(!!ICQueryConfigure(hic)); 
	} 
	else 
	{ 
		GetDlgItem(IDC_USEDATARATE)->EnableWindow(FALSE); 
		GetDlgItem(IDC_DATARATE)->EnableWindow(FALSE); 
		GetDlgItem(IDC_DATARATESTATIC)->EnableWindow(FALSE); 
 
		GetDlgItem(IDC_FORCEKEYFRAMES)->EnableWindow(FALSE); 
		GetDlgItem(IDC_KEYRATE)->EnableWindow(FALSE); 
		GetDlgItem(IDC_KEYFRAMESSTATIC)->EnableWindow(FALSE); 
 
		GetDlgItem(IDC_QUALITYSTATIC)->EnableWindow(FALSE); 
		GetDlgItem(IDC_QUALITYSLIDER)->EnableWindow(FALSE); 
		GetDlgItem(IDC_QUALITY)->EnableWindow(FALSE); 
 
		m_Configure.EnableWindow(FALSE); 
	} 
} 
 
void COptionsDlg::OnConfigure()  
{ 
  HIC hic; 
	int idx = m_VideoCombo.GetCurSel(); 
 
	if (idx < m_vVideoCodecList.GetSize()) 
    if (hic = m_vVideoCodecList[idx].hic) 
			ICConfigure(hic, m_hWnd); 
} 
 
void COptionsDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)  
{ 
	char buf[8]; 
	 
	sprintf(buf, "%d%%", m_QualitySlider.GetPos());	 
	SetDlgItemText(IDC_QUALITY, buf); 
 
	CDialog::OnHScroll(nSBCode, nPos, pScrollBar); 
}