offloading_video_encoder.cc 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // Copyright 2020 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. #include "media/base/offloading_video_encoder.h"
  5. #include "base/task/bind_post_task.h"
  6. #include "base/task/sequenced_task_runner.h"
  7. #include "base/task/task_traits.h"
  8. #include "base/task/thread_pool.h"
  9. #include "base/threading/sequenced_task_runner_handle.h"
  10. #include "base/trace_event/trace_event.h"
  11. #include "media/base/video_frame.h"
  12. namespace media {
  13. OffloadingVideoEncoder::OffloadingVideoEncoder(
  14. std::unique_ptr<VideoEncoder> wrapped_encoder,
  15. const scoped_refptr<base::SequencedTaskRunner> work_runner,
  16. const scoped_refptr<base::SequencedTaskRunner> callback_runner)
  17. : wrapped_encoder_(std::move(wrapped_encoder)),
  18. work_runner_(std::move(work_runner)),
  19. callback_runner_(std::move(callback_runner)) {
  20. DCHECK(wrapped_encoder_);
  21. DCHECK(work_runner_);
  22. DCHECK(callback_runner_);
  23. DCHECK_NE(callback_runner_, work_runner_);
  24. }
  25. OffloadingVideoEncoder::OffloadingVideoEncoder(
  26. std::unique_ptr<VideoEncoder> wrapped_encoder)
  27. : OffloadingVideoEncoder(std::move(wrapped_encoder),
  28. base::ThreadPool::CreateSequencedTaskRunner(
  29. {base::TaskPriority::USER_BLOCKING,
  30. base::WithBaseSyncPrimitives()}),
  31. base::SequencedTaskRunnerHandle::Get()) {}
  32. void OffloadingVideoEncoder::Initialize(VideoCodecProfile profile,
  33. const Options& options,
  34. OutputCB output_cb,
  35. EncoderStatusCB done_cb) {
  36. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  37. work_runner_->PostTask(
  38. FROM_HERE,
  39. base::BindOnce(&VideoEncoder::Initialize,
  40. base::Unretained(wrapped_encoder_.get()), profile, options,
  41. WrapCallback(std::move(output_cb)),
  42. WrapCallback(std::move(done_cb))));
  43. }
  44. void OffloadingVideoEncoder::Encode(scoped_refptr<VideoFrame> frame,
  45. bool key_frame,
  46. EncoderStatusCB done_cb) {
  47. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  48. TRACE_EVENT0("media", "OffloadingVideoEncoder::Encode");
  49. work_runner_->PostTask(
  50. FROM_HERE,
  51. base::BindOnce(&VideoEncoder::Encode,
  52. base::Unretained(wrapped_encoder_.get()), std::move(frame),
  53. key_frame, WrapCallback(std::move(done_cb))));
  54. }
  55. void OffloadingVideoEncoder::ChangeOptions(const Options& options,
  56. OutputCB output_cb,
  57. EncoderStatusCB done_cb) {
  58. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  59. work_runner_->PostTask(
  60. FROM_HERE, base::BindOnce(&VideoEncoder::ChangeOptions,
  61. base::Unretained(wrapped_encoder_.get()),
  62. options, WrapCallback(std::move(output_cb)),
  63. WrapCallback(std::move(done_cb))));
  64. }
  65. void OffloadingVideoEncoder::Flush(EncoderStatusCB done_cb) {
  66. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  67. work_runner_->PostTask(
  68. FROM_HERE, base::BindOnce(&VideoEncoder::Flush,
  69. base::Unretained(wrapped_encoder_.get()),
  70. WrapCallback(std::move(done_cb))));
  71. }
  72. OffloadingVideoEncoder::~OffloadingVideoEncoder() {
  73. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  74. work_runner_->DeleteSoon(FROM_HERE, std::move(wrapped_encoder_));
  75. }
  76. template <class T>
  77. T OffloadingVideoEncoder::WrapCallback(T cb) {
  78. DCHECK(callback_runner_);
  79. return base::BindPostTask(callback_runner_, std::move(cb));
  80. }
  81. } // namespace media