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);
}