CVideoDataManager.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. #include "CVideoDataManager.h"
  2. #include <fstream>
  3. extern "C"
  4. {
  5. #include "libavcodec/avcodec.h"
  6. #include "libavformat/avformat.h"
  7. };
  8. CPacketInfo::CPacketInfo(int64_t pts, AVPacket* pPkt)
  9. {
  10. m_nPts = pts;
  11. m_bTimeMark = false;
  12. m_pPkt = pPkt;
  13. m_UseState = NO_USE;
  14. }
  15. CPacketInfo::~CPacketInfo()
  16. {
  17. if (m_pPkt)
  18. {
  19. av_packet_free(&m_pPkt);
  20. m_pPkt = nullptr;
  21. }
  22. }
  23. CVideoDataManager::CVideoDataManager()
  24. {
  25. }
  26. CVideoDataManager::~CVideoDataManager()
  27. {
  28. }
  29. void CVideoDataManager::AddRecvData(int64_t pts, AVPacket* pAvpkt, bool bIData)
  30. {
  31. if (pAvpkt ==nullptr || pAvpkt->size<=0)
  32. {
  33. return;
  34. }
  35. double ptsVideo = pts;
  36. AVRational ar{ 1,90000 };
  37. ptsVideo *= av_q2d(ar);
  38. if (abs(ptsVideo - m_syncVideoPts) < TIME_SYNC_VAINTERVAL)
  39. {
  40. //OutputDebugPrintf("VideoPlayer CVideoDataManager AddData ptsVideo %lf %d", ptsVideo, this);
  41. }
  42. CPacketInfo *pPkt = new CPacketInfo(pts, pAvpkt);
  43. m_lockRecv.lock();
  44. m_vecRecvPacket.emplace_back(pPkt);
  45. m_lockRecv.unlock();
  46. }
  47. bool CVideoDataManager::GetRecvData(int64_t nPts, double dPts, CPacketInfo* &pPack)
  48. {
  49. std::lock_guard<std::mutex> lock(m_lockRecv);
  50. if (m_vecRecvPacket.size()<=0)
  51. {
  52. return false;
  53. }
  54. pPack = *m_vecRecvPacket.begin();
  55. m_vecRecvPacket.erase(m_vecRecvPacket.begin());
  56. return true;
  57. for (auto it = m_vecRecvPacket.begin(); it != m_vecRecvPacket.end(); it++)
  58. {
  59. double ptsVideo = (*it)->m_nPts;
  60. AVRational ar{ 1,90000 };
  61. ptsVideo *= av_q2d(ar);
  62. if (abs(ptsVideo - m_syncVideoPts - dPts) < TIME_SYNC_VAINTERVAL)
  63. {
  64. pPack = (*it);
  65. m_vecRecvPacket.erase(m_vecRecvPacket.begin());
  66. return true;
  67. }
  68. }
  69. double ptsVideo = (*m_vecRecvPacket.begin())->m_nPts;
  70. AVRational ar{ 1,90000 };
  71. ptsVideo *= av_q2d(ar);
  72. if (ptsVideo - m_syncVideoPts - dPts> TIME_SYNC_VAINTERVAL)
  73. {
  74. //OutputDebugPrintf("VideoPlayer CVideoDataManager TIME_SYNC_VAINTERVAL ");
  75. pPack = new CPacketInfo(0, nullptr);
  76. return true;
  77. }
  78. return false;
  79. }
  80. bool CVideoDataManager::AlignRecvData()
  81. {
  82. m_lockRecv.lock();
  83. bool bHave = false;
  84. auto it = m_vecRecvPacket.begin();
  85. for (it = m_vecRecvPacket.begin(); it != m_vecRecvPacket.end();)
  86. {
  87. CPacketInfo *pPkt = *it;
  88. double ptsVideo = pPkt->m_nPts;
  89. AVRational ar{ 1,90000 };
  90. ptsVideo *= av_q2d(ar);
  91. if (abs(ptsVideo - m_curAutdioPts) < TIME_MARK_VAINTERVAL)
  92. {
  93. m_curVideoPts = pPkt->m_nPts;
  94. m_syncVideoPts = ptsVideo;
  95. m_nMarkVideoIndex = m_nMarkAudioIndex;
  96. pPkt->m_bTimeMark = true;
  97. //OutputDebugPrintf("VideoPlayer UpdateData m_syncVideoPts %lf m_curAutdioPts %lf %d", m_syncVideoPts, m_curAutdioPts,this);
  98. bHave = true;
  99. break;
  100. }
  101. else
  102. {
  103. delete pPkt;
  104. it = m_vecRecvPacket.erase(it);
  105. }
  106. }
  107. m_lockRecv.unlock();
  108. return bHave;
  109. }
  110. void CVideoDataManager::Clear()
  111. {
  112. std::lock_guard<std::mutex> lock(m_lockRecv);
  113. for (auto it = m_vecRecvPacket.begin(); it != m_vecRecvPacket.end(); it++)
  114. {
  115. CPacketInfo *pPkt = *it;
  116. delete pPkt;
  117. pPkt = nullptr;
  118. }
  119. m_vecRecvPacket.clear();
  120. }
  121. bool CVideoDataManager::PopData(int64_t & pts, double& dPts, CPacketInfo* &pPack)
  122. {
  123. std::lock_guard<std::mutex> lock(m_lockRecv);
  124. if (m_vecRecvPacket.size()>0)
  125. {
  126. pts = (*m_vecRecvPacket.begin())->m_nPts;
  127. pPack = *m_vecRecvPacket.begin();
  128. dPts = pts;
  129. AVRational ar{ 1,90000 };
  130. dPts *= av_q2d(ar);
  131. dPts = dPts - m_syncVideoPts;
  132. //bool b = (*m_vecRecvPacket.begin())->m_bTimeMark;
  133. m_vecRecvPacket.erase(m_vecRecvPacket.begin());
  134. return true;
  135. }
  136. return false;
  137. }
  138. void CVideoDataManager::SetAutdioPts(double curAutdioPts)
  139. {
  140. m_curAutdioPts = curAutdioPts;
  141. }
  142. bool CVideoDataManager::AddSyncData(CPacketInfo* pPack)
  143. {
  144. //return true;
  145. std::lock_guard<std::mutex> lock(m_lockSync);
  146. m_vecPacketSync.emplace_back(pPack);
  147. return true;
  148. }
  149. bool CVideoDataManager::GetSyncData(CPacketInfo*& pPack)
  150. {
  151. //return true;
  152. std::lock_guard<std::mutex> lock(m_lockSync);
  153. if (m_vecPacketSync.size()>0)
  154. {
  155. pPack = *m_vecPacketSync.begin();
  156. m_vecPacketSync.erase(m_vecPacketSync.begin());
  157. return true;
  158. }
  159. return false;
  160. }
  161. void CVideoDataManager::ReleaseSyncData(CPacketInfo* pPack)
  162. {
  163. if (pPack!=nullptr)
  164. {
  165. delete pPack;
  166. pPack = nullptr;
  167. }
  168. }
  169. size_t CVideoDataManager::GetSyncDataCount()
  170. {
  171. return m_vecPacketSync.size();
  172. }
  173. bool CVideoDataManager::AddDecoderData(uint8_t* pData, double dPtzAngle)
  174. {
  175. std::lock_guard<std::mutex> lock(m_lockDecoder);
  176. if (m_vecFrameDecoder.size()<2)
  177. {
  178. m_vecFrameDecoder.emplace_back(pData);
  179. m_vecPtzAngleDecoder.emplace_back(dPtzAngle);
  180. }
  181. else
  182. {
  183. delete[]pData;
  184. }
  185. return false;
  186. }
  187. bool CVideoDataManager::GetDecoderData(uint8_t*& pData, int& nDataSize, double& dPtzAngle)
  188. {
  189. std::lock_guard<std::mutex> lock(m_lockDecoder);
  190. if (m_vecFrameDecoder.size() > 0)
  191. {
  192. pData = *m_vecFrameDecoder.begin();
  193. dPtzAngle = *m_vecPtzAngleDecoder.begin();
  194. m_vecFrameDecoder.erase(m_vecFrameDecoder.begin());
  195. m_vecPtzAngleDecoder.erase(m_vecPtzAngleDecoder.begin());
  196. nDataSize = m_nDataDecodeSize;
  197. return true;
  198. }
  199. return false;
  200. }
  201. void CVideoDataManager::ReleaseDecoderData(uint8_t* pData)
  202. {
  203. if (pData)
  204. {
  205. delete[]pData;
  206. pData = nullptr;
  207. }
  208. }
  209. int CVideoDataManager::GetDecoderDataCount()
  210. {
  211. return m_vecFrameDecoder.size();
  212. }