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 #ifndef MEDIA_TEST_PIPELINE_INTEGRATION_TEST_BASE_H_ | 5 #ifndef MEDIA_TEST_PIPELINE_INTEGRATION_TEST_BASE_H_ |
6 #define MEDIA_TEST_PIPELINE_INTEGRATION_TEST_BASE_H_ | 6 #define MEDIA_TEST_PIPELINE_INTEGRATION_TEST_BASE_H_ |
7 | 7 |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 #include <memory> | 9 #include <memory> |
10 | 10 |
11 #include "base/md5.h" | 11 #include "base/md5.h" |
12 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
13 #include "base/test/scoped_task_scheduler.h" | 13 #include "base/test/scoped_task_scheduler.h" |
14 #include "media/audio/clockless_audio_sink.h" | 14 #include "media/audio/clockless_audio_sink.h" |
15 #include "media/audio/null_audio_sink.h" | 15 #include "media/audio/null_audio_sink.h" |
16 #include "media/base/demuxer.h" | 16 #include "media/base/demuxer.h" |
17 #include "media/base/null_video_sink.h" | 17 #include "media/base/null_video_sink.h" |
18 #include "media/base/pipeline_impl.h" | 18 #include "media/base/pipeline_impl.h" |
19 #include "media/base/pipeline_status.h" | 19 #include "media/base/pipeline_status.h" |
20 #include "media/base/text_track.h" | 20 #include "media/base/text_track.h" |
21 #include "media/base/text_track_config.h" | 21 #include "media/base/text_track_config.h" |
22 #include "media/base/video_frame.h" | 22 #include "media/base/video_frame.h" |
23 #include "media/renderers/video_renderer_impl.h" | 23 #include "media/renderers/video_renderer_impl.h" |
24 #include "testing/gmock/include/gmock/gmock.h" | 24 #include "testing/gmock/include/gmock/gmock.h" |
25 | 25 |
26 namespace media { | 26 namespace media { |
27 | 27 |
28 class CdmContext; | 28 class FakeEncryptedMedia; |
| 29 class MockMediaSource; |
29 | 30 |
30 // Empty MD5 hash string. Used to verify empty video tracks. | 31 // Empty MD5 hash string. Used to verify empty video tracks. |
31 extern const char kNullVideoHash[]; | 32 extern const char kNullVideoHash[]; |
32 | 33 |
33 // Empty hash string. Used to verify empty audio tracks. | 34 // Empty hash string. Used to verify empty audio tracks. |
34 extern const char kNullAudioHash[]; | 35 extern const char kNullAudioHash[]; |
35 | 36 |
36 // Dummy tick clock which advances extremely quickly (1 minute every time | 37 // Dummy tick clock which advances extremely quickly (1 minute every time |
37 // NowTicks() is called). | 38 // NowTicks() is called). |
38 class DummyTickClock : public base::TickClock { | 39 class DummyTickClock : public base::TickClock { |
39 public: | 40 public: |
40 DummyTickClock() : now_() {} | 41 DummyTickClock() : now_() {} |
41 ~DummyTickClock() override {} | 42 ~DummyTickClock() override {} |
42 base::TimeTicks NowTicks() override; | 43 base::TimeTicks NowTicks() override; |
43 | 44 |
44 private: | 45 private: |
45 base::TimeTicks now_; | 46 base::TimeTicks now_; |
46 }; | 47 }; |
47 | 48 |
| 49 class PipelineTestRendererFactory { |
| 50 public: |
| 51 virtual ~PipelineTestRendererFactory() {} |
| 52 // Creates and returns a Renderer. |
| 53 virtual std::unique_ptr<Renderer> CreateRenderer( |
| 54 CreateVideoDecodersCB prepend_video_decoders_cb, |
| 55 CreateAudioDecodersCB prepend_audio_decoders_cb) = 0; |
| 56 }; |
| 57 |
48 // Integration tests for Pipeline. Real demuxers, real decoders, and | 58 // Integration tests for Pipeline. Real demuxers, real decoders, and |
49 // base renderer implementations are used to verify pipeline functionality. The | 59 // base renderer implementations are used to verify pipeline functionality. The |
50 // renderers used in these tests rely heavily on the AudioRendererBase & | 60 // renderers used in these tests rely heavily on the AudioRendererBase & |
51 // VideoRendererImpl implementations which contain a majority of the code used | 61 // VideoRendererImpl implementations which contain a majority of the code used |
52 // in the real AudioRendererImpl & SkCanvasVideoRenderer implementations used in | 62 // in the real AudioRendererImpl & SkCanvasVideoRenderer implementations used in |
53 // the browser. The renderers in this test don't actually write data to a | 63 // the browser. The renderers in this test don't actually write data to a |
54 // display or audio device. Both of these devices are simulated since they have | 64 // display or audio device. Both of these devices are simulated since they have |
55 // little effect on verifying pipeline behavior and allow tests to run faster | 65 // little effect on verifying pipeline behavior and allow tests to run faster |
56 // than real-time. | 66 // than real-time. |
57 class PipelineIntegrationTestBase : public Pipeline::Client { | 67 class PipelineIntegrationTestBase : public Pipeline::Client { |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 // Pipeline must have been started with clockless playback enabled. | 129 // Pipeline must have been started with clockless playback enabled. |
120 base::TimeDelta GetAudioTime(); | 130 base::TimeDelta GetAudioTime(); |
121 | 131 |
122 // Sets a callback to handle EME "encrypted" event. Must be called to test | 132 // Sets a callback to handle EME "encrypted" event. Must be called to test |
123 // potentially encrypted media. | 133 // potentially encrypted media. |
124 void set_encrypted_media_init_data_cb( | 134 void set_encrypted_media_init_data_cb( |
125 const Demuxer::EncryptedMediaInitDataCB& encrypted_media_init_data_cb) { | 135 const Demuxer::EncryptedMediaInitDataCB& encrypted_media_init_data_cb) { |
126 encrypted_media_init_data_cb_ = encrypted_media_init_data_cb; | 136 encrypted_media_init_data_cb_ = encrypted_media_init_data_cb; |
127 } | 137 } |
128 | 138 |
| 139 std::unique_ptr<Renderer> CreateRenderer( |
| 140 CreateVideoDecodersCB prepend_video_decoders_cb, |
| 141 CreateAudioDecodersCB prepend_audio_decoders_cb); |
| 142 |
129 protected: | 143 protected: |
130 MediaLog media_log_; | 144 MediaLog media_log_; |
131 base::MessageLoop message_loop_; | 145 base::MessageLoop message_loop_; |
132 base::MD5Context md5_context_; | 146 base::MD5Context md5_context_; |
133 bool hashing_enabled_; | 147 bool hashing_enabled_; |
134 bool clockless_playback_; | 148 bool clockless_playback_; |
135 | 149 |
136 // TaskScheduler is used only for FFmpegDemuxer. | 150 // TaskScheduler is used only for FFmpegDemuxer. |
137 std::unique_ptr<base::test::ScopedTaskScheduler> task_scheduler_; | 151 std::unique_ptr<base::test::ScopedTaskScheduler> task_scheduler_; |
138 std::unique_ptr<Demuxer> demuxer_; | 152 std::unique_ptr<Demuxer> demuxer_; |
139 std::unique_ptr<DataSource> data_source_; | 153 std::unique_ptr<DataSource> data_source_; |
140 std::unique_ptr<PipelineImpl> pipeline_; | 154 std::unique_ptr<PipelineImpl> pipeline_; |
141 scoped_refptr<NullAudioSink> audio_sink_; | 155 scoped_refptr<NullAudioSink> audio_sink_; |
142 scoped_refptr<ClocklessAudioSink> clockless_audio_sink_; | 156 scoped_refptr<ClocklessAudioSink> clockless_audio_sink_; |
143 std::unique_ptr<NullVideoSink> video_sink_; | 157 std::unique_ptr<NullVideoSink> video_sink_; |
144 bool ended_; | 158 bool ended_; |
145 PipelineStatus pipeline_status_; | 159 PipelineStatus pipeline_status_; |
146 Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb_; | 160 Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb_; |
147 VideoPixelFormat last_video_frame_format_; | 161 VideoPixelFormat last_video_frame_format_; |
148 ColorSpace last_video_frame_color_space_; | 162 ColorSpace last_video_frame_color_space_; |
149 DummyTickClock dummy_clock_; | 163 DummyTickClock dummy_clock_; |
150 PipelineMetadata metadata_; | 164 PipelineMetadata metadata_; |
151 scoped_refptr<VideoFrame> last_frame_; | 165 scoped_refptr<VideoFrame> last_frame_; |
152 base::TimeDelta current_duration_; | 166 base::TimeDelta current_duration_; |
| 167 std::unique_ptr<PipelineTestRendererFactory> renderer_factory_; |
153 | 168 |
154 PipelineStatus StartInternal( | 169 PipelineStatus StartInternal( |
155 std::unique_ptr<DataSource> data_source, | 170 std::unique_ptr<DataSource> data_source, |
156 CdmContext* cdm_context, | 171 CdmContext* cdm_context, |
157 uint8_t test_type, | 172 uint8_t test_type, |
158 CreateVideoDecodersCB prepend_video_decoders_cb = CreateVideoDecodersCB(), | 173 CreateVideoDecodersCB prepend_video_decoders_cb = CreateVideoDecodersCB(), |
159 CreateAudioDecodersCB prepend_audio_decoders_cb = | 174 CreateAudioDecodersCB prepend_audio_decoders_cb = |
160 CreateAudioDecodersCB()); | 175 CreateAudioDecodersCB()); |
161 | 176 |
162 PipelineStatus StartWithFile( | 177 PipelineStatus StartWithFile( |
163 const std::string& filename, | 178 const std::string& filename, |
164 CdmContext* cdm_context, | 179 CdmContext* cdm_context, |
165 uint8_t test_type, | 180 uint8_t test_type, |
166 CreateVideoDecodersCB prepend_video_decoders_cb = CreateVideoDecodersCB(), | 181 CreateVideoDecodersCB prepend_video_decoders_cb = CreateVideoDecodersCB(), |
167 CreateAudioDecodersCB prepend_audio_decoders_cb = | 182 CreateAudioDecodersCB prepend_audio_decoders_cb = |
168 CreateAudioDecodersCB()); | 183 CreateAudioDecodersCB()); |
169 | 184 |
| 185 PipelineStatus StartPipelineWithMediaSource(MockMediaSource* source); |
| 186 PipelineStatus StartPipelineWithEncryptedMedia( |
| 187 MockMediaSource* source, |
| 188 FakeEncryptedMedia* encrypted_media); |
| 189 PipelineStatus StartPipelineWithMediaSource( |
| 190 MockMediaSource* source, |
| 191 uint8_t test_type, |
| 192 FakeEncryptedMedia* encrypted_media); |
| 193 |
170 void OnSeeked(base::TimeDelta seek_time, PipelineStatus status); | 194 void OnSeeked(base::TimeDelta seek_time, PipelineStatus status); |
171 void OnStatusCallback(PipelineStatus status); | 195 void OnStatusCallback(PipelineStatus status); |
172 void DemuxerEncryptedMediaInitDataCB(EmeInitDataType type, | 196 void DemuxerEncryptedMediaInitDataCB(EmeInitDataType type, |
173 const std::vector<uint8_t>& init_data); | 197 const std::vector<uint8_t>& init_data); |
174 | 198 |
175 void DemuxerMediaTracksUpdatedCB(std::unique_ptr<MediaTracks> tracks); | 199 void DemuxerMediaTracksUpdatedCB(std::unique_ptr<MediaTracks> tracks); |
176 | 200 |
177 void QuitAfterCurrentTimeTask(const base::TimeDelta& quit_time); | 201 void QuitAfterCurrentTimeTask(const base::TimeDelta& quit_time); |
178 | 202 |
179 // Creates Demuxer and sets |demuxer_|. | 203 // Creates Demuxer and sets |demuxer_|. |
180 void CreateDemuxer(std::unique_ptr<DataSource> data_source); | 204 void CreateDemuxer(std::unique_ptr<DataSource> data_source); |
181 | 205 |
182 // Creates and returns a Renderer. | |
183 virtual std::unique_ptr<Renderer> CreateRenderer( | |
184 CreateVideoDecodersCB prepend_video_decoders_cb = CreateVideoDecodersCB(), | |
185 CreateAudioDecodersCB prepend_audio_decoders_cb = | |
186 CreateAudioDecodersCB()); | |
187 | |
188 void OnVideoFramePaint(const scoped_refptr<VideoFrame>& frame); | 206 void OnVideoFramePaint(const scoped_refptr<VideoFrame>& frame); |
189 | 207 |
190 void CheckDuration(); | 208 void CheckDuration(); |
191 | 209 |
192 // Return the media start time from |demuxer_|. | 210 // Return the media start time from |demuxer_|. |
193 base::TimeDelta GetStartTime(); | 211 base::TimeDelta GetStartTime(); |
194 | 212 |
195 MOCK_METHOD1(DecryptorAttached, void(bool)); | 213 MOCK_METHOD1(DecryptorAttached, void(bool)); |
196 // Pipeline::Client overrides. | 214 // Pipeline::Client overrides. |
197 void OnError(PipelineStatus status) override; | 215 void OnError(PipelineStatus status) override; |
198 void OnEnded() override; | 216 void OnEnded() override; |
199 MOCK_METHOD1(OnMetadata, void(PipelineMetadata)); | 217 MOCK_METHOD1(OnMetadata, void(PipelineMetadata)); |
200 MOCK_METHOD1(OnBufferingStateChange, void(BufferingState)); | 218 MOCK_METHOD1(OnBufferingStateChange, void(BufferingState)); |
201 MOCK_METHOD0(OnDurationChange, void()); | 219 MOCK_METHOD0(OnDurationChange, void()); |
202 MOCK_METHOD2(OnAddTextTrack, | 220 MOCK_METHOD2(OnAddTextTrack, |
203 void(const TextTrackConfig& config, | 221 void(const TextTrackConfig& config, |
204 const AddTextTrackDoneCB& done_cb)); | 222 const AddTextTrackDoneCB& done_cb)); |
205 MOCK_METHOD0(OnWaitingForDecryptionKey, void(void)); | 223 MOCK_METHOD0(OnWaitingForDecryptionKey, void(void)); |
206 MOCK_METHOD1(OnVideoNaturalSizeChange, void(const gfx::Size&)); | 224 MOCK_METHOD1(OnVideoNaturalSizeChange, void(const gfx::Size&)); |
207 MOCK_METHOD1(OnVideoOpacityChange, void(bool)); | 225 MOCK_METHOD1(OnVideoOpacityChange, void(bool)); |
208 MOCK_METHOD0(OnVideoAverageKeyframeDistanceUpdate, void()); | 226 MOCK_METHOD0(OnVideoAverageKeyframeDistanceUpdate, void()); |
| 227 |
| 228 private: |
| 229 DISALLOW_COPY_AND_ASSIGN(PipelineIntegrationTestBase); |
209 }; | 230 }; |
210 | 231 |
211 } // namespace media | 232 } // namespace media |
212 | 233 |
213 #endif // MEDIA_TEST_PIPELINE_INTEGRATION_TEST_BASE_H_ | 234 #endif // MEDIA_TEST_PIPELINE_INTEGRATION_TEST_BASE_H_ |
OLD | NEW |