📄 playbackdlg.cpp
字号:
// PlaybackDlg.cpp : implementation file
//
#include "stdafx.h"
#include "AVSynchronizer.h"
#include "Playback.h"
#include "PlaybackDlg.h"
#include "Database.h"
#include "database_error.h"
#include "parsedatapacket.h"
#include <assert.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#ifdef _TRACE_LOG
#define LOG_FILE_NAME "c:\\playback.log"
#endif // _TRACE_LOG
#define WM_CLOSE_THREAD (WM_USER + 1001)
#define WM_CLOSE_THREAD2 (WM_USER + 1002)
#define HEADERSIZE 20
#define FOOTERSIZE 20
DWORD RetrieveDataProc(LPARAM lParam);
void FreeMem(BYTE* pbyMem);
void DynaAllocMem(BYTE** ppbyMem, DWORD size)
{
if (*ppbyMem)
{
FreeMem(*ppbyMem);
*ppbyMem = NULL;
}
*ppbyMem = (BYTE*) malloc(size);
}
void FreeMem(BYTE* pbyMem)
{
if (pbyMem)
free(pbyMem);
}
BOOL ResetVideo ( CPlaybackDlg * pPlaybackDlg, DWORD& dwMatchMedia )
{
AvSynchronizer_StopChannel (pPlaybackDlg->m_hPlaybackChannel);
AvSynchronizer_StartChannel (pPlaybackDlg->m_hPlaybackChannel, 0);
DWORD dwFoundTime;
SCODE sRet;
pPlaybackDlg->GetMatchMediaType ( pPlaybackDlg->m_dwStartTime, pPlaybackDlg->m_dwEndTime, &dwMatchMedia );
sRet = MediaDBRet_MatchTime(pPlaybackDlg->m_hRetrieval,
pPlaybackDlg->m_hLocation,
pPlaybackDlg->m_wCurrentTimeSegIndex,
pPlaybackDlg->m_dwStartTime,
dwMatchMedia, &dwFoundTime);
if ( sRet != S_OK )
{
MediaDBRet_MatchFirstI(pPlaybackDlg->m_hRetrieval, pPlaybackDlg->m_hLocation,
pPlaybackDlg->m_wCurrentTimeSegIndex, pPlaybackDlg->m_dwStartTime,
pPlaybackDlg->m_dwEndTime, dwMatchMedia, &dwFoundTime);
if (IS_FAIL (sRet))
{
return FALSE;
}
}
return TRUE;
}
DWORD RetrieveDataProcNew(LPARAM lParam)
{
SCODE sRet;
DWORD dwMediaType;
DWORD dwBufferSize,dwCurSize;
BYTE* pbyInBuf = NULL;
TMediaDataPacketInfo tPacketInfo;
TUPDATEPBCHANNELOPTION tUpdatePBChannelOptions;
CPlaybackDlg* pPlaybackDlg = (CPlaybackDlg *) lParam;
BOOL bCheckI = FALSE;
DWORD dwMatchMedia;
//CWnd * pWnd;
// pPlaybackDlg->m_bUpdateFoundTime = TRUE; // set this to let CheckDataInInterval to keep the foundtime
pPlaybackDlg->CheckDataInInterval ( pPlaybackDlg->m_dwStartTime,
pPlaybackDlg->m_dwEndTime, &dwMatchMedia);
dwCurSize = dwBufferSize = 12000;
DynaAllocMem(&pbyInBuf, dwBufferSize);
if (pbyInBuf == NULL)
{
// memory allocate error
// stop avsynchronizer channel
AvSynchronizer_StopChannel(pPlaybackDlg->m_hPlaybackChannel);
// release retrieval
MediaDBRet_Release(pPlaybackDlg->m_hRetrieval);
pPlaybackDlg->m_hRetrieval = NULL;
return 1;
}
DWORD dwTickSave = GetTickCount();
while(pPlaybackDlg->m_bPlaying && !pPlaybackDlg->m_bExit)
{
dwBufferSize = dwCurSize;
assert ( pPlaybackDlg->m_hRetrieval );
sRet = MediaDBRet_OutputOneDataPacket(pPlaybackDlg->m_hRetrieval, MEDIADB_ALLSEQUENTIAL, pbyInBuf, &dwBufferSize, &dwMediaType);
if(sRet == DATABASE_E_ENDOFSTREAM)
{
if (pPlaybackDlg->m_RepeatMode.GetCheck() != 0)
{
if ( !ResetVideo ( pPlaybackDlg, dwMatchMedia ))
{
break; // stop playing
}
continue;
}
// stop playing
break;
}
else if(sRet == DATABASE_E_BUFFERDEFICIT)
{
DynaAllocMem(&pbyInBuf, dwBufferSize);
dwCurSize = dwBufferSize;
if (pbyInBuf == NULL)
{
TRACE("mem error\n");
CString strMsg;
CString strTitle;
strMsg = "Out of memory";
strTitle = "Error";
MessageBox(pPlaybackDlg->m_hWnd, strMsg, strTitle, MB_OK);
break;
}
continue;
}
else if(IS_FAIL(sRet))
{
CString strMsg ("Get data from database failed");
CString strTitle ("Error");
MessageBox(pPlaybackDlg->m_hWnd, strMsg, strTitle, MB_OK);
break;
}
if (pPlaybackDlg->m_dwCurMediaType != dwMediaType)
{
tUpdatePBChannelOptions.dwFlags = UPCH_MEDIATYPE;
tUpdatePBChannelOptions.tMediaType = (TMediaType) dwMediaType;
AvSynchronizer_UpdatePlaybackChannelSettings(pPlaybackDlg->m_hPlaybackChannel, tUpdatePBChannelOptions);
pPlaybackDlg->m_dwCurMediaType = dwMediaType;
bCheckI = TRUE;
}
else if(sRet == DATABASE_S_CHANGEINTERVAL)
{
tUpdatePBChannelOptions.dwFlags = UPCH_TIMEITV_CHG;
AvSynchronizer_UpdatePlaybackChannelSettings(pPlaybackDlg->m_hPlaybackChannel, tUpdatePBChannelOptions);
bCheckI = TRUE;
}
// parse packet
memset(&tPacketInfo, 0, sizeof(tPacketInfo));
tPacketInfo.pbyBuff = pbyInBuf;
DataPacket_Parse(&tPacketInfo);
if (bCheckI)
{
if ((tPacketInfo.dwStreamType & (mctH263 | mctJPEG)) != 0)
{
bCheckI = FALSE;
}
}
if (tPacketInfo.dwFirstUnitSecond > pPlaybackDlg->m_dwEndTime)
{
if ( !ResetVideo ( pPlaybackDlg, dwMatchMedia ))
{
break; // stop playing
}
continue;
}
sRet = AvSynchronizer_InputPlaybackMediaFrame(pPlaybackDlg->m_hPlaybackChannel, &tPacketInfo);
if (pPlaybackDlg->m_dwCurMediaType & MEDIADB_AUDIO_TYPE)
{
if (tPacketInfo.dwStreamType >= mctG7221)
pPlaybackDlg->m_PlaySlider.PostMessage(TBM_SETPOS, (WPARAM) TRUE, (int) tPacketInfo.dwFirstUnitSecond);
}
else
{
pPlaybackDlg->m_PlaySlider.PostMessage(TBM_SETPOS, (WPARAM) TRUE, (int) tPacketInfo.dwFirstUnitSecond);
}
}
TRACE("Stop Channel\n");
if (pPlaybackDlg->m_bExit)
{
FreeMem(pbyInBuf);
return 0;
}
// wait the player to finish the playing
if (pPlaybackDlg->m_bPlaying)
{
tUpdatePBChannelOptions.dwFlags = UPCH_TIMEITV_CHG;
AvSynchronizer_UpdatePlaybackChannelSettings(pPlaybackDlg->m_hPlaybackChannel, tUpdatePBChannelOptions);
}
DWORD dwTickNow = GetTickCount();
AvSynchronizer_StopChannel(pPlaybackDlg->m_hPlaybackChannel);
MediaDBRet_Release(pPlaybackDlg->m_hRetrieval);
pPlaybackDlg->GetDlgItem(IDC_PAUSE)->EnableWindow(FALSE);
pPlaybackDlg->GetDlgItem(IDC_PAUSE)->SetWindowText("P&ause");
pPlaybackDlg->GetDlgItem(IDC_PLAY)->SetWindowText("&Play");
pPlaybackDlg->GetDlgItem(IDC_DISPLAY_FRAME)->Invalidate(TRUE);
pPlaybackDlg->GetDlgItem(IDC_OPENDATABASE)->EnableWindow(TRUE);
pPlaybackDlg->m_LocationList.EnableWindow(TRUE);
pPlaybackDlg->m_TimeSegmentList.EnableWindow(TRUE);
pPlaybackDlg->m_hRetrieval = NULL;
FreeMem(pbyInBuf);
pbyInBuf = NULL;
if (!pPlaybackDlg->m_bPlaying)
{
tUpdatePBChannelOptions.dwFlags = UPCH_SHOW_BMP;
AvSynchronizer_UpdatePlaybackChannelSettings(pPlaybackDlg->m_hPlaybackChannel,
tUpdatePBChannelOptions);
}
char szBuf[MAX_PATH];
sprintf(szBuf, "%d", dwTickNow - dwTickSave);
pPlaybackDlg->m_PlayTime.SetWindowText(szBuf);
BOOL bPlaying = pPlaybackDlg->m_bPlaying;
pPlaybackDlg->m_bPlaying = FALSE;
pPlaybackDlg->GetDlgItem(IDC_PLAY)->EnableWindow(TRUE);
if (!pPlaybackDlg->m_bExit && !bPlaying)
pPlaybackDlg->PostMessage(WM_CLOSE_THREAD);
pPlaybackDlg->m_bPlaying = FALSE;
return 0;
}
DWORD RetrieveDataProc(LPARAM lParam)
{
SCODE sRet;
DWORD dwMediaType;
DWORD dwBufferSize,dwCurSize;
BYTE* pbyInBuf = NULL;
TMediaDataPacketInfo tPacketInfo;
TUPDATEPBCHANNELOPTION tUpdatePBChannelOptions;
CPlaybackDlg* pPlaybackDlg = (CPlaybackDlg *) lParam;
BOOL bCheckI = FALSE;
pPlaybackDlg->m_dwAOnlyCBCount = 0;
dwCurSize = dwBufferSize = 12000;
DynaAllocMem(&pbyInBuf, dwBufferSize);
if (pbyInBuf == NULL)
{
// memory allocate error
// stop avsynchronizer channel
AvSynchronizer_StopChannel(pPlaybackDlg->m_hPlaybackChannel);
// release retrieval
MediaDBRet_Release(pPlaybackDlg->m_hRetrieval);
return 1;
}
DWORD dwTickSave = GetTickCount();
#ifdef _TRACE_LOG
DeleteFile(LOG_FILE_NAME);
FILE *pFile;
#endif // _TRACE_LOG
//FILE *pBinFile = fopen("c:\\frames.bin", "wb");
while(pPlaybackDlg->m_bPlaying && !pPlaybackDlg->m_bExit)
{
// get data from database
dwBufferSize = dwCurSize;
sRet = MediaDBRet_OutputOneDataPacket(pPlaybackDlg->m_hRetrieval, MEDIADB_ALLSEQUENTIAL, pbyInBuf, &dwBufferSize, &dwMediaType);
#ifdef _TRACE_LOG
pFile = fopen(LOG_FILE_NAME, "at");
if (pFile)
{
fprintf(pFile, "After MediaDBRet_OutputOneDataPacket\n");
fclose(pFile);
}
#endif // _TRACE_LOG
if(sRet == DATABASE_E_ENDOFSTREAM)
{
#ifdef _TRACE_LOG
pFile = fopen(LOG_FILE_NAME, "at");
if (pFile)
{
fprintf(pFile, "End of stream returned!\n");
fclose(pFile);
}
#endif // _TRACE_LOG
if (pPlaybackDlg->m_RepeatMode.GetCheck() != 0)
{
DWORD dwFoundTime;
MediaDBRet_MatchTime(pPlaybackDlg->m_hRetrieval,
pPlaybackDlg->m_hLocation,
pPlaybackDlg->m_wCurrentTimeSegIndex,
pPlaybackDlg->m_dwStartTime,
MEDIADB_VIDEO_TYPE | MEDIADB_AUDIO_TYPE, &dwFoundTime);
continue;
}
// stop playing
break;
}
else if(sRet == DATABASE_E_BUFFERDEFICIT)
{
DynaAllocMem(&pbyInBuf, dwBufferSize);
dwCurSize = dwBufferSize;
if (pbyInBuf == NULL)
{
#ifdef _TRACE_LOG
pFile = fopen(LOG_FILE_NAME, "at");
if (pFile)
{
fprintf(pFile, "Mem alloc failed for frame! size = %ld\n", dwBufferSize);
fclose(pFile);
}
#endif // _TRACE_LOG
TRACE("mem error\n");
break;
}
continue;
}
else if(IS_FAIL(sRet))
{
#ifdef _TRACE_LOG
FILE *pFile = fopen(LOG_FILE_NAME, "at");
if (pFile)
{
fprintf(pFile, "MediaDBRet_OutputOneDataPacket failed (%X)\n",
sRet);
fclose(pFile);
}
#endif // _TRACE_LOG
// MessageBox("MediaDBRet_OutputOneDataPacket Fail !");
break;
}
// TRACE("type = %d size = %d\n",dwMediaType, dwBufferSize);
// check media type
if (pPlaybackDlg->m_dwCurMediaType != dwMediaType)
{
#ifdef _TRACE_LOG
pFile = fopen(LOG_FILE_NAME, "at");
if (pFile)
{
fprintf(pFile, "Change of media\n");
fclose(pFile);
}
#endif // _TRACE_LOG
tUpdatePBChannelOptions.dwFlags = UPCH_MEDIATYPE;
tUpdatePBChannelOptions.tMediaType = (TMediaType) dwMediaType;
AvSynchronizer_UpdatePlaybackChannelSettings(pPlaybackDlg->m_hPlaybackChannel, tUpdatePBChannelOptions);
pPlaybackDlg->m_dwCurMediaType = dwMediaType;
bCheckI = TRUE;
}
else if(sRet == DATABASE_S_CHANGEINTERVAL)
{
// temp
#ifdef _TRACE_LOG
pFile = fopen(LOG_FILE_NAME, "at");
if (pFile)
{
fprintf(pFile, "Change of time interval\n");
fclose(pFile);
}
#endif // _TRACE_LOG
//MessageBox(pPlaybackDlg->m_hWnd, "Time interval change!", "Debug", MB_OK);
tUpdatePBChannelOptions.dwFlags = UPCH_TIMEITV_CHG;
AvSynchronizer_UpdatePlaybackChannelSettings(pPlaybackDlg->m_hPlaybackChannel, tUpdatePBChannelOptions);
#ifdef _TRACE_LOG
pFile = fopen(LOG_FILE_NAME, "at");
if (pFile)
{
fprintf(pFile, "After change channel setting (CHG TIME ITV)\n");
fclose(pFile);
}
#endif // _TRACE_LOG
bCheckI = TRUE;
}
// parse packet
memset(&tPacketInfo, 0, sizeof(tPacketInfo));
tPacketInfo.pbyBuff = pbyInBuf;
DataPacket_Parse(&tPacketInfo);
if (bCheckI)
{
if ((tPacketInfo.dwStreamType & (mctH263 | mctJPEG)) != 0)
{
if (tPacketInfo.tFrameType != MEDIADB_FRAME_INTRA)
{
//MessageBox(NULL, "First Video frame is not I", "Debug", MB_OK);
}
bCheckI = FALSE;
}
}
#ifdef _TRACE_LOG
pFile = fopen(LOG_FILE_NAME, "at");
if (pFile)
{
fprintf(pFile, "After Parsing packet\n");
fclose(pFile);
}
#endif // _TRACE_LOG
if (tPacketInfo.dwFirstUnitSecond > pPlaybackDlg->m_dwEndTime)
{
#ifdef _TRACE_LOG
pFile = fopen(LOG_FILE_NAME, "at");
if (pFile)
{
fprintf(pFile, "Packet is out of range: end time = %d, packet time = %d\n",
pPlaybackDlg->m_dwEndTime,
tPacketInfo.dwFirstUnitSecond);
fclose(pFile);
}
#endif // _TRACE_LOG
break;
}
// send to avsynchonizer
sRet = AvSynchronizer_InputPlaybackMediaFrame(pPlaybackDlg->m_hPlaybackChannel, &tPacketInfo);
#ifdef _TRACE_LOG
pFile = fopen(LOG_FILE_NAME, "at");
if (pFile)
{
fprintf(pFile, "After AvSynchronizer_InputPlaybackMediaFrame\n");
fclose(pFile);
}
#endif // _TRACE_LOG
// update slider
//pPlaybackDlg->m_PlaySlider.SetPos((int) tPacketInfo.dwFirstUnitSecond);
if (pPlaybackDlg->m_dwCurMediaType & MEDIADB_AUDIO_TYPE)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -