📄 playbackdlg.cpp
字号:
m_LocationList.ResetContent();
MediaDB_GetLocationNum(m_hDatabase, &dwLocNum);
if (dwLocNum > 0)
{
pszLocation = (char(*)[STR_MAX]) malloc(dwLocNum * STR_MAX);
MediaDB_GetLocationList(m_hDatabase, dwLocNum, pszLocation);
for (unsigned int i = 0; i<dwLocNum; i++)
m_LocationList.AddString(pszLocation[i]);
// Open first location as default
OpenMediaLocation(pszLocation[0]);
m_LocationList.SetCurSel(0);
free(pszLocation);
}
MessageBox("Delete Location Successfully!!");
}
}
void CPlaybackDlg::OnBnClickedRepairDatabase()
{
// TODO: Add your control notification handler code here
TMediaDBInitOption tDBInitOption;
DWORD dwDIMask;
SCODE scResult;
dwDIMask = 0x0F;
tDBInitOption.pszDatabasePath = m_szDBPath;
tDBInitOption.dwVersion = DATABASE_VERSION;
scResult = MediaDB_RepairDatabase(&tDBInitOption, dwDIMask);
if (scResult != S_OK)
MessageBox("Repair Database Failed!!\n");
else
MessageBox("Repair Database Successfully!!\n");
}
void CPlaybackDlg::OnBnClickedRepairLocation()
{
// TODO: Add your control notification handler code here
int nIndex;
char szLoc[MAX_PATH];
DWORD dwDIMask;
SCODE scResult;
DWORD dwLastTick, dwNowTick;
dwDIMask = 0x0F;
nIndex = m_LocationList.GetCurSel();
m_LocationList.GetLBText(nIndex, szLoc);
dwLastTick = GetTickCount();
if (m_hLocation)
MediaDB_CloseLocation(m_hLocation);
m_hLocation = NULL;
scResult = MediaDB_RepairLocation(m_hDatabase, szLoc, dwDIMask);
dwNowTick = GetTickCount();
if (scResult != S_OK)
{
sprintf(szLoc, "Repair Location Failed!! (%X)", scResult);
MessageBox(szLoc);
}
else
{
sprintf(szLoc, "Repair Location Successfully!! (%d)", dwNowTick - dwLastTick);
MessageBox(szLoc);
}
}
void CPlaybackDlg::OnBnClickedDelOldestSeq()
{
// TODO: Add your control notification handler code here
SCODE scResult;
scResult = MediaDB_DeleteOldestSequence(m_hLocation, m_wCurrentTimeSegIndex);
if (scResult != S_OK)
MessageBox("Delete Oldest Sequence Failed!!");
else
MessageBox("Delete Oldest Sequence Successfully!!");
int nIndex;
char szLoc[MAX_PATH];
nIndex = m_LocationList.GetCurSel();
if (nIndex != CB_ERR)
{
m_LocationList.GetLBText(nIndex, szLoc);
OpenMediaLocation(szLoc);
}
}
void CPlaybackDlg::OnBnClickedDeleteEvent()
{
// TODO: Add your control notification handler code here
TMediaDBTimeInterval tTimeInterval;
DWORD dwEventType = 0;
SCODE scResult;
GetTimeQueryInterval();
tTimeInterval.dwStartTime = m_dwStartTime;
tTimeInterval.dwEndTime = m_dwEndTime;
GetEventType(&dwEventType);
scResult = MediaDB_DeleteEvent(m_hLocation, m_wCurrentTimeSegIndex, &tTimeInterval, dwEventType);
if (scResult != S_OK)
MessageBox("Delete Events Failed!!");
else
MessageBox("Delete Events Successfully!!");
}
void CPlaybackDlg::OnBnClickedRestoreEvent()
{
// TODO: Add your control notification handler code here
TMediaDBTimeInterval tTimeInterval;
DWORD dwEventType = 0;
SCODE scResult;
GetTimeQueryInterval();
tTimeInterval.dwStartTime = m_dwStartTime;
tTimeInterval.dwEndTime = m_dwEndTime;
GetEventType(&dwEventType);
scResult = MediaDB_RestoreEvent(m_hLocation, m_wCurrentTimeSegIndex, &tTimeInterval, dwEventType);
if (scResult != S_OK)
MessageBox("Restore Events Failed!!");
else
MessageBox("Restore Events Successfully!!");
}
void CPlaybackDlg::GetEventType(DWORD *dwEventType)
{
int iEvent;
iEvent = m_EventList.GetCurSel();
switch (iEvent)
{
case 0:
*dwEventType = 127 + 65536; // All type
break;
case 1:
*dwEventType = 1; // motion alert window 0
break;
case 2:
*dwEventType = 2; // motion alert window 1
break;
case 3:
*dwEventType = 4; // motion alert window 2
break;
case 4:
*dwEventType = 65536; // DI 0 height
break;
}
}
void CPlaybackDlg::OnBnClickedButtonNextframe()
{
TUPDATEPBCHANNELOPTION tUpdatePBChannelOptions;
if (m_hPlaybackChannel)
{
tUpdatePBChannelOptions.dwFlags = PBCH_NEXTFRAME;
SCODE sRet = AvSynchronizer_UpdatePlaybackChannelSettings(m_hPlaybackChannel,
tUpdatePBChannelOptions);
if (sRet == AVSYNCHRONIZER_E_NOMORE_FRAME)
{
m_btnNextFrame.EnableWindow(FALSE);
}
}
}
void CPlaybackDlg::OnBnClickedButtonEnlarge()
{
CWnd *pWnd = GetDlgItem(IDC_DISPLAY_FRAME);
CRect rect;
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);
pWnd->MoveWindow(rect.left, rect.top, rect.Width() + 10, rect.Height() + 10);
}
void CPlaybackDlg::OnBnClickedButtonShrink()
{
CWnd *pWnd = GetDlgItem(IDC_DISPLAY_FRAME);
CRect rect;
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);
pWnd->MoveWindow(rect.left, rect.top, rect.Width() - 10, rect.Height() - 10);
}
void CPlaybackDlg::OnBnClickedCancel()
{
OnCancel();
}
SCODE __stdcall AviStatusCallback (DWORD dwStatus, DWORD dwContext, DWORD dwParam1, DWORD dwParam2)
{
CPlaybackDlg * pThis;
pThis = (CPlaybackDlg*) dwContext;
switch (dwStatus)
{
case AVI_WRITE_FRAME_TIME:
break;
}
return S_OK;
}
//void __stdcall AviCaptionCallback (HDC hDC, DWORD dwContext, TCAPINFO * ptCapInfo)
SCODE __stdcall AviCaptionCallback (DWORD dwContext, TDISPLAYINFO * ptCapInfo)
{
CPlaybackDlg *pDlg = (CPlaybackDlg *) dwContext;
HBRUSH hBrush;
HDC hDC = ptCapInfo->hDC;
hBrush = CreateSolidBrush ( RGB ( 0, 0, 0 ) );
CRect rect;
CRect rtCaption;
rect.left = 0;
rect.top = 0;
rect.right = ptCapInfo->dwWidth;
rect.bottom = ptCapInfo->dwHeight;
rtCaption = rect;
rtCaption.bottom = rtCaption.top + HEADERSIZE - 2;
::FillRect ( hDC, &rtCaption, hBrush );
rtCaption = rect;
rtCaption.top = rtCaption.bottom - FOOTERSIZE + 2;
::FillRect ( hDC, &rtCaption, hBrush );
DeleteObject ( hBrush );
hBrush = CreateSolidBrush ( RGB(0, 0, 0) );
rtCaption = rect;
rtCaption.top = rtCaption.top + HEADERSIZE - 1;
rtCaption.bottom = rtCaption.top + 1;
::FillRect ( hDC, &rtCaption, hBrush );
rtCaption = rect;
rtCaption.bottom = rtCaption.bottom - FOOTERSIZE + 1;
rtCaption.top = rtCaption.bottom - 1;
::FillRect ( hDC, &rtCaption, hBrush );
SetBkColor(hDC, RGB(0,0,0));
struct tm *ptimeSrv = gmtime((time_t *) &ptCapInfo->DrawTime);
//struct tm *ptimeSrv = (struct tm *) ptCapInfo->DrawTime;
char szTime[MAX_PATH];
sprintf(szTime, "%d/%02d/%02d %02d:%02d:%02d", ptimeSrv->tm_year + 1900,
ptimeSrv->tm_mon + 1, ptimeSrv->tm_mday, ptimeSrv->tm_hour,
ptimeSrv->tm_min, ptimeSrv->tm_sec);
//SetTextAlign (hDC, TA_RIGHT);
SetBkColor (hDC, RGB(0, 0, 0));
SetTextColor(hDC, RGB(255, 255, 255));
SIZE Size;
GetTextExtentPoint32(hDC, szTime, strlen(szTime), &Size);
TextOut(hDC, ptCapInfo->dwWidth - Size.cx - 2,
0, szTime, strlen(szTime));
DeleteObject ( hBrush );
return S_OK;
}
DWORD ExportAviThread ( LPVOID lParam )
{
SCODE sRet;
CPlaybackDlg * pThis;
DWORD dwFoundTime;
DWORD dwMatchMedia;
DWORD dwMediaType = -1;
DWORD dwCurSize;
DWORD dwBufferSize;
BYTE* pbyInBuf = NULL;
TMediaDataPacketInfo tPacketInfo;
CString szTmpFile;
BOOL bIsAviIntervalEnd = FALSE;
BOOL bInterrupted = FALSE;
//-------------------------------------------------------------------------------------------
HANDLE hQuery;
DWORD dwTINum;
TMediaDBTimeInterval tTI;
TMediaDBIntervalInfo tTIInfo;
pThis = (CPlaybackDlg * ) lParam;
DWORD dwStartTime;
DWORD dwEndTime;
CoInitialize (NULL); // Avi convertor need to use COM object
dwStartTime = pThis->m_dwStartTime;
dwEndTime = pThis->m_dwEndTime;
tTI.dwStartTime = dwStartTime;
tTI.dwEndTime = dwEndTime;
sRet = MediaDB_CreateTimeQuery(pThis->m_hLocation, pThis->m_wCurrentTimeSegIndex, &tTI, &hQuery);
if (sRet != S_OK)
{
CoUninitialize ();
pThis->PostMessage(WM_CLOSE_THREAD2);
return sRet;
}
sRet = MediaDB_GetTimeIntervalNum(hQuery, &dwTINum);
if (sRet != S_OK)
{
CoUninitialize ();
pThis->PostMessage(WM_CLOSE_THREAD2);
return sRet;
}
sRet = MediaDB_FindFirstTimeInterval(hQuery, &tTIInfo);
if(sRet == DATABASE_E_ENDOFQUERY || sRet == DATABASE_E_INVALIDTIMEINTERVAL || IS_FAIL(sRet))
{
MediaDB_DeleteQuery(hQuery);
CoUninitialize ();
pThis->PostMessage(WM_CLOSE_THREAD2);
return sRet;
}
//-------------------------------------------------------------------------------------------
HANDLE hRetrieval = NULL;
if ( !hRetrieval )
{
sRet = MediaDBRet_Initial(&hRetrieval );
if (IS_FAIL(sRet))
{
char szBuf[MAX_PATH];
sprintf(szBuf, "Error when MediaDBRet_Initial (%X)", sRet);
MessageBox(NULL, szBuf, "Error", MB_OK);
pThis->PostMessage(WM_CLOSE_THREAD2);
return 1;
}
}
HANDLE hDecodeChannel = NULL;
int nIndex = 0;
do
{
if (pThis->m_bExit || pThis->m_bAbortExport)
break;
TAVICHOPTION tAviChOption;
tAviChOption.pfStatus = AviStatusCallback;
tAviChOption.pfCaption = AviCaptionCallback;
tAviChOption.dwStatusContext = (DWORD) pThis;
tAviChOption.dwCaptionContext = (DWORD) pThis;
AvSynchronizer_CreateAVIChannel ( pThis->m_hAvSync, &hDecodeChannel, &tAviChOption );
TAVICHOPTION2 tAviChOption2;
ZeroMemory (&tAviChOption2, sizeof(TAVICHOPTION2));
switch ( tTIInfo.dwMediaType )
{
case MEDIADB_VIDEO_TYPE :
dwMatchMedia = MEDIADB_VIDEO_TYPE;
tAviChOption2.bVideoEnable = TRUE;
break;
case MEDIADB_AUDIO_TYPE :
dwMatchMedia = MEDIADB_AUDIO_TYPE;
tAviChOption2.bAudioEnable = TRUE;
break;
case MEDIADB_VIDEO_TYPE | MEDIADB_AUDIO_TYPE:
dwMatchMedia = MEDIADB_VIDEO_TYPE;
tAviChOption2.bAudioEnable = tAviChOption2.bVideoEnable = TRUE;
break;
}
dwStartTime = (pThis->m_dwStartTime > tTIInfo.tTimeInterval.dwStartTime) ? pThis->m_dwStartTime : tTIInfo.tTimeInterval.dwStartTime;
dwEndTime = (pThis->m_dwEndTime < tTIInfo.tTimeInterval.dwEndTime ) ? pThis->m_dwEndTime : tTIInfo.tTimeInterval.dwEndTime;
sRet = MediaDBRet_MatchTime(hRetrieval, pThis->m_hLocation,
pThis->m_wCurrentTimeSegIndex, dwStartTime, dwMatchMedia, &dwFoundTime);
if ( sRet != S_OK )
{
sRet = MediaDBRet_MatchFirstI(hRetrieval, pThis->m_hLocation,
pThis->m_wCurrentTimeSegIndex, dwStartTime,
dwEndTime, dwMatchMedia, &dwFoundTime);
if (IS_FAIL (sRet))
{
char szBuf[MAX_PATH];
sprintf(szBuf, "Error when MediaDBRet_MatchFirstI (%X)", sRet);
MessageBox(NULL, szBuf, "Error", MB_OK);
break;
}
}
CString strFileName;
DWORD dwCurrAviMediaType = 0;
strFileName.Format("C:\\VNDPexp%d.avi", nIndex) ;
nIndex++;
strcpy ( tAviChOption2.szFileName, strFileName );
dwCurrAviMediaType = tTIInfo.dwMediaType;
tAviChOption2.tAviVInfo.dwWidth = 352;
tAviChOption2.tAviVInfo.dwHeight = 240;
tAviChOption2.tAviVInfo.dwBitCount = 24;
tAviChOption2.dwFrameRate = 15;
tAviChOption2.tBorder.dwHeader = 20;
tAviChOption2.tBorder.dwFooter = 20;
tAviChOption2.tBorder.dwLeft = 0;
tAviChOption2.dwFlag = FIXED_AINFO_AT_FIRST_FRAME;
if (tTIInfo.eAudioStreamType == mctG7221)
{
tAviChOption2.tAviAInfo.dwChannels = CONST_AO_CHANNEL;
tAviChOption2.tAviAInfo.dwSamplesPerSec = CONST_G7221_SAMPLE_RATE;
tAviChOption2.tAviAInfo.dwBitsPerSample = CONST_BITS_PER_SAMPLE;
}
else if (tTIInfo.eAudioStreamType == mctG729A)
{
tAviChOption2.tAviAInfo.dwChannels = CONST_AO_CHANNEL;
tAviChOption2.tAviAInfo.dwSamplesPerSec = CONST_G729A_SAMPLE_RATE;
tAviChOption2.tAviAInfo.dwBitsPerSample = CONST_BITS_PER_SAMPLE;
}
dwCurrAviMediaType = dwMediaType;
AvSynchronizer_StartAVIChannel ( hDecodeChannel, &tAviChOption2 );
bIsAviIntervalEnd = FALSE; // set this value false to not close avi file at the first time
dwCurSize = dwBufferSize = 12000;
DynaAllocMem(&pbyInBuf, dwBufferSize);
if (pbyInBuf == NULL)
{
break;
}
while ( 1 )
{
if (pThis->m_bExit || pThis->m_bAbortExport)
break;
dwBufferSize = dwCurSize;
sRet = MediaDBRet_OutputOneDataPacket(hRetrieval, MEDIADB_ALLSEQUE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -