// LiveWndChn.cpp : implementation file
//

#include "stdafx.h"
#include "NetSdkDemo.h"
#include "LiveWndChn.h"
#include "VideoLive.h"
#include "DlgLink.h"
#include "DlgConfig.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CLiveWndChn
static int live_chn_relink(LONG lStreamHandle, int nState, void *dwUser)
{
	return 1;
}

CLiveWndChn::CLiveWndChn()
{
	m_pLiveScren = NULL;
	m_bLButtonDown = FALSE;
	m_bRecord = FALSE;

	m_szIP = "192.168.5.183";
	m_wPort = 3000;
	m_szUserName = "admin";
	m_szPassword = "admin";

	m_b3DLocal = FALSE;
}

CLiveWndChn::~CLiveWndChn()
{
}

BEGIN_MESSAGE_MAP(CLiveWndChn, CWnd)
	//{{AFX_MSG_MAP(CLiveWndChn)
	ON_WM_SIZE()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONDBLCLK()
	ON_WM_RBUTTONUP()
	ON_WM_PAINT()
	ON_WM_ERASEBKGND()
	ON_WM_DESTROY()
	ON_WM_CREATE()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	ON_COMMAND(IDR_MENU_LIVE_LINK, OnMenuLiveLink)
	ON_COMMAND(IDR_MENU_LIVE_REC, OnMenuLiveRec)
	ON_COMMAND(IDR_MENU_LIVE_SHUT, OnMenuLiveShut)
	ON_COMMAND(IDR_MENU_LIVE_CONFIG, OnMenuLiveConfig)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CLiveWndChn message handlers

void CLiveWndChn::OnSize(UINT nType, int cx, int cy) 
{
	CWnd::OnSize(nType, cx, cy);
	
	if ((cx ==0 && cy == 0) || 
		(cx == m_clientRect.Width() && cy == m_clientRect.Height())) 
	{
		return;
	}
	else
	{
		GetClientRect(&m_clientRect);
		SetWndSize(m_pLiveScren->m_bAutoSizeAdj);
	}
}

void CLiveWndChn::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_bLButtonDown)
	{
		m_rcSlip.right  = point.x;
		m_rcSlip.bottom = point.y;
		Invalidate();
		//UpdateWindow();
	}
	CWnd::OnMouseMove(nFlags, point);
}

void CLiveWndChn::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_pLiveScren->SetActivePage(this);
	if(m_pLiveScren->m_nZoomType && m_lHandle)
	{
		m_bLButtonDown = TRUE;
		m_rcSlip.left  = point.x;
		m_rcSlip.top   = point.y;
	}
	else if(m_lHandle && m_b3DLocal)
	{
		m_bLButtonDown = TRUE;
		m_rcSlip.left  = point.x;
		m_rcSlip.top   = point.y;
	}
	CWnd::OnLButtonDown(nFlags, point);
}
void CLiveWndChn::OnLButtonUp(UINT nFlags, CPoint point) 
{
	if(m_bLButtonDown && m_lHandle)
	{
		if(m_pLiveScren->m_nZoomType)
		{

		}
		else if(m_b3DLocal)
		{
			CRect rcTmp;
			MR_PTZ3DLOCAL_T st3DLocal;
			m_hVideoWnd->GetWindowRect(&rcTmp);
			st3DLocal.bZoomIn = m_rcSlip.left < m_rcSlip.right ? TRUE : FALSE;
			st3DLocal.imgSrcWidth = rcTmp.Width();
			st3DLocal.imgSrcHeight= rcTmp.Height();
			st3DLocal.cWidth      = abs(m_rcSlip.right - m_rcSlip.left);
			st3DLocal.cHeight     = abs(m_rcSlip.bottom - m_rcSlip.top);
			st3DLocal.cx          = m_rcSlip.left < m_rcSlip.right ? m_rcSlip.left : m_rcSlip.right;
			st3DLocal.cy          = m_rcSlip.top < m_rcSlip.bottom ? m_rcSlip.top  : m_rcSlip.bottom;
			MRNSDK_PtzControl(m_szIP, m_wPort, m_szUserName, m_szPassword, NULL, 1000, 0, MR_PTZCMD_3DLOCATE, 0, &st3DLocal);
		}
	}
	m_bLButtonDown = FALSE;
	CWnd::OnLButtonUp(nFlags, point);
}

void CLiveWndChn::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_pLiveScren->m_nCurViewMode == VIDEO_MODE_1)
	{
		BOOL bFull = !m_pLiveScren->GetFullScreen();
		if(bFull && !m_lHandle)
			return;
		m_pLiveScren->SetFullScreen(bFull);
	}
	else if(m_pLiveScren->m_nCurViewMode > VIDEO_MODE_1 && m_pLiveScren->m_nCurViewMode <= VIDEO_MODE_36)
	{
		m_pLiveScren->SetMultiScreen(!m_pLiveScren->GetMultiScreen());
	}
	CWnd::OnLButtonDblClk(nFlags, point);
}

void CLiveWndChn::OnRButtonUp(UINT nFlags, CPoint point) 
{
	CMenu menuPop;
	CMenu *subMenu;
	POINT pox_cur;
	
	menuPop.LoadMenu(IDR_MENU_LIVE);
	subMenu = menuPop.GetSubMenu(0);
	if(m_lHandle)
	{
		subMenu->EnableMenuItem(IDR_MENU_LIVE_LINK, MF_BYCOMMAND | MF_GRAYED);
		subMenu->EnableMenuItem(IDR_MENU_LIVE_SHUT, MF_BYCOMMAND);
		subMenu->EnableMenuItem(IDR_MENU_LIVE_REC, MF_BYCOMMAND);
		//subMenu->EnableMenuItem(IDR_MENU_LIVE_CONFIG, MF_BYCOMMAND);
		subMenu->CheckMenuItem(IDR_MENU_LIVE_REC, m_bRecord ? MF_BYCOMMAND | MF_CHECKED : MF_BYCOMMAND);
	}
	else
	{
		subMenu->EnableMenuItem(IDR_MENU_LIVE_LINK, MF_BYCOMMAND);
		subMenu->EnableMenuItem(IDR_MENU_LIVE_SHUT, MF_BYCOMMAND | MF_GRAYED);
		subMenu->EnableMenuItem(IDR_MENU_LIVE_REC, MF_BYCOMMAND | MF_GRAYED);
		//subMenu->EnableMenuItem(IDR_MENU_LIVE_CONFIG, MF_BYCOMMAND | MF_GRAYED);
		subMenu->CheckMenuItem(IDR_MENU_LIVE_REC, MF_BYCOMMAND);
	}
	
	GetCursorPos(&pox_cur);
	subMenu->TrackPopupMenu(TPM_LEFTALIGN, pox_cur.x, pox_cur.y, this);
	/*if(m_pLiveScren->GetFullScreen())
	{
		m_pLiveScren->SetFullScreen(FALSE);
	}*/
	CWnd::OnRButtonUp(nFlags, point);
}

void CLiveWndChn::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	
	if(m_bLButtonDown)
	{
		CRect rcTemp;
		CBrush BrushRead(RGB(255,0,0));
		if(m_rcSlip.left < m_rcSlip.right)
		{
			rcTemp.left = m_rcSlip.left;
			rcTemp.right= m_rcSlip.right;
		}
		else
		{
			rcTemp.left = m_rcSlip.right;
			rcTemp.right = m_rcSlip.left;
		}
		if(m_rcSlip.top < m_rcSlip.bottom)
		{
			rcTemp.top = m_rcSlip.top;
			rcTemp.bottom = m_rcSlip.bottom;
		}
		else
		{
			rcTemp.top = m_rcSlip.bottom;
			rcTemp.bottom = m_rcSlip.top;
		}
		
		dc.FrameRect(&rcTemp, &BrushRead);
	}
	else if(m_lHandle && m_nStreamInx >= 0)
		MRNSDK_Stream_RefrenshWnd(m_lHandle, m_nStreamInx);
}

