| Index: remoting/protocol/webrtc_video_capturer_adapter.cc
|
| diff --git a/remoting/protocol/webrtc_video_capturer_adapter.cc b/remoting/protocol/webrtc_video_capturer_adapter.cc
|
| deleted file mode 100644
|
| index 23df1d98e61a376becca82bfbb30938f3f0e70ec..0000000000000000000000000000000000000000
|
| --- a/remoting/protocol/webrtc_video_capturer_adapter.cc
|
| +++ /dev/null
|
| @@ -1,245 +0,0 @@
|
| -// 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.
|
| -
|
| -#include "remoting/protocol/webrtc_video_capturer_adapter.h"
|
| -
|
| -#include <utility>
|
| -
|
| -#include "remoting/base/constants.h"
|
| -#include "third_party/libyuv/include/libyuv/convert.h"
|
| -#include "third_party/webrtc/media/engine/webrtcvideoframe.h"
|
| -#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
|
| -
|
| -namespace remoting {
|
| -namespace protocol {
|
| -
|
| -// Number of frames to be captured per second.
|
| -const int kFramesPerSec = 30;
|
| -
|
| -WebrtcVideoCapturerAdapter::WebrtcVideoCapturerAdapter(
|
| - std::unique_ptr<webrtc::DesktopCapturer> capturer)
|
| - : desktop_capturer_(std::move(capturer)), weak_factory_(this) {
|
| - DCHECK(desktop_capturer_);
|
| -
|
| - // Disable video adaptation since we don't intend to use it.
|
| - set_enable_video_adapter(false);
|
| -}
|
| -
|
| -WebrtcVideoCapturerAdapter::~WebrtcVideoCapturerAdapter() {
|
| - DCHECK(!capture_timer_);
|
| -}
|
| -
|
| -void WebrtcVideoCapturerAdapter::SetSizeCallback(
|
| - const VideoStream::SizeCallback& size_callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - size_callback_ = size_callback;
|
| -}
|
| -
|
| -base::WeakPtr<WebrtcVideoCapturerAdapter>
|
| -WebrtcVideoCapturerAdapter::GetWeakPtr() {
|
| - return weak_factory_.GetWeakPtr();
|
| -}
|
| -
|
| -bool WebrtcVideoCapturerAdapter::GetBestCaptureFormat(
|
| - const cricket::VideoFormat& desired,
|
| - cricket::VideoFormat* best_format) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - // The |capture_format| passed to Start() is always ignored, so copy
|
| - // |best_format| to |desired_format|.
|
| - *best_format = desired;
|
| - return true;
|
| -}
|
| -
|
| -cricket::CaptureState WebrtcVideoCapturerAdapter::Start(
|
| - const cricket::VideoFormat& capture_format) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!capture_timer_);
|
| -
|
| - if (!desktop_capturer_) {
|
| - VLOG(1) << "WebrtcVideoCapturerAdapter failed to start.";
|
| - return cricket::CS_FAILED;
|
| - }
|
| -
|
| - desktop_capturer_->Start(this);
|
| -
|
| - capture_timer_.reset(new base::RepeatingTimer());
|
| - capture_timer_->Start(FROM_HERE,
|
| - base::TimeDelta::FromSeconds(1) / kFramesPerSec, this,
|
| - &WebrtcVideoCapturerAdapter::CaptureNextFrame);
|
| -
|
| - return cricket::CS_RUNNING;
|
| -}
|
| -
|
| -bool WebrtcVideoCapturerAdapter::PauseCapturer(bool pause) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - if (pause) {
|
| - if (paused_)
|
| - return true;
|
| -
|
| - bool running = capture_state() == cricket::CS_STARTING ||
|
| - capture_state() == cricket::CS_RUNNING;
|
| -
|
| - DCHECK_EQ(running, IsRunning());
|
| -
|
| - if (!running) {
|
| - LOG(ERROR)
|
| - << "Cannot pause WebrtcVideoCapturerAdapter.";
|
| - return false;
|
| - }
|
| -
|
| - capture_timer_->Stop();
|
| - paused_ = true;
|
| -
|
| - VLOG(1) << "WebrtcVideoCapturerAdapter paused.";
|
| -
|
| - return true;
|
| - } else { // Unpausing.
|
| - if (!paused_ || !GetCaptureFormat() || !capture_timer_) {
|
| - LOG(ERROR) << "Cannot unpause WebrtcVideoCapturerAdapter.";
|
| - return false;
|
| - }
|
| -
|
| - capture_timer_->Start(FROM_HERE,
|
| - base::TimeDelta::FromMicroseconds(
|
| - GetCaptureFormat()->interval /
|
| - (base::Time::kNanosecondsPerMicrosecond)),
|
| - this,
|
| - &WebrtcVideoCapturerAdapter::CaptureNextFrame);
|
| - paused_ = false;
|
| -
|
| - VLOG(1) << "WebrtcVideoCapturerAdapter unpaused.";
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -void WebrtcVideoCapturerAdapter::Stop() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK_NE(capture_state(), cricket::CS_STOPPED);
|
| -
|
| - capture_timer_.reset();
|
| - desktop_capturer_.reset();
|
| -
|
| - SetCaptureFormat(nullptr);
|
| - SetCaptureState(cricket::CS_STOPPED);
|
| -
|
| - VLOG(1) << "WebrtcVideoCapturerAdapter stopped.";
|
| -}
|
| -
|
| -bool WebrtcVideoCapturerAdapter::IsRunning() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - return capture_timer_->IsRunning();
|
| -}
|
| -
|
| -bool WebrtcVideoCapturerAdapter::IsScreencast() const {
|
| - return true;
|
| -}
|
| -
|
| -bool WebrtcVideoCapturerAdapter::GetPreferredFourccs(
|
| - std::vector<uint32_t>* fourccs) {
|
| - return false;
|
| -}
|
| -
|
| -webrtc::SharedMemory* WebrtcVideoCapturerAdapter::CreateSharedMemory(
|
| - size_t size) {
|
| - return nullptr;
|
| -}
|
| -
|
| -void WebrtcVideoCapturerAdapter::OnCaptureCompleted(
|
| - webrtc::DesktopFrame* frame) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - DCHECK(capture_pending_);
|
| - capture_pending_ = false;
|
| -
|
| - if (!frame)
|
| - return;
|
| -
|
| - std::unique_ptr<webrtc::DesktopFrame> owned_frame(frame);
|
| -
|
| - // TODO(sergeyu): Currently the adapter keeps generating frames even when
|
| - // nothing is changing on the screen. This is necessary because the video
|
| - // sender drops frames. Obviously this is a suboptimal. The sending code in
|
| - // WebRTC needs to have some mechanism to notify when the bandwidth is
|
| - // exceeded, so the capturer can adapt frame rate.
|
| -
|
| - webrtc::DesktopVector dpi =
|
| - frame->dpi().is_zero() ? webrtc::DesktopVector(kDefaultDpi, kDefaultDpi)
|
| - : frame->dpi();
|
| - if (!frame_size_.equals(frame->size()) || !frame_dpi_.equals(dpi)) {
|
| - frame_size_ = frame->size();
|
| - frame_dpi_ = dpi;
|
| - if (!size_callback_.is_null())
|
| - size_callback_.Run(frame_size_, frame_dpi_);
|
| - }
|
| -
|
| - if (!yuv_frame_ ||
|
| - !frame_size_.equals(
|
| - webrtc::DesktopSize(yuv_frame_->width(), yuv_frame_->height()))) {
|
| - yuv_frame_ = new rtc::RefCountedObject<webrtc::I420Buffer>(
|
| - frame_size_.width(), frame_size_.height());
|
| - // Set updated_region so the whole frame is converted to YUV below.
|
| - frame->mutable_updated_region()->SetRect(
|
| - webrtc::DesktopRect::MakeSize(frame_size_));
|
| - }
|
| -
|
| - if (!yuv_frame_->HasOneRef()) {
|
| - // Frame is still used, typically by the encoder. We have to make
|
| - // a copy before modifying it.
|
| - // TODO(sergeyu): This will copy the buffer if it's being used.
|
| - // Optimize it by keeping a queue of frames.
|
| - yuv_frame_ = webrtc::I420Buffer::Copy(yuv_frame_);
|
| - }
|
| -
|
| - for (webrtc::DesktopRegion::Iterator i(frame->updated_region()); !i.IsAtEnd();
|
| - i.Advance()) {
|
| - int left = i.rect().left();
|
| - int top = i.rect().top();
|
| - int width = i.rect().width();
|
| - int height = i.rect().height();
|
| -
|
| - if (left % 2 == 1) {
|
| - --left;
|
| - ++width;
|
| - }
|
| - if (top % 2 == 1) {
|
| - --top;
|
| - ++height;
|
| - }
|
| -
|
| - int y_stride = yuv_frame_->stride(webrtc::kYPlane);
|
| - int u_stride = yuv_frame_->stride(webrtc::kUPlane);
|
| - int v_stride = yuv_frame_->stride(webrtc::kVPlane);
|
| - libyuv::ARGBToI420(
|
| - frame->data() + frame->stride() * top +
|
| - left * webrtc::DesktopFrame::kBytesPerPixel,
|
| - frame->stride(),
|
| - yuv_frame_->MutableData(webrtc::kYPlane) + y_stride * top + left,
|
| - y_stride, yuv_frame_->MutableData(webrtc::kUPlane) +
|
| - u_stride * top / 2 + left / 2,
|
| - u_stride, yuv_frame_->MutableData(webrtc::kVPlane) +
|
| - v_stride * top / 2 + left / 2,
|
| - v_stride, width, height);
|
| - }
|
| -
|
| - cricket::WebRtcVideoFrame video_frame(
|
| - yuv_frame_, (base::TimeTicks::Now() - base::TimeTicks()) /
|
| - base::TimeDelta::FromMicroseconds(1) * 1000,
|
| - webrtc::kVideoRotation_0);
|
| -
|
| - OnFrame(this, &video_frame);
|
| -}
|
| -
|
| -void WebrtcVideoCapturerAdapter::CaptureNextFrame() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - if (capture_pending_)
|
| - return;
|
| - capture_pending_ = true;
|
| - desktop_capturer_->Capture(webrtc::DesktopRegion());
|
| -}
|
| -
|
| -} // namespace protocol
|
| -} // namespace remoting
|
|
|