// Copyright 2020 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. #ifndef MEDIA_BASE_OFFLOADING_VIDEO_ENCODER_H_ #define MEDIA_BASE_OFFLOADING_VIDEO_ENCODER_H_ #include #include #include "base/sequence_checker.h" #include "media/base/video_encoder.h" namespace base { class SequencedTaskRunner; } namespace media { // A wrapper around video encoder that offloads all the calls to a dedicated // task runner. It's used to move synchronous software encoding work off the // current (main) thread. class MEDIA_EXPORT OffloadingVideoEncoder final : public VideoEncoder { public: // |work_runner| - task runner for encoding work // |callback_runner| - all encoder's callbacks will be executed on this task // runner. OffloadingVideoEncoder( std::unique_ptr wrapped_encoder, const scoped_refptr work_runner, const scoped_refptr callback_runner); // Uses current task runner for callbacks and asks thread pool for a new task // runner to do actual encoding work. explicit OffloadingVideoEncoder( std::unique_ptr wrapped_encoder); ~OffloadingVideoEncoder() override; void Initialize(VideoCodecProfile profile, const Options& options, OutputCB output_cb, EncoderStatusCB done_cb) override; void Encode(scoped_refptr frame, bool key_frame, EncoderStatusCB done_cb) override; void ChangeOptions(const Options& options, OutputCB output_cb, EncoderStatusCB done_cb) override; void Flush(EncoderStatusCB done_cb) override; private: template T WrapCallback(T cb); std::unique_ptr wrapped_encoder_; const scoped_refptr work_runner_; const scoped_refptr callback_runner_; SEQUENCE_CHECKER(sequence_checker_); }; } // namespace media #endif // MEDIA_BASE_OFFLOADING_VIDEO_ENCODER_H_