Index: remoting/host/video_frame_recorder.cc |
diff --git a/remoting/host/video_frame_recorder.cc b/remoting/host/video_frame_recorder.cc |
deleted file mode 100644 |
index cccfe7cd90b5d90e3d41c2b1fdaa8bb8b18dd635..0000000000000000000000000000000000000000 |
--- a/remoting/host/video_frame_recorder.cc |
+++ /dev/null |
@@ -1,207 +0,0 @@ |
-// 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. |
- |
-#include "remoting/host/video_frame_recorder.h" |
- |
-#include "base/bind.h" |
-#include "base/location.h" |
-#include "base/single_thread_task_runner.h" |
-#include "base/stl_util.h" |
-#include "base/thread_task_runner_handle.h" |
-#include "remoting/codec/video_encoder.h" |
-#include "remoting/proto/video.pb.h" |
-#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" |
-#include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h" |
-#include "third_party/webrtc/modules/desktop_capture/desktop_region.h" |
- |
-namespace remoting { |
- |
-static int64_t FrameContentSize(const webrtc::DesktopFrame* frame) { |
- DCHECK_GT(frame->stride(), 0); |
- return frame->stride() * frame->size().height(); |
-} |
- |
-// VideoEncoder wrapper used to intercept frames passed to a real VideoEncoder. |
-class VideoFrameRecorder::RecordingVideoEncoder : public VideoEncoder { |
- public: |
- RecordingVideoEncoder(scoped_ptr<VideoEncoder> encoder, |
- scoped_refptr<base::TaskRunner> recorder_task_runner, |
- base::WeakPtr<VideoFrameRecorder> recorder) |
- : encoder_(encoder.Pass()), |
- recorder_task_runner_(recorder_task_runner), |
- recorder_(recorder), |
- enable_recording_(false), |
- weak_factory_(this) { |
- DCHECK(encoder_); |
- DCHECK(recorder_task_runner_); |
- } |
- |
- base::WeakPtr<RecordingVideoEncoder> AsWeakPtr() { |
- return weak_factory_.GetWeakPtr(); |
- } |
- |
- void SetEnableRecording(bool enable_recording) { |
- DCHECK(!encoder_task_runner_ || |
- encoder_task_runner_->BelongsToCurrentThread()); |
- enable_recording_ = enable_recording; |
- } |
- |
- // remoting::VideoEncoder interface. |
- virtual void SetLosslessEncode(bool want_lossless) OVERRIDE { |
- encoder_->SetLosslessEncode(want_lossless); |
- } |
- virtual void SetLosslessColor(bool want_lossless) OVERRIDE { |
- encoder_->SetLosslessColor(want_lossless); |
- } |
- virtual scoped_ptr<VideoPacket> Encode( |
- const webrtc::DesktopFrame& frame) OVERRIDE { |
- // If this is the first Encode() then store the TaskRunner and inform the |
- // VideoFrameRecorder so it can post SetEnableRecording() on it. |
- if (!encoder_task_runner_) { |
- encoder_task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
- recorder_task_runner_->PostTask(FROM_HERE, |
- base::Bind(&VideoFrameRecorder::SetEncoderTaskRunner, |
- recorder_, |
- encoder_task_runner_)); |
- } |
- |
- DCHECK(encoder_task_runner_->BelongsToCurrentThread()); |
- |
- if (enable_recording_) { |
- // Copy the frame and post it to the VideoFrameRecorder to store. |
- scoped_ptr<webrtc::DesktopFrame> frame_copy( |
- new webrtc::BasicDesktopFrame(frame.size())); |
- *frame_copy->mutable_updated_region() = frame.updated_region(); |
- frame_copy->set_dpi(frame.dpi()); |
- frame_copy->CopyPixelsFrom(frame.data(), |
- frame.stride(), |
- webrtc::DesktopRect::MakeSize(frame.size())); |
- recorder_task_runner_->PostTask(FROM_HERE, |
- base::Bind(&VideoFrameRecorder::RecordFrame, |
- recorder_, |
- base::Passed(&frame_copy))); |
- } |
- |
- return encoder_->Encode(frame); |
- } |
- |
- private: |
- scoped_ptr<VideoEncoder> encoder_; |
- scoped_refptr<base::TaskRunner> recorder_task_runner_; |
- base::WeakPtr<VideoFrameRecorder> recorder_; |
- |
- bool enable_recording_; |
- scoped_refptr<base::SingleThreadTaskRunner> encoder_task_runner_; |
- |
- base::WeakPtrFactory<RecordingVideoEncoder> weak_factory_; |
- |
- DISALLOW_COPY_AND_ASSIGN(RecordingVideoEncoder); |
-}; |
- |
-VideoFrameRecorder::VideoFrameRecorder() |
- : content_bytes_(0), |
- max_content_bytes_(0), |
- enable_recording_(false), |
- weak_factory_(this) { |
-} |
- |
-VideoFrameRecorder::~VideoFrameRecorder() { |
- SetEnableRecording(false); |
- STLDeleteElements(&recorded_frames_); |
-} |
- |
-scoped_ptr<VideoEncoder> VideoFrameRecorder::WrapVideoEncoder( |
- scoped_ptr<VideoEncoder> encoder) { |
- DCHECK(!caller_task_runner_); |
- caller_task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
- |
- scoped_ptr<RecordingVideoEncoder> recording_encoder( |
- new RecordingVideoEncoder(encoder.Pass(), |
- caller_task_runner_, |
- weak_factory_.GetWeakPtr())); |
- recording_encoder_ = recording_encoder->AsWeakPtr(); |
- |
- return recording_encoder.PassAs<VideoEncoder>(); |
-} |
- |
-void VideoFrameRecorder::SetEnableRecording(bool enable_recording) { |
- DCHECK(!caller_task_runner_ || caller_task_runner_->BelongsToCurrentThread()); |
- |
- if (enable_recording_ == enable_recording) { |
- return; |
- } |
- enable_recording_ = enable_recording; |
- |
- if (encoder_task_runner_) { |
- encoder_task_runner_->PostTask(FROM_HERE, |
- base::Bind(&RecordingVideoEncoder::SetEnableRecording, |
- recording_encoder_, |
- enable_recording_)); |
- } |
-} |
- |
-void VideoFrameRecorder::SetMaxContentBytes(int64_t max_content_bytes) { |
- DCHECK(!caller_task_runner_ || caller_task_runner_->BelongsToCurrentThread()); |
- DCHECK_GE(max_content_bytes, 0); |
- |
- max_content_bytes_ = max_content_bytes; |
-} |
- |
-scoped_ptr<webrtc::DesktopFrame> VideoFrameRecorder::NextFrame() { |
- DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
- |
- scoped_ptr<webrtc::DesktopFrame> frame; |
- if (!recorded_frames_.empty()) { |
- frame.reset(recorded_frames_.front()); |
- recorded_frames_.pop_front(); |
- content_bytes_ -= FrameContentSize(frame.get()); |
- DCHECK_GE(content_bytes_, 0); |
- } |
- |
- return frame.Pass(); |
-} |
- |
-void VideoFrameRecorder::SetEncoderTaskRunner( |
- scoped_refptr<base::TaskRunner> task_runner) { |
- DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
- DCHECK(!encoder_task_runner_); |
- DCHECK(task_runner); |
- |
- encoder_task_runner_ = task_runner; |
- |
- // If the caller already enabled recording, inform the recording encoder. |
- if (enable_recording_ && encoder_task_runner_) { |
- encoder_task_runner_->PostTask(FROM_HERE, |
- base::Bind(&RecordingVideoEncoder::SetEnableRecording, |
- recording_encoder_, |
- enable_recording_)); |
- } |
-} |
- |
-void VideoFrameRecorder::RecordFrame(scoped_ptr<webrtc::DesktopFrame> frame) { |
- DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
- |
- int64_t frame_bytes = FrameContentSize(frame.get()); |
- DCHECK_GE(frame_bytes, 0); |
- |
- // Purge existing frames until there is space for the new one. |
- while (content_bytes_ + frame_bytes > max_content_bytes_ && |
- !recorded_frames_.empty()) { |
- scoped_ptr<webrtc::DesktopFrame> drop_frame(recorded_frames_.front()); |
- recorded_frames_.pop_front(); |
- content_bytes_ -= FrameContentSize(drop_frame.get()); |
- DCHECK_GE(content_bytes_, 0); |
- } |
- |
- // If the frame is still too big, ignore it. |
- if (content_bytes_ + frame_bytes > max_content_bytes_) { |
- return; |
- } |
- |
- // Store the frame and update the content byte count. |
- recorded_frames_.push_back(frame.release()); |
- content_bytes_ += frame_bytes; |
-} |
- |
-} // namespace remoting |