
This reverts commit 8b13f96e2d4b0449e54a3665121a4302ceb56e80. Original change's description: > Revert "Add AddTransceiver and GetTransceivers to PeerConnection" > > This reverts commit f93d2800d9b0d5818a5a383def0aaef3d441df3a. > > Reason for revert: https://logs.chromium.org/v/?s=chromium%2Fbb%2Fchromium.webrtc.fyi%2Fios-device%2F5804%2F%2B%2Frecipes%2Fsteps%2Fcompile%2F0%2Fstdout > > Original change's description: > > Add AddTransceiver and GetTransceivers to PeerConnection > > > > WebRTC 1.0 has added the transceiver API to PeerConnection. This > > is the first step towards exposing this to WebRTC consumers. For > > now, transceivers can be added and fetched but there is not yet > > support for creating offers/answers or setting local/remote > > descriptions. That support ("Unified Plan") will be added in > > follow-up CLs. > > > > The transceiver API is currently only available if the application > > opts in by specifying the kUnifiedPlan SDP semantics when creating > > the PeerConnection. > > > > Bug: webrtc:7600 > > Change-Id: I0b8ee24b489b45bb4c5f60b699bd20c61af01d8e > > Reviewed-on: https://webrtc-review.googlesource.com/23880 > > Commit-Queue: Steve Anton <steveanton@webrtc.org> > > Reviewed-by: Peter Thatcher <pthatcher@webrtc.org> > > Reviewed-by: Henrik Boström <hbos@webrtc.org> > > Cr-Commit-Position: refs/heads/master@{#20896} > > TBR=steveanton@webrtc.org,zhihuang@webrtc.org,hbos@webrtc.org,pthatcher@webrtc.org > > Change-Id: Ie91ea4988dba25c20e2532114d3a9d859a932d4c > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: webrtc:7600 > Reviewed-on: https://webrtc-review.googlesource.com/26400 > Reviewed-by: Steve Anton <steveanton@webrtc.org> > Commit-Queue: Steve Anton <steveanton@webrtc.org> > Cr-Commit-Position: refs/heads/master@{#20897} TBR=steveanton@webrtc.org,zhihuang@webrtc.org,hbos@webrtc.org,pthatcher@webrtc.org Change-Id: I19fdf08c54f09302794e998a0ffddb82ae0d7b41 No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: webrtc:7600 Reviewed-on: https://webrtc-review.googlesource.com/26401 Commit-Queue: Steve Anton <steveanton@webrtc.org> Reviewed-by: Steve Anton <steveanton@webrtc.org> Cr-Commit-Position: refs/heads/master@{#20898}
265 lines
8.5 KiB
C++
265 lines
8.5 KiB
C++
/*
|
|
* Copyright 2017 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#include "pc/peerconnectionwrapper.h"
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
#include "api/jsepsessiondescription.h"
|
|
#include "media/base/fakevideocapturer.h"
|
|
#include "pc/sdputils.h"
|
|
#include "rtc_base/function_view.h"
|
|
#include "rtc_base/gunit.h"
|
|
#include "rtc_base/ptr_util.h"
|
|
|
|
namespace webrtc {
|
|
|
|
namespace {
|
|
const uint32_t kDefaultTimeout = 10000U;
|
|
}
|
|
|
|
PeerConnectionWrapper::PeerConnectionWrapper(
|
|
rtc::scoped_refptr<PeerConnectionFactoryInterface> pc_factory,
|
|
rtc::scoped_refptr<PeerConnectionInterface> pc,
|
|
std::unique_ptr<MockPeerConnectionObserver> observer)
|
|
: pc_factory_(std::move(pc_factory)),
|
|
observer_(std::move(observer)),
|
|
pc_(std::move(pc)) {
|
|
RTC_DCHECK(pc_factory_);
|
|
RTC_DCHECK(pc_);
|
|
RTC_DCHECK(observer_);
|
|
observer_->SetPeerConnectionInterface(pc_.get());
|
|
}
|
|
|
|
PeerConnectionWrapper::~PeerConnectionWrapper() = default;
|
|
|
|
PeerConnectionFactoryInterface* PeerConnectionWrapper::pc_factory() {
|
|
return pc_factory_.get();
|
|
}
|
|
|
|
PeerConnectionInterface* PeerConnectionWrapper::pc() {
|
|
return pc_.get();
|
|
}
|
|
|
|
MockPeerConnectionObserver* PeerConnectionWrapper::observer() {
|
|
return observer_.get();
|
|
}
|
|
|
|
std::unique_ptr<SessionDescriptionInterface>
|
|
PeerConnectionWrapper::CreateOffer() {
|
|
return CreateOffer(PeerConnectionInterface::RTCOfferAnswerOptions());
|
|
}
|
|
|
|
std::unique_ptr<SessionDescriptionInterface> PeerConnectionWrapper::CreateOffer(
|
|
const PeerConnectionInterface::RTCOfferAnswerOptions& options,
|
|
std::string* error_out) {
|
|
return CreateSdp(
|
|
[this, options](CreateSessionDescriptionObserver* observer) {
|
|
pc()->CreateOffer(observer, options);
|
|
},
|
|
error_out);
|
|
}
|
|
|
|
std::unique_ptr<SessionDescriptionInterface>
|
|
PeerConnectionWrapper::CreateOfferAndSetAsLocal() {
|
|
return CreateOfferAndSetAsLocal(
|
|
PeerConnectionInterface::RTCOfferAnswerOptions());
|
|
}
|
|
|
|
std::unique_ptr<SessionDescriptionInterface>
|
|
PeerConnectionWrapper::CreateOfferAndSetAsLocal(
|
|
const PeerConnectionInterface::RTCOfferAnswerOptions& options) {
|
|
auto offer = CreateOffer(options);
|
|
if (!offer) {
|
|
return nullptr;
|
|
}
|
|
EXPECT_TRUE(SetLocalDescription(CloneSessionDescription(offer.get())));
|
|
return offer;
|
|
}
|
|
|
|
std::unique_ptr<SessionDescriptionInterface>
|
|
PeerConnectionWrapper::CreateAnswer() {
|
|
return CreateAnswer(PeerConnectionInterface::RTCOfferAnswerOptions());
|
|
}
|
|
|
|
std::unique_ptr<SessionDescriptionInterface>
|
|
PeerConnectionWrapper::CreateAnswer(
|
|
const PeerConnectionInterface::RTCOfferAnswerOptions& options,
|
|
std::string* error_out) {
|
|
return CreateSdp(
|
|
[this, options](CreateSessionDescriptionObserver* observer) {
|
|
pc()->CreateAnswer(observer, options);
|
|
},
|
|
error_out);
|
|
}
|
|
|
|
std::unique_ptr<SessionDescriptionInterface>
|
|
PeerConnectionWrapper::CreateAnswerAndSetAsLocal() {
|
|
return CreateAnswerAndSetAsLocal(
|
|
PeerConnectionInterface::RTCOfferAnswerOptions());
|
|
}
|
|
|
|
std::unique_ptr<SessionDescriptionInterface>
|
|
PeerConnectionWrapper::CreateAnswerAndSetAsLocal(
|
|
const PeerConnectionInterface::RTCOfferAnswerOptions& options) {
|
|
auto answer = CreateAnswer(options);
|
|
if (!answer) {
|
|
return nullptr;
|
|
}
|
|
EXPECT_TRUE(SetLocalDescription(CloneSessionDescription(answer.get())));
|
|
return answer;
|
|
}
|
|
|
|
std::unique_ptr<SessionDescriptionInterface> PeerConnectionWrapper::CreateSdp(
|
|
rtc::FunctionView<void(CreateSessionDescriptionObserver*)> fn,
|
|
std::string* error_out) {
|
|
rtc::scoped_refptr<MockCreateSessionDescriptionObserver> observer(
|
|
new rtc::RefCountedObject<MockCreateSessionDescriptionObserver>());
|
|
fn(observer);
|
|
EXPECT_EQ_WAIT(true, observer->called(), kDefaultTimeout);
|
|
if (error_out && !observer->result()) {
|
|
*error_out = observer->error();
|
|
}
|
|
return observer->MoveDescription();
|
|
}
|
|
|
|
bool PeerConnectionWrapper::SetLocalDescription(
|
|
std::unique_ptr<SessionDescriptionInterface> desc,
|
|
std::string* error_out) {
|
|
return SetSdp(
|
|
[this, &desc](SetSessionDescriptionObserver* observer) {
|
|
pc()->SetLocalDescription(observer, desc.release());
|
|
},
|
|
error_out);
|
|
}
|
|
|
|
bool PeerConnectionWrapper::SetRemoteDescription(
|
|
std::unique_ptr<SessionDescriptionInterface> desc,
|
|
std::string* error_out) {
|
|
return SetSdp(
|
|
[this, &desc](SetSessionDescriptionObserver* observer) {
|
|
pc()->SetRemoteDescription(observer, desc.release());
|
|
},
|
|
error_out);
|
|
}
|
|
|
|
bool PeerConnectionWrapper::SetRemoteDescription(
|
|
std::unique_ptr<SessionDescriptionInterface> desc,
|
|
RTCError* error_out) {
|
|
rtc::scoped_refptr<MockSetRemoteDescriptionObserver> observer =
|
|
new MockSetRemoteDescriptionObserver();
|
|
pc()->SetRemoteDescription(std::move(desc), observer);
|
|
EXPECT_EQ_WAIT(true, observer->called(), kDefaultTimeout);
|
|
bool ok = observer->error().ok();
|
|
if (error_out)
|
|
*error_out = std::move(observer->error());
|
|
return ok;
|
|
}
|
|
|
|
bool PeerConnectionWrapper::SetSdp(
|
|
rtc::FunctionView<void(SetSessionDescriptionObserver*)> fn,
|
|
std::string* error_out) {
|
|
rtc::scoped_refptr<MockSetSessionDescriptionObserver> observer(
|
|
new rtc::RefCountedObject<MockSetSessionDescriptionObserver>());
|
|
fn(observer);
|
|
EXPECT_EQ_WAIT(true, observer->called(), kDefaultTimeout);
|
|
if (error_out && !observer->result()) {
|
|
*error_out = observer->error();
|
|
}
|
|
return observer->result();
|
|
}
|
|
|
|
rtc::scoped_refptr<RtpTransceiverInterface>
|
|
PeerConnectionWrapper::AddTransceiver(cricket::MediaType media_type) {
|
|
RTCErrorOr<rtc::scoped_refptr<RtpTransceiverInterface>> result =
|
|
pc()->AddTransceiver(media_type);
|
|
EXPECT_EQ(RTCErrorType::NONE, result.error().type());
|
|
return result.MoveValue();
|
|
}
|
|
|
|
rtc::scoped_refptr<RtpTransceiverInterface>
|
|
PeerConnectionWrapper::AddTransceiver(cricket::MediaType media_type,
|
|
const RtpTransceiverInit& init) {
|
|
RTCErrorOr<rtc::scoped_refptr<RtpTransceiverInterface>> result =
|
|
pc()->AddTransceiver(media_type, init);
|
|
EXPECT_EQ(RTCErrorType::NONE, result.error().type());
|
|
return result.MoveValue();
|
|
}
|
|
|
|
rtc::scoped_refptr<RtpTransceiverInterface>
|
|
PeerConnectionWrapper::AddTransceiver(
|
|
rtc::scoped_refptr<MediaStreamTrackInterface> track) {
|
|
RTCErrorOr<rtc::scoped_refptr<RtpTransceiverInterface>> result =
|
|
pc()->AddTransceiver(track);
|
|
EXPECT_EQ(RTCErrorType::NONE, result.error().type());
|
|
return result.MoveValue();
|
|
}
|
|
|
|
rtc::scoped_refptr<RtpTransceiverInterface>
|
|
PeerConnectionWrapper::AddTransceiver(
|
|
rtc::scoped_refptr<MediaStreamTrackInterface> track,
|
|
const RtpTransceiverInit& init) {
|
|
RTCErrorOr<rtc::scoped_refptr<RtpTransceiverInterface>> result =
|
|
pc()->AddTransceiver(track, init);
|
|
EXPECT_EQ(RTCErrorType::NONE, result.error().type());
|
|
return result.MoveValue();
|
|
}
|
|
|
|
rtc::scoped_refptr<AudioTrackInterface> PeerConnectionWrapper::CreateAudioTrack(
|
|
const std::string& label) {
|
|
return pc_factory()->CreateAudioTrack(label, nullptr);
|
|
}
|
|
|
|
rtc::scoped_refptr<VideoTrackInterface> PeerConnectionWrapper::CreateVideoTrack(
|
|
const std::string& label) {
|
|
auto video_source = pc_factory()->CreateVideoSource(
|
|
rtc::MakeUnique<cricket::FakeVideoCapturer>());
|
|
return pc_factory()->CreateVideoTrack(label, video_source);
|
|
}
|
|
|
|
rtc::scoped_refptr<RtpSenderInterface> PeerConnectionWrapper::AddAudioTrack(
|
|
const std::string& track_label,
|
|
std::vector<MediaStreamInterface*> streams) {
|
|
return pc()->AddTrack(CreateAudioTrack(track_label), std::move(streams));
|
|
}
|
|
|
|
rtc::scoped_refptr<RtpSenderInterface> PeerConnectionWrapper::AddVideoTrack(
|
|
const std::string& track_label,
|
|
std::vector<MediaStreamInterface*> streams) {
|
|
return pc()->AddTrack(CreateVideoTrack(track_label), std::move(streams));
|
|
}
|
|
|
|
PeerConnectionInterface::SignalingState
|
|
PeerConnectionWrapper::signaling_state() {
|
|
return pc()->signaling_state();
|
|
}
|
|
|
|
bool PeerConnectionWrapper::IsIceGatheringDone() {
|
|
return observer()->ice_gathering_complete_;
|
|
}
|
|
|
|
bool PeerConnectionWrapper::IsIceConnected() {
|
|
return observer()->ice_connected_;
|
|
}
|
|
|
|
rtc::scoped_refptr<const webrtc::RTCStatsReport>
|
|
PeerConnectionWrapper::GetStats() {
|
|
rtc::scoped_refptr<webrtc::MockRTCStatsCollectorCallback> callback(
|
|
new rtc::RefCountedObject<webrtc::MockRTCStatsCollectorCallback>());
|
|
pc()->GetStats(callback);
|
|
EXPECT_TRUE_WAIT(callback->called(), kDefaultTimeout);
|
|
return callback->report();
|
|
}
|
|
|
|
} // namespace webrtc
|