// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef REMOTING_HOST_CAST_VIDEO_CAPTURER_ADAPTER_H_ #define REMOTING_HOST_CAST_VIDEO_CAPTURER_ADAPTER_H_ #include #include "base/memory/scoped_ptr.h" #include "base/threading/thread_checker.h" #include "base/timer/timer.h" #include "third_party/libjingle/source/talk/media/base/videocapturer.h" #include "third_party/webrtc/modules/desktop_capture/screen_capturer.h" namespace base { class SingleThreadTaskRunner; } // namespace base namespace webrtc { class DesktopFrame; } // namespace webrtc namespace remoting { // This class controls the capture of video frames from the desktop and is used // to construct a VideoSource as part of the webrtc PeerConnection API. // CastVideoCapturerAdapter acts as an adapter between webrtc::DesktopCapturer // and the cricket::VideoCapturer interface, which it implements. It is used // to construct a cricket::VideoSource for a PeerConnection, to capture frames // of the desktop. As indicated in the base implementation, Start() and Stop() // should be called on the same thread. class CastVideoCapturerAdapter : public cricket::VideoCapturer, public webrtc::DesktopCapturer::Callback { public: explicit CastVideoCapturerAdapter( scoped_ptr capturer); virtual ~CastVideoCapturerAdapter(); // webrtc::DesktopCapturer::Callback implementation. virtual webrtc::SharedMemory* CreateSharedMemory(size_t size) OVERRIDE; // Converts |frame| to a cricket::CapturedFrame and emits that via // SignalFrameCaptured for the base::VideoCapturer implementation to process. virtual void OnCaptureCompleted(webrtc::DesktopFrame* frame) OVERRIDE; // cricket::VideoCapturer implementation. virtual bool GetBestCaptureFormat(const cricket::VideoFormat& desired, cricket::VideoFormat* best_format) OVERRIDE; virtual cricket::CaptureState Start( const cricket::VideoFormat& capture_format) OVERRIDE; virtual bool Pause(bool pause) OVERRIDE; virtual void Stop() OVERRIDE; virtual bool IsRunning() OVERRIDE; virtual bool IsScreencast() const OVERRIDE; virtual bool GetPreferredFourccs(std::vector* fourccs) OVERRIDE; private: // Kicks off the next frame capture using |desktop_capturer_|. // The captured frame will be passed to OnCaptureCompleted(). void CaptureNextFrame(); // |thread_checker_| is bound to the peer connection worker thread. base::ThreadChecker thread_checker_; // Used to capture frames. scoped_ptr desktop_capturer_; // Used to schedule periodic screen captures. scoped_ptr > capture_timer_; // Used to set the elapsed_time attribute of captured frames. base::TimeTicks start_time_; DISALLOW_COPY_AND_ASSIGN(CastVideoCapturerAdapter); }; } // namespace remoting #endif // REMOTING_HOST_CAST_VIDEO_CAPTURER_ADAPTER_H_