www.pudn.com > mm_sdk_video_eg.zip > I800DemoView.cpp


// I800DemoView.cpp : implementation of the CI800DemoView class 
// 
 
#include "stdafx.h" 
#include "I800Demo.h" 
#include "mmsystem.h" 
#include "mainfrm.h" 
 
#include "I800DemoDoc.h" 
#include "I800DemoView.h" 
 
#include "AV800Api.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
HWND hWnd; 
 
HMMIO hmmioOutput = NULL; 
DWORD dwCode; 
DWORD DWORD_SWAP(DWORD x) 
{ 
    return 
     ((DWORD)( ((x) << 24) | ((x) >> 24) | 
               (((x) & 0xFF00) << 8) | (((x) & 0xFF0000) >> 8))); 
} 
 
 
DWORD CALLBACK StreamDataCallback (UINT msg, DWORD dwParam1, DWORD dwParam2) 
{ 
	switch (msg) { 
	case MD_CODE_CREATE: 
		hmmioOutput = mmioOpen("e:\\user\\stream1.mpg", (LPMMIOINFO)NULL, MMIO_CREATE | MMIO_WRITE); 
		break; 
	case MD_CODE_WRITE: 
		if (hmmioOutput) { 
			mmioWrite(hmmioOutput, (const char *)dwParam1, dwParam2); 
			dwCode = DWORD_SWAP(*(UNALIGNED DWORD *)(const char *)dwParam1); 
			char ss[128]; 
			sprintf (ss,"First 4 Bytes = %X, Size = %d",dwCode, dwParam2); 
			SetDlgItemText (hWnd, IDC_INFO, ss); 
		} 
		break; 
	case MD_CODE_CLOSE: 
		mmioClose(hmmioOutput, NULL); 
		hmmioOutput = NULL; 
		break; 
	} 
	return 0; 
} 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CI800DemoView 
 
IMPLEMENT_DYNCREATE(CI800DemoView, CFormView) 
 
BEGIN_MESSAGE_MAP(CI800DemoView, CFormView) 
	//{{AFX_MSG_MAP(CI800DemoView) 
	ON_WM_SIZE() 
	ON_BN_CLICKED(IDC_BROWSE, OnBrowse) 
	ON_BN_CLICKED(IDC_UPDATE, OnUpdate) 
	ON_BN_CLICKED(IDC_TUNING, OnTuning) 
	ON_CBN_SELCHANGE(IDC_ENC_MPDE_COMBO, OnSelchangeEncMpdeCombo) 
	ON_WM_VSCROLL() 
	ON_COMMAND(ID_START_CAPTURE, OnStartCapture) 
	ON_COMMAND(ID_PAUSE_CAPTURE, OnPauseCapture) 
	ON_COMMAND(ID_STOP_CAPTURE, OnStopCapture) 
	ON_COMMAND(ID_START_PLAYBACK, OnStartPlayback) 
	ON_COMMAND(ID_PAUSE_PLAYBACK, OnPausePlayback) 
	ON_COMMAND(ID_STOP_PLAYBACK, OnStopPlayback) 
	ON_BN_CLICKED(IDC_SVIDEO, OnChangeInput) 
	ON_BN_CLICKED(IDC_TVTUNER, OnChangeInput) 
	ON_BN_CLICKED(IDC_COMPOSITE, OnChangeInput) 
	//}}AFX_MSG_MAP 
	// Standard printing commands 
	ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CI800DemoView construction/destruction 
 
CI800DemoView::CI800DemoView() 
	: CFormView(CI800DemoView::IDD) 
{ 
	//{{AFX_DATA_INIT(CI800DemoView) 
	m_BitRate = 0; 
	m_RateControl = -1; 
	m_Channel = 0; 
	m_FilePath = _T(""); 
	m_GOPSize = 0; 
	m_HHR = FALSE; 
	m_OffsetField1 = 0; 
	m_PDistance = 0; 
	m_PreProcessFilter = 0; 
	m_TFF = FALSE; 
	m_VideoSource = -1; 
	m_OffsetField2 = 0; 
	m_Resolution = -1; 
	m_AVSplit = FALSE; 
	//}}AFX_DATA_INIT 
	// TODO: add construction code here 
	m_bInitDevice = false; 
} 
 
CI800DemoView::~CI800DemoView() 
{ 
	if (m_bInitDevice) 
		TS_UnInitDevice (); 
} 
 
