📄 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;
}
/////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -