// CProcessUserData.cpp: implementation of the CProcessUserData class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "mgrnve.h" #include "ConnectionManager.h" #include "ProcessUserData.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif #include "MgrNVE.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CProcessUserData::CProcessUserData() { m_hCodEvent = NULL; m_hNetEvent = NULL; m_hSensorEvent = NULL; m_hVStatusEvent = NULL; m_pCod5Api = NULL; m_pNet5Api = NULL; m_pAudioBuf = NULL; m_pMDInfo = NULL; m_pMDBuff = NULL; m_uMDBufIndex = 0; m_pMp2File = NULL; m_bIFrameArrived = FALSE; #ifdef MP4S_AVI m_pAvi = NULL; m_pIdx = NULL; m_uAviFrameCount = 0; m_uMaxFrameLength = 0; m_uWidth = 0; m_uHeight = 0; #endif #if 0 m_PreTime.QuadPart = 0; #endif } CProcessUserData::~CProcessUserData() { if (m_UserThread.GetState() == TS_RUN) { m_UserThread.StopThread(1); } if (m_pMp2File) { fclose(m_pMp2File); } } BOOL CProcessUserData::Init(CConnectionManager *pConnMgr) { if (!pConnMgr) { TRACE("Get pConnMgr failed\n"); return FALSE; } m_pConnMgr = pConnMgr; m_pFrameApp = pConnMgr->GetMgrNVE()->GetFrameApp(); if (!m_pFrameApp) { TRACE("Get m_pFrameApp failed\n"); return FALSE; } m_pMsgMgr = pConnMgr->GetMgrNVE()->GetMsgManager(); m_pCod5Api = pConnMgr->GetCod5Api(); m_pNet5Api = pConnMgr->GetNet5Api(); m_pMDInfo = m_pConnMgr->GetMDInfo(); m_pAudioBuf = new BYTE[MAX_AUDIO_PACKET_SIZE]; m_pMDBuff = new char[MAX_MD_BUFF_SIZE]; #ifdef MP4S_AVI char szFileName[NVE_MAX_STR_LENGTH]; _snprintf(szFileName, sizeof(szFileName), "NVE_MP4S_%d.idx", m_pConnMgr->GetServerIndex()); m_pIdx = fopen(szFileName, "w+b"); if (!m_pIdx) { TRACE("Unable to open %s: %s\n", szFileName); } /* Then open the real AVI destination file */ _snprintf(szFileName, sizeof(szFileName), "NVE_MP4S_%d.avi", m_pConnMgr->GetServerIndex()); m_pAvi = fopen(szFileName, "w+b"); if (!m_pAvi) { TRACE("Unable to open %s: %s\n", szFileName); } fseek(m_pAvi, 1024 + 12, SEEK_SET); #endif return TRUE; } void CProcessUserData::Release() { #ifdef MP4S_AVI AviFinish(); #endif if (m_pMDBuff) { delete[] m_pMDBuff; m_pMDBuff = NULL; } if (m_pAudioBuf) { delete[] m_pAudioBuf; m_pAudioBuf= NULL; } } BOOL CProcessUserData::ProcessMediaData() { COD5_DATA_INFO_EX DataInfo; do { if (!m_pCod5Api->Cod5GetEventData(CMN5_DT_COD_EX, &DataInfo)) { return FALSE; } switch(DataInfo.uFrameType) { case COD5_FT_MP4V_I_PIC: case COD5_FT_MP4V_P_PIC: case COD5_FT_MJPEG: case COD5_FT_MP2V_I_PIC: case COD5_FT_MP2V_P_PIC: ProcessVideoData(&DataInfo); break; case COD5_FT_PCM_AUDIO: ProcessAudioData(&DataInfo); break; case COD5_FT_MD_1: ProcessMDData(&DataInfo); break; } m_pCod5Api->Cod5ReleaseData(&DataInfo); } while(DataInfo.uHasNextData); return TRUE; } BOOL CProcessUserData::MakeMP4S(UCHAR *pData, ULONG *puSize) { UCHAR *pBuffer = pData; ULONG uOffset = 0; if(0xb0010000 == *(ULONG*)pData || 0xb3010000 == *(ULONG*)pData){ int i = 0; for (i=0; i<64; i++) { if (0xb6010000 == *(ULONG*)(pData+i)) { break; } } uOffset = i; } pBuffer += uOffset; (*puSize) -= uOffset; CopyMemory(pData, pBuffer, *puSize); return TRUE; } BOOL CProcessUserData::ProcessVideoData(COD5_DATA_INFO_EX *pInfo) { #if 1 if (pInfo->uFrameType == COD5_FT_MP2V_I_PIC || pInfo->uFrameType == COD5_FT_MP2V_P_PIC) { SYSTEMTIME SysTime; GetLocalTime(&SysTime); char szFileName[NVE_MAX_STR_LENGTH]; _snprintf(szFileName, sizeof(szFileName), "%02d_%04d%02d%02d %02d%02d.m2v", m_pConnMgr->GetServerIndex(), SysTime.wYear, SysTime.wMonth, SysTime.wDay, SysTime.wHour, SysTime.wMinute); if (!m_pMp2File) { m_pMp2File = fopen(szFileName, "ab"); if (!m_pMp2File) { TRACE("Cannot open mpeg2 file\n"); return FALSE; } } if (pInfo->uFrameType == COD5_FT_MP2V_I_PIC) { m_bIFrameArrived = TRUE; } if (!m_bIFrameArrived) { return FALSE; } fwrite(pInfo->pDataBuffer, pInfo->uDataSize, 1, m_pMp2File); //return TRUE; } else { if (m_pMp2File) { fclose(m_pMp2File); m_pMp2File = NULL; m_bIFrameArrived = FALSE; } } #endif MEDIADATA_VIDEO mdv; mdv.time.QuadPart= pInfo->TimeTag.QuadPart; mdv.PTS.QuadPart = pInfo->PTS.QuadPart; mdv.pData = pInfo->pDataBuffer; mdv.len = pInfo->uDataSize; if (pInfo->uFrameType == COD5_FT_MP4V_I_PIC || pInfo->uFrameType == COD5_FT_MJPEG) { mdv.bKeyFrame = TRUE; }else{ mdv.bKeyFrame = FALSE; } mdv.dwFrameType = pInfo->uFrameType; /*static LARGE_INTEGER time; TRACE("%d ", (pInfo->TimeTag.QuadPart - time.QuadPart)/10000); //TRACE("%I64d\n", pInfo->TimeTag.QuadPart); time = pInfo->TimeTag;*/ m_pFrameApp->ProcessMediaData(MEDIA_INDEX_DIVX, m_pConnMgr->GetServerIndex()+pInfo->uChannelNum, &mdv, NULL); UCHAR *pData = new UCHAR[pInfo->uDataSize]; ULONG uSize = pInfo->uDataSize; CopyMemory(pData, pInfo->pDataBuffer, uSize); MakeMP4S(pData, &uSize); mdv.pData = pData; mdv.len = uSize; m_pFrameApp->ProcessMediaData(MEDIA_INDEX_MP4S, m_pConnMgr->GetServerIndex()+pInfo->uChannelNum, &mdv, NULL); delete[] pData; #if 0 static FILE *fp = NULL; static int count = 0; if (count < 300) { if (!fp) { fp = fopen("d:\\temp\\sample.mjpg", "wb"); } fwrite(&pInfo->uDataSize, sizeof(pInfo->uDataSize), 1, fp); fwrite(pInfo->pDataBuffer, pInfo->uDataSize, 1, fp); count++; if (count == 300) { fclose(fp); } } #endif #if 0 if (m_PreTime.QuadPart) { if (pInfo->TimeTag.QuadPart - m_PreTime.QuadPart > 600000 || pInfo->TimeTag.QuadPart - m_PreTime.QuadPart < 200000) { //if (pInfo->TimeTag.QuadPart - m_PreTime.QuadPart <= 0) { m_pMsgMgr->PushErrorCodeF("[%d] %d", m_pConnMgr->GetServerIndex(), (pInfo->TimeTag.QuadPart-m_PreTime.QuadPart)); m_pMsgMgr->Show(TRUE); } } m_PreTime.QuadPart = pInfo->TimeTag.QuadPart; #endif #ifdef MP4S_AVI ULONG uOffset = 0; if(0xb0010000 == *(ULONG*)pInfo->pDataBuffer || 0xb3010000 == *(ULONG*)pInfo->pDataBuffer){ int i = 0; for (i=0; i<64; i++) { if (0xb6010000 == *(ULONG*)(pInfo->pDataBuffer+i)) { break; } } TRACE("seq header size[%d]\n", i); uOffset = i; } WriteFrame(pInfo->pDataBuffer+uOffset, pInfo->uDataSize-uOffset, pInfo->uFrameType==COD5_FT_MP4V_I_PIC); #endif return TRUE; } #ifdef MP4S_AVI #define DENOMINATOR 25050 #define NUMERATOR 1001 #define PUT_16(p,v) ((p)[0]=(UCHAR)((v)&0xff),(p)[1]=(UCHAR)(((v)>>8)&0xff)) #define PUT_32(p,v) ((p)[0]=(UCHAR)((v)&0xff),(p)[1]=(UCHAR)(((v)>>8)&0xff),(p)[2]=(UCHAR)(((v)>>16)&0xff),(p)[3]=(UCHAR)(((v)>>24)&0xff)) #define FOURCC(c) (((c)[3]<<24)|((c)[2]<<16)|((c)[1]<<8)|(c)[0]) BOOL CProcessUserData::WriteFrame(UCHAR *pData, ULONG uSize, BOOL bKey) { unsigned char pHdr[16]; unsigned int offset; if (m_pAvi < 0) return FALSE; m_uWidth = CMN5_GETIMGWIDTH(m_pConnMgr->GetMediaSettings(0)->CodecSettings.uResolution); m_uHeight = CMN5_GETIMGHEIGHT(m_pConnMgr->GetMediaSettings(0)->CodecSettings.uResolution); /* Write the AVI index record */ PUT_32(pHdr, FOURCC("00dc")); PUT_32(pHdr + 4, bKey ? 0x10 : 0); offset = ftell(m_pAvi); PUT_32(pHdr + 8, offset - 1024 - 8); PUT_32(pHdr + 12, uSize); fwrite(pHdr, 16, 1, m_pIdx); /* Write the frame data to the AVI file */ PUT_32(pHdr + 4, uSize); fwrite(pHdr, 8, 1, m_pAvi); fwrite(pData, (uSize + 1) & ~0x1, 1, m_pAvi); /* word-align with junk */ m_uAviFrameCount++; if (uSize > m_uMaxFrameLength) m_uMaxFrameLength = uSize; return TRUE; } int CProcessUserData::AddVideoStreamHeader(UCHAR *pHdr) { unsigned int video_fourcc; unsigned char mp4_seq[18]; //video_fourcc = FOURCC("DX50"); video_fourcc = FOURCC("MP4S"); // mp4sÀÏ °æ¿ì mp4_seq¸¦ ³Ö¾îÁà¾ß ÇÑ´Ù. mp4_seq[0] = 0x00; mp4_seq[1] = 0x00; mp4_seq[2] = 0x01; mp4_seq[3] = 0x00; mp4_seq[4] = 0x00; mp4_seq[5] = 0x00; mp4_seq[6] = 0x01; mp4_seq[7] = 0x20; mp4_seq[8] = 0x00; mp4_seq[9] = 0x84; mp4_seq[10] = 0x40 + ((DENOMINATOR>>10)&0x3F); mp4_seq[11] = (DENOMINATOR>>2)&0xFF; mp4_seq[12] = (UCHAR)(0x28 + ((m_uWidth>>10)&0x7) + ((DENOMINATOR&3)<<6)); mp4_seq[13] = (UCHAR)((m_uWidth>>2)&0xFF); mp4_seq[14] = (UCHAR)(0x20 + ((m_uHeight>>8)&0x1F)); mp4_seq[15] = (UCHAR)(m_uHeight & 0xFF); mp4_seq[16] = 0xA3; mp4_seq[17] = 0x1F; PUT_32(pHdr, FOURCC("LIST")); PUT_32(pHdr + 4, 12 - 8 + 64 + 48 + 18); //PUT_32(pHdr + 4, 12 - 8 + 64 + 48); PUT_32(pHdr + 8, FOURCC("strl")); PUT_32(pHdr + 12, FOURCC("strh")); PUT_32(pHdr + 12 + 4, 64 - 8); PUT_32(pHdr + 12 + 8, FOURCC("vids")); PUT_32(pHdr + 12 + 12, video_fourcc); PUT_32(pHdr + 12 + 28, NUMERATOR); PUT_32(pHdr + 12 + 32, DENOMINATOR); PUT_32(pHdr + 12 + 40, m_uAviFrameCount); PUT_32(pHdr + 12 + 44, m_uMaxFrameLength); PUT_16(pHdr + 12 + 60, m_uWidth); PUT_16(pHdr + 12 + 62, m_uHeight); PUT_32(pHdr + 12 + 64, FOURCC("strf")); PUT_32(pHdr + 12 + 64 + 4, 48 - 8 + 18); PUT_32(pHdr + 12 + 64 + 8, 48 - 8 + 18); //PUT_32(pHdr + 12 + 64 + 4, 48 - 8); //PUT_32(pHdr + 12 + 64 + 8, 48 - 8); PUT_32(pHdr + 12 + 64 + 12, m_uWidth); PUT_32(pHdr + 12 + 64 + 16, m_uHeight); PUT_16(pHdr + 12 + 64 + 20, 1); PUT_16(pHdr + 12 + 64 + 22, 24); PUT_32(pHdr + 12 + 64 + 24, video_fourcc); PUT_32(pHdr + 12 + 64 + 28, m_uWidth * m_uHeight * 3); memcpy(pHdr + 12 + 64 + 48, mp4_seq, 18); return 12 + 64 + 48 + 18; //return 12 + 64 + 48; } BOOL CProcessUserData::AviFinish() { int i, movielen, filelen, off; unsigned char pHdr[1024 + 12]; movielen = ftell(m_pAvi); PUT_32(pHdr, FOURCC("idx1")); PUT_32(pHdr + 4, ftell(m_pIdx)); fwrite(pHdr, 8, 1, m_pAvi); fseek(m_pIdx, 0, SEEK_SET); while ((i = fread(pHdr, 1, sizeof(pHdr), m_pIdx)) > 0) { if (fwrite(pHdr, i, 1, m_pAvi) < 0) { return FALSE; } } fclose(m_pIdx); char szFileName[NVE_MAX_STR_LENGTH]; _snprintf(szFileName, sizeof(szFileName), "NVE_MP4S_%d.idx", m_pConnMgr->GetServerIndex()); DeleteFile(szFileName); filelen = ftell(m_pAvi); memset(pHdr, 0, sizeof(pHdr)); PUT_32(pHdr, FOURCC("RIFF")); PUT_32(pHdr + 4, ftell(m_pAvi) - 8); PUT_32(pHdr + 8, FOURCC("AVI ")); PUT_32(pHdr + 12, FOURCC("LIST")); PUT_32(pHdr + 12 + 8, FOURCC("hdrl")); PUT_32(pHdr + 12 + 12, FOURCC("avih")); PUT_32(pHdr + 12 + 12 + 4, 64 - 8); /* bizarre math to do microsecond arithmetic in 32-bit ints */ /* => 1000000 * NUMERATOR / DENOMINATOR */ PUT_32(pHdr + 12 + 12 + 8, (NUMERATOR * 15625 / DENOMINATOR) * 64 + ((NUMERATOR * 15625) % DENOMINATOR) * 64 / DENOMINATOR); PUT_32(pHdr + 12 + 12 + 20, 2320); PUT_32(pHdr + 12 + 12 + 24, m_uAviFrameCount); PUT_32(pHdr + 12 + 12 + 32, 1); PUT_32(pHdr + 12 + 12 + 36, 128*1024); PUT_32(pHdr + 12 + 12 + 40, m_uWidth); PUT_32(pHdr + 12 + 12 + 44, m_uHeight); off = 64; off += AddVideoStreamHeader(pHdr + 12 + 12 + off); PUT_32(pHdr + 12 + 4, 12 - 8 + off); PUT_32(pHdr + 12 + 12 + off, FOURCC("JUNK")); PUT_32(pHdr + 12 + 12 + off + 4, 1024 - 12 - 12 - off - 8); PUT_32(pHdr + 1024, FOURCC("LIST")); PUT_32(pHdr + 1024 + 4, movielen - 1024 - 8); PUT_32(pHdr + 1024 + 8, FOURCC("movi")); fseek(m_pAvi, 0, SEEK_SET); fwrite(pHdr, 1024 + 12, 1, m_pAvi); fclose(m_pAvi); return TRUE; } #endif extern "C" { short ulaw2linear(unsigned char u_val); short alaw2linear(unsigned char a_val); } BOOL CProcessUserData::ProcessAudioData(COD5_DATA_INFO_EX *pInfo) { MEDIADATA_AUDIO mda; NVE_AUDIO_SETTINGS *pAudioSettings = &m_pConnMgr->GetMediaSettings(pInfo->uChannelNum)->AudioSettings; if (pAudioSettings->uAudioCodec == COD5_ACT_ULAW) { if (pInfo->uDataSize*2 > MAX_AUDIO_PACKET_SIZE) { //m_pMsgMgr->PushErrorCodeF("Audio size is too big\n"); //m_pMsgMgr->Show(TRUE); return FALSE; } TRACE("Convert uLaw to PCM\n"); for (ULONG i=0; iuDataSize; i++) { short data = ulaw2linear(pInfo->pDataBuffer[i]); memcpy(&m_pAudioBuf[i*2], &data, 2); } pInfo->pDataBuffer = m_pAudioBuf; pInfo->uDataSize = pInfo->uDataSize*2; } if (pAudioSettings->uAudioCodec == COD5_ACT_ALAW) { if (pInfo->uDataSize*2 > MAX_AUDIO_PACKET_SIZE) { //m_pMsgMgr->PushErrorCodeF("Audio size is too big\n"); //m_pMsgMgr->Show(TRUE); return FALSE; } TRACE("Convert aLaw to PCM\n"); for (ULONG i=0; iuDataSize; i++) { short data = alaw2linear(pInfo->pDataBuffer[i]); memcpy(&m_pAudioBuf[i*2], &data, 2); } pInfo->pDataBuffer = m_pAudioBuf; pInfo->uDataSize = pInfo->uDataSize*2; } mda.time.QuadPart= pInfo->TimeTag.QuadPart; mda.pData = pInfo->pDataBuffer; mda.nSamples = pInfo->uDataSize/(pAudioSettings->Wfx.wBitsPerSample/8); mda.len = pInfo->uDataSize; /*static FILE *fp = NULL; static int count = 0; if (count < 80) { if (!fp) { fp = fopen("d:\\temp\\test.pcm", "wb"); } fwrite(pInfo->pDataBuffer, pInfo->uDataSize, 1, fp); count++; if (count == 80) { fclose(fp); } }*/ m_pFrameApp->ProcessMediaData(MEDIA_INDEX_PCM, m_pConnMgr->GetServerIndex()+pInfo->uChannelNum, &mda, NULL); return TRUE; } BOOL CProcessUserData::ProcessMDData(COD5_DATA_INFO_EX *pInfo) { FILETIME LocalFiletime; SYSTEMTIME SysTime; //TRACE("Channel[%d]\n", pInfo->uChannelNum); //TRACE("TimeTag[%d]\n", pInfo->TimeTag.QuadPart); //TRACE("DataSize[%d]\n", pInfo->uDataSize); FileTimeToLocalFileTime((FILETIME*)&pInfo->TimeTag, &LocalFiletime); FileTimeToSystemTime(&LocalFiletime, &SysTime); char pszTime[NVE_MAX_STR_LENGTH]; sprintf(pszTime, "MD Time[%d-%d-%d %d:%d:%d]", SysTime.wYear, SysTime.wMonth, SysTime.wDay, SysTime.wHour, SysTime.wMinute, SysTime.wSecond); /*m_pMsgMgr->PushErrorCodeF("MD Channel[%d]", pInfo->uChannelNum); m_pMsgMgr->PushErrorCodeF(pszTime); m_pMsgMgr->PushErrorCodeF("MD DataSize[%d]", pInfo->uDataSize); //m_pMsgMgr->PushErrorCodeF("MD Data[%s]\r\n", (char*)pInfo->pDataBuffer); m_pMsgMgr->Show(TRUE);*/ MEDIADATA_AUX mdaux; char cLayer = *(char*)pInfo->pDataBuffer; for (ULONG i=0; i> i)&0x01)) { continue; } if (m_uMDBufIndex+8+sizeof(NVE_MD_INFO)+pInfo->uDataSize > MAX_MD_BUFF_SIZE) { m_uMDBufIndex = 0; } strcpy(m_pMDBuff+m_uMDBufIndex, "NVE-MD"); CopyMemory(m_pMDBuff+m_uMDBufIndex+8, &m_pMDInfo[i], sizeof(NVE_MD_INFO)); mdaux.time.QuadPart = pInfo->TimeTag.QuadPart; mdaux.pData = (BYTE*)(m_pMDBuff+m_uMDBufIndex); mdaux.len = sizeof(NVE_MD_INFO)+8; if (m_pMDInfo[i].Info.uInfoType == COD5_MDI_BITMAP) { CopyMemory(m_pMDBuff+m_uMDBufIndex+mdaux.len, pInfo->pDataBuffer+sizeof(MD_INFO_COUNT)+1, pInfo->uDataSize-(sizeof(MD_INFO_COUNT)+1)); mdaux.len += pInfo->uDataSize-(sizeof(MD_INFO_COUNT)+1); } else if (m_pMDInfo[i].Info.uInfoType == COD5_MDI_CONTINUOUS) { /*MD_INFO_CONTINUOUS *pConInfo = (MD_INFO_CONTINUOUS*)pInfo->pDataBuffer; TRACE("layer[%d], count[%d %d %d]\n", cLayer, pConInfo->wRoiMBCount[0], pConInfo->wRoiMBCount[1], pConInfo->wRoiMBCount[2]);*/ } #if 0 if (m_pConnMgr->GetMgrNVE()->GetCurDlg() != PT_MD_SETTINGS) { return TRUE; } #endif if (!m_pMDInfo[i].Info.uEnable) { return TRUE; } m_pFrameApp->ProcessMediaData(MEDIA_INDEX_MD, m_pConnMgr->GetServerIndex()+pInfo->uChannelNum, &mdaux, NULL); m_uMDBufIndex += mdaux.len; } return TRUE; } BOOL CProcessUserData::ProcessNetData() { NET5_EVENT_DATA Data; ULONG i; unsigned char pData[NVE_MAX_STR_LENGTH]; ULONG uPort = 1; ULONG uMaxSize = NVE_MAX_STR_LENGTH; ULONG uDataSize; if (m_pNet5Api->Net5GetEventData(CMN5_DT_NET_EX, &Data)) { switch(Data.uNetDataType) { case NET5_NDT_CHANGE_PROPERTY: { if (m_pConnMgr->GetProcessState() == CMN5_PS_RUN) { m_pCod5Api->Cod5Stop(); } for (i=0; iGetMediaInfo(i)) { m_pConnMgr->Reconnect(); } m_pConnMgr->GetMgrNVE()->UpdateMediaInfo(m_pConnMgr->GetServerIndex()+i, m_pConnMgr->GetMediaSettings(i), m_pConnMgr->GetServerAddr()); } if (m_pConnMgr->GetProcessState() == CMN5_PS_RUN) { if (!m_pCod5Api->Cod5Run()) { m_pConnMgr->Reconnect(); } } if (m_pConnMgr->GetMgrNVE()->GetCurDlg()) { m_pConnMgr->GetMgrNVE()->GetCurDlgPtr()->UpdateSetting(); } m_pMsgMgr->PushErrorCodeF("Property is changed"); m_pMsgMgr->Show(TRUE); } break; case NET5_NDT_RECV_SERIAL_DATA: ZeroMemory(pData, sizeof(pData)); m_pNet5Api->Net5Command(NET5_NC_RECV_SERIAL_DATA, &uPort, (ULONG*)pData, &uMaxSize, &uDataSize); if(!theApp.m_bIgnoreEventComm) { TRACE("read serial data\n"); TRACE("%s\n", (char*)pData); for (i=0; iPushErrorCodeF("0x%02x [%c]", pData[i], (char)pData[i]); } m_pMsgMgr->Show(TRUE); } break; case NET5_NDT_CONNECTION: TRACE("Connection is closed[%s]\n", m_pConnMgr->GetServerAddr()); m_pConnMgr->Reconnect(); } } return TRUE; } BOOL CProcessUserData::ProcessSensorData() { CMN5_SENSOR_STATUS_INFO SensorInfo; do { ZeroMemory(&SensorInfo, sizeof(SensorInfo)); if (!m_pCod5Api->Cod5GetEventData(CMN5_DT_SENSOR, &SensorInfo)) { m_pMsgMgr->PushErrorCodeF("Cod5GetEventData(CMN5_DT_SENSOR) failed"); m_pMsgMgr->Show(TRUE); return FALSE; } if (SensorInfo.uErrCode != CMN5_EC_NO_DATA) { m_pConnMgr->GetMgrNVE()->ShowDI(&SensorInfo, m_pConnMgr); } } while (SensorInfo.uErrCode != CMN5_EC_NO_DATA); return TRUE; } BOOL CProcessUserData::ProcessVStatusData() { CMN5_VIDEO_STATUS_INFO VStatusInfo; do { ZeroMemory(&VStatusInfo, sizeof(VStatusInfo)); if (!m_pCod5Api->Cod5GetEventData(CMN5_DT_VSTATUS, &VStatusInfo)) { m_pMsgMgr->PushErrorCodeF("Cod5GetEventData(CMN5_DT_VSTATUS) failed"); m_pMsgMgr->Show(TRUE); return FALSE; } if (VStatusInfo.uErrCode != CMN5_EC_NO_DATA) { m_pConnMgr->GetMgrNVE()->ShowVStatus(&VStatusInfo, m_pConnMgr); } } while(VStatusInfo.uErrCode != CMN5_EC_NO_DATA); return TRUE; } BOOL CProcessUserData::StartEventThread() { if (!m_UserThread.StartThread(ThreadEventDataProcStub, this, NULL, NULL)) { return FALSE; } return TRUE; } void CProcessUserData::StopEventThread() { m_UserThread.StopThread(0); } DWORD WINAPI CProcessUserData::ThreadEventDataProcStub(LPVOID lpParameter) { THREAD_PARAM_SET *pParamSet = (THREAD_PARAM_SET*)lpParameter; CProcessUserData *pProcUserData = (CProcessUserData*)pParamSet->pParam2; return static_cast(pProcUserData)->ThreadEventDataProc(lpParameter); } #define EVENT_THREAD_COUNT 5 #define INDEX_EVENT_KILL WAIT_OBJECT_0 + 0 #define INDEX_EVENT_COD WAIT_OBJECT_0 + 1 #define INDEX_EVENT_NET WAIT_OBJECT_0 + 2 #define INDEX_EVENT_SENSOR WAIT_OBJECT_0 + 3 #define INDEX_EVENT_VSTATUS WAIT_OBJECT_0 + 4 DWORD WINAPI CProcessUserData::ThreadEventDataProc(LPVOID lpParameter) { THREAD_PARAM_SET *pParamSet = (THREAD_PARAM_SET*)lpParameter; CUserThread *pUserThread = (CUserThread*)pParamSet->pParam1; CoInitialize(NULL); BOOL bRun = TRUE; ULONG uRet; HANDLE hEvents[EVENT_THREAD_COUNT] = { pUserThread->GetKillHandle(), m_hCodEvent, m_hNetEvent, m_hSensorEvent, m_hVStatusEvent }; while (bRun) { uRet = WaitForMultipleObjects(EVENT_THREAD_COUNT, hEvents, FALSE, INFINITE); switch(uRet) { case INDEX_EVENT_KILL: bRun = FALSE; break; case INDEX_EVENT_COD: ProcessMediaData(); break; case INDEX_EVENT_NET: ProcessNetData(); break; case INDEX_EVENT_SENSOR: ProcessSensorData(); break; case INDEX_EVENT_VSTATUS: ProcessVStatusData(); break; } } CoUninitialize(); return 0; }