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

📄 playbackdlg.cpp

📁 一个在Linux下开发的IP摄像头的驱动程序及控制软件
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// PlaybackDlg.cpp : implementation file
//

#include "stdafx.h"
#include "AVSynchronizer.h"
#include "Playback.h"
#include "PlaybackDlg.h"
#include "Database.h"
#include "database_error.h"
#include "parsedatapacket.h"
#include <assert.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#ifdef _TRACE_LOG
#define LOG_FILE_NAME	"c:\\playback.log"
#endif // _TRACE_LOG

#define	WM_CLOSE_THREAD		(WM_USER + 1001)
#define	WM_CLOSE_THREAD2		(WM_USER + 1002)
#define HEADERSIZE 20
#define FOOTERSIZE 20

DWORD RetrieveDataProc(LPARAM lParam);
void FreeMem(BYTE* pbyMem);

void DynaAllocMem(BYTE** ppbyMem, DWORD size)
{
	if (*ppbyMem)
	{
		FreeMem(*ppbyMem);
		*ppbyMem = NULL;
	}

	*ppbyMem = (BYTE*) malloc(size);
}

void FreeMem(BYTE* pbyMem)
{
	if (pbyMem)
		free(pbyMem);
}

BOOL ResetVideo ( CPlaybackDlg * pPlaybackDlg, DWORD& dwMatchMedia )
{
    AvSynchronizer_StopChannel (pPlaybackDlg->m_hPlaybackChannel);
    AvSynchronizer_StartChannel (pPlaybackDlg->m_hPlaybackChannel, 0);

	DWORD dwFoundTime;
    SCODE sRet;

    pPlaybackDlg->GetMatchMediaType ( pPlaybackDlg->m_dwStartTime, pPlaybackDlg->m_dwEndTime, &dwMatchMedia );

	sRet = MediaDBRet_MatchTime(pPlaybackDlg->m_hRetrieval, 
		pPlaybackDlg->m_hLocation, 
		pPlaybackDlg->m_wCurrentTimeSegIndex, 
		pPlaybackDlg->m_dwStartTime, 
		dwMatchMedia, &dwFoundTime);

    if ( sRet != S_OK )
    {
        MediaDBRet_MatchFirstI(pPlaybackDlg->m_hRetrieval, pPlaybackDlg->m_hLocation, 
            pPlaybackDlg->m_wCurrentTimeSegIndex, pPlaybackDlg->m_dwStartTime, 
            pPlaybackDlg->m_dwEndTime, dwMatchMedia, &dwFoundTime);

        if (IS_FAIL (sRet))
        {
            return FALSE;
        }
    }
    
    return TRUE;
}

