audio_decoder_stream_unittest.cc 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. // Copyright 2018 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 <memory>
  5. #include <utility>
  6. #include "base/bind.h"
  7. #include "base/callback_helpers.h"
  8. #include "base/memory/raw_ptr.h"
  9. #include "base/run_loop.h"
  10. #include "base/test/gmock_callback_support.h"
  11. #include "base/test/task_environment.h"
  12. #include "base/threading/sequenced_task_runner_handle.h"
  13. #include "base/time/time.h"
  14. #include "media/base/media_util.h"
  15. #include "media/base/mock_filters.h"
  16. #include "media/filters/decoder_stream.h"
  17. #include "testing/gmock/include/gmock/gmock.h"
  18. #include "testing/gtest/include/gtest/gtest.h"
  19. using ::base::test::RunCallback;
  20. using ::base::test::RunOnceCallback;
  21. using testing::_;
  22. using testing::AnyNumber;
  23. using testing::DoAll;
  24. using testing::Invoke;
  25. using testing::Return;
  26. using testing::SaveArg;
  27. namespace media {
  28. MATCHER(IsRegularDecoderBuffer, "") {
  29. return !arg->end_of_stream();
  30. }
  31. MATCHER(IsEOSDecoderBuffer, "") {
  32. return arg->end_of_stream();
  33. }
  34. static void OnAudioDecoderStreamInitialized(base::OnceClosure closure,
  35. bool success) {
  36. ASSERT_TRUE(success);
  37. std::move(closure).Run();
  38. }
  39. class AudioDecoderStreamTest : public testing::Test {
  40. public:
  41. AudioDecoderStreamTest()
  42. : audio_decoder_stream_(
  43. std::make_unique<AudioDecoderStream::StreamTraits>(
  44. &media_log_,
  45. CHANNEL_LAYOUT_STEREO,
  46. kSampleFormatPlanarF32),
  47. task_environment_.GetMainThreadTaskRunner(),
  48. base::BindRepeating(&AudioDecoderStreamTest::CreateMockAudioDecoder,
  49. base::Unretained(this)),
  50. &media_log_) {
  51. // Any valid config will do.
  52. demuxer_stream_.set_audio_decoder_config({AudioCodec::kAAC,
  53. kSampleFormatS16,
  54. CHANNEL_LAYOUT_STEREO,
  55. 44100,
  56. {},
  57. {}});
  58. EXPECT_CALL(demuxer_stream_, SupportsConfigChanges())
  59. .WillRepeatedly(Return(true));
  60. base::RunLoop run_loop;
  61. audio_decoder_stream_.Initialize(
  62. &demuxer_stream_,
  63. base::BindOnce(&OnAudioDecoderStreamInitialized,
  64. run_loop.QuitClosure()),
  65. nullptr, base::DoNothing(), base::DoNothing());
  66. run_loop.Run();
  67. }
  68. AudioDecoderStreamTest(const AudioDecoderStreamTest&) = delete;
  69. AudioDecoderStreamTest& operator=(const AudioDecoderStreamTest&) = delete;
  70. MockDemuxerStream* demuxer_stream() { return &demuxer_stream_; }
  71. MockAudioDecoder* decoder() { return decoder_; }
  72. void ReadAudioBuffer(base::OnceClosure closure) {
  73. audio_decoder_stream_.Read(
  74. base::BindOnce(&AudioDecoderStreamTest::OnAudioBufferReadDone,
  75. base::Unretained(this), std::move(closure)));
  76. }
  77. void ProduceDecoderOutput(scoped_refptr<DecoderBuffer> buffer,
  78. AudioDecoder::DecodeCB decode_cb) {
  79. // Make sure successive AudioBuffers have increasing timestamps.
  80. last_timestamp_ += base::Milliseconds(27);
  81. const auto& config = demuxer_stream_.audio_decoder_config();
  82. base::SequencedTaskRunnerHandle::Get()->PostTask(
  83. FROM_HERE,
  84. base::BindOnce(
  85. decoder_output_cb_,
  86. AudioBuffer::CreateEmptyBuffer(
  87. config.channel_layout(), config.channels(),
  88. config.samples_per_second(), 1221, last_timestamp_)));
  89. base::SequencedTaskRunnerHandle::Get()->PostTask(
  90. FROM_HERE,
  91. base::BindOnce(std::move(decode_cb), DecoderStatus::Codes::kOk));
  92. }
  93. void RunUntilIdle() { task_environment_.RunUntilIdle(); }
  94. private:
  95. std::vector<std::unique_ptr<AudioDecoder>> CreateMockAudioDecoder() {
  96. auto decoder = std::make_unique<MockAudioDecoder>();
  97. EXPECT_CALL(*decoder, Initialize_(_, _, _, _, _))
  98. .Times(AnyNumber())
  99. .WillRepeatedly(DoAll(SaveArg<3>(&decoder_output_cb_),
  100. RunOnceCallback<2>(DecoderStatus::Codes::kOk)));
  101. decoder_ = decoder.get();
  102. std::vector<std::unique_ptr<AudioDecoder>> result;
  103. result.push_back(std::move(decoder));
  104. return result;
  105. }
  106. void OnAudioBufferReadDone(base::OnceClosure closure,
  107. AudioDecoderStream::ReadResult result) {
  108. std::move(closure).Run();
  109. }
  110. base::test::TaskEnvironment task_environment_;
  111. NullMediaLog media_log_;
  112. testing::NiceMock<MockDemuxerStream> demuxer_stream_{DemuxerStream::AUDIO};
  113. AudioDecoderStream audio_decoder_stream_;
  114. raw_ptr<MockAudioDecoder> decoder_ = nullptr;
  115. AudioDecoder::OutputCB decoder_output_cb_;
  116. base::TimeDelta last_timestamp_;
  117. };
  118. TEST_F(AudioDecoderStreamTest, FlushOnConfigChange) {
  119. MockAudioDecoder* first_decoder = decoder();
  120. ASSERT_NE(first_decoder, nullptr);
  121. // Make a regular DemuxerStream::Read().
  122. EXPECT_CALL(*demuxer_stream(), OnRead(_))
  123. .WillOnce(RunOnceCallback<0>(DemuxerStream::kOk, new DecoderBuffer(12)));
  124. EXPECT_CALL(*decoder(), Decode(IsRegularDecoderBuffer(), _))
  125. .WillOnce(Invoke(this, &AudioDecoderStreamTest::ProduceDecoderOutput));
  126. base::RunLoop run_loop0;
  127. ReadAudioBuffer(run_loop0.QuitClosure());
  128. run_loop0.Run();
  129. // Make a config-change DemuxerStream::Read().
  130. // Expect the decoder to be flushed. Upon flushing, the decoder releases
  131. // internally buffered output.
  132. EXPECT_CALL(*demuxer_stream(), OnRead(_))
  133. .WillOnce(RunOnceCallback<0>(DemuxerStream::kConfigChanged, nullptr));
  134. EXPECT_CALL(*decoder(), Decode(IsEOSDecoderBuffer(), _))
  135. .WillOnce(Invoke(this, &AudioDecoderStreamTest::ProduceDecoderOutput));
  136. base::RunLoop run_loop1;
  137. ReadAudioBuffer(run_loop1.QuitClosure());
  138. run_loop1.Run();
  139. // Expect the decoder to be re-initialized when AudioDecoderStream finishes
  140. // processing the last decode.
  141. EXPECT_CALL(*decoder(), Initialize_(_, _, _, _, _));
  142. RunUntilIdle();
  143. }
  144. } // namespace media