OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stddef.h> | 5 #include <stddef.h> |
6 #include <stdint.h> | 6 #include <stdint.h> |
7 | 7 |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 GetParam().sampling_rate, | 51 GetParam().sampling_rate, |
52 GetParam().codec)); | 52 GetParam().codec)); |
53 CHECK_EQ(STATUS_INITIALIZED, audio_decoder_->InitializationResult()); | 53 CHECK_EQ(STATUS_INITIALIZED, audio_decoder_->InitializationResult()); |
54 | 54 |
55 audio_bus_factory_.reset( | 55 audio_bus_factory_.reset( |
56 new TestAudioBusFactory(GetParam().num_channels, | 56 new TestAudioBusFactory(GetParam().num_channels, |
57 GetParam().sampling_rate, | 57 GetParam().sampling_rate, |
58 TestAudioBusFactory::kMiddleANoteFreq, | 58 TestAudioBusFactory::kMiddleANoteFreq, |
59 0.5f)); | 59 0.5f)); |
60 last_frame_id_ = FrameId::first(); | 60 last_frame_id_ = FrameId::first(); |
61 seen_a_decoded_frame_ = false; | 61 decoded_frames_seen_ = 0; |
62 | 62 |
63 if (GetParam().codec == CODEC_AUDIO_OPUS) { | 63 if (GetParam().codec == CODEC_AUDIO_OPUS) { |
64 opus_encoder_memory_.reset( | 64 opus_encoder_memory_.reset( |
65 new uint8_t[opus_encoder_get_size(GetParam().num_channels)]); | 65 new uint8_t[opus_encoder_get_size(GetParam().num_channels)]); |
66 OpusEncoder* const opus_encoder = | 66 OpusEncoder* const opus_encoder = |
67 reinterpret_cast<OpusEncoder*>(opus_encoder_memory_.get()); | 67 reinterpret_cast<OpusEncoder*>(opus_encoder_memory_.get()); |
68 CHECK_EQ(OPUS_OK, opus_encoder_init(opus_encoder, | 68 CHECK_EQ(OPUS_OK, opus_encoder_init(opus_encoder, |
69 GetParam().sampling_rate, | 69 GetParam().sampling_rate, |
70 GetParam().num_channels, | 70 GetParam().num_channels, |
71 OPUS_APPLICATION_AUDIO)); | 71 OPUS_APPLICATION_AUDIO)); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 bool is_continuous) { | 152 bool is_continuous) { |
153 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 153 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
154 | 154 |
155 // A NULL |audio_bus| indicates a decode error, which we don't expect. | 155 // A NULL |audio_bus| indicates a decode error, which we don't expect. |
156 ASSERT_TRUE(audio_bus); | 156 ASSERT_TRUE(audio_bus); |
157 | 157 |
158 // Did the decoder detect whether frames were dropped? | 158 // Did the decoder detect whether frames were dropped? |
159 EXPECT_EQ(should_be_continuous, is_continuous); | 159 EXPECT_EQ(should_be_continuous, is_continuous); |
160 | 160 |
161 // Does the audio data seem to be intact? For Opus, we have to ignore the | 161 // Does the audio data seem to be intact? For Opus, we have to ignore the |
162 // first frame seen at the start (and immediately after dropped packet | 162 // first two frames seen at the start (and immediately after dropped packet |
163 // recovery) because it introduces a tiny, significant delay. | 163 // recovery) because it introduces a tiny, significant delay. |
164 bool examine_signal = true; | 164 bool examine_signal = true; |
165 if (GetParam().codec == CODEC_AUDIO_OPUS) { | 165 if (GetParam().codec == CODEC_AUDIO_OPUS) { |
166 examine_signal = seen_a_decoded_frame_ && should_be_continuous; | 166 ++decoded_frames_seen_; |
167 seen_a_decoded_frame_ = true; | 167 examine_signal = (decoded_frames_seen_ > 2) && should_be_continuous; |
168 } | 168 } |
169 if (examine_signal) { | 169 if (examine_signal) { |
170 for (int ch = 0; ch < audio_bus->channels(); ++ch) { | 170 for (int ch = 0; ch < audio_bus->channels(); ++ch) { |
171 EXPECT_NEAR( | 171 EXPECT_NEAR( |
172 TestAudioBusFactory::kMiddleANoteFreq * 2 * audio_bus->frames() / | 172 TestAudioBusFactory::kMiddleANoteFreq * 2 * audio_bus->frames() / |
173 GetParam().sampling_rate, | 173 GetParam().sampling_rate, |
174 CountZeroCrossings(audio_bus->channel(ch), audio_bus->frames()), | 174 CountZeroCrossings(audio_bus->channel(ch), audio_bus->frames()), |
175 1); | 175 1); |
176 } | 176 } |
177 } | 177 } |
178 | 178 |
179 // Signal the main test thread that more audio was decoded. | 179 // Signal the main test thread that more audio was decoded. |
180 base::AutoLock auto_lock(lock_); | 180 base::AutoLock auto_lock(lock_); |
181 total_audio_decoded_ += base::TimeDelta::FromSeconds(1) * | 181 total_audio_decoded_ += base::TimeDelta::FromSeconds(1) * |
182 audio_bus->frames() / GetParam().sampling_rate; | 182 audio_bus->frames() / GetParam().sampling_rate; |
183 cond_.Signal(); | 183 cond_.Signal(); |
184 } | 184 } |
185 | 185 |
186 const scoped_refptr<StandaloneCastEnvironment> cast_environment_; | 186 const scoped_refptr<StandaloneCastEnvironment> cast_environment_; |
187 std::unique_ptr<AudioDecoder> audio_decoder_; | 187 std::unique_ptr<AudioDecoder> audio_decoder_; |
188 std::unique_ptr<TestAudioBusFactory> audio_bus_factory_; | 188 std::unique_ptr<TestAudioBusFactory> audio_bus_factory_; |
189 FrameId last_frame_id_; | 189 FrameId last_frame_id_; |
190 bool seen_a_decoded_frame_; | 190 int decoded_frames_seen_; |
191 std::unique_ptr<uint8_t[]> opus_encoder_memory_; | 191 std::unique_ptr<uint8_t[]> opus_encoder_memory_; |
192 | 192 |
193 base::Lock lock_; | 193 base::Lock lock_; |
194 base::ConditionVariable cond_; | 194 base::ConditionVariable cond_; |
195 base::TimeDelta total_audio_feed_in_; | 195 base::TimeDelta total_audio_feed_in_; |
196 base::TimeDelta total_audio_decoded_; | 196 base::TimeDelta total_audio_decoded_; |
197 | 197 |
198 DISALLOW_COPY_AND_ASSIGN(AudioDecoderTest); | 198 DISALLOW_COPY_AND_ASSIGN(AudioDecoderTest); |
199 }; | 199 }; |
200 | 200 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
241 AudioDecoderTestScenarios, | 241 AudioDecoderTestScenarios, |
242 AudioDecoderTest, | 242 AudioDecoderTest, |
243 ::testing::Values( | 243 ::testing::Values( |
244 TestScenario(CODEC_AUDIO_PCM16, 1, 8000), | 244 TestScenario(CODEC_AUDIO_PCM16, 1, 8000), |
245 TestScenario(CODEC_AUDIO_PCM16, 2, 48000), | 245 TestScenario(CODEC_AUDIO_PCM16, 2, 48000), |
246 TestScenario(CODEC_AUDIO_OPUS, 1, 8000), | 246 TestScenario(CODEC_AUDIO_OPUS, 1, 8000), |
247 TestScenario(CODEC_AUDIO_OPUS, 2, 48000))); | 247 TestScenario(CODEC_AUDIO_OPUS, 2, 48000))); |
248 | 248 |
249 } // namespace cast | 249 } // namespace cast |
250 } // namespace media | 250 } // namespace media |
OLD | NEW |