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

📄 playbackdlg.cpp

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