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

📄 mp_mobilemovecamdlg.cpp

📁 一个在Linux下开发的IP摄像头的驱动程序及控制软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MP_MobileMoveCamDlg.cpp : implementation file
//

#include "stdafx.h"
#include "MP_MobileMoveCam.h"
#include "MP_MobileMoveCamDlg.h"
#include "Settings.h"
#include "DataBroker.h"
#include "AvSynchronizer.h"
#include "ServerUtl.h"
#include "SrvDepResource.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#define WM_UPDATE_CTRLSTATE				(WM_USER + 3)

SCODE DataBrokerStatusCallBack(DWORD dwContext, TDataBrokerStatusType tStatusType, PVOID pvParam1, PVOID pvParam2)
{
	CMP_MobileMoveCamDlg *pDlg = (CMP_MobileMoveCamDlg*)dwContext;

	switch (tStatusType)
	{
		case eOnConnectionInfo:
			pDlg->m_tChannelInfo.chStatus = channelConnected;
			PTDataBrokerConnInfo pConnInfo;
			pConnInfo=(PTDataBrokerConnInfo) pvParam1;
			pDlg->m_tChannelInfo.nFrames = 0;
			if (pConnInfo->dwMediaType == (emtAudio|emtVideo))
			{
				pDlg->m_tChannelInfo.dwMediaType = AVSYNCHRONIZER_MEDIATYPE_AUDIO_VIDEO;
				TRACE(_T("dwMediaType = AUDIO_VIDEO\n"));
			}
			else if (pConnInfo->dwMediaType == emtAudio)
			{
				pDlg->m_tChannelInfo.dwMediaType = AVSYNCHRONIZER_MEDIATYPE_AUDIO_ONLY;
				TRACE(_T("dwMediaType = AUDIO_ONLY\n"));
			}
			else
			{
				pDlg->m_tChannelInfo.dwMediaType = AVSYNCHRONIZER_MEDIATYPE_VIDEO_ONLY;
				TRACE(_T("dwMediaType = VIDEO_ONLY\n"));
			}
			TUPDATECHANNELOPTION tUpdateChOpt;
			tUpdateChOpt.dwFlags = UPCH_MEDIATYPE;
			tUpdateChOpt.tMediaType = (EMEDIATYPE)pDlg->m_tChannelInfo.dwMediaType;
			AvSynchronizer_UpdateChannelSettings(pDlg->m_tChannelInfo.hChannel, tUpdateChOpt);
			pDlg->PostMessage(WM_UPDATE_CTRLSTATE, TRUE, 0);
			
			break;
		case eOnAuthFailed:
			TRACE(_T("eOnAuthFailed\n"));
			break;
		case eOnStartMediaChannel:
			TRACE(_T("eOnStartMediaChannel\n"));
			break;
		case eOnChannelClosed:
			TRACE(_T("eOnChannelClosed\n"));
			break;
		case eOnTimeout:
			if ((int) pvParam1 == eAudioChannel)
				TRACE(_T("Timeout for audio\n"));
			else
				TRACE(_T("Timeout for video\n"));
			return S_OK;
			//break;
		case eOnProtocolChanged:
			TRACE(_T("eOnProtocolChanged\n"));
			::MessageBox (pDlg->m_hWnd, _T("Protocol change\n"), _T(""), MB_OK);
			break;
		case eOnPacketLoss:
			TRACE(_T("eOnPacketLoss ...\n"));
			break;
		case eOnDiDo:
			TRACE(_T("eOnDiDo\n"));
			break;
		case eOnLocationChanged:
			TRACE(_T("eOnLocationChanged ...\n"));
			break;
		case eOnInputInfo:
			TRACE(_T("eOnInputInfo\n"));
			break;
		case eOnOtherError:
			TRACE(_T("eOnOtherError %x\n"), pvParam1);
			break;
		case eOnVideoSignalChange:
			TRACE(_T("eOnVideoSignalChange\n"));
			break;
		case eOnStopped:
			TRACE(_T("eOnStopped\n"));
			//if (!pDlg->m_bUserStop)
			//{	// disconnected abnormally, reconnecting
			//	pDlg->m_tChannelInfo.dwReconnCnt++;
			//}
			pDlg->m_tChannelInfo.chStatus = channelStopped;		
			break;

// below are for 4000/5000/6000 servers
		case eOnGetPrivilege:
			TRACE(_T("eOnGetPrivilege\n"));
			break;
		case eOnAudioMode:
			TRACE(_T("eOnAudioMode\n"));
			break;
		case eOnAudioDisabled:
			TRACE(_T("eOnAudioDisabled\n"));
			break;
		case eOnChangeMediaType:
			// post to show error message
			TRACE(_T("eOnChangeMediaType\n"));
			break;
		case eOnServiceUnavailable:
			TRACE(_T("eOnServiceUnavailable\n"));
			break;
		default:
				break;
	}
	return S_OK;
}

SCODE DataBrokerAVCallBack(DWORD dwContext,TMediaDataPacketInfo *pMediaDataPacket)
{
	CMP_MobileMoveCamDlg *pDlg = (CMP_MobileMoveCamDlg*)dwContext;

	SCODE scRet = AvSynchronizer_InputEncodedMediaFrame(pDlg->m_tChannelInfo.hChannel, pMediaDataPacket);
	if (AVSYNCHRONIZER_E_QUEUE_FULL == scRet)
	{
		TRACE(_T("FRAME_NOT_HANDLED\n"));
		return DATABROKER_S_FRAME_NOT_HANDLED;
	}

	return S_OK;	
}

SCODE AvSyhchronizerStatusCallBack(DWORD dwContext, DWORD dwStatusCode, DWORD dwParam1, DWORD dwParam2)
{
	return S_OK;
}

SCODE AvSyhchronizerDisplayCallBack(DWORD dwContext, TDISPLAYINFO* ptDisplayInfo)
{
	CMP_MobileMoveCamDlg *pDlg = (CMP_MobileMoveCamDlg*)dwContext;
	HDC	hDC = ptDisplayInfo->hDC;
	struct tm * p = (struct tm *)ptDisplayInfo->DrawTime;
	TCHAR chTime[128];

	SetBkMode(hDC,TRANSPARENT);
	// show remote time
	SetTextColor(hDC,RGB(0,255,0));
	_stprintf(chTime,_T("%d/%02ld/%02ld %02ld:%02ld:%02ld"),
		p->tm_year + 1900, p->tm_mon + 1, p->tm_mday,
		p->tm_hour,p->tm_min,p->tm_sec);

	SIZE Size;
	GetTextExtentPoint32(hDC, chTime, wcslen(chTime), &Size);

	RECT r;
	r.top = ptDisplayInfo->ptOrigin.y;
	r.left = ptDisplayInfo->dwWidth - Size.cx - 5;
	r.bottom = ptDisplayInfo->dwHeight;
	r.right = ptDisplayInfo->dwWidth;

	DrawText(hDC, chTime, wcslen(chTime), &r, DT_RIGHT);

	return S_OK;
}

CMP_MobileMoveCamDlg::CMP_MobileMoveCamDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMP_MobileMoveCamDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	m_hDataBroker = NULL;
	m_hAvSync = NULL;
	m_hServerDev = NULL;
	m_hServerUtl = NULL;
}

CMP_MobileMoveCamDlg::~CMP_MobileMoveCamDlg()
{
	if (m_tChannelInfo.hDataConn)
		DataBroker_DeleteConnection(m_hDataBroker,&m_tChannelInfo.hDataConn);

	if (m_hDataBroker)
		DataBroker_Release(&m_hDataBroker);

	if (m_tChannelInfo.hChannel)
		AvSynchronizer_DeleteChannel(m_hAvSync, &m_tChannelInfo.hChannel);

	if (m_hAvSync)
		AvSynchronizer_Release(&m_hAvSync);

	if (m_hServerDev)
		ServerUtl_DeleteDevice(m_hServerDev);

	if (m_hServerUtl)
		ServerUtl_Release(&m_hServerUtl);
}

void CMP_MobileMoveCamDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CMP_MobileMoveCamDlg, CDialog)
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
	ON_WM_SIZE()
#endif
	//}}AFX_MSG_MAP
	ON_BN_CLICKED(IDC_BUTTON6, &CMP_MobileMoveCamDlg::OnBnClickedSettings)
	ON_BN_CLICKED(IDC_BUTTON_CONNECT, &CMP_MobileMoveCamDlg::OnButtonConnect)

	ON_BN_CLICKED(IDC_BUTTON_LEFT, OnButtonLeft)
	ON_BN_CLICKED(IDC_BUTTON_DOWN, OnButtonDown)
	ON_BN_CLICKED(IDC_BUTTON_HOME, OnButtonHome)
	ON_BN_CLICKED(IDC_BUTTON_UP, OnButtonUp)
	ON_BN_CLICKED(IDC_BUTTON_RIGHT, OnButtonRight)

	ON_MESSAGE(WM_UPDATE_CTRLSTATE, OnUpdateCtrlState)
