// VideoVod.cpp : implementation file
//

#include "stdafx.h"
#include "VideoVod.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define USRMSG_PLAYEND	(WM_USER + 10)

/////////////////////////////////////////////////////////////////////////////
// CVideoVod

CVideoVod::CVideoVod()
{
	m_nWorkMode = 2;
	m_nButtom     = 0;//48;
	m_lVodHandle  = 0;
	m_szFileName = "";
}

CVideoVod::~CVideoVod()
{
}

BEGIN_MESSAGE_MAP(CVideoVod, CWnd)
	//{{AFX_MSG_MAP(CVideoVod)
	ON_WM_CREATE()
	ON_WM_DESTROY()
	ON_WM_PAINT()
	ON_WM_ERASEBKGND()
	ON_WM_SIZE()
	//}}AFX_MSG_MAP
	ON_MESSAGE(USRMSG_PLAYEND,	OnPlayEnd)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CVideoVod message handlers
int CVideoVod::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	for(int i = 0; i < VCHN_MAX; i++)
	{
		m_VChn[i].m_pVodScren = this;
		m_VChn[i].Create(
			NULL, 
			NULL, 
			WS_VISIBLE | WS_CHILD,
			CRect(0, 0, 0, 0),
			this,
			1979,
			NULL);
		//AddPage(&m_VChn[i]);
	}

	SetDrawActiveRect(TRUE, RGB(70, 255, 40));
	SetActivePage(&m_VChn[0], TRUE);
	
	SetMultiScreen(TRUE);
	SetSlipMode(VIDEO_MODE_1, 0);

	GetClientRect(&m_clientRect);
	AdjWindowSize();
	return 0;
}

void CVideoVod::OnDestroy() 
{
	if(m_bFullScreen)
		SetFullScreen(FALSE);
	StopAllChn();

	CWnd::OnDestroy();
	
	for(int i=0; i < VCHN_MAX; i++)
	{
		m_VChn[i].DestroyWindow();
	}
}

LRESULT CVideoVod::OnPlayEnd(WPARAM wParam, LPARAM lParam)
{
	TRACE("play end\n");
	return 0;
}

void CVideoVod::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	UpdateWnd();
}

BOOL CVideoVod::OnEraseBkgnd(CDC* pDC) 
{
	CRect rt;
	GetClientRect(&rt);
	CBrush br;
	br.CreateSolidBrush(m_clrBack);
	//br.CreateSolidBrush(RGB(255,255,255));
	pDC->FillRect(&rt,&br);
	return TRUE;
}

void CVideoVod::AdjWindowSize()
{
	
}
void CVideoVod::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 if(m_hWnd)
	{
		GetClientRect(&m_clientRect);
		AdjWindowSize();
	}
}

int CVideoVod::GetFreeChnWnd()
{
	int i;
	for(i=0; i<VCHN_MAX; i++)
	{
		if(!m_VChn[i].m_lHandle)
			return i;
	}
	return -1;
}

static void playback_getdata(
						   MRPARAM_IN LONG lStreamHandle, 
						   MRPARAM_IN MRAVFrame *pAvFrame, 
						   MRPARAM_IN void *userdata)
{
	//TRACE("frame type=%d, pts=%d, size=%d\n", pAvFrame->nFrameType, pAvFrame->pts, pAvFrame->size);
}

long CVideoVod::vodstart(LPCTSTR szFileName)
{
	LONG lHandle = 0;
	int i, iRet, nIndex = 0;
	int nVChs;
	MRAVSTREAM_T stStream;
	BOOL bHaveAudio = FALSE;
	if(!szFileName || !strlen(szFileName))
	{
		DPERROR(("param error\n"));
		return 0;
	}
	iRet = MRPSDK_Chn_FileOpen(&lHandle, szFileName, 0, 0);
	if(iRet)
	{
		DPERROR(("MRPSDK_Chn_FileOpen failed\n"));
		return 0;
	}
	
	iRet = MRPSDK_Chn_GetStreams(lHandle);
	for(i=0; i<iRet; i++)
	{
		MRPSDK_Chn_GetStream(lHandle, i, &stStream);
		if(stStream.codec_type == AVMEDIA_TYPE_AUDIO)
			bHaveAudio = TRUE;
		if(stStream.codec_type != AVMEDIA_TYPE_VIDEO)
			continue;
		//nIndex = i;
		/*if(nIndex < 0)
		{
			DPERROR(("not free wnd\n"));
			LVNSDK2_Stream_Stop(lHandle);
			lHandle = 0;
			return 0;
		}*/
		m_VChn[nIndex].m_nStreamInx = i;
		m_VChn[nIndex].m_lHandle    = lHandle;
		MRPSDK_Chn_SetVideoWnd(lHandle, i, m_VChn[nIndex].m_hVideoWnd->m_hWnd);
		m_VChn[nIndex].SetWndSize(m_bAutoSizeAdj);
		nIndex ++;
	}
	MRPSDK_Chn_RegPlayEndMsg(lHandle, m_hWnd, USRMSG_PLAYEND);
	MRPSDK_Chn_RegGetData(lHandle, playback_getdata, this);
	nVChs = MRPSDK_Chn_GetVideoStreams(lHandle);
	//SetSlipMode(nVChs, 0);
	//m_hPyTools->StartPlay(bHaveAudio, nVChs, LVNSDK2_Vod_GetTolTime(lHandle));
	MRPSDK_Chn_Start(lHandle);
	//MRPSDK_Chn_SoundPlay(lHandle, TRUE);
	m_szFileName = szFileName;
	m_lVodHandle = lHandle;
	return (long)lHandle;
}

