123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- #pragma once
- /*************************************************
- Author: wangc
- Date:2023-05-06
- Name:CVideoDataManager
- Description:实现视频数据包管理类。提供接口供外部保存和使用视频包
- 每个管理器 对应一个源CVideoSource和使用者CVideoProcess
- **************************************************/
- #include <vector>
- #include <mutex>
- 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<CPacketInfo *> m_vecRecvPacket;
-
- //同步之后的数据
- std::mutex m_lockSync;
- std::vector<CPacketInfo*> m_vecPacketSync;
- //解码之后的数据
- std::mutex m_lockDecoder;
- //统一用yuv420格式数据
- std::vector<uint8_t*> m_vecFrameDecoder;
- std::vector<double> 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 };
- };
|