DWORD rtspStream::SendThread(LPVOID lpParam)
{
	HANDLE pHandle[3] = {m_hExitEvent,m_hDelIPEvent,m_hSendEvent};
	while (1)
	{
		switch(WaitForMultipleObjects(3,pHandle,FALSE,1000/m_nFPS))
		{
		case WAIT_OBJECT_0:
			return 0;
		case WAIT_OBJECT_0+1:
			ResetEvent(m_hDelIPEvent);
			for (auto i = m_SessionList.begin();i != m_SessionList.end();)
			{
				if (i->second->state == -1 ) m_SessionList.erase(i++);				
				else i++;
			}
			break;
		case WAIT_OBJECT_0+2:
			ResetEvent(m_hSendEvent);
			EnterCriticalSection(&cs);
			memcpy(PYUVBuf,pLoadBuf,m_nWidth*m_nHeight * 2);
			LeaveCriticalSection(&cs);
			GetOneFrame();
			break;
		default:
			GetOneFrame();
			break;
		}
	}
	return 0;
}
示例#2
0
BOOL CFileStreamParser::OpenFile(LPCTSTR szFile)
{
	CloseFile();

	m_hFileStream = ::CreateFile(szFile,
		GENERIC_READ,
		FILE_SHARE_READ,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL);

	if (m_hFileStream != INVALID_HANDLE_VALUE)
	{
		_tcscpy(m_szFilename, szFile);

		std::auto_ptr<BYTE> streamData(new BYTE[ MAX_FRAME_LENGTH ]);
		memset(streamData.get(), 0, MAX_FRAME_LENGTH);
		FRAME_HEADER fh;
		INT nRet = GetOneFrame(streamData.get(), &fh);
		if (nRet <= 0)
		{
			nRet = GetOneFrame(streamData.get(), &fh);
			if ( nRet <= 0)
			{
				m_nFirstFrameTime = 0;
				m_nLastFrameTime = 0;
				return TRUE;
			}
		}
		m_nFirstFrameTime = htonl(fh.FrameTime);
		dwFileSize = GetFileSize();
		DWORD dwMovePos = dwFileSize-100;
		DWORD dwCurPos = 0;
		if (dwMovePos > 0 && INVALID_SET_FILE_POINTER != (dwCurPos = ::SetFilePointer(m_hFileStream, dwMovePos, 0, FILE_BEGIN)))
		{
			nRet = GetOneFrame(streamData.get(), &fh);
			while((nRet <= 0 && (dwMovePos - 100)) > 0 ||
				(nRet > 0 && (fh.FrameRate != 25 || fh.FrameType == 10)))
			{
				dwMovePos -= 100;
				if (INVALID_SET_FILE_POINTER == (dwCurPos = ::SetFilePointer(m_hFileStream, dwMovePos, 0, FILE_BEGIN)))
					break;
				nRet = GetOneFrame(streamData.get(), &fh);
			}
			if (nRet > 0)
			{
				m_nLastFrameTime = htonl(fh.FrameTime);
			}
		}
		::SetFilePointer(m_hFileStream, 0, 0, FILE_BEGIN);
		return TRUE;
	}
	return FALSE;
}
示例#3
0
AM_ERR CMp4Builder::put_AudioData(AM_U8* pData,
                                  AM_UINT dataSize,
                                  AM_U32 frameCount)
{
  AM_U8 *pFrameStart;
  AM_U32 frameSize;

  FeedStreamData(pData, dataSize, frameCount);

  while (GetOneFrame (&pFrameStart, &frameSize)) {
    AM_UINT   chunk_offset = mCurPos;
    AdtsHeader *adtsHeader = (AdtsHeader*)pFrameStart;
    AM_UINT  header_length = sizeof(AdtsHeader);

    if (AM_UNLIKELY((mCurPos + frameSize + MovieBox_SIZE) >
                     _record_info.max_filesize)) {
      return ME_TOO_MANY;
    }

    if (AM_UNLIKELY(frameSize < 7)) {
      return ME_ERROR;
    }
    if (AM_UNLIKELY(false == adtsHeader->IsSyncWordOk())) {
      return ME_ERROR;
    }
    if (AM_LIKELY(_audio_spec_config == 0xffff)) {
      _audio_spec_config = (((adtsHeader->AacAudioObjectType() << 11) |
                             (adtsHeader->AacFrequencyIndex() << 7)   |
                             (adtsHeader->AacChannelConf() << 3)) & 0xFFF8);
      INFO("Audio Spec Info: 0x%04x", _audio_spec_config);
    }
    if (AM_LIKELY(adtsHeader->AacFrameNumber() == 0)) {
      if (adtsHeader->ProtectionAbsent() == 0) { //adts_error_check
        header_length += 2;
      }
      //adts_fixed_header + adts_variable_header
      put_buffer(pFrameStart + header_length, frameSize - header_length);
    } else {
      //Todo
    }
    UpdateAudioIdx((frameSize - header_length), chunk_offset);
  }

  return ME_OK;
}