1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "remoting/codec/webrtc_video_encoder_proxy.h"
6
7 #include "base/bind.h"
8 #include "base/threading/sequenced_task_runner_handle.h"
9 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
10
11 namespace remoting {
12
13 class WebrtcVideoEncoderProxy::Core {
14 public:
Core(std::unique_ptr<WebrtcVideoEncoder> encoder)15 Core(std::unique_ptr<WebrtcVideoEncoder> encoder)
16 : encoder_(std::move(encoder)),
17 main_task_runner_(base::SequencedTaskRunnerHandle::Get()) {}
18 ~Core() = default;
19
SetLosslessEncode(bool want_lossless)20 void SetLosslessEncode(bool want_lossless) {
21 encoder_->SetLosslessEncode(want_lossless);
22 }
23
SetLosslessColor(bool want_lossless)24 void SetLosslessColor(bool want_lossless) {
25 encoder_->SetLosslessColor(want_lossless);
26 }
27
Encode(std::unique_ptr<webrtc::DesktopFrame> frame,const FrameParams & params,EncodeCallback done)28 void Encode(std::unique_ptr<webrtc::DesktopFrame> frame,
29 const FrameParams& params,
30 EncodeCallback done) {
31 encoder_->Encode(std::move(frame), params,
32 base::BindOnce(&Core::OnEncoded, base::Unretained(this),
33 std::move(done)));
34 }
35
36 private:
OnEncoded(EncodeCallback done,EncodeResult result,std::unique_ptr<WebrtcVideoEncoder::EncodedFrame> frame)37 void OnEncoded(EncodeCallback done,
38 EncodeResult result,
39 std::unique_ptr<WebrtcVideoEncoder::EncodedFrame> frame) {
40 main_task_runner_->PostTask(
41 FROM_HERE, base::BindOnce(std::move(done), result, std::move(frame)));
42 }
43
44 std::unique_ptr<WebrtcVideoEncoder> encoder_;
45 scoped_refptr<base::SequencedTaskRunner> main_task_runner_;
46 };
47
WebrtcVideoEncoderProxy(std::unique_ptr<WebrtcVideoEncoder> encoder,scoped_refptr<base::SequencedTaskRunner> encode_task_runner)48 WebrtcVideoEncoderProxy::WebrtcVideoEncoderProxy(
49 std::unique_ptr<WebrtcVideoEncoder> encoder,
50 scoped_refptr<base::SequencedTaskRunner> encode_task_runner)
51 : core_(new Core(std::move(encoder))),
52 encode_task_runner_(encode_task_runner) {}
53
~WebrtcVideoEncoderProxy()54 WebrtcVideoEncoderProxy::~WebrtcVideoEncoderProxy() {
55 encode_task_runner_->DeleteSoon(FROM_HERE, core_.release());
56 }
57
SetLosslessEncode(bool want_lossless)58 void WebrtcVideoEncoderProxy::SetLosslessEncode(bool want_lossless) {
59 encode_task_runner_->PostTask(
60 FROM_HERE, base::BindOnce(&Core::SetLosslessEncode,
61 base::Unretained(core_.get()), want_lossless));
62 }
63
SetLosslessColor(bool want_lossless)64 void WebrtcVideoEncoderProxy::SetLosslessColor(bool want_lossless) {
65 encode_task_runner_->PostTask(
66 FROM_HERE, base::BindOnce(&Core::SetLosslessColor,
67 base::Unretained(core_.get()), want_lossless));
68 }
69
Encode(std::unique_ptr<webrtc::DesktopFrame> frame,const FrameParams & params,EncodeCallback done)70 void WebrtcVideoEncoderProxy::Encode(
71 std::unique_ptr<webrtc::DesktopFrame> frame,
72 const FrameParams& params,
73 EncodeCallback done) {
74 encode_task_runner_->PostTask(
75 FROM_HERE,
76 base::BindOnce(
77 &Core::Encode, base::Unretained(core_.get()), std::move(frame),
78 params,
79 base::BindOnce(&WebrtcVideoEncoderProxy::OnEncoded,
80 weak_factory_.GetWeakPtr(), std::move(done))));
81 }
82
OnEncoded(EncodeCallback done,EncodeResult result,std::unique_ptr<WebrtcVideoEncoder::EncodedFrame> frame)83 void WebrtcVideoEncoderProxy::OnEncoded(
84 EncodeCallback done,
85 EncodeResult result,
86 std::unique_ptr<WebrtcVideoEncoder::EncodedFrame> frame) {
87 std::move(done).Run(result, std::move(frame));
88 }
89
90 } // namespace remoting
91