#pragma once /************************************************* Author: wangc Date:2023-05-06 Name:CVideoDataManager Description:实现视频数据包管理类。提供接口供外部保存和使用视频包 每个管理器 对应一个源CVideoSource和使用者CVideoProcess **************************************************/ #include #include const double TIME_MARK_VAINTERVAL = 0.02; const double TIME_SYNC_VAINTERVAL = 0.04; class AVPacket; class AVFrame; enum en_state_use { NO_USE, USING, USED }; class CPacketInfo { public: CPacketInfo(int64_t pts, AVPacket* pPkt); ~CPacketInfo(); public: //时间戳 int64_t m_nPts; //数据 AVPacket* m_pPkt; //同步标识 bool m_bTimeMark; en_state_use m_UseState; double m_dPtzAngle; }; class CVideoDataManager { public: CVideoDataManager(); ~CVideoDataManager(); public: //数据源通知音频信息时间戳 void SetAutdioPts(double curAutdioPts); //保存接收到的视频包 void AddRecvData(int64_t pts, AVPacket* pPkt, bool bIData); //找到第一个视频数据,一般是之后全景对应的管理类对象使用 bool PopData(int64_t & pts, double& dPts, CPacketInfo* &pPack); //通过传入的时间戳,计算出这个类对象对应的数据。 //一般通过基准的一路数据PopData来拿到一个数据帧,其他路通过GetRecvData获取基准路对应的同步视频帧 bool GetRecvData(int64_t nPts, double dPts, CPacketInfo* &pPack); //对齐接收到的数据。 bool AlignRecvData(); //清除数据,这里清除的是接收到的包,不包括同步后的包 void Clear(); //添加同步之后的压缩帧 bool AddSyncData(CPacketInfo* pPack); //获取同步之后的压缩帧 bool GetSyncData(CPacketInfo* & pPack); //释放用完的压缩帧 void ReleaseSyncData(CPacketInfo* pPack); //获取同步的帧数 size_t GetSyncDataCount(); //添加解码之后的视频帧 bool AddDecoderData(uint8_t* pData, double dPtzAngle); //获取解码之后的视频帧 bool GetDecoderData(uint8_t*& pData, int & nDataSize, double & dPtzAngle); //释放解码之后的数据帧 void ReleaseDecoderData(uint8_t* pData); //获取已解码的帧数 int GetDecoderDataCount(); void SetDecodeDataSize(const int nSzie) { m_nDataDecodeSize = nSzie; } private: //同步之前的数据,为数据源接收到的数据,包含时间戳等信息 std::mutex m_lockRecv; std::vector m_vecRecvPacket; //同步之后的数据 std::mutex m_lockSync; std::vector m_vecPacketSync; //解码之后的数据 std::mutex m_lockDecoder; //统一用yuv420格式数据 std::vector m_vecFrameDecoder; std::vector m_vecPtzAngleDecoder; //解码后数据帧的单帧长度 int m_nDataDecodeSize; double m_curAutdioPts{ -1 }; //对应音频同步信号的 视频时间戳 int64_t m_curVideoPts{ 0 }; int m_nMarkAudioIndex{ -1 }; int m_nMarkVideoIndex{ -1 }; int m_nPktIndex{ 0 }; double m_syncVideoPts{ 0 }; };