CVideoDataManager.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #pragma once
  2. /*************************************************
  3. Author: wangc
  4. Date:2023-05-06
  5. Name:CVideoDataManager
  6. Description:实现视频数据包管理类。提供接口供外部保存和使用视频包
  7. 每个管理器 对应一个源CVideoSource和使用者CVideoProcess
  8. **************************************************/
  9. #include <vector>
  10. #include <mutex>
  11. const double TIME_MARK_VAINTERVAL = 0.02;
  12. const double TIME_SYNC_VAINTERVAL = 0.04;
  13. class AVPacket;
  14. class AVFrame;
  15. enum en_state_use
  16. {
  17. NO_USE,
  18. USING,
  19. USED
  20. };
  21. class CPacketInfo
  22. {
  23. public:
  24. CPacketInfo(int64_t pts, AVPacket* pPkt);
  25. ~CPacketInfo();
  26. public:
  27. //时间戳
  28. int64_t m_nPts;
  29. //数据
  30. AVPacket* m_pPkt;
  31. //同步标识
  32. bool m_bTimeMark;
  33. en_state_use m_UseState;
  34. double m_dPtzAngle;
  35. };
  36. class CVideoDataManager
  37. {
  38. public:
  39. CVideoDataManager();
  40. ~CVideoDataManager();
  41. public:
  42. //数据源通知音频信息时间戳
  43. void SetAutdioPts(double curAutdioPts);
  44. //保存接收到的视频包
  45. void AddRecvData(int64_t pts, AVPacket* pPkt, bool bIData);
  46. //找到第一个视频数据,一般是之后全景对应的管理类对象使用
  47. bool PopData(int64_t & pts, double& dPts, CPacketInfo* &pPack);
  48. //通过传入的时间戳,计算出这个类对象对应的数据。
  49. //一般通过基准的一路数据PopData来拿到一个数据帧,其他路通过GetRecvData获取基准路对应的同步视频帧
  50. bool GetRecvData(int64_t nPts, double dPts, CPacketInfo* &pPack);
  51. //对齐接收到的数据。
  52. bool AlignRecvData();
  53. //清除数据,这里清除的是接收到的包,不包括同步后的包
  54. void Clear();
  55. //添加同步之后的压缩帧
  56. bool AddSyncData(CPacketInfo* pPack);
  57. //获取同步之后的压缩帧
  58. bool GetSyncData(CPacketInfo* & pPack);
  59. //释放用完的压缩帧
  60. void ReleaseSyncData(CPacketInfo* pPack);
  61. //获取同步的帧数
  62. size_t GetSyncDataCount();
  63. //添加解码之后的视频帧
  64. bool AddDecoderData(uint8_t* pData, double dPtzAngle);
  65. //获取解码之后的视频帧
  66. bool GetDecoderData(uint8_t*& pData, int & nDataSize, double & dPtzAngle);
  67. //释放解码之后的数据帧
  68. void ReleaseDecoderData(uint8_t* pData);
  69. //获取已解码的帧数
  70. int GetDecoderDataCount();
  71. void SetDecodeDataSize(const int nSzie)
  72. {
  73. m_nDataDecodeSize = nSzie;
  74. }
  75. private:
  76. //同步之前的数据,为数据源接收到的数据,包含时间戳等信息
  77. std::mutex m_lockRecv;
  78. std::vector<CPacketInfo *> m_vecRecvPacket;
  79. //同步之后的数据
  80. std::mutex m_lockSync;
  81. std::vector<CPacketInfo*> m_vecPacketSync;
  82. //解码之后的数据
  83. std::mutex m_lockDecoder;
  84. //统一用yuv420格式数据
  85. std::vector<uint8_t*> m_vecFrameDecoder;
  86. std::vector<double> m_vecPtzAngleDecoder;
  87. //解码后数据帧的单帧长度
  88. int m_nDataDecodeSize;
  89. double m_curAutdioPts{ -1 };
  90. //对应音频同步信号的 视频时间戳
  91. int64_t m_curVideoPts{ 0 };
  92. int m_nMarkAudioIndex{ -1 };
  93. int m_nMarkVideoIndex{ -1 };
  94. int m_nPktIndex{ 0 };
  95. double m_syncVideoPts{ 0 };
  96. };