15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_RENDERER_MEDIA_MOCK_MEDIA_STREAM_DEPENDENCY_FACTORY_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_RENDERER_MEDIA_MOCK_MEDIA_STREAM_DEPENDENCY_FACTORY_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/media_stream_dependency_factory.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/libjingle/source/talk/app/webrtc/mediaconstraintsinterface.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockVideoSource : public webrtc::VideoSourceInterface {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockVideoSource();
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RegisterObserver(webrtc::ObserverInterface* observer) OVERRIDE;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UnregisterObserver(webrtc::ObserverInterface* observer) OVERRIDE;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual MediaSourceInterface::SourceState state() const OVERRIDE;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual cricket::VideoCapturer* GetVideoCapturer() OVERRIDE;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AddSink(cricket::VideoRenderer* output) OVERRIDE;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RemoveSink(cricket::VideoRenderer* output) OVERRIDE;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual const cricket::VideoOptions* options() const OVERRIDE;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Changes the state of the source to live and notifies the observer.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetLive();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Changes the state of the source to ended and notifies the observer.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetEnded();
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Set the video capturer.
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetVideoCapturer(cricket::VideoCapturer* capturer);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockVideoSource();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void FireOnChanged();
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<webrtc::ObserverInterface*> observers_;
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MediaSourceInterface::SourceState state_;
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<cricket::VideoCapturer> capturer_;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockAudioSource : public webrtc::AudioSourceInterface {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit MockAudioSource(
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const webrtc::MediaConstraintsInterface* constraints);
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void RegisterObserver(webrtc::ObserverInterface* observer) OVERRIDE;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void UnregisterObserver(webrtc::ObserverInterface* observer) OVERRIDE;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual MediaSourceInterface::SourceState state() const OVERRIDE;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Changes the state of the source to live and notifies the observer.
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetLive();
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Changes the state of the source to ended and notifies the observer.
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetEnded();
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const webrtc::MediaConstraintsInterface::Constraints& optional_constraints() {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return optional_constraints_;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const webrtc::MediaConstraintsInterface::Constraints&
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mandatory_constraints() {
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return mandatory_constraints_;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~MockAudioSource();
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  webrtc::ObserverInterface* observer_;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaSourceInterface::SourceState state_;
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  webrtc::MediaConstraintsInterface::Constraints optional_constraints_;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  webrtc::MediaConstraintsInterface::Constraints mandatory_constraints_;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockLocalVideoTrack : public webrtc::VideoTrackInterface {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockLocalVideoTrack(std::string id,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      webrtc::VideoSourceInterface* source);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AddRenderer(webrtc::VideoRendererInterface* renderer) OVERRIDE;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RemoveRenderer(
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      webrtc::VideoRendererInterface* renderer) OVERRIDE;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual cricket::VideoRenderer* FrameInput() OVERRIDE;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string kind() const OVERRIDE;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual std::string id() const OVERRIDE;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool enabled() const OVERRIDE;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual TrackState state() const OVERRIDE;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool set_enabled(bool enable) OVERRIDE;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool set_state(TrackState new_state) OVERRIDE;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RegisterObserver(webrtc::ObserverInterface* observer) OVERRIDE;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UnregisterObserver(webrtc::ObserverInterface* observer) OVERRIDE;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual webrtc::VideoSourceInterface* GetSource() const OVERRIDE;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockLocalVideoTrack();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool enabled_;
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string id_;
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TrackState state_;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<webrtc::VideoSourceInterface> source_;
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  webrtc::ObserverInterface* observer_;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A mock factory for creating different objects for
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RTC MediaStreams and PeerConnections.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockMediaStreamDependencyFactory : public MediaStreamDependencyFactory {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockMediaStreamDependencyFactory();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockMediaStreamDependencyFactory();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_refptr<webrtc::PeerConnectionInterface> CreatePeerConnection(
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const webrtc::PeerConnectionInterface::IceServers& ice_servers,
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const webrtc::MediaConstraintsInterface* constraints,
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebKit::WebFrame* frame,
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      webrtc::PeerConnectionObserver* observer) OVERRIDE;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_refptr<webrtc::AudioSourceInterface>
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateLocalAudioSource(
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          const webrtc::MediaConstraintsInterface* constraints) OVERRIDE;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual scoped_refptr<webrtc::VideoSourceInterface>
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateLocalVideoSource(
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          int video_session_id,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          bool is_screencast,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          const webrtc::MediaConstraintsInterface* constraints) OVERRIDE;
129bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  virtual scoped_refptr<WebRtcAudioCapturer> CreateWebAudioSource(
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebKit::WebMediaStreamSource* source) OVERRIDE;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_refptr<webrtc::MediaStreamInterface>
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateLocalMediaStream(const std::string& label) OVERRIDE;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual scoped_refptr<webrtc::VideoTrackInterface>
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateLocalVideoTrack(const std::string& id,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            webrtc::VideoSourceInterface* source) OVERRIDE;
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual scoped_refptr<webrtc::VideoTrackInterface>
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateLocalVideoTrack(const std::string& id,
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            cricket::VideoCapturer* capturer) OVERRIDE;
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_refptr<webrtc::AudioTrackInterface>
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateLocalAudioTrack(const std::string& id,
141bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                            const scoped_refptr<WebRtcAudioCapturer>& capturer,
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            webrtc::AudioSourceInterface* source) OVERRIDE;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual webrtc::SessionDescriptionInterface* CreateSessionDescription(
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& type,
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& sdp,
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      webrtc::SdpParseError* error) OVERRIDE;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual webrtc::IceCandidateInterface* CreateIceCandidate(
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& sdp_mid,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int sdp_mline_index,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& sdp) OVERRIDE;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool EnsurePeerConnectionFactory() OVERRIDE;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool PeerConnectionFactoryCreated() OVERRIDE;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  virtual scoped_refptr<WebRtcAudioCapturer> MaybeCreateAudioCapturer(
156bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      int render_view_id, const StreamDeviceInfo& device_info) OVERRIDE;
157bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MockAudioSource* last_audio_source() { return last_audio_source_.get(); }
159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MockVideoSource* last_video_source() { return last_video_source_.get(); }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool mock_pc_factory_created_;
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr <MockAudioSource> last_audio_source_;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr <MockVideoSource> last_video_source_;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockMediaStreamDependencyFactory);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_RENDERER_MEDIA_MOCK_MEDIA_STREAM_DEPENDENCY_FACTORY_H_
172