offloading_audio_encoder.cc 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // Copyright 2021 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_audio_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. namespace media {
  11. OffloadingAudioEncoder::OffloadingAudioEncoder(
  12. std::unique_ptr<AudioEncoder> wrapped_encoder,
  13. const scoped_refptr<base::SequencedTaskRunner> work_runner,
  14. const scoped_refptr<base::SequencedTaskRunner> callback_runner)
  15. : wrapped_encoder_(std::move(wrapped_encoder)),
  16. work_runner_(std::move(work_runner)),
  17. callback_runner_(std::move(callback_runner)) {
  18. DCHECK(wrapped_encoder_);
  19. DCHECK(work_runner_);
  20. DCHECK(callback_runner_);
  21. DCHECK_NE(callback_runner_, work_runner_);
  22. }
  23. OffloadingAudioEncoder::OffloadingAudioEncoder(
  24. std::unique_ptr<AudioEncoder> wrapped_encoder)
  25. : OffloadingAudioEncoder(std::move(wrapped_encoder),
  26. base::ThreadPool::CreateSequencedTaskRunner(
  27. {base::TaskPriority::USER_BLOCKING}),
  28. base::SequencedTaskRunnerHandle::Get()) {}
  29. void OffloadingAudioEncoder::Initialize(const Options& options,
  30. OutputCB output_cb,
  31. EncoderStatusCB done_cb) {
  32. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  33. work_runner_->PostTask(
  34. FROM_HERE, base::BindOnce(&AudioEncoder::Initialize,
  35. base::Unretained(wrapped_encoder_.get()),
  36. options, WrapCallback(std::move(output_cb)),
  37. WrapCallback(std::move(done_cb))));
  38. }
  39. void OffloadingAudioEncoder::Encode(std::unique_ptr<AudioBus> audio_bus,
  40. base::TimeTicks capture_time,
  41. EncoderStatusCB done_cb) {
  42. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  43. work_runner_->PostTask(
  44. FROM_HERE, base::BindOnce(&AudioEncoder::Encode,
  45. base::Unretained(wrapped_encoder_.get()),
  46. std::move(audio_bus), capture_time,
  47. WrapCallback(std::move(done_cb))));
  48. }
  49. void OffloadingAudioEncoder::Flush(EncoderStatusCB done_cb) {
  50. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  51. work_runner_->PostTask(
  52. FROM_HERE, base::BindOnce(&AudioEncoder::Flush,
  53. base::Unretained(wrapped_encoder_.get()),
  54. WrapCallback(std::move(done_cb))));
  55. }
  56. OffloadingAudioEncoder::~OffloadingAudioEncoder() {
  57. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  58. work_runner_->DeleteSoon(FROM_HERE, std::move(wrapped_encoder_));
  59. }
  60. template <class T>
  61. T OffloadingAudioEncoder::WrapCallback(T cb) {
  62. DCHECK(callback_runner_);
  63. return base::BindPostTask(callback_runner_, std::move(cb));
  64. }
  65. } // namespace media