📄 yuvviewerdlg.cpp
字号:
// 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 + -