END_MESSAGE_MAP()


// CMP_MobileMoveCamDlg message handlers

void CMP_MobileMoveCamDlg::ReadParameters()
{
	_tcscpy(m_tChannelInfo.szHostIP, _T("172.16.7.36"));
	m_tChannelInfo.dwHTTPPort = 80;
	m_tChannelInfo.dwMediaType = 3;
	_tcscpy(m_tChannelInfo.szUserName, _T("root"));
	_tcscpy(m_tChannelInfo.szPassword, _T(""));
	_tcscpy(m_tChannelInfo.szServer_Type, _T("auto"));
	m_tChannelInfo.dwProtocol = 3;
}

BOOL CMP_MobileMoveCamDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	// TODO: Add extra initialization here

	ReadParameters();
	
	CenterWindow(GetDesktopWindow());	// center to the hpc screen

	// TODO: Add extra initialization here
	SetDlgItemText (IDC_EDIT_TYPE, _T("IP21x1-VVTK"));
	SetDlgItemText (IDC_EDIT_ADDRESS, _T("192.168.1.66"));
	SetDlgItemText (IDC_EDIT_PORT, _T("80"));
	GetDlgItem(IDC_STATIC_DISPLAY)->MoveWindow(0, 0, 460, 420);//240, 180); //
	TCHAR szBuf[256];
	SCODE sRet = DataBroker_Initial ( &m_hDataBroker, 1, 
						DataBrokerStatusCallBack, 
						DataBrokerAVCallBack,
						mctJPEG | mctH263 | mctMP4V | mctG7221 | mctG729A | mctAAC , 
						0?0:eOptConnUseIE,
						DATABROKER_VERSION);

	if (IS_FAIL(sRet))
	{
		_stprintf(szBuf, _T("DataBroker_Initial failed with error %X"), sRet);
		MessageBox(szBuf, _T("Error"), MB_OK);
		return FALSE;
	}

	sRet = DataBroker_CreateConnection(m_hDataBroker, &m_tChannelInfo.hDataConn);
	
	if (IS_FAIL(sRet))
	{
		_stprintf(szBuf, _T("DataBroker_CreateConnection failed with error %X"), sRet);
		MessageBox(szBuf, _T("Error"), MB_OK);
		return FALSE;
	}

	sRet = AvSynchronizer_InitialEx(&m_hAvSync, AvSyhchronizerStatusCallBack,
		AvSyhchronizerDisplayCallBack,
		//NULL,
		this->m_hWnd, AUDIOOUT_FOCUS_NORMAL, 0, AVSYNCHRONIZER_VERSION, 
		USE_GDI_ONLY | FORCE_GDI | BETTER_GDI_STRETCH, //| AV_DONT_SYNC,//  | CAPTION_ON_GRAPH,
		RGB(82, 130, 148));

	if (IS_FAIL(sRet))
	{
		_stprintf(szBuf, _T("AvSynchronizer_Initial failed with error %X"), sRet);
		MessageBox(szBuf, _T("Error"), MB_OK);
		return FALSE;
	}

	CreateAvSyncChannel();

	sRet = ServerUtl_Initial(&m_hServerUtl, SERVERUTL_VERSION);
	
	if (sRet != S_OK)
	{
		_stprintf(szBuf, _T("ServerUtl_Initial failed with error %X"), sRet);
		MessageBox(szBuf, _T("Error"), MB_OK);
		return FALSE;
	}


	return TRUE;  // return TRUE  unless you set the focus to a control
}

LRESULT CMP_MobileMoveCamDlg::OnUpdateCtrlState(WPARAM wParam, LPARAM lParam)
{
	if (wParam == TRUE)
	{
		// set serverutl property here
		if (m_hServerDev)
			ServerUtl_DeleteDevice(m_hServerDev);

		m_hServerDev = NULL;
		TSrvDepResource_ServerInfo srvInfo;

⌨️ 快捷键说明

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