⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 playbackdlg.cpp

📁 一个在Linux下开发的IP摄像头的驱动程序及控制软件
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		{
			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 + -