PeerConnection.cpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include <assert.h>
  2. #include <iostream>
  3. #include <memory>
  4. #include "../common/comm.h"
  5. #include "api.h"
  6. #include "Protocol.pb.h"
  7. #include "../common/socket_client.h"
  8. #include "../common/iobuffer.h"
  9. #include "PeerConnection.h"
  10. #include "VideoRenderer.h"
  11. #include "message_queue.h"
  12. PeerConnectionWrapper::PeerConnectionWrapper(SocketClient* d) :_client(d)
  13. {
  14. _nativeHandle = nullptr;
  15. }
  16. PeerConnectionWrapper::~PeerConnectionWrapper()
  17. {
  18. if (_nativeHandle != nullptr)
  19. {
  20. }
  21. }
  22. void PeerConnectionWrapper::Initialize(int32_t peer,int32_t index ,bool bNeedData)
  23. {
  24. bDataChannel=bNeedData;
  25. _nativeHandle = mrsPeerConnectionCreate();
  26. std::cout<<"native handle"<<_nativeHandle<<std::endl;
  27. if (_nativeHandle == nullptr)
  28. {
  29. mrsPeerConnectionClose(&_nativeHandle);
  30. _nativeHandle = nullptr;
  31. return;
  32. }
  33. mrsPeerConnectionRegisterConnectedCallback(_nativeHandle, &PeerConnectionWrapper::ConnectionCallBack, this);
  34. mrsPeerConnectionRegisterLocalSdpReadytoSendCallback(_nativeHandle,peer,index, &PeerConnectionWrapper::LocalSdpReadytoSendCallback, this);
  35. mrsPeerConnectionRegisterIceCandidateReadytoSendCallback(_nativeHandle,peer,index, &PeerConnectionWrapper::IceCandidateReadytoSendCallback, this);
  36. if(bNeedData)
  37. mrsPeerConnectionRegisterChannelCallback(_nativeHandle, &SocketClient::MessageCallback, _client, nullptr, nullptr, nullptr, nullptr);
  38. }
  39. void PeerConnectionWrapper::Close()
  40. {
  41. if(_nativeHandle==nullptr) return;
  42. mrsPeerConnectionRegisterConnectedCallback(_nativeHandle, nullptr, nullptr);
  43. mrsPeerConnectionRegisterLocalSdpReadytoSendCallback(_nativeHandle,0,0, nullptr, nullptr);
  44. mrsPeerConnectionRegisterIceCandidateReadytoSendCallback(_nativeHandle,0, 0,nullptr, nullptr);
  45. if(bDataChannel)
  46. mrsPeerConnectionRemoveDataChannel(_nativeHandle);
  47. mrsPeerConnectionClose(&_nativeHandle);
  48. _nativeHandle=nullptr;
  49. }
  50. void PeerConnectionWrapper::AddDataChannel(bool ordered, bool reliable)
  51. {
  52. mrsPeerConnectionAddDataChannel(_nativeHandle, ordered, reliable);
  53. }
  54. void PeerConnectionWrapper::RemoveDataChannel()
  55. {
  56. mrsPeerConnectionRemoveDataChannel(_nativeHandle);
  57. }
  58. void PeerConnectionWrapper::ConnectionCallBack(void* UserData)
  59. {
  60. PeerConnectionWrapper* lhs = static_cast<PeerConnectionWrapper*>(UserData);
  61. lhs->OnConnect();
  62. }
  63. void PeerConnectionWrapper::OnConnect()
  64. {
  65. bConnected = true;
  66. }
  67. const std::string kOffer = "offer";
  68. const std::string kAnswer = "answer";
  69. void PeerConnectionWrapper::LocalSdpReadytoSendCallback(void* user_data,int32_t peer,int32_t view, const char* type, const char* sdp_data)
  70. {
  71. auto lhs = static_cast<PeerConnectionWrapper*>(user_data);
  72. lhs->OnLocalSdpReadytoSend(peer,view,type, sdp_data);
  73. }
  74. void PeerConnectionWrapper::OnLocalSdpReadytoSend(int32_t peer,int32_t view,const char* type, const char* sdp)
  75. {
  76. //std::string newsdp = ForceSdpCodecs(sdp, PreferredAudioCodec, PreferredAudioCodecExtraParamsRemote, PreferredVideoCodec, PreferredVideoCodecExtraParamsRemote);
  77. //std::cout<<type<<","<<__LINE__<<std::endl;
  78. if (kOffer == type)
  79. {
  80. _client->WriteOffer(EgoType::User,peer,view, type, sdp);
  81. }
  82. else if(kAnswer==type)
  83. {
  84. _client->WriteAnswer(EgoType::User,peer,view, type, sdp);
  85. }
  86. //mrsWe
  87. }
  88. void PeerConnectionWrapper::SetRemoteDescription(const char* type, std::string sdp)
  89. {
  90. //std::string newsdp = ForceSdpCodecs(sdp, PreferredAudioCodec, PreferredAudioCodecExtraParamsLocal, PreferredVideoCodec, PreferredVideoCodecExtraParamsLocal);
  91. auto ret = mrsPeerConnectionSetRemoteDescription(_nativeHandle, type, sdp.c_str());
  92. assert(ret == true);
  93. }
  94. void PeerConnectionWrapper::IceCandidateReadytoSendCallback(void* user_data,int32_t peer,int32_t index, const char* sdp, int32_t sdp_mline_index, const char* sdp_mid)
  95. {
  96. auto lhs = static_cast<PeerConnectionWrapper*>(user_data);
  97. lhs->OnIceCandidateReadytoSend(peer,index,sdp, sdp_mline_index, sdp_mid);
  98. }
  99. void PeerConnectionWrapper::OnIceCandidateReadytoSend(int32_t peer,int32_t index,const char* candidate, int32_t sdp_mline_index, const char* sdp_mid)
  100. {
  101. _client->WriteCandidate(EgoType::User,peer,index, candidate, sdp_mline_index, sdp_mid);
  102. }
  103. void PeerConnectionWrapper::AddIceCandidate(const char* sdp, int32_t sdp_mline_index, const char* sdp_mid)
  104. {
  105. auto ret = mrsPeerConnectionAddIceCandidate(_nativeHandle, sdp, sdp_mline_index, sdp_mid);
  106. assert(ret == true);
  107. }
  108. bool PeerConnectionWrapper::CreateOffer()
  109. {
  110. // std::cout<<__FUNCTION__<<","<<__LINE__<<std::endl;
  111. auto ret = mrsPeerConnectionCreateOffer(_nativeHandle);// == mrsResult::kSuccess;
  112. assert(ret == true);
  113. return true;
  114. }
  115. bool PeerConnectionWrapper::CreateAnswer()
  116. {
  117. //std::cout<<__FUNCTION__<<","<<__LINE__<<std::endl;
  118. auto ret = mrsPeerConnectionCreateAnswer(_nativeHandle); ;
  119. assert(ret == true);
  120. return true;
  121. }
  122. void PeerConnectionWrapper::AddLocalArgb32VideoFrameReady(PeerConnectionARGBVideoFrameCallback fn, void* user_data)
  123. {
  124. mrsPeerConnectionRegisterARGBLocalVideoFrameCallback(_nativeHandle, fn, user_data);
  125. }
  126. void PeerConnectionWrapper::AddRemoteArgb32VideoFrameReady(PeerConnectionARGBVideoFrameCallback fn, void* user_data)
  127. {
  128. mrsPeerConnectionRegisterARGBRemoteVideoFrameCallback(_nativeHandle, fn, user_data);
  129. }
  130. /*
  131. void PeerConnectionWrapper::AddLocalVideoTrack(CaptureType type, DisplayResolution solution,int32_t fps)
  132. {
  133. auto ret = mrsPeerConnectionAddLocalVideoTrack(_nativeHandle,type,solution,fps);
  134. assert(ret == true);
  135. }
  136. */
  137. void PeerConnectionWrapper::AddLocalVideoTrack(int32_t rotation,const std::string& label,const std::string &videourl,std::int32_t width,std::int32_t height)
  138. {
  139. auto ret=mrsPeerConnectionAddLocalRtspTrack(_nativeHandle,label,videourl,rotation,width,height);
  140. }
  141. void PeerConnectionWrapper::AddLocalAudioTrack()
  142. {
  143. auto ret = mrsPeerConnectionAddLocalAudioTrack(_nativeHandle);
  144. assert(ret == true);
  145. }
  146. void PeerConnectionWrapper::MessageCallback(void* user_data, const void* data, const uint64_t size)
  147. {
  148. }
  149. void PeerConnectionWrapper::SendData(CIOBuffer* pBuffer)
  150. {
  151. auto ret=mrsPeerConnectionSendDataChannelMessage(_nativeHandle,pBuffer->Buffer,pBuffer->Length);
  152. //assert(ret==true);
  153. if(ret==false)
  154. {
  155. printf("send failed to Peer \n");
  156. }
  157. }