void CI800DemoView::DoDataExchange(CDataExchange* pDX) 
{ 
	CFormView::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CI800DemoView) 
	DDX_Control(pDX, IDC_CHANNEL_SPIN, m_ChannelSpin); 
	DDX_Control(pDX, IDC_ENC_MPDE_COMBO, m_EncodeModeList); 
	DDX_Text(pDX, IDC_VID_BITRATE, m_BitRate); 
	DDX_Radio(pDX, IDC_CBR, m_RateControl); 
	DDX_Text(pDX, IDC_CHANNEL, m_Channel); 
	DDX_Text(pDX, IDC_FILE_PATH, m_FilePath); 
	DDX_Text(pDX, IDC_GOP_SIZE, m_GOPSize); 
	DDX_Check(pDX, IDC_HHR, m_HHR); 
	DDX_Text(pDX, IDC_OFFSET1, m_OffsetField1); 
	DDX_Text(pDX, IDC_PDISTANCE, m_PDistance); 
	DDX_Text(pDX, IDC_PREPROCESS_FILTER, m_PreProcessFilter); 
	DDX_Check(pDX, IDC_TFF, m_TFF); 
	DDX_Radio(pDX, IDC_TVTUNER, m_VideoSource); 
	DDX_Text(pDX, IDC_OFFSET2, m_OffsetField2); 
	DDX_Radio(pDX, IDC_CIF, m_Resolution); 
	DDX_Check(pDX, IDC_SPLIT, m_AVSplit); 
	//}}AFX_DATA_MAP 
} 
 
void CI800DemoView::UpdateParameterView () 
{ 
	int EncMode = TS_GetEncodeMode (); 
 
	m_BitRate = TS_GetVideoBitRate (); 
	m_GOPSize = TS_GetGOPSize(); 
	m_HHR = TS_GetHHR(); 
	m_OffsetField1 = TS_GetOffsetField1(); 
	m_OffsetField2 = TS_GetOffsetField2(); 
	m_PDistance = TS_GetPDistance (); 
	m_PreProcessFilter = TS_GetPreFilterNo(); 
	m_RateControl = TS_GetRateCtrl(); 
	m_Resolution = TS_GetResolution(); 
	m_TFF = TS_GetTopFieldFirst (); 
 
	m_EncodeModeList.SetCurSel(EncMode); 
 
	UpdateData (false); 
 
} 
 
 
BOOL CI800DemoView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CFormView::PreCreateWindow(cs); 
} 
 
void CI800DemoView::OnInitialUpdate() 
{ 
	CFormView::OnInitialUpdate(); 
	GetParentFrame()->RecalcLayout(); 
	ResizeParentToFit(); 
 
	hWnd = m_hWnd; 
 
	CWnd * pWnd = (CWnd *)GetDlgItem (IDC_VIDEOWND); 
	if (!(m_bInitDevice = TS_InitDevice (pWnd->GetSafeHwnd ()))) { 
		MessageBox ("InitDevice Error"); 
		return; 
	} 
 
	int TotalEncMode = TS_GetTotalEncodeMode (); 
	CString EncModeName; 
	for (int i=0; i< TotalEncMode; i++) { 
		TS_GetEncodeModeName (i, EncModeName); 
		m_EncodeModeList.AddString (EncModeName); 
	} 
 
	m_EncodeModeList.SetCurSel (TS_GetEncodeMode ()); 
 
	m_VideoSource = TS_GetVideoSource (); 
	m_ChannelSpin.SetRange (1,100); 
	m_ChannelSpin.SetPos (m_Channel =TS_GetTVChannel ()); 
	 
	m_FilePath = "e:\\user\\test.mpg"; 
 
	UpdateParameterView (); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CI800DemoView printing 
 
BOOL CI800DemoView::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
	// default preparation 
	return DoPreparePrinting(pInfo); 
} 
 
void CI800DemoView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add extra initialization before printing 
} 
 
void CI800DemoView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add cleanup after printing 
} 
 
void CI800DemoView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add customized printing code here 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CI800DemoView diagnostics 
 
#ifdef _DEBUG 
void CI800DemoView::AssertValid() const 
{ 
	CFormView::AssertValid(); 
} 
 
void CI800DemoView::Dump(CDumpContext& dc) const 
{ 
	CFormView::Dump(dc); 
} 
 
