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