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

📄 playbackdlg.cpp

📁 一个在Linux下开发的IP摄像头的驱动程序及控制软件
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

LRESULT CPlaybackDlg::OnCloseThread(WPARAM wParam, LPARAM lParam)
{
	if (m_hRetrieveThread)
		CloseHandle(m_hRetrieveThread);
	m_hRetrieveThread = NULL;

	return 0;
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CPlaybackDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CPlaybackDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

void CPlaybackDlg::SetTimeSegment(int index)
{
	TMediaDBTimeInterval tTI;
	struct tm *stime;
	SYSTEMTIME wTime;
	memset(&wTime, 0, sizeof(wTime));

	if (index >= 0)
	{
		// clear search result list box
		m_SearchResult.ResetContent();

		SCODE sRet = MediaDB_GetTimeSegmentInterval(m_hLocation, (WORD) index, &tTI);
		if (!IS_SUCCESS(sRet))
			return;

		/*
		int nOld = _daylight;
		_daylight = 0;
		stime = localtime((time_t *) &tTI.dwStartTime);
		*/
		// use new converting method now
		stime = gmtime((time_t *) &tTI.dwStartTime);

		wTime.wYear = stime->tm_year+1900;
		wTime.wMonth = stime->tm_mon+1;
		wTime.wDay = stime->tm_mday;
		wTime.wHour = stime->tm_hour;
		wTime.wMinute = stime->tm_min;
		wTime.wSecond = stime->tm_sec;
		m_StartDate.SetTime(&wTime);
		m_StartTime.SetTime(&wTime);

		/*
		stime = localtime((time_t *) &tTI.dwEndTime);
		_daylight = nOld;	// restore daylight value
		*/
		// use new converting method now
		stime = gmtime((time_t *) &tTI.dwEndTime);

		wTime.wYear = stime->tm_year+1900;
		wTime.wMonth = stime->tm_mon+1;
		wTime.wDay = stime->tm_mday;
		wTime.wHour = stime->tm_hour;
		wTime.wMinute = stime->tm_min;
		wTime.wSecond = stime->tm_sec;
		m_EndDate.SetTime(&wTime);
		m_EndTime.SetTime(&wTime);
		m_wCurrentTimeSegIndex = index;
		m_StartDate.EnableWindow(TRUE);
		m_StartTime.EnableWindow(TRUE);
		m_EndDate.EnableWindow(TRUE);
		m_EndTime.EnableWindow(TRUE);
		m_SearchResult.EnableWindow(TRUE);
		CButton_DeleteTI.EnableWindow(TRUE);
		m_btnSearchTimeI.EnableWindow(TRUE);
		m_btnSearchEvent.EnableWindow(TRUE);
		m_EventList.EnableWindow(TRUE);
	}
	else
	{
		m_StartDate.EnableWindow(FALSE);
		m_StartTime.EnableWindow(FALSE);
		m_EndDate.EnableWindow(FALSE);
		m_EndTime.EnableWindow(FALSE);
		m_SearchResult.EnableWindow(FALSE);
		CButton_DeleteTI.EnableWindow(FALSE);
		m_btnSearchTimeI.EnableWindow(FALSE);
		m_btnSearchEvent.EnableWindow(FALSE);
		m_EventList.EnableWindow(FALSE);
	}
}

void CPlaybackDlg::OpenMediaLocation(char* pszLoc)
{
	SCODE ret;
	WORD wTimeSegmentNum = 0;
	TMediaLocationOption tLocOption;
	TMediaDBTimeInterval tTI;
	CString TimeSeg, TimeSeg2;
	struct tm *stime;

	// close current location
	if (m_hLocation)
	{
		MediaDB_CloseLocation(m_hLocation);
		m_hLocation = NULL;
	}
	m_TimeSegmentList.ResetContent();

	// Open new location
	tLocOption.dwMaxFileSize = 1024 * 1024 * 2;
	tLocOption.dwMaxIndexNumber = 20;
	tLocOption.pszLocation = pszLoc;
	ret = MediaDB_OpenLocation(m_hDatabase, &tLocOption, &m_hLocation);
	if (IS_FAIL(ret))
	{
		char szMsg[MAX_PATH];

		sprintf(szMsg, "Open Location Fail ! %d (%X)", ret, ret);
		MessageBox(szMsg, "Error", MB_OK);
		return;
	}

	MediaDB_GetTimeSegmentNumber(m_hLocation, &wTimeSegmentNum);
	/*
	int nOld = _daylight;
	_daylight = 0;
	*/
	for (int i = 0; i<wTimeSegmentNum; i++)
	{
		MediaDB_GetTimeSegmentInterval(m_hLocation, (WORD) i, &tTI);
		
		//stime = localtime((time_t *) &tTI.dwStartTime);
		// use new converting method now
		stime = gmtime((time_t *) &tTI.dwStartTime);
		
		TimeSeg.Format("%4d/%2d/%2d %02d:%02d:%02d", stime->tm_year+1900, 
			stime->tm_mon+1, stime->tm_mday, stime->tm_hour, stime->tm_min, stime->tm_sec);
		
		//stime = localtime((time_t *) &tTI.dwEndTime);
		// use new converting method now
		stime = gmtime((time_t *) &tTI.dwEndTime);

		TimeSeg2.Format(" ~ %4d/%2d/%2d %02d:%02d:%02d", stime->tm_year+1900, 
			stime->tm_mon+1, stime->tm_mday, stime->tm_hour, stime->tm_min, stime->tm_sec);
		TimeSeg += TimeSeg2;
		m_TimeSegmentList.AddString(TimeSeg);
	}
	//_daylight = nOld;

	// Select first timesegment as default
	if (wTimeSegmentNum > 0)
	{
		m_TimeSegmentList.EnableWindow(TRUE);
		m_TimeSegmentList.SetCurSel(0);
		SetTimeSegment(0);
	}
	else
	{
		m_TimeSegmentList.EnableWindow(FALSE);
		SetTimeSegment(-1);
	}
}

void CPlaybackDlg::GetTimeQueryInterval()
{
	SYSTEMTIME sDate;
	SYSTEMTIME sTime;
	struct tm timetm;

	time_t tVal;
	time(&tVal);
	localtime(&tVal);

	// start time
	m_StartDate.GetTime(&sDate);
	m_StartTime.GetTime(&sTime);
	timetm.tm_isdst = 0;
	timetm.tm_year = sDate.wYear - 1900;
	timetm.tm_mon = sDate.wMonth - 1;
	timetm.tm_mday = sDate.wDay;
	timetm.tm_hour = sTime.wHour;
	timetm.tm_min = sTime.wMinute;
	timetm.tm_sec = sTime.wSecond;
	timetm.tm_hour -= _timezone / 3600;
	m_dwStartTime = (DWORD) mktime(&timetm);

	// end time
	m_EndDate.GetTime(&sDate);
	m_EndTime.GetTime(&sTime);
	timetm.tm_isdst = 0;
	timetm.tm_year = sDate.wYear - 1900;
	timetm.tm_mon = sDate.wMonth - 1;
	timetm.tm_mday = sDate.wDay;
	timetm.tm_hour = sTime.wHour;
	timetm.tm_min = sTime.wMinute;
	timetm.tm_sec = sTime.wSecond;
	timetm.tm_hour -= _timezone / 3600;
	m_dwEndTime = (DWORD) mktime(&timetm);

	m_BmkDate.GetTime(&sDate);
	m_BmkTime.GetTime(&sTime);
	timetm.tm_isdst = 0;
	timetm.tm_year = sDate.wYear - 1900;
	timetm.tm_mon = sDate.wMonth - 1;
	timetm.tm_mday = sDate.wDay;
	timetm.tm_hour = sTime.wHour;
	timetm.tm_min = sTime.wMinute;
	timetm.tm_sec = sTime.wSecond;
	timetm.tm_hour -= _timezone / 3600;
	m_dwBmkTime = (DWORD) mktime(&timetm);
}

void CPlaybackDlg::OnBnClickedOpendatabase()
{
	// TODO: Add your control notification handler code here
	BROWSEINFO biShell;
	char szFolderName[MAX_PATH];
    LPITEMIDLIST pidlSelected = NULL;
    LPMALLOC pMalloc = NULL;
	TMediaDBInitOption tInitOption;
	SCODE ret;
	DWORD dwLocNum = 0;

	// Select Database Folder
    SHGetMalloc(&pMalloc);
    biShell.hwndOwner       = m_hWnd;
    biShell.pidlRoot        = NULL;
    biShell.pszDisplayName  = szFolderName;
    biShell.lpszTitle       = "Select database path";
    //biShell.ulFlags         = BIF_BROWSEFORCOMPUTER | BIF_DONTGOBELOWDOMAIN | BIF_RETURNFSANCESTORS |
	biShell.ulFlags         = BIF_RETURNONLYFSDIRS;// | BIF_NONEWFOLDERBUTTON | BIF_USENEWUI;
    biShell.lpfn            = NULL;
    biShell.lParam          = 0;
    biShell.iImage          = 0;
 
    if ((pidlSelected = SHBrowseForFolder(&biShell)) == NULL)
        return;

    if (!SHGetPathFromIDList(pidlSelected, szFolderName))
		return;

    if (pidlSelected)
		pMalloc->Free(pidlSelected);
    pMalloc->Release();

	CEdit *pDBCtrl = (CEdit *) GetDlgItem(IDC_DATAPATH);
	pDBCtrl->SetWindowText(szFolderName);
	m_szDBPath = szFolderName;

    // Database initial
	if (m_hDatabase)
	{
		// close current location
		if (m_hLocation)
		{
			MediaDB_CloseLocation(m_hLocation);
			m_hLocation = NULL;
		}
		// close current database
		MediaDB_Release(m_hDatabase);
		m_hDatabase = NULL;
	}

	tInitOption.pszDatabasePath = szFolderName;         // database path
	tInitOption.dwVersion = DATABASE_VERSION;			// database library version
	ret = MediaDB_Initial(&m_hDatabase, &tInitOption, DB_OPEN);
	if (IS_FAIL(ret))
	{
		MessageBox("Open Database Fail !", "Error", MB_OK);
		return;
	}

	// Get location list
	CHAR (*pszLocation)[STR_MAX];

	MediaDB_GetLocationNum(m_hDatabase, &dwLocNum);
	pszLocation = (char(*)[STR_MAX]) malloc(dwLocNum * STR_MAX);
	MediaDB_GetLocationList(m_hDatabase, dwLocNum, pszLocation);

	m_LocationList.ResetContent();

	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);

	GetDlgItem(IDC_PLAY)->EnableWindow(TRUE);
}