void CVideoVod::StopAllChn()
{
	for(int i=0; i < VCHN_MAX; i++)
	{
		m_VChn[i].m_lHandle = 0;
		m_VChn[i].m_nStreamInx = -1;
	}
	if(m_lVodHandle)
		MRPSDK_Chn_Close(m_lVodHandle);
	m_lVodHandle = 0;
	Invalidate();
}

long CVideoVod::vod_vchs(LONG lHandle)
{
	if(!m_lVodHandle)
		return 0;
	return MRPSDK_Chn_GetVideoStreams(m_lVodHandle);
}

void CVideoVod::StopChn(LONG lHandle)
{
	/*int i;
	POSITION pos;
	if(!lHandle || !(pos = m_ListHandle.Find(lHandle)))
		return;
	
	for(i=0; i < VCHN_MAX; i++)
	{
		if(m_VChn[i].m_lHandle == lHandle)
		{
			m_VChn[i].m_lHandle = 0;
			m_VChn[i].m_nStreamInx = -1;
			m_VChn[i].Invalidate(TRUE);
		}
	}*/
	MRPSDK_Chn_Close(lHandle);
	//m_ListHandle.RemoveAt(pos);
}

int  CVideoVod::SetSlipMode(int nMode, int nStart)
{
	int nNum = 16;
	int nBegin = 0;
	int i;
	if(nMode == VIDEO_MODE_1)
	{
		nNum   = 1;
		nBegin = ((nStart / nNum) * nNum);
	}
	else if(nMode == VIDEO_MODE_2)
	{
		nNum   = 2;
		nBegin = ((nStart / nNum) * nNum);
	}
	else if(nMode == 3 || nMode == VIDEO_MODE_4)
	{
		nNum   = VIDEO_MODE_4;
		nBegin = ((nStart / nNum) * nNum);
	}
	else if(nMode == 5 || nMode == VIDEO_MODE_6)
	{
		nNum   = VIDEO_MODE_6;
		nBegin = ((nStart / nNum) * nNum);
	}
	else if(nMode == 7 || nMode == VIDEO_MODE_8)
	{
		nNum   = VIDEO_MODE_8;
		nBegin = ((nStart / nNum) * nNum);
	}
	else if(nMode == VIDEO_MODE_9)
	{
		nNum   = VIDEO_MODE_9;
		nBegin = ((nStart / nNum) * nNum);
	}
	else if(nMode >= 10 && nMode <= VIDEO_MODE_13)
	{
		nNum   = VIDEO_MODE_13;
		nBegin = ((nStart / nNum) * nNum);
	}
	else if(nMode >= 14 && nMode <= VIDEO_MODE_16)
	{
		nNum   = VIDEO_MODE_16;
		nBegin = ((nStart / nNum) * nNum);
	}
	else if(nMode >= 17 && nMode <= VIDEO_MODE_20)
	{
		nNum   = VIDEO_MODE_20;
		nBegin = ((nStart / nNum) * nNum);
	}
	else if(nMode >= 21 && nMode <= VIDEO_MODE_25)
	{
		nNum   = VIDEO_MODE_25;
		nBegin = ((nStart / nNum) * nNum);
	}
	else if(nMode >= 26 && nMode <= VIDEO_MODE_36)
	{
		nNum   = VIDEO_MODE_36;
		nBegin = ((nStart / nNum) * nNum);
	}
	else if(nMode >= VIDEO_MODE_PAN_2 && nMode <= VIDEO_MODE_PAN_8)
	{
		nNum   = nMode - VIDEO_MODE_PAN;
		nBegin = ((nStart / nNum) * nNum);
	}
	else
	{
		DPERROR(("not support mode:%d\n", nMode));
		return 0;
	}
	
	
	//if( m_bDrawActive ) 
	//	DrawActivePage(FALSE);
	
	m_nCurViewMode = nMode;
	
	CList<VideoWndChn*, VideoWndChn*> templist;
	
	POSITION pos = m_PageList.GetHeadPosition();
	while(pos != NULL)
	{
		VideoWndChn* pWnd = m_PageList.GetNext(pos);
		if (pWnd)
		{
			templist.AddTail(pWnd);
		}
	}
	m_PageList.RemoveAll();
	
	if( (nBegin + nNum) > VCHN_MAX)
	{
		int addno = nBegin + nNum - VCHN_MAX;
		for(i=nBegin; i < VCHN_MAX; i++)
			m_PageList.AddTail(&m_VChn[i]);
		for(i=0; i < addno; i++)
			m_PageList.AddTail(&m_VChn[i]);
	}
	else
	{
		for(i=nBegin; i < (nBegin+nNum); i++)
			m_PageList.AddTail(&m_VChn[i]);
	}
	
	pos = templist.GetHeadPosition();
	while(pos != NULL)
	{
		VideoWndChn* pWnd = templist.GetNext(pos);
		if (pWnd)
		{
			POSITION pos2 = m_PageList.Find(pWnd);
			if(!pos2)
				pWnd->ShowWindow(SW_HIDE);
		}
	}
	templist.RemoveAll();
	
	m_pActivePage = &m_VChn[nBegin];
	SetMultiScreen(nMode == VIDEO_MODE_1 ? FALSE : TRUE);
	/*
	{
		CRect rtContainer;
		GetRefrenRect(rtContainer);
		
		m_bMultiScreen = nMode == VIDEO_MODE_1 ? FALSE : TRUE;
		rtContainer.bottom += 3;
		InvalidateRect(rtContainer);
	}
	*/
	//SetActivePage(&m_VChn[nBegin]);
	return 0;
}

