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

📄 yuvviewerdlg.cpp

📁 wince下EVC的编程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// YUVviewerDlg.cpp : implementation file
//

#include "stdafx.h"
#include "YUVviewer.h"
#include "ChildWindow.h"
#include "YUVviewerDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

BOOL g_bPlay;
int g_nFrameNumber = 0;
int g_nOldFrameNumber = -1000; 
BOOL g_Play = true;

int g_nStartFrame = 0;
int g_nEndFrame = 10000;
int g_nCurrentFrame = 0; 
BOOL g_bReversePlay = FALSE;

void getSeqName(TCHAR *inseqpath, TCHAR *seqname);

//int nImgWidth, nImgHeight;
UINT PlayVideo( LPVOID pParam )
{
	int i;//,j;

	BOOL bPlay = g_bPlay;
	BOOL bEof = FALSE;

	CYUVviewerDlg *pWin = (CYUVviewerDlg *)pParam;
	UINT picsize = pWin->m_nWidth*pWin->m_nHeight;
	//下面是两种方案,显然要转化字符后是对的
	LPSTR tempstring=(char *)malloc(sizeof(char*)*5);
	WideCharToMultiByte(CP_ACP,0,LPCTSTR(pWin->m_sFrameRate),
		-1,tempstring,5,NULL,NULL);
	int timespan = 1000/atoi(tempstring);
     free(tempstring);
	 
	//int timespan = 1000/atoi((char*)(LPCTSTR(pWin->m_sFrameRate)));
	
	if(g_nCurrentFrame < g_nStartFrame) g_nCurrentFrame = g_nStartFrame;
	if(g_nCurrentFrame > g_nEndFrame) g_nCurrentFrame = g_nEndFrame;

	for(i=0; i<pWin->m_iCount; i++)
	{
		pWin->m_pFile[i]->Seek(g_nCurrentFrame*picsize*3/2, SEEK_SET);
		pWin->m_pWnd[i]->nPicShowOrder = g_nCurrentFrame;
	}
	
//	HANDLE hPlayTemp1 = OpenMutex(MUTEX_ALL_ACCESS,FALSE,"Play");
	HANDLE hPlayTemp1=CreateMutex(NULL,FALSE,_T("play"));
	if(GetLastError()== ERROR_INVALID_HANDLE) hPlayTemp1=NULL;
	
	while(g_nCurrentFrame >= g_nStartFrame && g_nCurrentFrame <= g_nEndFrame && !bEof)
	{
		DWORD t2=GetTickCount();
		g_nFrameNumber = g_nCurrentFrame;//j;
 
		if ( WAIT_OBJECT_0 == WaitForSingleObject(hPlayTemp1,INFINITE) )
			ReleaseMutex( hPlayTemp1 );
		
		for(i=0; i<pWin->m_iCount; i++)
		{
			pWin->m_pFile[i]->Seek(g_nCurrentFrame*picsize*3/2, SEEK_SET);

			if(picsize != pWin->m_pFile[i]->Read(pWin->m_pWnd[i]->Y,picsize))
			{
				AfxMessageBox(_T("Get to end of file"));
				bEof = TRUE;
				break;
			}
			if(1)//bColorImage) 
			{
				if(picsize/4 != pWin->m_pFile[i]->Read(pWin->m_pWnd[i]->Cb,picsize/4))
				{
					AfxMessageBox(_T("Get to end of file"));
					bEof = TRUE;
					break;
				}
				if(picsize/4 != pWin->m_pFile[i]->Read(pWin->m_pWnd[i]->Cr,picsize/4))
				{
					AfxMessageBox(_T("Get to end of file"));
					bEof = TRUE;
					break;
				}
			}

			pWin->m_pWnd[i]->InvalidateRect (NULL,FALSE);
			pWin->m_pWnd[i]->UpdateWindow ();
			pWin->m_pWnd[i]->nPicShowOrder=g_nCurrentFrame;
		}

		if(g_bReversePlay == FALSE)
			g_nCurrentFrame++;
		else 
			g_nCurrentFrame--;

		int t1=GetTickCount()-t2;
		if(t1 < timespan) 
			Sleep(timespan - t1); // sleep time in milliseconds
	}
	
	pWin->m_pWinThread = NULL;
	AfxEndThread(0);

	return 1;

}

