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 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #include "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. webrtc::SdpParseError error;
  35. std::unique_ptr<webrtc::SessionDescriptionInterface> desc =
  36. webrtc::CreateSessionDescription(webrtc::SdpType::kOffer, sdp, &error);
  37. if (!desc.get()) {
  38. observer_.onError(ConductorObserver::ErrorType::RECEIVE_OFFER,
  39. std::move(error.description));
  40. return;
  41. }
  42. receiveOffer(std::move(desc));
  43. }
  44. void Conductor::receiveOffer(std::unique_ptr<webrtc::SessionDescriptionInterface> offer) {
  45. ensurePeerConnection();
  46. peer_conn_->SetRemoteDescription(
  47. SetSessionDescriptionObserver::Create(observer_),
  48. offer.release());
  49. peer_conn_->CreateAnswer(
  50. this, webrtc::PeerConnectionInterface::RTCOfferAnswerOptions());
  51. }
  52. void Conductor::receiveIceCandidate(std::string mid, int index, std::string sdp) {
  53. webrtc::SdpParseError error;
  54. std::unique_ptr<webrtc::IceCandidateInterface> candidate(
  55. webrtc::CreateIceCandidate(mid, index, sdp, &error));
  56. if (!candidate.get()) {
  57. observer_.onError(ConductorObserver::ErrorType::WARNING,
  58. std::move(error.description));
  59. return;
  60. }
  61. if (!peer_conn_->AddIceCandidate(candidate.get())) {
  62. observer_.onError(ConductorObserver::ErrorType::WARNING,
  63. "Failed to apply the received candidate");
  64. return;
  65. }
  66. }
  67. void Conductor::ensurePeerConnection() {
  68. if (peer_conn_factory_.get())
  69. return;
  70. peer_conn_factory_ = doCreatePeerConnectionFactory();
  71. peer_conn_ = doCreatePeerConnection(*peer_conn_factory_);
  72. }
  73. void Conductor::OnAddTrack(
  74. rtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver,
  75. const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>> &streams) {
  76. observer_.onRemoteTrack(std::move(receiver->track()));
  77. }
  78. void Conductor::OnRemoveTrack(
  79. rtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver) {
  80. observer_.removeRemoteTrack(std::move(receiver->track()));
  81. }
  82. void Conductor::OnIceCandidate(const webrtc::IceCandidateInterface* candidate) {
  83. std::string sdp;
  84. if (!candidate->ToString(&sdp)) {
  85. observer_.onError(ConductorObserver::ErrorType::WARNING,
  86. "Failed to serialize candidate");
  87. return;
  88. }
  89. observer_.onIceCandidate(
  90. std::move(candidate->sdp_mid()),
  91. candidate->sdp_mline_index(),
  92. std::move(sdp));
  93. }
  94. rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface>
  95. Conductor::doCreatePeerConnectionFactory() {
  96. return webrtc::CreatePeerConnectionFactory(
  97. nullptr /* network_thread */, nullptr /* worker_thread */,
  98. nullptr /* signaling_thread */, nullptr /* default_adm */,
  99. webrtc::CreateBuiltinAudioEncoderFactory(),
  100. webrtc::CreateBuiltinAudioDecoderFactory(),
  101. webrtc::CreateBuiltinVideoEncoderFactory(),
  102. webrtc::CreateBuiltinVideoDecoderFactory(), nullptr /* audio_mixer */,
  103. nullptr /* audio_processing */);
  104. }
  105. rtc::scoped_refptr<webrtc::PeerConnectionInterface>
  106. Conductor::doCreatePeerConnection(webrtc::PeerConnectionFactoryInterface &factory) {
  107. webrtc::PeerConnectionInterface::RTCConfiguration config;
  108. config.sdp_semantics = webrtc::SdpSemantics::kUnifiedPlan;
  109. webrtc::PeerConnectionInterface::IceServer server;
  110. const char *uri = getenv("WEBRTC_CONNECT");
  111. if (uri) {
  112. server.uri = uri;
  113. } else {
  114. server.uri = "stun:stun.l.google.com:19302";
  115. }
  116. config.servers.push_back(server);
  117. rtc::scoped_refptr<webrtc::PeerConnectionInterface> conn =
  118. factory.CreatePeerConnection(
  119. config, nullptr, nullptr, this);
  120. doAddTracks(*conn);
  121. return conn;
  122. }
  123. void Conductor::OnSuccess(webrtc::SessionDescriptionInterface *desc) {
  124. peer_conn_->SetLocalDescription(
  125. SetSessionDescriptionObserver::Create(observer_), desc);
  126. std::string sdp;
  127. desc->ToString(&sdp);
  128. observer_.onAnswer(std::move(sdp));
  129. }
  130. void Conductor::OnFailure(webrtc::RTCError error) {
  131. observer_.onError(ConductorObserver::ErrorType::WARNING,
  132. error.message());
  133. }
  134. }