int CVideoVod::SetSlipModeByList(int nChs, int *pChnList)
{
	int i;
	int nMode = nChs;
	CList<VideoWndChn*, VideoWndChn*> templist;
	
	if(nChs <= 1)
		nMode = VIDEO_MODE_1;
	//else if(nChs <= 2)
	//	nMode = VIDEO_MODE_2;
	else if(nChs <= 4)
		nMode = VIDEO_MODE_4;
	else if(nChs <= 6)
		nMode = VIDEO_MODE_6;
	else if(nChs <= 9)
		nMode = VIDEO_MODE_9;
	else if(nChs <= 16)
		nMode = VIDEO_MODE_16;
	else if(nChs <= 25)
		nMode = VIDEO_MODE_25;
	else
		return -1;

	POSITION pos = m_PageList.GetHeadPosition();
	while(pos != NULL)
	{
		VideoWndChn* pWnd = m_PageList.GetNext(pos);
		if (pWnd)
		{
			templist.AddTail(pWnd);
		}
	}
	m_PageList.RemoveAll();
	
	for(i=0; i<nChs; i++)
	{
		m_PageList.AddTail(&m_VChn[pChnList[i]]);
		//m_VChn[pChnList[i]].ShowWindow(SW_SHOW);
	}
	for(i=nChs; i<nMode; i++)
	{
		m_PageList.AddTail(&m_VChn[16 + i - nChs]);
		m_VChn[16 + i - nChs].ShowWindow(SW_HIDE);
	}
	
	pos = templist.GetHeadPosition();
	while(pos != NULL)
	{
		VideoWndChn* pWnd = templist.GetNext(pos);
		if (pWnd)
		{
			POSITION pos2 = m_PageList.Find(pWnd);
			if(!pos2)
				pWnd->ShowWindow(SW_HIDE);
		}
	}
	templist.RemoveAll();
	
	m_pActivePage = &m_VChn[pChnList[0]];
	m_nCurViewMode = nMode;
	SetMultiScreen(nMode == VIDEO_MODE_1 ? FALSE : TRUE);
	return 0;
}

void CVideoVod::SetAutoScan(BOOL bAutoScan)
{
	if(m_bAutoSizeAdj != bAutoScan)
	{
		int i;
		m_bAutoSizeAdj = bAutoScan;
		for(i=0; i<VCHN_MAX; i++)
		{
			m_VChn[i].SetWndSize(m_bAutoSizeAdj);
		}
	}
}

int CVideoVod::audioplay(BOOL bOpen)
{
	if(!m_lVodHandle)
		return -1;
	return MRPSDK_Chn_SoundPlay(m_lVodHandle, bOpen);
}
