blob: 4a373e9f138994cf347da81b25074dcf687feffa [file] [log] [blame]
// Copyright 2015 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_PROTOCOL_WEBRTC_VIDEO_CAPTURER_ADAPTER_H_
#define REMOTING_PROTOCOL_WEBRTC_VIDEO_CAPTURER_ADAPTER_H_
#include <stddef.h>
#include <stdint.h>
#include <vector>
#include "base/macros.h"
#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/desktop_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.
// WebrtcVideoCapturerAdapter 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 WebrtcVideoCapturerAdapter : public cricket::VideoCapturer,
public webrtc::DesktopCapturer::Callback {
public:
explicit WebrtcVideoCapturerAdapter(
scoped_ptr<webrtc::DesktopCapturer> capturer);
~WebrtcVideoCapturerAdapter() override;
// webrtc::DesktopCapturer::Callback implementation.
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.
void OnCaptureCompleted(webrtc::DesktopFrame* frame) override;
// cricket::VideoCapturer implementation.
bool GetBestCaptureFormat(const cricket::VideoFormat& desired,
cricket::VideoFormat* best_format) override;
cricket::CaptureState Start(
const cricket::VideoFormat& capture_format) override;
bool Pause(bool pause) override;
void Stop() override;
bool IsRunning() override;
bool IsScreencast() const override;
bool GetPreferredFourccs(std::vector<uint32_t>* 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<webrtc::DesktopCapturer> desktop_capturer_;
// Used to schedule periodic screen captures.
scoped_ptr<base::RepeatingTimer> capture_timer_;
DISALLOW_COPY_AND_ASSIGN(WebrtcVideoCapturerAdapter);
};
} // namespace remoting
#endif // REMOTING_PROTOCOL_WEBRTC_VIDEO_CAPTURER_ADAPTER_H_