void CYUVviewerDlg::OnOrder() 
{
	if(g_bReversePlay == FALSE)
	{
		m_buttonOrder.SetWindowText(_T("Forward"));
		g_bReversePlay = TRUE;
	}
	else
	{
		m_buttonOrder.SetWindowText(_T("Backward"));
		g_bReversePlay = FALSE;
	}
}

void CYUVviewerDlg::OnPauseplay() 
{

	UpdateData(TRUE);

	g_nStartFrame = m_nFrameFrom;
	if(m_nFrameTo != 0) g_nEndFrame = m_nFrameTo;
	else g_nEndFrame = 10000;

	// create a new thread
	if (m_bPlay)
	{
		m_buttonPausePlay.SetWindowText(_T("Pause"));
		m_bPlay = false;
		g_Play = true;
	}
	else
	{
		m_buttonPausePlay.SetWindowText(_T("Play"));
		m_bPlay = true;
	}

	TCHAR chTitle[10];
	m_buttonPausePlay.GetWindowText(LPTSTR(chTitle),10);
	hPlayTemp = NULL;
//	hPlayTemp=OpenMutex(NULL,FALSE,"Play");
	hPlayTemp=CreateMutex(NULL,FALSE,_T("play"));
	if(GetLastError()== ERROR_INVALID_HANDLE) hPlayTemp=NULL;

	if ( lstrcmp( chTitle,_T("Play") ) == 0 )
	{
		WaitForSingleObject( hPlayTemp,0);
		
	}
	else
		ReleaseMutex(hPlayTemp);

	if ( m_pWinThread == NULL)
		m_pWinThread = AfxBeginThread( (AFX_THREADPROC)PlayVideo , (void*)this);

}

void CYUVviewerDlg::OnCloseall() 
{
	int i;

	for(i=0; i<m_iCount; i++)
	{
		if(m_pFile[i])
			m_pFile[i]->Close();
		if(m_pWnd[i])
			m_pWnd[i]->DestroyWindow();
	}
	m_iCount = 0;

	g_nFrameNumber = 0;
	g_nOldFrameNumber = -1000; 
	g_Play = true;

	g_nStartFrame = 0;
	g_nEndFrame = 10000;
	g_nCurrentFrame = 0; 
	g_bReversePlay = FALSE;
}

void CYUVviewerDlg::OnCancel() 
{
	int i;

	for(i=0; i<m_iCount; i++)
	{
		if(m_pFile[i])
			m_pFile[i]->Close();
		if(m_pWnd[i])
			m_pWnd[i]->DestroyWindow();
	}
	
	CDialog::OnCancel();
}

