📄 playbackdlg.cpp
字号:
{
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);
}
#ifdef _TRACE_LOG
pFile = fopen(LOG_FILE_NAME, "at");
if (pFile)
{
fprintf(pFile, "After SetPos\n");
fclose(pFile);
}
#endif // _TRACE_LOG
}
//if (pBinFile)
// fclose(pBinFile);
if (pPlaybackDlg->m_bExit)
{
FreeMem(pbyInBuf);
return 0;
}
TRACE("Stop Channel\n");
// 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();
// stop avsynchronizer channel
AvSynchronizer_StopChannel(pPlaybackDlg->m_hPlaybackChannel);
// release retrieval
MediaDBRet_Release(pPlaybackDlg->m_hRetrieval);
//pPlaybackDlg->GetDlgItem(IDC_PLAY)->EnableWindow(TRUE);
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);
FreeMem(pbyInBuf);
pbyInBuf = NULL;
// CloseHandle(pPlaybackDlg->m_hRetrieveThread);
// pPlaybackDlg->m_hRetrieveThread = NULL;
char szBuf[MAX_PATH];
sprintf(szBuf, "%d", dwTickNow - dwTickSave);
pPlaybackDlg->m_PlayTime.SetWindowText(szBuf);
if (!pPlaybackDlg->m_bPlaying)
{
tUpdatePBChannelOptions.dwFlags = UPCH_SHOW_BMP;
AvSynchronizer_UpdatePlaybackChannelSettings(pPlaybackDlg->m_hPlaybackChannel,
tUpdatePBChannelOptions);
}
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);
return 0;
}
SCODE __stdcall StaticAVStatus(DWORD dwContext, DWORD dwStatusCode, DWORD dwParam1, DWORD dwParam2)
{
if (dwStatusCode == AVSYNCHRONIZER_STATUSCODE_FRAME_SIZE_CHG)
{
char szBuf[MAX_PATH];
sprintf(szBuf, "Frame Size Changed: W = %d, H = %d", dwParam1, dwParam2);
// MessageBox(NULL, szBuf, "Info", MB_OK);
}
return S_OK;
}
//SCODE __stdcall StaticDisplayCaption(DWORD dwContext, HDC hDC, DWORD DrawTime)
SCODE __stdcall StaticDisplayCaption(DWORD dwContext, TDISPLAYINFO *pDisplayInfo)
{
struct tm *ptimeSrv;
CPlaybackDlg *pDlg = (CPlaybackDlg *) dwContext;
ptimeSrv = (struct tm *) pDisplayInfo->DrawTime;
HDC hDC = pDisplayInfo->hDC;
CRect rect;
HWND hWnd = ::GetDlgItem(pDlg->m_hWnd, IDC_DISPLAY_FRAME);
if (!hWnd)
return 0;
if ((pDisplayInfo->dwFlag & DIF_SHOW_AUDIOONLY) != 0)
{
SIZE Size;
char szMsg[MAX_PATH];
SetBkColor(hDC, RGB(0,0,0));
strcpy(szMsg, "Audio Only");
HBRUSH hBrush;
hBrush = CreateSolidBrush ( RGB ( 0, 0, 0 ) );
int nR = pDisplayInfo->dwWidth;
int nL = pDisplayInfo->ptOrigin.x;
int nT = pDisplayInfo->ptOrigin.y + 18;
int nB = pDisplayInfo->dwHeight - 18;
CRect rectFill(nL, nT, nR, nB);
::FillRect ( hDC, &rectFill, hBrush );
if (pDlg->m_dwAOnlyCBCount == 0)
{
pDlg->m_dwAOnlyX = nL;
pDlg->m_dwAOnlyY = nT;
}
else
{
//if (pCaller->m_bAudioDisabled || pCaller->m_nLastSecond != p->tm_sec)
if (pDlg->m_nLastSecond != ptimeSrv->tm_sec)
{
BOOL bYMove = FALSE;
GetTextExtentPoint32(hDC, szMsg, strlen(szMsg), &Size);
int nX = pDlg->m_dwAOnlyX;
int nY = pDlg->m_dwAOnlyY;
if (nX + pDlg->m_nXAdd + Size.cx > nR)
{
int nDiff = nX + pDlg->m_nXAdd + Size.cx - nR;
nX = nR - nDiff - Size.cx;
pDlg->m_nXAdd = -pDlg->m_nXAdd;
bYMove = TRUE;
}
else if (nX + pDlg->m_nXAdd < nL)
{
int nDiff = nL - (nX + pDlg->m_nXAdd);
nX = nL + nDiff;
pDlg->m_nXAdd = -pDlg->m_nXAdd;
bYMove = TRUE;
}
else
nX += pDlg->m_nXAdd;
if (bYMove)
{
if (nY + pDlg->m_nYAdd + Size.cy > nB)
{
int nDiff = nY + pDlg->m_nYAdd + Size.cy - nB;
pDlg->m_nYAdd = -pDlg->m_nYAdd;
nY = nB - nDiff - Size.cy;
}
else if (nY + pDlg->m_nYAdd < nT)
{
int nDiff = nT - (nY + pDlg->m_nYAdd);
pDlg->m_nYAdd = -pDlg->m_nYAdd;
nY = nT + nDiff;
}
else
nY += pDlg->m_nYAdd;
}
pDlg->m_dwAOnlyX = nX;
pDlg->m_dwAOnlyY = nY;
}
}
pDlg->m_dwAOnlyCBCount = 1;
pDlg->m_nLastSecond = ptimeSrv->tm_sec;
SetTextColor(hDC,RGB(0,255,0));
TextOut(hDC, pDlg->m_dwAOnlyX, pDlg->m_dwAOnlyY, szMsg, strlen(szMsg));
DeleteObject ( hBrush );
}
::GetWindowRect(hWnd, &rect);
SetTextColor(hDC, RGB(0xff,0xff,0xff));
SetBkColor(hDC, RGB(0,0,0));
char szTemp[MAX_PATH];
sprintf(szTemp, "%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);
// Use TextOut rather than DrawText could increase some performance
//::DrawText((HDC) hDC, szTemp, strlen(szTemp), rect, 0);
::SetTextAlign(hDC, TA_LEFT);
// now the coordinate is always start from x, y in the info
//::TextOut((HDC) hDC, rect.left, rect.top, szTemp, strlen(szTemp));
::TextOut((HDC) hDC, pDisplayInfo->ptOrigin.x,
pDisplayInfo->ptOrigin.y, szTemp, strlen(szTemp));
return 0;
}
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
// Implementation
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CPlaybackDlg dialog
CPlaybackDlg::CPlaybackDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPlaybackDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_hDatabase = NULL;
m_hLocation = NULL;
m_bPlaying = FALSE;
m_hAvSync = NULL;
m_hPlaybackChannel = NULL;
m_hRetrieveThread = NULL;
m_bPause = FALSE;
m_bExit = FALSE;
m_hBMP = NULL;
m_hAviThread = NULL;
m_dwStartTime = 0;
m_dwEndTime = 0;
m_hRetrievalCheck = NULL;
m_hRetrieval = NULL;
m_bAviExporting = FALSE;
m_bAbortExport = FALSE;
}
CPlaybackDlg::~CPlaybackDlg(void)
{
}
void CPlaybackDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_START_DATE, m_StartDate);
DDX_Control(pDX, IDC_START_TIME, m_StartTime);
DDX_Control(pDX, IDC_END_DATE, m_EndDate);
DDX_Control(pDX, IDC_END_TIME, m_EndTime);
DDX_Control(pDX, IDC_TIMESEGMENT, m_TimeSegmentList);
DDX_Control(pDX, IDC_LOCATION, m_LocationList);
DDX_Control(pDX, IDC_PLAY_CURSOR, m_PlaySlider);
DDX_Control(pDX, IDC_SEARCH_RESULT, m_SearchResult);
DDX_Control(pDX, IDC_EVENTTYPE, m_EventList);
DDX_Control(pDX, IDC_COMBO_SPEED, m_PlaybackSpeed);
DDX_Control(pDX, IDC_STATIC_PLAYTIME, m_PlayTime);
DDX_Control(pDX, IDC_CHECK1, m_RepeatMode);
DDX_Control(pDX, IDC_BUTTON1, CButton_DeleteTI);
DDX_Control(pDX, IDC_SEARCH_TI, m_btnSearchTimeI);
DDX_Control(pDX, IDC_SEARCH_EVENT, m_btnSearchEvent);
DDX_Control(pDX, IDC_CHECK2, m_PlayInterval);
DDX_Control(pDX, IDC_BOOKMARK_DATE, m_BmkDate);
DDX_Control(pDX, IDC_BOOKMARK_TIME, m_BmkTime);
DDX_Control(pDX, IDC_BOOKMARK_STRING, m_BmkString);
DDX_Control(pDX, IDC_BOOKMARK_OLDSTRING, m_BmkOldString);
DDX_Control(pDX, IDC_PLAYBOOKMARK, m_PlayBookmark);
DDX_Control(pDX, IDC_BUTTON_NEXTFRAME, m_btnNextFrame);
}
BEGIN_MESSAGE_MAP(CPlaybackDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_OPENDATABASE, OnBnClickedOpendatabase)
ON_CBN_SELCHANGE(IDC_LOCATION, OnCbnSelchangeLocation)
ON_BN_CLICKED(IDC_SEARCH_TI, OnBnClickedSearchTi)
ON_BN_CLICKED(IDC_SEARCH_EVENT, OnBnClickedSearchEvent)
ON_BN_CLICKED(IDC_PLAY, OnBnClickedPlay)
ON_BN_CLICKED(IDC_PAUSE, OnBnClickedPause)
ON_CBN_SELCHANGE(IDC_TIMESEGMENT, OnCbnSelchangeTimesegment)
ON_WM_DESTROY()
ON_CBN_SELCHANGE(IDC_COMBO_SPEED, OnCbnSelchangeComboSpeed)
ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
ON_BN_CLICKED(IDC_ADD_BOOKMARK, OnBnClickedAddBookmark)
ON_BN_CLICKED(IDC_EDIT_BOOKMARK, OnBnClickedEditBookmark)
ON_BN_CLICKED(IDC_DELETE_BOOKMARK, OnBnClickedDeleteBookmark)
ON_BN_CLICKED(IDC_SEARCH_BOOKMARKS, OnBnClickedSearchBookmarks)
ON_BN_CLICKED(IDC_INPUTMEDIAFILE, OnBnClickedInputmediafile)
ON_BN_CLICKED(IDC_DELETE_LOCATION, OnBnClickedDeleteLocation)
ON_BN_CLICKED(IDC_REPAIR_DATABASE, OnBnClickedRepairDatabase)
ON_BN_CLICKED(IDC_REPAIR_LOCATION, OnBnClickedRepairLocation)
ON_BN_CLICKED(IDC_DEL_OLDEST_SEQ, OnBnClickedDelOldestSeq)
ON_BN_CLICKED(IDC_DELETE_EVENT, OnBnClickedDeleteEvent)
ON_BN_CLICKED(IDC_RESTORE_EVENT, OnBnClickedRestoreEvent)
ON_BN_CLICKED(IDC_BUTTON_NEXTFRAME, OnBnClickedButtonNextframe)
ON_BN_CLICKED(IDC_BUTTON_ENLARGE, OnBnClickedButtonEnlarge)
ON_BN_CLICKED(IDC_BUTTON_SHRINK, OnBnClickedButtonShrink)
ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
ON_MESSAGE(WM_CLOSE_THREAD, OnCloseThread)
ON_MESSAGE(WM_CLOSE_THREAD2, OnCloseThread2)
ON_BN_CLICKED(IDC_BUTTON4, OnBnClickedButton4)
ON_BN_CLICKED(IDC_BUTTON6, OnBnClickedButton6)
ON_BN_CLICKED(IDC_BUTTON7, OnBnClickedButton7)
END_MESSAGE_MAP()
// CPlaybackDlg message handlers
char *apszSpeed[] =
{
"16X", "15X", "14X", "13X",
"12X", "11X", "10X", "9X",
"8X", "7X", "6X", "5X",
"4X", "3X", "2X", "Normal",
"1/2", "1/3", "1/4", "1/5",
"1/6", "1/7", "1/8", "1/9",
"1/10", "1/11", "1/12", "1/13",
"1/14", "1/15", "1/16", "Free Go",
};
int annSpeedItem[][2] =
{
{16, 1}, {15, 1}, {14, 1}, {13, 1},
{12, 1}, {11, 1}, {10, 1}, {9, 1},
{8, 1}, {7, 1}, {6, 1}, {5, 1},
{4, 1}, {3, 1}, {2, 1}, {1, 1},
{1, 2}, {1, 3}, {1, 4}, {1, 5},
{1, 6}, {1, 7}, {1, 8}, {1, 9},
{1, 10}, {1, 11}, {1, 12}, {1, 13},
{1, 14}, {1, 15}, {1, 16}, {1, 0},
};
BOOL CPlaybackDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
m_hBMP = ::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE((WORD)IDB_MARK));
// fix the bug for display window appears in wrong position
CRect rect, rectSlider, rectGroup;
GetDlgItem(IDC_PLAY_CURSOR)->GetWindowRect(&rectSlider);
GetDlgItem(IDC_STATIC_GROUP)->GetWindowRect(&rectGroup);
ScreenToClient(&rectSlider);
ScreenToClient(&rectGroup);
int nX = rectGroup.left + (rectGroup.Width() - 352) / 2;
int nY = rectGroup.top + (rectSlider.top - rectGroup.top - 260) / 2;
CWnd *pWnd = GetDlgItem(IDC_DISPLAY_FRAME);
pWnd->MoveWindow(nX, nY, 352, 260, TRUE);
// Init AVSynchronizer
SCODE sRet = AvSynchronizer_Initial(&m_hAvSync, NULL, NULL, m_hWnd,
AUDIOOUT_FOCUS_STICKY, 0, AVSYNCHRONIZER_VERSION, INDIVIDUAL_SURFACE);
if (IS_FAIL(sRet))
{
char szBuf[MAX_PATH];
sprintf(szBuf, "AvSynchronizer Initial Fail ! (%X)", sRet);
MessageBox(szBuf, "Error", MB_OK);
return FALSE;
}
// Create avsynchronizer channel
TPBCHOPTION tPbChOption;
memset(&tPbChOption, 0, sizeof(tPbChOption));
tPbChOption.dwFlags = PBCH_BITMAP | PBCH_MOTION | CH_MOTIONRECTALERT | PBCH_MOTIONRECT | PBCH_DISPLAYCB | PBCH_DISPLAYCONTEXT | PBCH_ALLBORDER | PBCH_STATUSCB;
tPbChOption.hBMP=m_hBMP;
tPbChOption.dwLeftBorderSize = 0;
tPbChOption.dwTopBorderSize = 20;
tPbChOption.dwRightBorderSize = 0;
tPbChOption.dwBottomBorderSize = 0;
tPbChOption.hDisplay = GetDlgItem(IDC_DISPLAY_FRAME)->m_hWnd;
tPbChOption.bMotionAlert = TRUE;
tPbChOption.dwDisplayContext = (DWORD) this;
tPbChOption.pfDisplay = StaticDisplayCaption;
tPbChOption.pfStatus = StaticAVStatus;
tPbChOption.dwMotionRectAlert = 0;
//tPbChOption.dwMotionRect=0x80000000 | RGB(0, 255, 255);
tPbChOption.dwMotionRect=-1;
sRet = AvSynchronizer_CreatePlaybackChannel(m_hAvSync, &m_hPlaybackChannel,
//AVSYNCHRONIZER_MEDIATYPE_AUDIO_VIDEO,
tPbChOption);
//m_dwCurMediaType = AVSYNCHRONIZER_MEDIATYPE_AUDIO_VIDEO;
m_dwCurMediaType = 0;
if (sRet != S_OK)
{
MessageBox("Failed to Create Playback Channel", "Error", MB_OK);
return FALSE;
}
m_PlaybackSpeed.EnableWindow(TRUE);
m_EventList.AddString("All Events");
m_EventList.AddString("Motion Alert Window 1");
m_EventList.AddString("Motion Alert Window 2");
m_EventList.AddString("Motion Alert Window 3");
m_EventList.AddString("DI 0 Height");
m_EventList.SetCurSel(0);
for (int nCnt2 = 0; nCnt2 < 32; nCnt2++)
{
int nIdx = m_PlaybackSpeed.AddString(apszSpeed[nCnt2]);
m_PlaybackSpeed.SetItemData(nIdx, nCnt2);
}
m_PlaybackSpeed.SelectString(-1, "Normal");
DateTime_SetFormat(m_EndTime.m_hWnd, "tt hh:mm:ss");
DateTime_SetFormat(m_StartTime.m_hWnd, "tt hh:mm:ss");
DateTime_SetFormat(m_BmkTime.m_hWnd, "tt hh:mm:ss");
//m_EndTime.SetFormat(DTS_TIMEFORMAT);
//m_StartTime.SetFormat(DTS_TIMEFORMAT);
return TRUE; // return TRUE unless you set the focus to a control
}
void CPlaybackDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -