www.pudn.com > EM84XX 测试程序 .rar > 847XXAPI.cpp


// 847XXAPI.cpp: implementation of the C847XXAPI class. 
// 
////////////////////////////////////////////////////////////////////// 
#include "stdafx.h" 
#include "847XXAPI.h" 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
DWORD WINAPI CallBack(PVOID pParam); 
 
C847XXAPI::C847XXAPI(HINSTANCE hInstance, HWND hwnd, DWORD dwKeyColor) 
{ 
	m_hInstance = hInstance; 
	m_hwnd = hwnd; 
	m_dwKeyColor = dwKeyColor; 
	m_FileName[0] = '\0'; 
 
	m_VideoChoice = SET_VGA;	// SET_TV, SET_VGA 
	m_pMemManager = 0; 
	m_pSplitter = 0; 
	m_pHardware = 0; 
	 
	m_dwPlayThreadId = 0; 
	m_bPlay = FALSE; 
} 
 
C847XXAPI::~C847XXAPI() 
{ 
 
} 
 
//初始化 
BOOL C847XXAPI::Initialize() 
{ 
	GUID gAudioSubtype = GUID_NULL; 
 
	if (strcmp(m_FileName, "") == 0) 
		GetFileName(); 
 
	if (strcmp(m_FileName, "") == 0) 
		return FALSE; 
 
	CoCreateInstance(CLSID_RM_MPEG2_VIDEO_SUBPICTURE,  
					 NULL,  
					 CLSCTX_INPROC_SERVER,  
					 IID_IRmHardware,  
					 (void **) &m_pHardware); 
 
	if (m_pHardware != NULL) 
	{ 
		m_pMemManager = new MemManager(15, 1000, BUFFERSIZE); 
		m_pSplitter = new Splitter(m_pMemManager); 
 
		m_AudioSubtype.bIsAc3 = m_AudioSubtype.bIsDts = m_AudioSubtype.bIsMpeg1 = m_AudioSubtype.bIsPcm = FALSE; 
		 
		gAudioSubtype = IdentifyAudioSubtype(m_FileName, &m_AudioSubtype); 
		m_mAudioType.SetType(&MEDIATYPE_Audio); 
		m_mAudioType.SetSubtype(&gAudioSubtype); 
 
		m_pHardware->SetTvOutput(m_VideoChoice); 
		m_pHardware->SetDefaultSyncSource(TRUE); 
		 
		// Settings for VGA display 
		if (m_VideoChoice == SET_VGA) 
		{ 
			m_pHardware->SetVideoBrightness(500);	// Optional 
			m_pHardware->SetVideoSaturation(550);	// Optional 
			m_pHardware->SetVideoContrast(550);		// Optional 
			m_pHardware->SetKeyColor(m_dwKeyColor); 
			m_pHardware->ShowMpegWindow(); 
		} 
		return TRUE; 
	} 
	else 
	{ 
		MessageBox (m_hwnd, "Unable to initialize the hardware.", NULL, MB_OK); 
		return FALSE; 
	} 
} 
 
//反初始化 
void C847XXAPI::Uninitialize() 
{ 
	if (m_pSplitter) m_pSplitter->StopDemux(); 
 
	if (m_pHardware != NULL) 
	{ 
		// Sending an empty MediaSample.  
		// This will signal the IRmHardware that it's the end of file. 
		m_pHardware->Receive(MEDIASTREAM_VIDEO, EOS_PACKET); 
		m_pHardware->Receive(MEDIASTREAM_AUDIO, EOS_PACKET); 
 
		// Wait until decoder finishes all samples 
		while(m_pHardware->GetState(1000) != RM_STATE_STOPPED); 
 
		// Stop and uninitialize the decoder 
		m_pHardware->Stop(); 
		m_pHardware->HideMpegWindow(); 
		m_pHardware->Release(); 
		m_pHardware = NULL; 
	} 
 
	if (m_pSplitter != NULL)	delete m_pSplitter; 
	if (m_pMemManager != NULL)	delete m_pMemManager; 
 
	m_pSplitter = NULL; 
	m_pMemManager = NULL; 
} 
 
//播放文件 
BOOL C847XXAPI::Play(char *file) 
{ 
	if (file = NULL) return FALSE; 	 
	 
	strcpy(m_FileName, file); 
 
	if (m_pHardware == NULL) 
	{ 
		if (!Initialize())	return FALSE; 
	} 
	 
	m_hPlayEvent = CreateEvent(NULL, TRUE, TRUE, NULL); 
	m_hPlayThread = CreateThread(NULL, 0,  
								(LPTHREAD_START_ROUTINE)::CallBack,  
								this,0,  
								&m_dwPlayThreadId); 
	return TRUE; 
} 
 
//停止播放 
void C847XXAPI::Stop() 
{ 
	m_bPlay = FALSE; 
	WaitForSingleObject(m_hPlayEvent, 2000); 
	Uninitialize(); 
	OSCloseHandle(m_hPlayEvent); 
} 
 
