1 // Copyright (c) 2012 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/mock_media_stream_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 "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
15 #include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h"
16 #include "third_party/libjingle/source/talk/base/scoped_ref_ptr.h"
17 #include "third_party/libjingle/source/talk/media/base/videocapturer.h"
19 using webrtc::AudioSourceInterface;
20 using webrtc::AudioTrackInterface;
21 using webrtc::AudioTrackVector;
22 using webrtc::IceCandidateCollection;
23 using webrtc::IceCandidateInterface;
24 using webrtc::MediaStreamInterface;
25 using webrtc::ObserverInterface;
26 using webrtc::SessionDescriptionInterface;
27 using webrtc::VideoRendererInterface;
28 using webrtc::VideoSourceInterface;
29 using webrtc::VideoTrackInterface;
30 using webrtc::VideoTrackVector;
35 static typename V::iterator FindTrack(V* vector,
36 const std::string& track_id) {
37 typename V::iterator it = vector->begin();
38 for (; it != vector->end(); ++it) {
39 if ((*it)->id() == track_id) {
46 MockMediaStream::MockMediaStream(const std::string& label) : label_(label) {}
48 bool MockMediaStream::AddTrack(AudioTrackInterface* track) {
49 audio_track_vector_.push_back(track);
54 bool MockMediaStream::AddTrack(VideoTrackInterface* track) {
55 video_track_vector_.push_back(track);
60 bool MockMediaStream::RemoveTrack(AudioTrackInterface* track) {
61 AudioTrackVector::iterator it = FindTrack(&audio_track_vector_,
63 if (it == audio_track_vector_.end())
65 audio_track_vector_.erase(it);
70 bool MockMediaStream::RemoveTrack(VideoTrackInterface* track) {
71 VideoTrackVector::iterator it = FindTrack(&video_track_vector_,
73 if (it == video_track_vector_.end())
75 video_track_vector_.erase(it);
80 std::string MockMediaStream::label() const {
84 AudioTrackVector MockMediaStream::GetAudioTracks() {
85 return audio_track_vector_;
88 VideoTrackVector MockMediaStream::GetVideoTracks() {
89 return video_track_vector_;
92 talk_base::scoped_refptr<AudioTrackInterface> MockMediaStream::FindAudioTrack(
93 const std::string& track_id) {
94 AudioTrackVector::iterator it = FindTrack(&audio_track_vector_, track_id);
95 return it == audio_track_vector_.end() ? NULL : *it;
98 talk_base::scoped_refptr<VideoTrackInterface> MockMediaStream::FindVideoTrack(
99 const std::string& track_id) {
100 VideoTrackVector::iterator it = FindTrack(&video_track_vector_, track_id);
101 return it == video_track_vector_.end() ? NULL : *it;
104 void MockMediaStream::RegisterObserver(ObserverInterface* observer) {
105 DCHECK(observers_.find(observer) == observers_.end());
106 observers_.insert(observer);
109 void MockMediaStream::UnregisterObserver(ObserverInterface* observer) {
110 ObserverSet::iterator it = observers_.find(observer);
111 DCHECK(it != observers_.end());
112 observers_.erase(it);
115 void MockMediaStream::NotifyObservers() {
116 for (ObserverSet::iterator it = observers_.begin(); it != observers_.end();
122 MockMediaStream::~MockMediaStream() {}
124 class MockRtcVideoCapturer : public WebRtcVideoCapturerAdapter {
126 explicit MockRtcVideoCapturer(bool is_screencast)
127 : WebRtcVideoCapturerAdapter(is_screencast),
128 number_of_capturered_frames_(0),
133 virtual void SetRequestedFormat(
134 const media::VideoCaptureFormat& format) OVERRIDE {
137 virtual void OnFrameCaptured(
138 const scoped_refptr<media::VideoFrame>& frame) OVERRIDE {
139 ++number_of_capturered_frames_;
140 width_ = frame->visible_rect().width();
141 height_ = frame->visible_rect().height();
144 int GetLastFrameWidth() const {
148 int GetLastFrameHeight() const {
152 int GetFrameNum() const {
153 return number_of_capturered_frames_;
157 int number_of_capturered_frames_;
162 MockVideoRenderer::MockVideoRenderer()
167 MockVideoRenderer::~MockVideoRenderer() {}
169 bool MockVideoRenderer::SetSize(int width, int height, int reserved) {
175 bool MockVideoRenderer::RenderFrame(const cricket::VideoFrame* frame) {
180 MockAudioSource::MockAudioSource(
181 const webrtc::MediaConstraintsInterface* constraints)
183 state_(MediaSourceInterface::kLive),
184 optional_constraints_(constraints->GetOptional()),
185 mandatory_constraints_(constraints->GetMandatory()) {
188 MockAudioSource::~MockAudioSource() {}
190 void MockAudioSource::RegisterObserver(webrtc::ObserverInterface* observer) {
191 observer_ = observer;
194 void MockAudioSource::UnregisterObserver(webrtc::ObserverInterface* observer) {
195 DCHECK(observer_ == observer);
199 webrtc::MediaSourceInterface::SourceState MockAudioSource::state() const {
203 MockVideoSource::MockVideoSource()
204 : state_(MediaSourceInterface::kInitializing) {
207 MockVideoSource::~MockVideoSource() {}
209 void MockVideoSource::SetVideoCapturer(cricket::VideoCapturer* capturer) {
210 capturer_.reset(capturer);
213 cricket::VideoCapturer* MockVideoSource::GetVideoCapturer() {
214 return capturer_.get();
217 void MockVideoSource::AddSink(cricket::VideoRenderer* output) {
221 void MockVideoSource::RemoveSink(cricket::VideoRenderer* output) {
225 cricket::VideoRenderer* MockVideoSource::FrameInput() {
229 void MockVideoSource::RegisterObserver(webrtc::ObserverInterface* observer) {
230 observers_.push_back(observer);
233 void MockVideoSource::UnregisterObserver(webrtc::ObserverInterface* observer) {
234 for (std::vector<ObserverInterface*>::iterator it = observers_.begin();
235 it != observers_.end(); ++it) {
236 if (*it == observer) {
237 observers_.erase(it);
243 void MockVideoSource::FireOnChanged() {
244 std::vector<ObserverInterface*> observers(observers_);
245 for (std::vector<ObserverInterface*>::iterator it = observers.begin();
246 it != observers.end(); ++it) {
251 void MockVideoSource::SetLive() {
252 DCHECK(state_ == MediaSourceInterface::kInitializing ||
253 state_ == MediaSourceInterface::kLive);
254 state_ = MediaSourceInterface::kLive;
258 void MockVideoSource::SetEnded() {
259 DCHECK_NE(MediaSourceInterface::kEnded, state_);
260 state_ = MediaSourceInterface::kEnded;
264 webrtc::MediaSourceInterface::SourceState MockVideoSource::state() const {
268 const cricket::VideoOptions* MockVideoSource::options() const {
273 int MockVideoSource::GetLastFrameWidth() const {
276 static_cast<MockRtcVideoCapturer*>(capturer_.get())->GetLastFrameWidth();
279 int MockVideoSource::GetLastFrameHeight() const {
282 static_cast<MockRtcVideoCapturer*>(capturer_.get())->GetLastFrameHeight();
285 int MockVideoSource::GetFrameNum() const {
287 return static_cast<MockRtcVideoCapturer*>(capturer_.get())->GetFrameNum();
290 MockLocalVideoTrack::MockLocalVideoTrack(std::string id,
291 webrtc::VideoSourceInterface* source)
294 state_(MediaStreamTrackInterface::kLive),
299 MockLocalVideoTrack::~MockLocalVideoTrack() {}
301 void MockLocalVideoTrack::AddRenderer(VideoRendererInterface* renderer) {
305 void MockLocalVideoTrack::RemoveRenderer(VideoRendererInterface* renderer) {
309 std::string MockLocalVideoTrack::kind() const {
311 return std::string();
314 std::string MockLocalVideoTrack::id() const { return id_; }
316 bool MockLocalVideoTrack::enabled() const { return enabled_; }
318 MockLocalVideoTrack::TrackState MockLocalVideoTrack::state() const {
322 bool MockLocalVideoTrack::set_enabled(bool enable) {
327 bool MockLocalVideoTrack::set_state(TrackState new_state) {
330 observer_->OnChanged();
334 void MockLocalVideoTrack::RegisterObserver(ObserverInterface* observer) {
335 observer_ = observer;
338 void MockLocalVideoTrack::UnregisterObserver(ObserverInterface* observer) {
339 DCHECK(observer_ == observer);
343 VideoSourceInterface* MockLocalVideoTrack::GetSource() const {
344 return source_.get();
347 class MockSessionDescription : public SessionDescriptionInterface {
349 MockSessionDescription(const std::string& type,
350 const std::string& sdp)
354 virtual ~MockSessionDescription() {}
355 virtual cricket::SessionDescription* description() OVERRIDE {
359 virtual const cricket::SessionDescription* description() const OVERRIDE {
363 virtual std::string session_id() const OVERRIDE {
365 return std::string();
367 virtual std::string session_version() const OVERRIDE {
369 return std::string();
371 virtual std::string type() const OVERRIDE {
374 virtual bool AddCandidate(const IceCandidateInterface* candidate) OVERRIDE {
378 virtual size_t number_of_mediasections() const OVERRIDE {
382 virtual const IceCandidateCollection* candidates(
383 size_t mediasection_index) const OVERRIDE {
388 virtual bool ToString(std::string* out) const OVERRIDE {
398 class MockIceCandidate : public IceCandidateInterface {
400 MockIceCandidate(const std::string& sdp_mid,
402 const std::string& sdp)
404 sdp_mline_index_(sdp_mline_index),
407 virtual ~MockIceCandidate() {}
408 virtual std::string sdp_mid() const OVERRIDE {
411 virtual int sdp_mline_index() const OVERRIDE {
412 return sdp_mline_index_;
414 virtual const cricket::Candidate& candidate() const OVERRIDE {
415 // This function should never be called. It will intentionally crash. The
416 // base class forces us to return a reference.
418 cricket::Candidate* candidate = NULL;
421 virtual bool ToString(std::string* out) const OVERRIDE {
427 std::string sdp_mid_;
428 int sdp_mline_index_;
432 MockMediaStreamDependencyFactory::MockMediaStreamDependencyFactory()
433 : MediaStreamDependencyFactory(NULL) {
436 MockMediaStreamDependencyFactory::~MockMediaStreamDependencyFactory() {}
438 scoped_refptr<webrtc::PeerConnectionInterface>
439 MockMediaStreamDependencyFactory::CreatePeerConnection(
440 const webrtc::PeerConnectionInterface::IceServers& ice_servers,
441 const webrtc::MediaConstraintsInterface* constraints,
442 blink::WebFrame* frame,
443 webrtc::PeerConnectionObserver* observer) {
444 return new talk_base::RefCountedObject<MockPeerConnectionImpl>(this);
447 scoped_refptr<webrtc::AudioSourceInterface>
448 MockMediaStreamDependencyFactory::CreateLocalAudioSource(
449 const webrtc::MediaConstraintsInterface* constraints) {
451 new talk_base::RefCountedObject<MockAudioSource>(constraints);
452 return last_audio_source_;
455 WebRtcVideoCapturerAdapter*
456 MockMediaStreamDependencyFactory::CreateVideoCapturer(
457 bool is_screen_capture) {
458 return new MockRtcVideoCapturer(is_screen_capture);
461 scoped_refptr<webrtc::VideoSourceInterface>
462 MockMediaStreamDependencyFactory::CreateVideoSource(
463 cricket::VideoCapturer* capturer,
464 const blink::WebMediaConstraints& constraints) {
465 last_video_source_ = new talk_base::RefCountedObject<MockVideoSource>();
466 last_video_source_->SetVideoCapturer(capturer);
467 return last_video_source_;
470 scoped_refptr<WebAudioCapturerSource>
471 MockMediaStreamDependencyFactory::CreateWebAudioSource(
472 blink::WebMediaStreamSource* source) {
476 scoped_refptr<webrtc::MediaStreamInterface>
477 MockMediaStreamDependencyFactory::CreateLocalMediaStream(
478 const std::string& label) {
479 return new talk_base::RefCountedObject<MockMediaStream>(label);
482 scoped_refptr<webrtc::VideoTrackInterface>
483 MockMediaStreamDependencyFactory::CreateLocalVideoTrack(
484 const std::string& id,
485 webrtc::VideoSourceInterface* source) {
486 scoped_refptr<webrtc::VideoTrackInterface> track(
487 new talk_base::RefCountedObject<MockLocalVideoTrack>(
492 scoped_refptr<webrtc::VideoTrackInterface>
493 MockMediaStreamDependencyFactory::CreateLocalVideoTrack(
494 const std::string& id,
495 cricket::VideoCapturer* capturer) {
496 scoped_refptr<MockVideoSource> source =
497 new talk_base::RefCountedObject<MockVideoSource>();
498 source->SetVideoCapturer(capturer);
500 return new talk_base::RefCountedObject<MockLocalVideoTrack>(id, source.get());
503 SessionDescriptionInterface*
504 MockMediaStreamDependencyFactory::CreateSessionDescription(
505 const std::string& type,
506 const std::string& sdp,
507 webrtc::SdpParseError* error) {
508 return new MockSessionDescription(type, sdp);
511 webrtc::IceCandidateInterface*
512 MockMediaStreamDependencyFactory::CreateIceCandidate(
513 const std::string& sdp_mid,
515 const std::string& sdp) {
516 return new MockIceCandidate(sdp_mid, sdp_mline_index, sdp);
519 scoped_refptr<WebRtcAudioCapturer>
520 MockMediaStreamDependencyFactory::CreateAudioCapturer(
521 int render_view_id, const StreamDeviceInfo& device_info,
522 const blink::WebMediaConstraints& constraints) {
523 return WebRtcAudioCapturer::CreateCapturer(-1, device_info,
527 void MockMediaStreamDependencyFactory::StartLocalAudioTrack(
528 WebRtcLocalAudioTrack* audio_track) {
532 } // namespace content