1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/renderer/media/webrtc/mock_peer_connection_dependency_factory.h"
7 #include "base/logging.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "content/renderer/media/mock_peer_connection_impl.h"
10 #include "content/renderer/media/webaudio_capturer_source.h"
11 #include "content/renderer/media/webrtc/webrtc_local_audio_track_adapter.h"
12 #include "content/renderer/media/webrtc/webrtc_video_capturer_adapter.h"
13 #include "content/renderer/media/webrtc_audio_capturer.h"
14 #include "content/renderer/media/webrtc_local_audio_track.h"
15 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
16 #include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h"
17 #include "third_party/libjingle/source/talk/media/base/videocapturer.h"
18 #include "third_party/webrtc/base/scoped_ref_ptr.h"
20 using webrtc::AudioSourceInterface;
21 using webrtc::AudioTrackInterface;
22 using webrtc::AudioTrackVector;
23 using webrtc::IceCandidateCollection;
24 using webrtc::IceCandidateInterface;
25 using webrtc::MediaStreamInterface;
26 using webrtc::ObserverInterface;
27 using webrtc::SessionDescriptionInterface;
28 using webrtc::VideoRendererInterface;
29 using webrtc::VideoSourceInterface;
30 using webrtc::VideoTrackInterface;
31 using webrtc::VideoTrackVector;
36 static typename V::iterator FindTrack(V* vector,
37 const std::string& track_id) {
38 typename V::iterator it = vector->begin();
39 for (; it != vector->end(); ++it) {
40 if ((*it)->id() == track_id) {
47 MockMediaStream::MockMediaStream(const std::string& label) : label_(label) {}
49 bool MockMediaStream::AddTrack(AudioTrackInterface* track) {
50 audio_track_vector_.push_back(track);
55 bool MockMediaStream::AddTrack(VideoTrackInterface* track) {
56 video_track_vector_.push_back(track);
61 bool MockMediaStream::RemoveTrack(AudioTrackInterface* track) {
62 AudioTrackVector::iterator it = FindTrack(&audio_track_vector_,
64 if (it == audio_track_vector_.end())
66 audio_track_vector_.erase(it);
71 bool MockMediaStream::RemoveTrack(VideoTrackInterface* track) {
72 VideoTrackVector::iterator it = FindTrack(&video_track_vector_,
74 if (it == video_track_vector_.end())
76 video_track_vector_.erase(it);
81 std::string MockMediaStream::label() const {
85 AudioTrackVector MockMediaStream::GetAudioTracks() {
86 return audio_track_vector_;
89 VideoTrackVector MockMediaStream::GetVideoTracks() {
90 return video_track_vector_;
93 rtc::scoped_refptr<AudioTrackInterface> MockMediaStream::FindAudioTrack(
94 const std::string& track_id) {
95 AudioTrackVector::iterator it = FindTrack(&audio_track_vector_, track_id);
96 return it == audio_track_vector_.end() ? NULL : *it;
99 rtc::scoped_refptr<VideoTrackInterface> MockMediaStream::FindVideoTrack(
100 const std::string& track_id) {
101 VideoTrackVector::iterator it = FindTrack(&video_track_vector_, track_id);
102 return it == video_track_vector_.end() ? NULL : *it;
105 void MockMediaStream::RegisterObserver(ObserverInterface* observer) {
106 DCHECK(observers_.find(observer) == observers_.end());
107 observers_.insert(observer);
110 void MockMediaStream::UnregisterObserver(ObserverInterface* observer) {
111 ObserverSet::iterator it = observers_.find(observer);
112 DCHECK(it != observers_.end());
113 observers_.erase(it);
116 void MockMediaStream::NotifyObservers() {
117 for (ObserverSet::iterator it = observers_.begin(); it != observers_.end();
123 MockMediaStream::~MockMediaStream() {}
125 class MockRtcVideoCapturer : public WebRtcVideoCapturerAdapter {
127 explicit MockRtcVideoCapturer(bool is_screencast)
128 : WebRtcVideoCapturerAdapter(is_screencast),
129 number_of_capturered_frames_(0),
134 virtual void OnFrameCaptured(
135 const scoped_refptr<media::VideoFrame>& frame) OVERRIDE {
136 ++number_of_capturered_frames_;
137 width_ = frame->visible_rect().width();
138 height_ = frame->visible_rect().height();
141 int GetLastFrameWidth() const {
145 int GetLastFrameHeight() const {
149 int GetFrameNum() const {
150 return number_of_capturered_frames_;
154 int number_of_capturered_frames_;
159 MockVideoRenderer::MockVideoRenderer()
164 MockVideoRenderer::~MockVideoRenderer() {}
166 bool MockVideoRenderer::SetSize(int width, int height, int reserved) {
172 bool MockVideoRenderer::RenderFrame(const cricket::VideoFrame* frame) {
177 MockAudioSource::MockAudioSource(
178 const webrtc::MediaConstraintsInterface* constraints)
180 state_(MediaSourceInterface::kLive),
181 optional_constraints_(constraints->GetOptional()),
182 mandatory_constraints_(constraints->GetMandatory()) {
185 MockAudioSource::~MockAudioSource() {}
187 void MockAudioSource::RegisterObserver(webrtc::ObserverInterface* observer) {
188 observer_ = observer;
191 void MockAudioSource::UnregisterObserver(webrtc::ObserverInterface* observer) {
192 DCHECK(observer_ == observer);
196 webrtc::MediaSourceInterface::SourceState MockAudioSource::state() const {
200 MockVideoSource::MockVideoSource()
201 : state_(MediaSourceInterface::kInitializing) {
204 MockVideoSource::~MockVideoSource() {}
206 void MockVideoSource::SetVideoCapturer(cricket::VideoCapturer* capturer) {
207 capturer_.reset(capturer);
210 cricket::VideoCapturer* MockVideoSource::GetVideoCapturer() {
211 return capturer_.get();
214 void MockVideoSource::AddSink(cricket::VideoRenderer* output) {
218 void MockVideoSource::RemoveSink(cricket::VideoRenderer* output) {
222 cricket::VideoRenderer* MockVideoSource::FrameInput() {
226 void MockVideoSource::RegisterObserver(webrtc::ObserverInterface* observer) {
227 observers_.push_back(observer);
230 void MockVideoSource::UnregisterObserver(webrtc::ObserverInterface* observer) {
231 for (std::vector<ObserverInterface*>::iterator it = observers_.begin();
232 it != observers_.end(); ++it) {
233 if (*it == observer) {
234 observers_.erase(it);
240 void MockVideoSource::FireOnChanged() {
241 std::vector<ObserverInterface*> observers(observers_);
242 for (std::vector<ObserverInterface*>::iterator it = observers.begin();
243 it != observers.end(); ++it) {
248 void MockVideoSource::SetLive() {
249 DCHECK(state_ == MediaSourceInterface::kInitializing ||
250 state_ == MediaSourceInterface::kLive);
251 state_ = MediaSourceInterface::kLive;
255 void MockVideoSource::SetEnded() {
256 DCHECK_NE(MediaSourceInterface::kEnded, state_);
257 state_ = MediaSourceInterface::kEnded;
261 webrtc::MediaSourceInterface::SourceState MockVideoSource::state() const {
265 const cricket::VideoOptions* MockVideoSource::options() const {
270 int MockVideoSource::GetLastFrameWidth() const {
273 static_cast<MockRtcVideoCapturer*>(capturer_.get())->GetLastFrameWidth();
276 int MockVideoSource::GetLastFrameHeight() const {
279 static_cast<MockRtcVideoCapturer*>(capturer_.get())->GetLastFrameHeight();
282 int MockVideoSource::GetFrameNum() const {
284 return static_cast<MockRtcVideoCapturer*>(capturer_.get())->GetFrameNum();
287 MockWebRtcVideoTrack::MockWebRtcVideoTrack(
288 const std::string& id,
289 webrtc::VideoSourceInterface* source)
292 state_(MediaStreamTrackInterface::kLive),
298 MockWebRtcVideoTrack::~MockWebRtcVideoTrack() {}
300 void MockWebRtcVideoTrack::AddRenderer(VideoRendererInterface* renderer) {
302 renderer_ = renderer;
305 void MockWebRtcVideoTrack::RemoveRenderer(VideoRendererInterface* renderer) {
306 DCHECK_EQ(renderer_, renderer);
310 std::string MockWebRtcVideoTrack::kind() const {
312 return std::string();
315 std::string MockWebRtcVideoTrack::id() const { return id_; }
317 bool MockWebRtcVideoTrack::enabled() const { return enabled_; }
319 MockWebRtcVideoTrack::TrackState MockWebRtcVideoTrack::state() const {
323 bool MockWebRtcVideoTrack::set_enabled(bool enable) {
328 bool MockWebRtcVideoTrack::set_state(TrackState new_state) {
331 observer_->OnChanged();
335 void MockWebRtcVideoTrack::RegisterObserver(ObserverInterface* observer) {
336 observer_ = observer;
339 void MockWebRtcVideoTrack::UnregisterObserver(ObserverInterface* observer) {
340 DCHECK(observer_ == observer);
344 VideoSourceInterface* MockWebRtcVideoTrack::GetSource() const {
345 return source_.get();
348 class MockSessionDescription : public SessionDescriptionInterface {
350 MockSessionDescription(const std::string& type,
351 const std::string& sdp)
355 virtual ~MockSessionDescription() {}
356 virtual cricket::SessionDescription* description() OVERRIDE {
360 virtual const cricket::SessionDescription* description() const OVERRIDE {
364 virtual std::string session_id() const OVERRIDE {
366 return std::string();
368 virtual std::string session_version() const OVERRIDE {
370 return std::string();
372 virtual std::string type() const OVERRIDE {
375 virtual bool AddCandidate(const IceCandidateInterface* candidate) OVERRIDE {
379 virtual size_t number_of_mediasections() const OVERRIDE {
383 virtual const IceCandidateCollection* candidates(
384 size_t mediasection_index) const OVERRIDE {
389 virtual bool ToString(std::string* out) const OVERRIDE {
399 class MockIceCandidate : public IceCandidateInterface {
401 MockIceCandidate(const std::string& sdp_mid,
403 const std::string& sdp)
405 sdp_mline_index_(sdp_mline_index),
407 // Assign an valid address to |candidate_| to pass assert in code.
408 candidate_.set_address(rtc::SocketAddress("127.0.0.1", 5000));
410 virtual ~MockIceCandidate() {}
411 virtual std::string sdp_mid() const OVERRIDE {
414 virtual int sdp_mline_index() const OVERRIDE {
415 return sdp_mline_index_;
417 virtual const cricket::Candidate& candidate() const OVERRIDE {
420 virtual bool ToString(std::string* out) const OVERRIDE {
426 std::string sdp_mid_;
427 int sdp_mline_index_;
429 cricket::Candidate candidate_;
432 MockPeerConnectionDependencyFactory::MockPeerConnectionDependencyFactory()
433 : PeerConnectionDependencyFactory(NULL),
434 fail_to_create_next_audio_capturer_(false) {
437 MockPeerConnectionDependencyFactory::~MockPeerConnectionDependencyFactory() {}
439 scoped_refptr<webrtc::PeerConnectionInterface>
440 MockPeerConnectionDependencyFactory::CreatePeerConnection(
441 const webrtc::PeerConnectionInterface::RTCConfiguration& config,
442 const webrtc::MediaConstraintsInterface* constraints,
443 blink::WebFrame* frame,
444 webrtc::PeerConnectionObserver* observer) {
445 return new rtc::RefCountedObject<MockPeerConnectionImpl>(this);
448 scoped_refptr<webrtc::AudioSourceInterface>
449 MockPeerConnectionDependencyFactory::CreateLocalAudioSource(
450 const webrtc::MediaConstraintsInterface* constraints) {
452 new rtc::RefCountedObject<MockAudioSource>(constraints);
453 return last_audio_source_;
456 WebRtcVideoCapturerAdapter*
457 MockPeerConnectionDependencyFactory::CreateVideoCapturer(
458 bool is_screen_capture) {
459 return new MockRtcVideoCapturer(is_screen_capture);
462 scoped_refptr<webrtc::VideoSourceInterface>
463 MockPeerConnectionDependencyFactory::CreateVideoSource(
464 cricket::VideoCapturer* capturer,
465 const blink::WebMediaConstraints& constraints) {
466 last_video_source_ = new rtc::RefCountedObject<MockVideoSource>();
467 last_video_source_->SetVideoCapturer(capturer);
468 return last_video_source_;
471 scoped_refptr<WebAudioCapturerSource>
472 MockPeerConnectionDependencyFactory::CreateWebAudioSource(
473 blink::WebMediaStreamSource* source) {
477 scoped_refptr<webrtc::MediaStreamInterface>
478 MockPeerConnectionDependencyFactory::CreateLocalMediaStream(
479 const std::string& label) {
480 return new rtc::RefCountedObject<MockMediaStream>(label);
483 scoped_refptr<webrtc::VideoTrackInterface>
484 MockPeerConnectionDependencyFactory::CreateLocalVideoTrack(
485 const std::string& id,
486 webrtc::VideoSourceInterface* source) {
487 scoped_refptr<webrtc::VideoTrackInterface> track(
488 new rtc::RefCountedObject<MockWebRtcVideoTrack>(
493 scoped_refptr<webrtc::VideoTrackInterface>
494 MockPeerConnectionDependencyFactory::CreateLocalVideoTrack(
495 const std::string& id,
496 cricket::VideoCapturer* capturer) {
497 scoped_refptr<MockVideoSource> source =
498 new rtc::RefCountedObject<MockVideoSource>();
499 source->SetVideoCapturer(capturer);
502 new rtc::RefCountedObject<MockWebRtcVideoTrack>(id, source.get());
505 SessionDescriptionInterface*
506 MockPeerConnectionDependencyFactory::CreateSessionDescription(
507 const std::string& type,
508 const std::string& sdp,
509 webrtc::SdpParseError* error) {
510 return new MockSessionDescription(type, sdp);
513 webrtc::IceCandidateInterface*
514 MockPeerConnectionDependencyFactory::CreateIceCandidate(
515 const std::string& sdp_mid,
517 const std::string& sdp) {
518 return new MockIceCandidate(sdp_mid, sdp_mline_index, sdp);
521 scoped_refptr<WebRtcAudioCapturer>
522 MockPeerConnectionDependencyFactory::CreateAudioCapturer(
523 int render_view_id, const StreamDeviceInfo& device_info,
524 const blink::WebMediaConstraints& constraints,
525 MediaStreamAudioSource* audio_source) {
526 if (fail_to_create_next_audio_capturer_) {
527 fail_to_create_next_audio_capturer_ = false;
530 DCHECK(audio_source);
531 return WebRtcAudioCapturer::CreateCapturer(-1, device_info,
532 constraints, NULL, audio_source);
535 void MockPeerConnectionDependencyFactory::StartLocalAudioTrack(
536 WebRtcLocalAudioTrack* audio_track) {
537 audio_track->Start();
540 } // namespace content