int CYUVviewerDlg::OnOpenfile() 
{
	UpdateData(TRUE);

	UINT picsize = m_nWidth*m_nHeight;

	m_pFile[m_iCount] = new CFile();

	TCHAR BASED_CODE szFilter[] = _T("All Files (*.*)|*.*||");
	CFileDialog dlg( TRUE, LPCTSTR("yuv"), NULL, OFN_HIDEREADONLY,LPCTSTR(szFilter));
  	if(dlg.DoModal()!=IDOK) return 0; 
	//写入文件decoder.cfg
     CString str=dlg.GetFileName();
  CString strTitle=dlg.GetFileTitle();
  strTitle+=_T(".yuv");
// 转化到ansi
  LPSTR lpa=(char *)malloc(sizeof(char*)*20);
  lpa[0]='\0';
  WideCharToMultiByte(CP_ACP,0,str,-1,lpa,MAX_PATH,NULL,NULL);
//
  CFile myfile;
myfile.Open(_T("decoder.cfg"),CFile::modeCreate|CFile::modeReadWrite|CFile::typeText);
//char sz[] = "Hockey is best!";
//sz=W2A(LPCTSTR(str));
char szz[]="    one\n";
myfile.Write(lpa,strlen(lpa));

myfile.Write(szz,strlen(szz));
//char sz2[] = "Hockey is best2!";
char szz2[]="    two\n";
lpa[0]='\0';
  WideCharToMultiByte(CP_ACP,0,strTitle,-1,lpa,MAX_PATH,NULL,NULL);
//
myfile.Write(lpa,strlen(lpa));
myfile.Write(szz2,strlen(szz2));
char sz3[]="football_qcif.yuv       .......Ref sequence (for SNR)";
myfile.Write(sz3,strlen(sz3));
myfile.Close();delete lpa;
//再调用dll

HINSTANCE m_ins;
  m_ins=LoadLibrary(_T("wcedll.dll"));
  typedef void(*p)();
  p m_p;
  m_p=(p)GetProcAddress(m_ins,_T("decode_me"));
  m_p();
  FreeLibrary(m_ins);
  //再替换那个名字*.avs->*.yuv
   CString mytitle;
  CString mypath;
  mypath=dlg.GetPathName();
  mytitle=dlg.GetFileTitle();
  int pos=mypath.ReverseFind('\\');
  mypath=mypath.Left(pos+1);
 mypath+=mytitle;
 mypath+=".yuv";
 //
  swprintf(inSeqence[m_iCount], _T("%s"), mypath);//dlg.GetPathName() );
  getSeqName(inSeqence[m_iCount], inSeqName[m_iCount]);

	if(!m_pFile[m_iCount]->Open(LPCTSTR(inSeqence[m_iCount]), CFile::modeRead )) 
  {
		AfxMessageBox(_T("Can't open input file"));
		return 0;
	}
/*
char *oneframe;
CFile outf;
outf.Open("right.yuv", CFile::modeCreate | CFile::modeWrite);
//  if(m_nFrameSize == 0) // 0: CIF, 1:QCIF
  oneframe = (char*) malloc(picsize*3/2);

  m_pFile[m_iCount]->Seek( picsize*3/2, CFile::begin );
  while( picsize*3/2 == m_pFile[m_iCount]->Read(oneframe, picsize*3/2) )
  {
    outf.Write(oneframe, picsize*3/2);
  }

  outf.Close();
  m_pFile[m_iCount]->Close();
  free(oneframe);
return 0;
*/
//	CYUVviewerDlg* pWin = (CYUVviewerDlg*)pParam;

	m_pWnd[m_iCount]=new CChildWindow((CFrameWnd*)this, m_nWidth, m_nHeight,1);

	if(picsize != m_pFile[m_iCount]->Read(m_pWnd[m_iCount]->Y,picsize))
	{
		MessageBox(_T("Get to end of file"));
		return 0;
	}
	if(1)//bColorImage) 
	{
		if(picsize/4 != m_pFile[m_iCount]->Read(m_pWnd[m_iCount]->Cb,picsize/4))
		{
			MessageBox(_T("Get to end of file"));
			return 0;
		}
		if(picsize/4 != m_pFile[m_iCount]->Read(m_pWnd[m_iCount]->Cr,picsize/4))
		{
			MessageBox(_T("Get to end of file"));
			return 0;
		}
	}

	m_pWnd[m_iCount]->ShowWindow(SW_SHOW);

	if(m_nZoom == -1) m_pWnd[m_iCount]->CenterWindow(m_nWidth,m_nHeight);
	else if(m_nZoom == 0) m_pWnd[m_iCount]->CenterWindow(m_nWidth*2,m_nHeight*2);


	m_iCount++;
	
	// create a new thread

//	m_pWinThread[ m_iCountThread ] = AfxBeginThread( (AFX_THREADPROC)PlayVideo , (void*)this);

	
/*	if ( pWnd != NULL )
	{
		delete pWnd;
		pWnd = NULL;
	}
	m_pFile[m_iCountThread]->Close();
*/
	return 1;

}