DWORD RetrieveDataProcNew(LPARAM lParam)
{

	SCODE sRet;
	DWORD dwMediaType;
	DWORD dwBufferSize,dwCurSize;
	BYTE* pbyInBuf = NULL;
	TMediaDataPacketInfo tPacketInfo;
	TUPDATEPBCHANNELOPTION tUpdatePBChannelOptions;
	CPlaybackDlg* pPlaybackDlg = (CPlaybackDlg *) lParam;
	BOOL bCheckI = FALSE;
	DWORD dwMatchMedia;
    //CWnd * pWnd;

//    pPlaybackDlg->m_bUpdateFoundTime = TRUE; // set this to let CheckDataInInterval to keep the foundtime

    pPlaybackDlg->CheckDataInInterval ( pPlaybackDlg->m_dwStartTime, 
		pPlaybackDlg->m_dwEndTime, &dwMatchMedia);

	dwCurSize = dwBufferSize = 12000;
	DynaAllocMem(&pbyInBuf, dwBufferSize);
	if (pbyInBuf == NULL)
	{
		// memory allocate error
		// stop avsynchronizer channel
		AvSynchronizer_StopChannel(pPlaybackDlg->m_hPlaybackChannel);
		// release retrieval
		MediaDBRet_Release(pPlaybackDlg->m_hRetrieval);
        pPlaybackDlg->m_hRetrieval = NULL;
		return 1;
	}

	DWORD dwTickSave = GetTickCount();
	
	while(pPlaybackDlg->m_bPlaying && !pPlaybackDlg->m_bExit)
	{
		dwBufferSize = dwCurSize;
        assert ( pPlaybackDlg->m_hRetrieval );
		sRet = MediaDBRet_OutputOneDataPacket(pPlaybackDlg->m_hRetrieval, MEDIADB_ALLSEQUENTIAL, pbyInBuf, &dwBufferSize, &dwMediaType);

		if(sRet == DATABASE_E_ENDOFSTREAM)
		{
			if (pPlaybackDlg->m_RepeatMode.GetCheck() != 0)
			{
                if ( !ResetVideo ( pPlaybackDlg, dwMatchMedia ))
                {
                    break; // stop playing
                }
				continue;
			}
			// stop playing
			break;
		}
		else if(sRet == DATABASE_E_BUFFERDEFICIT)
		{
			DynaAllocMem(&pbyInBuf, dwBufferSize);
			dwCurSize = dwBufferSize;
			if (pbyInBuf == NULL)
			{
				TRACE("mem error\n");
		        CString strMsg;
                CString strTitle;
		        strMsg = "Out of memory";
                strTitle = "Error";
		        MessageBox(pPlaybackDlg->m_hWnd, strMsg, strTitle, MB_OK);
				break;
			}
			continue;
		}
		else if(IS_FAIL(sRet))
		{
		    CString strMsg ("Get data from database failed");
            CString strTitle ("Error");
		    MessageBox(pPlaybackDlg->m_hWnd, strMsg, strTitle, MB_OK);
			break;
		}

		if (pPlaybackDlg->m_dwCurMediaType != dwMediaType)
		{
			tUpdatePBChannelOptions.dwFlags = UPCH_MEDIATYPE;
			tUpdatePBChannelOptions.tMediaType = (TMediaType) dwMediaType;
			AvSynchronizer_UpdatePlaybackChannelSettings(pPlaybackDlg->m_hPlaybackChannel, tUpdatePBChannelOptions);
			pPlaybackDlg->m_dwCurMediaType = dwMediaType;
			bCheckI = TRUE;
		}
		else if(sRet == DATABASE_S_CHANGEINTERVAL)
		{
			tUpdatePBChannelOptions.dwFlags = UPCH_TIMEITV_CHG;
			AvSynchronizer_UpdatePlaybackChannelSettings(pPlaybackDlg->m_hPlaybackChannel, tUpdatePBChannelOptions);
			bCheckI = TRUE;
		}

		// parse packet
		memset(&tPacketInfo, 0, sizeof(tPacketInfo));
		tPacketInfo.pbyBuff = pbyInBuf;
		DataPacket_Parse(&tPacketInfo);

		if (bCheckI)
		{
			if ((tPacketInfo.dwStreamType & (mctH263 | mctJPEG)) != 0)
			{
				bCheckI = FALSE;
			}
		}

		if (tPacketInfo.dwFirstUnitSecond > pPlaybackDlg->m_dwEndTime)
		{
            if ( !ResetVideo ( pPlaybackDlg, dwMatchMedia ))
            {
                break; // stop playing
            }
            continue;
		}

		sRet = AvSynchronizer_InputPlaybackMediaFrame(pPlaybackDlg->m_hPlaybackChannel, &tPacketInfo);
        
		if (pPlaybackDlg->m_dwCurMediaType & MEDIADB_AUDIO_TYPE)
		{
			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);
		}
	}

	TRACE("Stop Channel\n");

	if (pPlaybackDlg->m_bExit)
	{
		FreeMem(pbyInBuf);
		return 0;
	}

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


	AvSynchronizer_StopChannel(pPlaybackDlg->m_hPlaybackChannel);
	MediaDBRet_Release(pPlaybackDlg->m_hRetrieval);

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

    pPlaybackDlg->m_hRetrieval = NULL;

	FreeMem(pbyInBuf);
	pbyInBuf = NULL;

	if (!pPlaybackDlg->m_bPlaying)
	{
		tUpdatePBChannelOptions.dwFlags = UPCH_SHOW_BMP;
		AvSynchronizer_UpdatePlaybackChannelSettings(pPlaybackDlg->m_hPlaybackChannel, 
			tUpdatePBChannelOptions);
	}

	char szBuf[MAX_PATH];

	sprintf(szBuf, "%d", dwTickNow - dwTickSave);
	pPlaybackDlg->m_PlayTime.SetWindowText(szBuf);


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

	pPlaybackDlg->m_bPlaying = FALSE;
	return 0;
}


