You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Conductor.cc 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. #include <rtcutil/Conductor.h>
  2. #include <webrtc/api/create_peerconnection_factory.h>
  3. #include <webrtc/api/audio_codecs/builtin_audio_encoder_factory.h>
  4. #include <webrtc/api/audio_codecs/builtin_audio_decoder_factory.h>
  5. #include <webrtc/api/video_codecs/builtin_video_encoder_factory.h>
  6. #include <webrtc/api/video_codecs/builtin_video_decoder_factory.h>
  7. #include <webrtc/pc/video_track_source.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. namespace rtcutil {
  11. void ConductorObserver::onError(ErrorType type, std::string err) {
  12. if (type == ErrorType::WARNING) {
  13. fprintf(stderr, "Warning: %s\n", err.c_str());
  14. } else {
  15. fprintf(stderr, "Error: %s\n", err.c_str());
  16. abort();
  17. }
  18. }
  19. class SetSessionDescriptionObserver: public webrtc::SetSessionDescriptionObserver {
  20. public:
  21. SetSessionDescriptionObserver(ConductorObserver &observer): observer_(observer) {}
  22. static SetSessionDescriptionObserver* Create(ConductorObserver &observer) {
  23. return new rtc::RefCountedObject<SetSessionDescriptionObserver>(observer);
  24. }
  25. virtual void OnSuccess() {}
  26. virtual void OnFailure(webrtc::RTCError error) {
  27. observer_.onError(ConductorObserver::ErrorType::RECEIVE_OFFER,
  28. error.message());
  29. }
  30. private:
  31. ConductorObserver &observer_;
  32. };
  33. void Conductor::receiveOffer(const std::string &sdp) {
  34. printf("receive offer 1\n");
  35. webrtc::SdpParseError error;
  36. std::unique_ptr<webrtc::SessionDescriptionInterface> desc =
  37. webrtc::CreateSessionDescription(webrtc::SdpType::kOffer, sdp, &error);
  38. if (!desc.get()) {
  39. observer_.onError(ConductorObserver::ErrorType::RECEIVE_OFFER,
  40. std::move(error.description));
  41. return;
  42. }
  43. receiveOffer(std::move(desc));
  44. }
  45. void Conductor::receiveOffer(std::unique_ptr<webrtc::SessionDescriptionInterface> offer) {
  46. printf("receive offer 2\n");
  47. ensurePeerConnection();
  48. peer_conn_->SetRemoteDescription(
  49. SetSessionDescriptionObserver::Create(observer_),
  50. offer.release());
  51. peer_conn_->CreateAnswer(
  52. this, webrtc::PeerConnectionInterface::RTCOfferAnswerOptions());
  53. }
  54. void Conductor::receiveIceCandidate(std::string mid, int index, std::string sdp) {
  55. printf("receive ice candidate\n");
  56. webrtc::SdpParseError error;
  57. std::unique_ptr<webrtc::IceCandidateInterface> candidate(
  58. webrtc::CreateIceCandidate(mid, index, sdp, &error));
  59. if (!candidate.get()) {
  60. observer_.onError(ConductorObserver::ErrorType::WARNING,
  61. std::move(error.description));
  62. return;
  63. }
  64. if (!peer_conn_->AddIceCandidate(candidate.get())) {
  65. observer_.onError(ConductorObserver::ErrorType::WARNING,
  66. "Failed to apply the received candidate");
  67. return;
  68. }
  69. }
  70. void Conductor::ensurePeerConnection() {
  71. if (peer_conn_factory_.get())
  72. return;
  73. peer_conn_factory_ = doCreatePeerConnectionFactory();
  74. peer_conn_ = doCreatePeerConnection(*peer_conn_factory_);
  75. }
  76. void Conductor::OnAddTrack(
  77. rtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver,
  78. const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>> &streams) {
  79. observer_.onRemoteTrack(std::move(receiver->track()));
  80. }
  81. void Conductor::OnRemoveTrack(
  82. rtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver) {
  83. observer_.removeRemoteTrack(std::move(receiver->track()));
  84. }
  85. void Conductor::OnIceCandidate(const webrtc::IceCandidateInterface* candidate) {
  86. std::string sdp;
  87. if (!candidate->ToString(&sdp)) {
  88. observer_.onError(ConductorObserver::ErrorType::WARNING,
  89. "Failed to serialize candidate");
  90. return;
  91. }
  92. observer_.onIceCandidate(
  93. std::move(candidate->sdp_mid()),
  94. candidate->sdp_mline_index(),
  95. std::move(sdp));
  96. }
  97. rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface>
  98. Conductor::doCreatePeerConnectionFactory() {
  99. return webrtc::CreatePeerConnectionFactory(
  100. nullptr /* network_thread */, nullptr /* worker_thread */,
  101. nullptr /* signaling_thread */, nullptr /* default_adm */,
  102. webrtc::CreateBuiltinAudioEncoderFactory(),
  103. webrtc::CreateBuiltinAudioDecoderFactory(),
  104. webrtc::CreateBuiltinVideoEncoderFactory(),
  105. webrtc::CreateBuiltinVideoDecoderFactory(), nullptr /* audio_mixer */,
  106. nullptr /* audio_processing */);
  107. }
  108. rtc::scoped_refptr<webrtc::PeerConnectionInterface>
  109. Conductor::doCreatePeerConnection(webrtc::PeerConnectionFactoryInterface &factory) {
  110. webrtc::PeerConnectionInterface::RTCConfiguration config;
  111. config.sdp_semantics = webrtc::SdpSemantics::kUnifiedPlan;
  112. webrtc::PeerConnectionInterface::IceServer server;
  113. const char *uri = getenv("WEBRTC_CONNECT");
  114. if (uri) {
  115. server.uri = uri;
  116. } else {
  117. server.uri = "stun:stun.l.google.com:19302";
  118. }
  119. config.servers.push_back(server);
  120. rtc::scoped_refptr<webrtc::PeerConnectionInterface> conn =
  121. factory.CreatePeerConnection(
  122. config, nullptr, nullptr, this);
  123. doAddTracks(*conn);
  124. return conn;
  125. }
  126. void Conductor::OnSuccess(webrtc::SessionDescriptionInterface *desc) {
  127. fprintf(stderr, "on success; got answer\n");
  128. peer_conn_->SetLocalDescription(
  129. SetSessionDescriptionObserver::Create(observer_), desc);
  130. std::string sdp;
  131. desc->ToString(&sdp);
  132. observer_.onAnswer(std::move(sdp));
  133. }
  134. void Conductor::OnFailure(webrtc::RTCError error) {
  135. observer_.onError(ConductorObserver::ErrorType::WARNING,
  136. error.message());
  137. }
  138. }