void CYUVviewerDlg::OnNext() 
{
	int i;
	UINT picsize = m_nWidth*m_nHeight;

	UpdateData(TRUE);

	g_nStartFrame = m_nFrameFrom;
	if(m_nFrameTo != 0) g_nEndFrame = m_nFrameTo;
	else g_nEndFrame = 10000;

	for(i=0; i<m_iCount; i++)
	{
		m_pFile[i]->Seek(g_nCurrentFrame*picsize*3/2, SEEK_SET);
		m_pWnd[i]->nPicShowOrder = g_nCurrentFrame;
	}
	
	if(g_nCurrentFrame < g_nEndFrame) // && !bEof)
	{
		g_nFrameNumber = g_nCurrentFrame;//j;
 
		for(i=0; i<m_iCount; i++)
		{
			if(picsize != m_pFile[i]->Read(m_pWnd[i]->Y,picsize))
			{
				MessageBox(_T("Get to end of file"));
				return;
			}
			if(1)//bColorImage) 
			{
				if(picsize/4 != m_pFile[i]->Read(m_pWnd[i]->Cb,picsize/4))
				{
					MessageBox(_T("Get to end of file"));
					return;
				}
				if(picsize/4 != m_pFile[i]->Read(m_pWnd[i]->Cr,picsize/4))
				{
					MessageBox(_T("Get to end of file"));
					return;
				}
			}
			m_pWnd[i]->InvalidateRect (NULL,FALSE);
			m_pWnd[i]->UpdateWindow ();
			m_pWnd[i]->nPicShowOrder ++;
		}
		g_nCurrentFrame++;
		//Sleep(200); // sleep time in milliseconds
	}


/*	if ( m_bPlay && hPlayTemp != NULL)
	{
		g_nOldFrameNumber = g_nFrameNumber;
		ReleaseMutex(hPlayTemp);
		g_Play = true;
	}
	WaitForSingleObject( hPlayTemp,INFINITE );
*/
/*	if ( g_nFrameNumber == g_nOldFrameNumber+1)
	{
	//	g_Play = false;
		OpenMutex(MUTEX_ALL_ACCESS,FALSE,"Play");
	}
*/
/*	if ( !g_bPlay )
		OpenMutex(MUTEX_ALL_ACCESS,FALSE,"Play");
*/
}

void CYUVviewerDlg::OnNext5() 
{
	int i;
	UINT picsize = m_nWidth*m_nHeight;

	UpdateData(TRUE);

	g_nStartFrame = m_nFrameFrom;
	if(m_nFrameTo != 0) g_nEndFrame = m_nFrameTo;
	else g_nEndFrame = 10000;

	g_nCurrentFrame += 4;
	if(g_nCurrentFrame > g_nEndFrame) g_nCurrentFrame = g_nEndFrame;

	for(i=0; i<m_iCount; i++)
	{
		m_pFile[i]->Seek(g_nCurrentFrame*picsize*3/2, SEEK_SET);
		m_pWnd[i]->nPicShowOrder = g_nCurrentFrame;
	}
	
	if(g_nCurrentFrame < g_nEndFrame) // && !bEof)
	{
		g_nFrameNumber = g_nCurrentFrame;//j;
 
		for(i=0; i<m_iCount; i++)
		{
			if(picsize != m_pFile[i]->Read(m_pWnd[i]->Y,picsize))
			{
				MessageBox(_T("Get to end of file"));
				return;
			}
			if(1)//bColorImage) 
			{
				if(picsize/4 != m_pFile[i]->Read(m_pWnd[i]->Cb,picsize/4))
				{
					MessageBox(_T("Get to end of file"));
					return;
				}
				if(picsize/4 != m_pFile[i]->Read(m_pWnd[i]->Cr,picsize/4))
				{
					MessageBox(_T("Get to end of file"));
					return;
				}
			}
			m_pWnd[i]->InvalidateRect (NULL,FALSE);
			m_pWnd[i]->UpdateWindow ();
			m_pWnd[i]->nPicShowOrder ++;
		}
		g_nCurrentFrame++;
		//Sleep(200); // sleep time in milliseconds
	}

/*	if ( m_bPlay && hPlayTemp != NULL)
	{
		g_nOldFrameNumber = g_nFrameNumber;
		ReleaseMutex(hPlayTemp);
//		g_Play = true;
	}
	WaitForSingleObject( hPlayTemp,INFINITE );
	for ( int i=0;i<5;i++)
	{
	//	g_Play = false;
		ReleaseMutex(hPlayTemp);
		WaitForSingleObject( hPlayTemp,INFINITE );
		
	}
	if ( g_nFrameNumber == g_nOldFrameNumber+5 )
	{
		OpenMutex(MUTEX_ALL_ACCESS,FALSE,"Play");
	}
*/	
}

void CYUVviewerDlg::OnPrevious() 
{
	int i;
	int picsize = m_nWidth*m_nHeight;

	UpdateData(TRUE);

	g_nStartFrame = m_nFrameFrom;

⌨️ 快捷键说明

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