| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/callback_helpers.h" | 6 #include "base/callback_helpers.h" |
| 7 #include "base/format_macros.h" | 7 #include "base/format_macros.h" |
| 8 #include "base/run_loop.h" | 8 #include "base/run_loop.h" |
| 9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
| 10 #include "base/test/simple_test_tick_clock.h" | 10 #include "base/test/simple_test_tick_clock.h" |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 static SampleFormat kSampleFormat = kSampleFormatPlanarF32; | 47 static SampleFormat kSampleFormat = kSampleFormatPlanarF32; |
| 48 static ChannelLayout kChannelLayout = CHANNEL_LAYOUT_STEREO; | 48 static ChannelLayout kChannelLayout = CHANNEL_LAYOUT_STEREO; |
| 49 static int kChannelCount = 2; | 49 static int kChannelCount = 2; |
| 50 static int kChannels = ChannelLayoutToChannelCount(kChannelLayout); | 50 static int kChannels = ChannelLayoutToChannelCount(kChannelLayout); |
| 51 | 51 |
| 52 // Use a different output sample rate so the AudioBufferConverter is invoked. | 52 // Use a different output sample rate so the AudioBufferConverter is invoked. |
| 53 static int kInputSamplesPerSecond = 5000; | 53 static int kInputSamplesPerSecond = 5000; |
| 54 static int kOutputSamplesPerSecond = 10000; | 54 static int kOutputSamplesPerSecond = 10000; |
| 55 | 55 |
| 56 ACTION_P(EnterPendingDecoderInitStateAction, test) { | 56 ACTION_P(EnterPendingDecoderInitStateAction, test) { |
| 57 test->EnterPendingDecoderInitState(arg2); | 57 test->EnterPendingDecoderInitState(arg1); |
| 58 } | 58 } |
| 59 | 59 |
| 60 class AudioRendererImplTest : public ::testing::Test { | 60 class AudioRendererImplTest : public ::testing::Test { |
| 61 public: | 61 public: |
| 62 // Give the decoder some non-garbage media properties. | 62 // Give the decoder some non-garbage media properties. |
| 63 AudioRendererImplTest() | 63 AudioRendererImplTest() |
| 64 : hardware_config_(AudioParameters(), AudioParameters()), | 64 : hardware_config_(AudioParameters(), AudioParameters()), |
| 65 tick_clock_(new base::SimpleTestTickClock()), | 65 tick_clock_(new base::SimpleTestTickClock()), |
| 66 demuxer_stream_(DemuxerStream::AUDIO), | 66 demuxer_stream_(DemuxerStream::AUDIO), |
| 67 decoder_(new MockAudioDecoder()), | 67 decoder_(new MockAudioDecoder()), |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 102 new MediaLog())); | 102 new MediaLog())); |
| 103 renderer_->tick_clock_.reset(tick_clock_); | 103 renderer_->tick_clock_.reset(tick_clock_); |
| 104 tick_clock_->Advance(base::TimeDelta::FromSeconds(1)); | 104 tick_clock_->Advance(base::TimeDelta::FromSeconds(1)); |
| 105 } | 105 } |
| 106 | 106 |
| 107 virtual ~AudioRendererImplTest() { | 107 virtual ~AudioRendererImplTest() { |
| 108 SCOPED_TRACE("~AudioRendererImplTest()"); | 108 SCOPED_TRACE("~AudioRendererImplTest()"); |
| 109 } | 109 } |
| 110 | 110 |
| 111 void ExpectUnsupportedAudioDecoder() { | 111 void ExpectUnsupportedAudioDecoder() { |
| 112 EXPECT_CALL(*decoder_, Initialize(_, _, _, _)) | 112 EXPECT_CALL(*decoder_, Initialize(_, _, _)) |
| 113 .WillOnce(DoAll(SaveArg<3>(&output_cb_), RunCallback<2>(false))); | 113 .WillOnce(DoAll(SaveArg<2>(&output_cb_), RunCallback<1>(false))); |
| 114 } | 114 } |
| 115 | 115 |
| 116 void OnStatistics(const PipelineStatistics& stats) { | 116 void OnStatistics(const PipelineStatistics& stats) { |
| 117 last_statistics_.audio_memory_usage += stats.audio_memory_usage; | 117 last_statistics_.audio_memory_usage += stats.audio_memory_usage; |
| 118 } | 118 } |
| 119 | 119 |
| 120 MOCK_METHOD1(OnBufferingStateChange, void(BufferingState)); | 120 MOCK_METHOD1(OnBufferingStateChange, void(BufferingState)); |
| 121 MOCK_METHOD1(OnError, void(PipelineStatus)); | 121 MOCK_METHOD1(OnError, void(PipelineStatus)); |
| 122 MOCK_METHOD0(OnWaitingForDecryptionKey, void(void)); | 122 MOCK_METHOD0(OnWaitingForDecryptionKey, void(void)); |
| 123 | 123 |
| 124 void InitializeRenderer(const PipelineStatusCB& pipeline_status_cb) { | 124 void InitializeRenderer(const PipelineStatusCB& pipeline_status_cb) { |
| 125 EXPECT_CALL(*this, OnWaitingForDecryptionKey()).Times(0); | 125 EXPECT_CALL(*this, OnWaitingForDecryptionKey()).Times(0); |
| 126 renderer_->Initialize( | 126 renderer_->Initialize( |
| 127 &demuxer_stream_, pipeline_status_cb, SetCdmReadyCB(), | 127 &demuxer_stream_, pipeline_status_cb, SetCdmReadyCB(), |
| 128 base::Bind(&AudioRendererImplTest::OnStatistics, | 128 base::Bind(&AudioRendererImplTest::OnStatistics, |
| 129 base::Unretained(this)), | 129 base::Unretained(this)), |
| 130 base::Bind(&AudioRendererImplTest::OnBufferingStateChange, | 130 base::Bind(&AudioRendererImplTest::OnBufferingStateChange, |
| 131 base::Unretained(this)), | 131 base::Unretained(this)), |
| 132 base::Bind(&AudioRendererImplTest::OnEnded, base::Unretained(this)), | 132 base::Bind(&AudioRendererImplTest::OnEnded, base::Unretained(this)), |
| 133 base::Bind(&AudioRendererImplTest::OnError, base::Unretained(this)), | 133 base::Bind(&AudioRendererImplTest::OnError, base::Unretained(this)), |
| 134 base::Bind(&AudioRendererImplTest::OnWaitingForDecryptionKey, | 134 base::Bind(&AudioRendererImplTest::OnWaitingForDecryptionKey, |
| 135 base::Unretained(this))); | 135 base::Unretained(this))); |
| 136 } | 136 } |
| 137 | 137 |
| 138 void Initialize() { | 138 void Initialize() { |
| 139 EXPECT_CALL(*decoder_, Initialize(_, _, _, _)) | 139 EXPECT_CALL(*decoder_, Initialize(_, _, _)) |
| 140 .WillOnce(DoAll(SaveArg<3>(&output_cb_), RunCallback<2>(true))); | 140 .WillOnce(DoAll(SaveArg<2>(&output_cb_), RunCallback<1>(true))); |
| 141 InitializeWithStatus(PIPELINE_OK); | 141 InitializeWithStatus(PIPELINE_OK); |
| 142 | 142 |
| 143 next_timestamp_.reset(new AudioTimestampHelper(kInputSamplesPerSecond)); | 143 next_timestamp_.reset(new AudioTimestampHelper(kInputSamplesPerSecond)); |
| 144 } | 144 } |
| 145 | 145 |
| 146 void InitializeWithStatus(PipelineStatus expected) { | 146 void InitializeWithStatus(PipelineStatus expected) { |
| 147 SCOPED_TRACE(base::StringPrintf("InitializeWithStatus(%d)", expected)); | 147 SCOPED_TRACE(base::StringPrintf("InitializeWithStatus(%d)", expected)); |
| 148 | 148 |
| 149 WaitableMessageLoopEvent event; | 149 WaitableMessageLoopEvent event; |
| 150 InitializeRenderer(event.GetPipelineStatusCB()); | 150 InitializeRenderer(event.GetPipelineStatusCB()); |
| 151 event.RunAndWaitForStatus(expected); | 151 event.RunAndWaitForStatus(expected); |
| 152 | 152 |
| 153 // We should have no reads. | 153 // We should have no reads. |
| 154 EXPECT_TRUE(decode_cb_.is_null()); | 154 EXPECT_TRUE(decode_cb_.is_null()); |
| 155 } | 155 } |
| 156 | 156 |
| 157 void InitializeAndDestroy() { | 157 void InitializeAndDestroy() { |
| 158 EXPECT_CALL(*decoder_, Initialize(_, _, _, _)) | 158 EXPECT_CALL(*decoder_, Initialize(_, _, _)).WillOnce(RunCallback<1>(true)); |
| 159 .WillOnce(RunCallback<2>(true)); | |
| 160 | 159 |
| 161 WaitableMessageLoopEvent event; | 160 WaitableMessageLoopEvent event; |
| 162 InitializeRenderer(event.GetPipelineStatusCB()); | 161 InitializeRenderer(event.GetPipelineStatusCB()); |
| 163 | 162 |
| 164 // Destroy the |renderer_| before we let the MessageLoop run, this simulates | 163 // Destroy the |renderer_| before we let the MessageLoop run, this simulates |
| 165 // an interleaving in which we end up destroying the |renderer_| while the | 164 // an interleaving in which we end up destroying the |renderer_| while the |
| 166 // OnDecoderSelected callback is in flight. | 165 // OnDecoderSelected callback is in flight. |
| 167 renderer_.reset(); | 166 renderer_.reset(); |
| 168 event.RunAndWaitForStatus(PIPELINE_ERROR_ABORT); | 167 event.RunAndWaitForStatus(PIPELINE_ERROR_ABORT); |
| 169 } | 168 } |
| 170 | 169 |
| 171 void InitializeAndDestroyDuringDecoderInit() { | 170 void InitializeAndDestroyDuringDecoderInit() { |
| 172 EXPECT_CALL(*decoder_, Initialize(_, _, _, _)) | 171 EXPECT_CALL(*decoder_, Initialize(_, _, _)) |
| 173 .WillOnce(EnterPendingDecoderInitStateAction(this)); | 172 .WillOnce(EnterPendingDecoderInitStateAction(this)); |
| 174 | 173 |
| 175 WaitableMessageLoopEvent event; | 174 WaitableMessageLoopEvent event; |
| 176 InitializeRenderer(event.GetPipelineStatusCB()); | 175 InitializeRenderer(event.GetPipelineStatusCB()); |
| 177 base::RunLoop().RunUntilIdle(); | 176 base::RunLoop().RunUntilIdle(); |
| 178 DCHECK(!init_decoder_cb_.is_null()); | 177 DCHECK(!init_decoder_cb_.is_null()); |
| 179 | 178 |
| 180 renderer_.reset(); | 179 renderer_.reset(); |
| 181 event.RunAndWaitForStatus(PIPELINE_ERROR_ABORT); | 180 event.RunAndWaitForStatus(PIPELINE_ERROR_ABORT); |
| 182 } | 181 } |
| (...skipping 700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 883 // Advance far enough that we shouldn't be clamped to current time (tested | 882 // Advance far enough that we shouldn't be clamped to current time (tested |
| 884 // already above). | 883 // already above). |
| 885 tick_clock_->Advance(kOneSecond); | 884 tick_clock_->Advance(kOneSecond); |
| 886 EXPECT_EQ( | 885 EXPECT_EQ( |
| 887 current_time + timestamp_helper.GetFrameDuration(frames_to_consume.value), | 886 current_time + timestamp_helper.GetFrameDuration(frames_to_consume.value), |
| 888 CurrentMediaWallClockTime(&is_time_moving)); | 887 CurrentMediaWallClockTime(&is_time_moving)); |
| 889 EXPECT_TRUE(is_time_moving); | 888 EXPECT_TRUE(is_time_moving); |
| 890 } | 889 } |
| 891 | 890 |
| 892 } // namespace media | 891 } // namespace media |
| OLD | NEW |