#pragma once #include #include #include #include #include /************************************************************************************** 功能点和关键点: 1、保存视频帧 2、接收音频信号的同步消息,并执行同步 3、建立同步帧缓冲区 4、给解码模块提供同步后视频帧 5、删除视频帧,确定在下一帧已经收到的情况下才可以删除,因为可能要补帧 6、音频失步之后处理。 7、帧比对都以全景的时间戳和播放时间为基准 *************************************************************************************/ class CPacketInfo; class CVideoDataManager; class AVCodecContext; class AVPacket; class AVFrame; //最大的同步之后的数据包队列 #define MAX_SYNCOACKET_QUEUE 25 #define VIDEO_TIME_INTERVAL 40 class CSyncProc { public: CSyncProc(); ~CSyncProc(); CSyncProc(const CSyncProc& proc); CSyncProc & operator=(const CSyncProc& proc); public: typedef std::function FunUpdate; struct TimeParam { void * pParam; double dTime; }; public: static CSyncProc& getInstance(); void AddFun(void * p, FunUpdate fun); bool UpdateTimeQueue(CVideoDataManager * pMan, double dTime); //音频同步信号收全后,要对数据包进行对齐。 static unsigned __stdcall SyncThread(void * param); void SyncProcessor(); bool GetSync() { return /*true*/ m_bSync; } //接收到的m_vecPacket数据整理到m_qPacket。 static unsigned __stdcall RecvDataToSyncDataThread(void * param); void RecvDataToSyncDataProcessor(); void AddDataManager(CVideoDataManager * pMan); void Start(); private: std::mutex m_lockTime; //m_maxInternal单位是s ,音频信号队列收全后,执行m_mapFun函数,对包进行对齐 double m_maxInternal{ 5}; std::queue m_qTimeParam; std::map m_mapFun; bool m_bSync{ false }; //所有的数据管理对象 std::mutex m_lockManager; std::vector m_vecPacketManager; };