blob: 4cbfcde99ffc9c4ab9169fe7a445164fb7f31e2d [file] [log] [blame]
// Copyright 2017 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/codec/webrtc_video_encoder_proxy.h"
#include "base/bind.h"
#include "base/threading/sequenced_task_runner_handle.h"
#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
namespace remoting {
class WebrtcVideoEncoderProxy::Core {
public:
Core(std::unique_ptr<WebrtcVideoEncoder> encoder)
: encoder_(std::move(encoder)),
main_task_runner_(base::SequencedTaskRunnerHandle::Get()) {}
~Core() = default;
void Encode(std::unique_ptr<webrtc::DesktopFrame> frame,
const FrameParams& params,
EncodeCallback done) {
encoder_->Encode(std::move(frame), params,
base::BindOnce(&Core::OnEncoded, base::Unretained(this),
std::move(done)));
}
private:
void OnEncoded(EncodeCallback done,
EncodeResult result,
std::unique_ptr<WebrtcVideoEncoder::EncodedFrame> frame) {
main_task_runner_->PostTask(
FROM_HERE, base::BindOnce(std::move(done), result, std::move(frame)));
}
std::unique_ptr<WebrtcVideoEncoder> encoder_;
scoped_refptr<base::SequencedTaskRunner> main_task_runner_;
};
WebrtcVideoEncoderProxy::WebrtcVideoEncoderProxy(
std::unique_ptr<WebrtcVideoEncoder> encoder,
scoped_refptr<base::SequencedTaskRunner> encode_task_runner)
: core_(new Core(std::move(encoder))),
encode_task_runner_(encode_task_runner),
weak_factory_(this) {}
WebrtcVideoEncoderProxy::~WebrtcVideoEncoderProxy() {
encode_task_runner_->DeleteSoon(FROM_HERE, core_.release());
}
void WebrtcVideoEncoderProxy::Encode(
std::unique_ptr<webrtc::DesktopFrame> frame,
const FrameParams& params,
EncodeCallback done) {
encode_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(
&Core::Encode, base::Unretained(core_.get()), std::move(frame),
params,
base::BindOnce(&WebrtcVideoEncoderProxy::OnEncoded,
weak_factory_.GetWeakPtr(), std::move(done))));
}
void WebrtcVideoEncoderProxy::OnEncoded(
EncodeCallback done,
EncodeResult result,
std::unique_ptr<WebrtcVideoEncoder::EncodedFrame> frame) {
std::move(done).Run(result, std::move(frame));
}
} // namespace remoting