//启动播放 
void C847XXAPI::Start() 
{ 
	FILE *m_PlayFile; 
	LONG m_ulReadSize; 
	CBuffer *m_pCBuffer = 0; 
	int iRetMsg = 0; 
 
	if ((m_PlayFile = fopen(m_FileName, "rb")) == NULL) 
	{ 
		MessageBox(m_hwnd, "Unable to open file", NULL, MB_OK); 
		Uninitialize(); 
		return; 
	} 
 
	// Check empty file 
	int iFileHandle = _open(m_FileName, _O_RDONLY); 
	long fl = _filelength(iFileHandle); 
	_close(iFileHandle); 
	if (fl == 0) 
	{ 
		MessageBox (m_hwnd, "File is empty", NULL, MB_OK); 
		Uninitialize(); 
		return; 
	} 
 
	if (m_pHardware == NULL)	Initialize(); 
 
	m_pHardware->Pause(MEDIASTREAM_AUDIO | MEDIASTREAM_VIDEO,  
		               NULL,  
					   NULL,  
					   &m_mAudioType); 
 
	m_pHardware->Run(0); 
	m_bPlay = TRUE; 
	ResetEvent(m_hPlayEvent); 
 
	while (m_bPlay)  
	{ 
		m_pCBuffer = m_pMemManager->GetBuffer(); 
		m_ulReadSize = fread(m_pCBuffer->GetBuffer(),  
							 1,  
							 m_pCBuffer->GetSize(),  
							 m_PlayFile); 
 
		m_pCBuffer->SetActualSize(m_ulReadSize); 
 
		if (m_ulReadSize > 0) 
		{ 
			if (m_pSplitter->Receiver(m_pCBuffer) == STOP_DEMUX) 
				break; 
		} 
 
		if (m_ulReadSize < BUFFERSIZE)	// EOF 
		{ 
			m_pSplitter->WaitForFilledBufferEmpty(); 
			m_pHardware->Receive(MEDIASTREAM_VIDEO, EOS_PACKET); 
			m_pHardware->Receive(MEDIASTREAM_AUDIO, EOS_PACKET); 
			 
			// Reset the file pointer and replay it 
			rewind(m_PlayFile);	 
			 
			// Wait until decoder finishes all samples 
			while(m_pHardware->GetState(1000) != RM_STATE_STOPPED); 
		 
			// Stop and restart 
			m_pHardware->Stop(); 
			m_pHardware->Pause(MEDIASTREAM_AUDIO | MEDIASTREAM_VIDEO,  
								NULL, NULL, &m_mAudioType); 
			m_pHardware->Run(0); 
		} 
	} 
 
	SetEvent(m_hPlayEvent); 
	fclose(m_PlayFile); 
} 
 
DWORD WINAPI CallBack(PVOID pParam) 
{ 
	//847XXAPI *p847XXAPI = (847XXAPI *)pParam; 
	//p847XXAPI->Start(); 
	return 0; 
} 
 
 
/////////////////////////////////////////////////////////////////// 
#define	FILE_EXTENSION_FILTER		"MPEG video (*.*)\0*.*;\0" 
 
char* C847XXAPI::GetFileName() 
{ 
	OPENFILENAME fileName; 
	HGLOBAL	hFile, hFileTitle;			// Capture filename handles 
	TCHAR 	*lpFile; 
	TCHAR 	*lpFileTitle; 
 
	hFile = GlobalAlloc(GHND, 256);		// Allocate global memory 
	if (!hFile)							// if unsuccessful, print error message 
	{ 
		MessageBox (m_hwnd, "Unable to get file name", NULL, MB_OK); 
		return 0; 
	} 
 
	hFileTitle = GlobalAlloc(GHND, 256); 
	if (!hFileTitle) 
	{ 
		GlobalFree(hFile); 
		MessageBox (m_hwnd, "Unable to get file name", NULL, MB_OK); 
		return 0; 
	} 
 
	lpFile = (TCHAR *)GlobalLock(hFile);	// Lock allocated memory 
	lpFileTitle = (TCHAR *)GlobalLock(hFileTitle); 
 
	memset(&fileName, 0, sizeof(fileName)); 
	fileName.lStructSize = sizeof(fileName); 
	fileName.Flags = OFN_HIDEREADONLY; 
	fileName.hInstance = m_hInstance; 
	fileName.hwndOwner = m_hwnd; 
	fileName.lpstrFile = lpFile; 
	fileName.nMaxFile = 256; 
	fileName.lpstrFileTitle = lpFileTitle; 
	fileName.nMaxFileTitle = 256; 
	fileName.lpstrFilter = FILE_EXTENSION_FILTER; 
 
	char cPath[_MAX_PATH] = ""; 
	char cDrive[_MAX_DRIVE] = ""; 
	char cDir[_MAX_DIR] = ""; 
	char cFName[_MAX_FNAME] = ""; 
 
	// Initialize the common Open File dialog. 
	if (GetOpenFileName (&fileName)) 
	{ 
		m_FileName[0] = NULL; 
		strcpy (m_FileName, fileName.lpstrFile); 
	} 
 
	GlobalUnlock(hFile); 
	GlobalUnlock(hFileTitle); 
	GlobalFree(hFile); 
	GlobalFree(hFileTitle); 
	return m_FileName; 
} 
 
/////////////////////////////////////////////////////////////////////