BOOL CLiveWndChn::OnEraseBkgnd(CDC* pDC) 
{
	if(!m_bLButtonDown)
	{
		CRect rt;
		GetClientRect(&rt);
		CBrush br;
		br.CreateSolidBrush(RGB(0, 0, 0));
		pDC->FillRect(&rt,&br);
	}
	return TRUE;
	//return CWnd::OnEraseBkgnd(pDC);
}
void CLiveWndChn::OnDestroy() 
{
	CWnd::OnDestroy();
	
	if(m_lHandle)
	{
		MRNSDK_Stream_Stop(m_lHandle);
		m_lHandle = 0;
	}
	if(m_hVideoWnd)
	{
		m_hVideoWnd->DestroyWindow();
		delete m_hVideoWnd;
		m_hVideoWnd = NULL;
	}
}

int CLiveWndChn::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	RECT rc;
	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	m_hVideoWnd = new CStatic();
	GetClientRect(&rc);
	/*m_hVideoWnd->Create(
		NULL, 
		NULL, 
		WS_VISIBLE | WS_CHILD,
		rc,
		this,
		4600,
		NULL);*/
	m_hVideoWnd->Create("",WS_CHILD|WS_VISIBLE|SS_OWNERDRAW, rc, this, 4600);
	m_hVideoWnd->ShowWindow(SW_SHOW);
	return 0;
}

void CLiveWndChn::OnMenuLiveLink() 
{
	MRAVSTREAM_T stStream;
	CDlgLink dlg;
	int i, iRet;
	if(dlg.DoModal() != IDOK)
		return;
	m_lHandle = dlg.m_lHandle;
	iRet = MRNSDK_Stream_GetNums(m_lHandle);
	for(i=0; i<iRet; i++)
	{
		MRNSDK_Stream_GetStream(m_lHandle, i, &stStream);
		if(stStream.codec_type != AVMEDIA_TYPE_VIDEO)
			continue;
		MRNSDK_Stream_SetVideoWnd(m_lHandle, i, m_hVideoWnd->m_hWnd);
		m_nStreamInx = i;
		break;
	}
	m_szIP  = dlg.m_szIP;
	m_wPort = dlg.m_nProtel == 0 ? dlg.m_wPort : 3000;
	m_szUserName = dlg.m_szUserName;
	m_szPassword = dlg.m_szPassword;
	m_szStreamName = dlg.m_szStreamName;
	m_nProtel      = dlg.m_nProtel;
	m_bLButtonDown = FALSE;

	MRNSDK_Live_RegRelinkCallback(m_lHandle, live_chn_relink, this);
	MRNSDK_Stream_Start(m_lHandle);
}

void CLiveWndChn::OnMenuLiveRec() 
{
	if(!m_lHandle)
		return;
	if(!m_bRecord)
	{
		int nRecType = MR_PACKTYPE_MP4;
		CString szFileName;
		time_t nowtime;
		struct tm *timeinfo;
		time( &nowtime );					// 获取时间
		timeinfo = localtime( &nowtime );	// 转化为当地时间
		szFileName.Format("%s_%04d%02d%02d%02d%02d%02d%s",
			m_szIP, 
			timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday,
			timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec,
			nRecType == MR_PACKTYPE_MP4 ? ".mp4" : ".ts");
		MRNSDK_Live_SaveToFile(m_lHandle, nRecType, szFileName);
		m_bRecord = TRUE;
	}
	else
	{
		MRNSDK_Live_StopSaveFile(m_lHandle);
		m_bRecord = FALSE;
	}
}

void CLiveWndChn::OnMenuLiveShut() 
{
	if(m_lHandle)
	{
		MRNSDK_Stream_Stop(m_lHandle);
		m_lHandle = 0;
		Invalidate();
	}
}

void CLiveWndChn::OnMenuLiveConfig() 
{
	if(m_lHandle)
	{
		CDlgConfig dlg;
		g_envDev.szIP		= m_szIP;
		g_envDev.wPort	    = m_wPort;
		g_envDev.szUserName = m_szUserName;
		g_envDev.szPassword = m_szPassword;
		dlg.DoModal();
	}
}