DWORD RetrieveDataProc(LPARAM lParam)
{
	SCODE sRet;
	DWORD dwMediaType;
	DWORD dwBufferSize,dwCurSize;
	BYTE* pbyInBuf = NULL;
	TMediaDataPacketInfo tPacketInfo;
	TUPDATEPBCHANNELOPTION tUpdatePBChannelOptions;
	CPlaybackDlg* pPlaybackDlg = (CPlaybackDlg *) lParam;
	BOOL bCheckI = FALSE;

	pPlaybackDlg->m_dwAOnlyCBCount = 0;

	dwCurSize = dwBufferSize = 12000;
	DynaAllocMem(&pbyInBuf, dwBufferSize);
	if (pbyInBuf == NULL)
	{
		// memory allocate error
		// stop avsynchronizer channel
		AvSynchronizer_StopChannel(pPlaybackDlg->m_hPlaybackChannel);
		// release retrieval
		MediaDBRet_Release(pPlaybackDlg->m_hRetrieval);
		return 1;
	}


	DWORD dwTickSave = GetTickCount();
	
#ifdef _TRACE_LOG
	DeleteFile(LOG_FILE_NAME);
	FILE *pFile;
#endif // _TRACE_LOG
	//FILE *pBinFile = fopen("c:\\frames.bin", "wb");

	while(pPlaybackDlg->m_bPlaying && !pPlaybackDlg->m_bExit)
	{
		// get data from database
		dwBufferSize = dwCurSize;
		sRet = MediaDBRet_OutputOneDataPacket(pPlaybackDlg->m_hRetrieval, MEDIADB_ALLSEQUENTIAL, pbyInBuf, &dwBufferSize, &dwMediaType);

#ifdef _TRACE_LOG
		pFile = fopen(LOG_FILE_NAME, "at");
		if (pFile)
		{
			fprintf(pFile, "After MediaDBRet_OutputOneDataPacket\n");
			fclose(pFile);
		}
#endif // _TRACE_LOG

		if(sRet == DATABASE_E_ENDOFSTREAM)
		{
#ifdef _TRACE_LOG
			pFile = fopen(LOG_FILE_NAME, "at");
			if (pFile)
			{
				fprintf(pFile, "End of stream returned!\n");
				fclose(pFile);
			}
#endif // _TRACE_LOG

			if (pPlaybackDlg->m_RepeatMode.GetCheck() != 0)
			{
				DWORD dwFoundTime;
				MediaDBRet_MatchTime(pPlaybackDlg->m_hRetrieval, 
					pPlaybackDlg->m_hLocation, 
					pPlaybackDlg->m_wCurrentTimeSegIndex, 
					pPlaybackDlg->m_dwStartTime, 
					MEDIADB_VIDEO_TYPE | MEDIADB_AUDIO_TYPE, &dwFoundTime);
				continue;
			}
			// stop playing
			break;
		}
		else if(sRet == DATABASE_E_BUFFERDEFICIT)
		{
			DynaAllocMem(&pbyInBuf, dwBufferSize);
			dwCurSize = dwBufferSize;
			if (pbyInBuf == NULL)
			{
#ifdef _TRACE_LOG
				pFile = fopen(LOG_FILE_NAME, "at");
				if (pFile)
				{
					fprintf(pFile, "Mem alloc failed for frame! size = %ld\n", dwBufferSize);
					fclose(pFile);
				}
#endif // _TRACE_LOG

				TRACE("mem error\n");
				break;
			}
			continue;
		}
		else if(IS_FAIL(sRet))
		{
#ifdef _TRACE_LOG
			FILE *pFile = fopen(LOG_FILE_NAME, "at");
			if (pFile)
			{
				fprintf(pFile, "MediaDBRet_OutputOneDataPacket failed (%X)\n",
					sRet);
				fclose(pFile);
			}
#endif // _TRACE_LOG
			// MessageBox("MediaDBRet_OutputOneDataPacket Fail !");
			break;
		}

		// TRACE("type = %d size = %d\n",dwMediaType, dwBufferSize);
		// check media type
		if (pPlaybackDlg->m_dwCurMediaType != dwMediaType)
		{
#ifdef _TRACE_LOG
			pFile = fopen(LOG_FILE_NAME, "at");
			if (pFile)
			{
				fprintf(pFile, "Change of media\n");
				fclose(pFile);
			}
#endif // _TRACE_LOG

			tUpdatePBChannelOptions.dwFlags = UPCH_MEDIATYPE;
			tUpdatePBChannelOptions.tMediaType = (TMediaType) dwMediaType;
			AvSynchronizer_UpdatePlaybackChannelSettings(pPlaybackDlg->m_hPlaybackChannel, tUpdatePBChannelOptions);
			pPlaybackDlg->m_dwCurMediaType = dwMediaType;
			bCheckI = TRUE;
		}
		else if(sRet == DATABASE_S_CHANGEINTERVAL)
		{
			// temp
#ifdef _TRACE_LOG
			pFile = fopen(LOG_FILE_NAME, "at");
			if (pFile)
			{
				fprintf(pFile, "Change of time interval\n");
				fclose(pFile);
			}
#endif // _TRACE_LOG
			//MessageBox(pPlaybackDlg->m_hWnd, "Time interval change!", "Debug", MB_OK);
			tUpdatePBChannelOptions.dwFlags = UPCH_TIMEITV_CHG;
			AvSynchronizer_UpdatePlaybackChannelSettings(pPlaybackDlg->m_hPlaybackChannel, tUpdatePBChannelOptions);
			
#ifdef _TRACE_LOG
			pFile = fopen(LOG_FILE_NAME, "at");
			if (pFile)
			{
				fprintf(pFile, "After change channel setting (CHG TIME ITV)\n");
				fclose(pFile);
			}
#endif // _TRACE_LOG
			bCheckI = TRUE;
		}

		// parse packet
		memset(&tPacketInfo, 0, sizeof(tPacketInfo));
		tPacketInfo.pbyBuff = pbyInBuf;
		DataPacket_Parse(&tPacketInfo);

		if (bCheckI)
		{
			if ((tPacketInfo.dwStreamType & (mctH263 | mctJPEG)) != 0)
			{
				if (tPacketInfo.tFrameType != MEDIADB_FRAME_INTRA)
				{
					//MessageBox(NULL, "First Video frame is not I", "Debug", MB_OK);
				}
				bCheckI = FALSE;
			}
		}
	
#ifdef _TRACE_LOG
		pFile = fopen(LOG_FILE_NAME, "at");
		if (pFile)
		{
			fprintf(pFile, "After Parsing packet\n");
			fclose(pFile);
		}
#endif // _TRACE_LOG

		if (tPacketInfo.dwFirstUnitSecond > pPlaybackDlg->m_dwEndTime)
		{
#ifdef _TRACE_LOG
			pFile = fopen(LOG_FILE_NAME, "at");
			if (pFile)
			{
				fprintf(pFile, "Packet is out of range: end time = %d, packet time = %d\n",
					pPlaybackDlg->m_dwEndTime,
					tPacketInfo.dwFirstUnitSecond);
				fclose(pFile);
			}
#endif // _TRACE_LOG

			break;
		}

		// send to avsynchonizer
		sRet = AvSynchronizer_InputPlaybackMediaFrame(pPlaybackDlg->m_hPlaybackChannel, &tPacketInfo);

#ifdef _TRACE_LOG
		pFile = fopen(LOG_FILE_NAME, "at");
		if (pFile)
		{
			fprintf(pFile, "After AvSynchronizer_InputPlaybackMediaFrame\n");
			fclose(pFile);
		}
#endif // _TRACE_LOG

		// update slider
		//pPlaybackDlg->m_PlaySlider.SetPos((int) tPacketInfo.dwFirstUnitSecond);
		if (pPlaybackDlg->m_dwCurMediaType & MEDIADB_AUDIO_TYPE)

⌨️ 快捷键说明

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