CI800DemoDoc* CI800DemoView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CI800DemoDoc))); 
	return (CI800DemoDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CI800DemoView message handlers 
 
void CI800DemoView::OnSize(UINT nType, int cx, int cy)  
{ 
	CFormView::OnSize(nType, cx, cy); 
/*	CRect rc; 
 
	GetClientRect (&rc); 
 
	if (m_bInitDevice) { 
		TS_SetVideoWindowPos (rc.left, rc.top, rc.Width(), rc.Height()); 
	} 
*/		 
} 
 
void CI800DemoView::OnBrowse()  
{ 
	UpdateData (); 
	CFileDialog dlgFile (false, "mpg", m_FilePath, 
		OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
		"MPEG Files (*.mpg)|*.mpg||", this); 
 
	if (dlgFile.DoModal () == IDOK) 
		m_FilePath = dlgFile.GetPathName (); 
	 
	UpdateData (false); 
} 
 
void CI800DemoView::OnUpdate()  
{ 
	UpdateData (); 
	CString EncName; 
 
	int EncMode = m_EncodeModeList.GetCurSel (); 
	TS_SetEncodeMode (EncMode); 
	TS_SetVideoBitRate (m_BitRate); 
	TS_SetGOPSize(m_GOPSize); 
	TS_SetHHR (m_HHR); 
	TS_SetOffsetField1(m_OffsetField1); 
	TS_SetOffsetField2(m_OffsetField2); 
	TS_SetPDistance (m_PDistance); 
	TS_SetPreFilterNo(m_PreProcessFilter); 
	TS_SetRateCtrl(m_RateControl); 
	TS_SetResolution(m_Resolution); 
	TS_SetTopFieldFirst (m_TFF); 
 
	TS_UpdateEncodeParameter (); 
} 
 
void CI800DemoView::OnTuning()  
{ 
	TS_TVTuning (); 
} 
 
void CI800DemoView::OnSelchangeEncMpdeCombo()  
{ 
	int CurSel; 
	 
	CurSel = m_EncodeModeList.GetCurSel (); 
	TS_SetEncodeMode (CurSel); 
	TS_ReadEncodeParameters (CurSel); 
	UpdateParameterView (); 
	 
} 
 
void CI800DemoView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)  
{ 
	if (pScrollBar->GetDlgCtrlID() == IDC_CHANNEL_SPIN) { 
		UpdateData (); 
		TS_SetTVChannel (m_Channel); 
	} 
	 
	CFormView::OnVScroll(nSBCode, nPos, pScrollBar); 
} 
 
void CI800DemoView::OnStartCapture()  
{ 
	CString AudFile; 
 
	AudFile = m_FilePath.Left (m_FilePath.Find ('.')) + ".mpa"; 
 
	UpdateData (); 
	if (m_AVSplit) { 
		/// for Capture MPEG Video and Audio  
		if (!TS_StartAVCapture (m_FilePath, AudFile)) { 
			MessageBox ("Has something wrong"); 
		} 
	} else { 
		/// for Capture  MPEG system/program 
		//if (!TS_StartCapture (STREAM_TO_FILE /*| STREAM_TO_BUFFER*/, m_FilePath, (long)&StreamDataCallback)) { 
		//	MessageBox ("Has something wrong"); 
		//} 
		// for Capture video only 
		if (!TS_StartVidCapture (/*STREAM_TO_FILE |*/ STREAM_TO_BUFFER, m_FilePath, (long)&StreamDataCallback)) { 
			MessageBox ("Has something wrong"); 
		} 
		// for Capture audio only 
		//if (!TS_StartAudCapture (/*STREAM_TO_FILE |*/ STREAM_TO_BUFFER, m_FilePath, (long)&StreamDataCallback)) { 
		//	MessageBox ("Has something wrong"); 
		//} 
	} 
} 
 
void CI800DemoView::OnPauseCapture()  
{ 
	// TODO: Add your command handler code here 
	 
} 
 
void CI800DemoView::OnStopCapture()  
{ 
	TS_StopCapture (); 
} 
 
void CI800DemoView::OnStartPlayback()  
{ 
	CString PlayFile; 
	CFileDialog dlgFile (true, "mpg", m_FilePath, 
		OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
		"MPEG Files (*.mpg)|*.mpg||", this); 
 
	if (dlgFile.DoModal () == IDOK) { 
		PlayFile = dlgFile.GetPathName (); 
		TS_StartPlayback (PlayFile); 
	} 
} 
 
void CI800DemoView::OnPausePlayback()  
{ 
	if (TS_GetState () == STATE_PAUSEPLAYBACK) 
		TS_ResumePlayback (); 
	else 
		TS_PausePlayback (); 
} 
 
void CI800DemoView::OnStopPlayback()  
{ 
	TS_StopPlayback (); 
} 
 
 
void CI800DemoView::OnChangeInput()  
{ 
	UpdateData (); 
	TS_SetVideoSource (m_VideoSource);	 
}