void CPlaybackDlg::OnCbnSelchangeLocation()
{
	// TODO: Add your control notification handler code here
	int nIndex;
	char szLoc[MAX_PATH];

	nIndex = m_LocationList.GetCurSel();
	if (nIndex != CB_ERR)
	{
		m_LocationList.GetLBText(nIndex, szLoc);
		OpenMediaLocation(szLoc);
	}
}

void CPlaybackDlg::OnBnClickedSearchTi()
{
	// TODO: Add your control notification handler code here
	HANDLE hQuery;
	DWORD dwTINum;
	TMediaDBTimeInterval tTI;
	TMediaDBIntervalInfo tTIInfo;
	CString strItem, strItem2;
	struct tm *timetm;
	SCODE sRet;

	// clear list box
	m_SearchResult.ResetContent();

	GetTimeQueryInterval();
	tTI.dwStartTime = m_dwStartTime;
	tTI.dwEndTime = m_dwEndTime;
	MediaDB_CreateTimeQuery(m_hLocation, m_wCurrentTimeSegIndex, &tTI, &hQuery);
	MediaDB_GetTimeIntervalNum(hQuery, &dwTINum);
	sRet = MediaDB_FindFirstTimeInterval(hQuery, &tTIInfo);
	if(sRet == DATABASE_E_ENDOFQUERY || IS_FAIL(sRet))
	{
		MediaDB_DeleteQuery(hQuery);
		return;
	}

	/*
	int nOld;
	nOld = _daylight;
	_daylight = 0;
	*/

	do
	{

		//timetm = localtime((time_t *) &tTIInfo.tTimeInterval.dwStartTime);
		// use new converting method
		timetm = gmtime((time_t *) &tTIInfo.tTimeInterval.dwStartTime);

		strItem.Format("%4d/%02d/%02d %02d:%02d:%02d", timetm->tm_year+1900, 
			timetm->tm_mon+1, timetm->tm_mday, timetm->tm_hour, timetm->tm_min, timetm->tm_sec);
		
		//timetm = localtime((time_t *) &tTIInfo.tTimeInterval.dwEndTime);
		timetm = gmtime((time_t *) &tTIInfo.tTimeInterval.dwEndTime);
		
		strItem2.Format(" ~ %4d/%02d/%02d %02d:%02d:%02d", timetm->tm_year+1900, 
			timetm->tm_mon+1, timetm->tm_mday, timetm->tm_hour, timetm->tm_min, timetm->tm_sec);
		strItem += strItem2;
		switch (tTIInfo.dwMediaType)
		{
		case MEDIADB_VIDEO_TYPE :
			strItem2.Format(" V   ");
			strItem += strItem2;
			break;
		case MEDIADB_AUDIO_TYPE :
			strItem2.Format(" A   ");
			strItem += strItem2;
			break;
		case MEDIADB_VIDEO_TYPE | MEDIADB_AUDIO_TYPE:
			strItem2.Format(" A/V ");
			strItem += strItem2;
			break;
		}
		switch (tTIInfo.eVideoStreamType)
		{
		case mctJPEG :
			strItem2.Format(" JPEG  ");
			strItem += strItem2;
			break;
		case mctH263 :
			strItem2.Format(" H.263 ");
			strItem += strItem2;
			break;
		case mctMP4V :
			strItem2.Format(" MPEG4 ");
			strItem += strItem2;
			break;
		}
		switch (tTIInfo.eAudioStreamType)
		{
		case mctG7221 :
			strItem2.Format(" G.7221 ");
			strItem += strItem2;
			break;
		case mctG729A :
			strItem2.Format(" G.729A ");
			strItem += strItem2;
			break;
		case mctGAMR :
			strItem2.Format(" GAMR ");
			strItem += strItem2;
			break;
		case mctAAC :
			strItem2.Format(" AAC ");
			strItem += strItem2;
			break;
		}

		m_SearchResult.AddString(strItem);

	} while(((sRet = MediaDB_FindNextTimeInterval(hQuery, &tTIInfo)) != DATABASE_E_ENDOFQUERY) && IS_SUCCESS(sRet));
	//_daylight = nOld;

	MediaDB_DeleteQuery(hQuery);
}

void CPlaybackDlg::OnBnClickedSearchEvent()
{
	// TODO: Add your control notification handler code here
	HANDLE hQuery;
	DWORD dwEventNum;
	TMediaDBTimeInterval tTI;
	TMediaDBEventProperty tEventProperty;
	CString strItem, strItem2;
	DWORD dwEventType;
	struct tm *timetm;
	SCODE sRet;

	// clear list box
	m_SearchResult.ResetContent();

	GetTimeQueryInterval();
	tTI.dwStartTime = m_dwStartTime;
	tTI.dwEndTime = m_dwEndTime;

	GetEventType(&dwEventType);
	MediaDB_CreateEventQuery(m_hLocation, m_wCurrentTimeSegIndex, &tTI, dwEventType, &hQuery);
	MediaDB_GetEventIntervalNum(hQuery, &dwEventNum);
	sRet = MediaDB_FindFirstEventInterval(hQuery, &tEventProperty);
	if(sRet == DATABASE_E_ENDOFQUERY || IS_FAIL(sRet))
	{
		MediaDB_DeleteQuery(hQuery);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -