OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 <string> | 5 #include <string> |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
(...skipping 27 matching lines...) Expand all Loading... |
38 // TODO(wolenetz/qinmin): Simplify tests with more effective mock usage, and | 38 // TODO(wolenetz/qinmin): Simplify tests with more effective mock usage, and |
39 // fix flaky pointer-based MDJ inequality testing. See http://crbug.com/327839. | 39 // fix flaky pointer-based MDJ inequality testing. See http://crbug.com/327839. |
40 | 40 |
41 // Mock of MediaPlayerManager for testing purpose. | 41 // Mock of MediaPlayerManager for testing purpose. |
42 class MockMediaPlayerManager : public MediaPlayerManager { | 42 class MockMediaPlayerManager : public MediaPlayerManager { |
43 public: | 43 public: |
44 explicit MockMediaPlayerManager(base::MessageLoop* message_loop) | 44 explicit MockMediaPlayerManager(base::MessageLoop* message_loop) |
45 : message_loop_(message_loop), | 45 : message_loop_(message_loop), |
46 playback_completed_(false), | 46 playback_completed_(false), |
47 num_resources_requested_(0), | 47 num_resources_requested_(0), |
48 num_resources_released_(0), | |
49 timestamp_updated_(false) {} | 48 timestamp_updated_(false) {} |
50 virtual ~MockMediaPlayerManager() {} | 49 virtual ~MockMediaPlayerManager() {} |
51 | 50 |
52 // MediaPlayerManager implementation. | 51 // MediaPlayerManager implementation. |
53 virtual MediaResourceGetter* GetMediaResourceGetter() OVERRIDE { | 52 virtual MediaResourceGetter* GetMediaResourceGetter() OVERRIDE { |
54 return NULL; | 53 return NULL; |
55 } | 54 } |
56 virtual MediaUrlInterceptor* GetMediaUrlInterceptor() OVERRIDE { | 55 virtual MediaUrlInterceptor* GetMediaUrlInterceptor() OVERRIDE { |
57 return NULL; | 56 return NULL; |
58 } | 57 } |
(...skipping 26 matching lines...) Expand all Loading... |
85 #endif // defined(VIDEO_HOLE) | 84 #endif // defined(VIDEO_HOLE) |
86 | 85 |
87 bool playback_completed() const { | 86 bool playback_completed() const { |
88 return playback_completed_; | 87 return playback_completed_; |
89 } | 88 } |
90 | 89 |
91 int num_resources_requested() const { | 90 int num_resources_requested() const { |
92 return num_resources_requested_; | 91 return num_resources_requested_; |
93 } | 92 } |
94 | 93 |
95 int num_resources_released() const { | |
96 return num_resources_released_; | |
97 } | |
98 | |
99 void OnMediaResourcesRequested(int player_id) { | 94 void OnMediaResourcesRequested(int player_id) { |
100 num_resources_requested_++; | 95 num_resources_requested_++; |
101 } | 96 } |
102 | 97 |
103 void OnMediaResourcesReleased(int player_id) { | |
104 num_resources_released_++; | |
105 } | |
106 | |
107 bool timestamp_updated() const { | 98 bool timestamp_updated() const { |
108 return timestamp_updated_; | 99 return timestamp_updated_; |
109 } | 100 } |
110 | 101 |
111 void ResetTimestampUpdated() { | 102 void ResetTimestampUpdated() { |
112 timestamp_updated_ = false; | 103 timestamp_updated_ = false; |
113 } | 104 } |
114 | 105 |
115 private: | 106 private: |
116 base::MessageLoop* message_loop_; | 107 base::MessageLoop* message_loop_; |
117 bool playback_completed_; | 108 bool playback_completed_; |
118 // The number of resource requests this object has seen. | 109 // The number of resource requests this object has seen. |
119 int num_resources_requested_; | 110 int num_resources_requested_; |
120 // The number of released resources. | |
121 int num_resources_released_; | |
122 // Playback timestamp was updated. | 111 // Playback timestamp was updated. |
123 bool timestamp_updated_; | 112 bool timestamp_updated_; |
124 | 113 |
125 DISALLOW_COPY_AND_ASSIGN(MockMediaPlayerManager); | 114 DISALLOW_COPY_AND_ASSIGN(MockMediaPlayerManager); |
126 }; | 115 }; |
127 | 116 |
128 class MockDemuxerAndroid : public DemuxerAndroid { | 117 class MockDemuxerAndroid : public DemuxerAndroid { |
129 public: | 118 public: |
130 explicit MockDemuxerAndroid(base::MessageLoop* message_loop) | 119 explicit MockDemuxerAndroid(base::MessageLoop* message_loop) |
131 : message_loop_(message_loop), | 120 : message_loop_(message_loop), |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 }; | 156 }; |
168 | 157 |
169 class MediaSourcePlayerTest : public testing::Test { | 158 class MediaSourcePlayerTest : public testing::Test { |
170 public: | 159 public: |
171 MediaSourcePlayerTest() | 160 MediaSourcePlayerTest() |
172 : manager_(&message_loop_), | 161 : manager_(&message_loop_), |
173 demuxer_(new MockDemuxerAndroid(&message_loop_)), | 162 demuxer_(new MockDemuxerAndroid(&message_loop_)), |
174 player_(0, &manager_, | 163 player_(0, &manager_, |
175 base::Bind(&MockMediaPlayerManager::OnMediaResourcesRequested, | 164 base::Bind(&MockMediaPlayerManager::OnMediaResourcesRequested, |
176 base::Unretained(&manager_)), | 165 base::Unretained(&manager_)), |
177 base::Bind(&MockMediaPlayerManager::OnMediaResourcesReleased, | |
178 base::Unretained(&manager_)), | |
179 scoped_ptr<DemuxerAndroid>(demuxer_), | 166 scoped_ptr<DemuxerAndroid>(demuxer_), |
180 GURL()), | 167 GURL()), |
181 decoder_callback_hook_executed_(false), | 168 decoder_callback_hook_executed_(false), |
182 surface_texture_a_is_next_(true) {} | 169 surface_texture_a_is_next_(true) {} |
183 virtual ~MediaSourcePlayerTest() {} | 170 virtual ~MediaSourcePlayerTest() {} |
184 | 171 |
185 protected: | 172 protected: |
186 // Get the decoder job from the MediaSourcePlayer. The return value must not | 173 // Get the decoder job from the MediaSourcePlayer. The return value must not |
187 // be NULL. | 174 // be NULL. |
188 MediaDecoderJob* GetMediaDecoderJob(bool is_audio) { | 175 MediaDecoderJob* GetMediaDecoderJob(bool is_audio) { |
(...skipping 842 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1031 TEST_F(MediaSourcePlayerTest, ReleaseVideoDecoderResourcesWhileDecoding) { | 1018 TEST_F(MediaSourcePlayerTest, ReleaseVideoDecoderResourcesWhileDecoding) { |
1032 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1019 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1033 | 1020 |
1034 // Test that if video decoder is released while decoding, the resources will | 1021 // Test that if video decoder is released while decoding, the resources will |
1035 // not be immediately released. | 1022 // not be immediately released. |
1036 CreateNextTextureAndSetVideoSurface(); | 1023 CreateNextTextureAndSetVideoSurface(); |
1037 StartVideoDecoderJob(); | 1024 StartVideoDecoderJob(); |
1038 // No resource is requested since there is no data to decode. | 1025 // No resource is requested since there is no data to decode. |
1039 EXPECT_EQ(0, manager_.num_resources_requested()); | 1026 EXPECT_EQ(0, manager_.num_resources_requested()); |
1040 ReleasePlayer(); | 1027 ReleasePlayer(); |
1041 EXPECT_EQ(0, manager_.num_resources_released()); | |
1042 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); | 1028 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); |
1043 | 1029 |
1044 // Recreate the video decoder. | 1030 // Recreate the video decoder. |
1045 CreateNextTextureAndSetVideoSurface(); | 1031 CreateNextTextureAndSetVideoSurface(); |
1046 player_.Start(); | 1032 player_.Start(); |
1047 while (!GetMediaDecoderJob(false)->is_decoding()) | 1033 while (!GetMediaDecoderJob(false)->is_decoding()) |
1048 message_loop_.RunUntilIdle(); | 1034 message_loop_.RunUntilIdle(); |
1049 EXPECT_EQ(0, demuxer_->num_browser_seek_requests()); | 1035 EXPECT_EQ(0, demuxer_->num_browser_seek_requests()); |
1050 EXPECT_EQ(1, manager_.num_resources_requested()); | 1036 EXPECT_EQ(1, manager_.num_resources_requested()); |
1051 ReleasePlayer(); | 1037 ReleasePlayer(); |
1052 // The resource is still held by the video decoder until it finishes decoding. | |
1053 EXPECT_EQ(0, manager_.num_resources_released()); | |
1054 // Wait for the media codec bridge to finish decoding and be reset. | 1038 // Wait for the media codec bridge to finish decoding and be reset. |
1055 while (manager_.num_resources_released() != 1) | 1039 while (GetMediaDecoderJob(false)->is_decoding()) |
1056 message_loop_.RunUntilIdle(); | 1040 message_loop_.RunUntilIdle(); |
1057 } | 1041 } |
1058 | 1042 |
1059 TEST_F(MediaSourcePlayerTest, AudioOnlyStartAfterSeekFinish) { | 1043 TEST_F(MediaSourcePlayerTest, AudioOnlyStartAfterSeekFinish) { |
1060 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1044 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1061 | 1045 |
1062 // Test audio decoder job will not start until pending seek event is handled. | 1046 // Test audio decoder job will not start until pending seek event is handled. |
1063 DemuxerConfigs configs = CreateAudioDemuxerConfigs(kCodecVorbis, false); | 1047 DemuxerConfigs configs = CreateAudioDemuxerConfigs(kCodecVorbis, false); |
1064 player_.OnDemuxerConfigsAvailable(configs); | 1048 player_.OnDemuxerConfigsAvailable(configs); |
1065 | 1049 |
(...skipping 730 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1796 | 1780 |
1797 // New video codec should have been created and configured, without any | 1781 // New video codec should have been created and configured, without any |
1798 // browser seek. | 1782 // browser seek. |
1799 EXPECT_TRUE(GetMediaCodecBridge(false)); | 1783 EXPECT_TRUE(GetMediaCodecBridge(false)); |
1800 EXPECT_EQ(3, demuxer_->num_data_requests()); | 1784 EXPECT_EQ(3, demuxer_->num_data_requests()); |
1801 EXPECT_EQ(0, demuxer_->num_seek_requests()); | 1785 EXPECT_EQ(0, demuxer_->num_seek_requests()); |
1802 | 1786 |
1803 // 2 codecs should have been created, one before the config change, and one | 1787 // 2 codecs should have been created, one before the config change, and one |
1804 // after it. | 1788 // after it. |
1805 EXPECT_EQ(2, manager_.num_resources_requested()); | 1789 EXPECT_EQ(2, manager_.num_resources_requested()); |
1806 EXPECT_EQ(1, manager_.num_resources_released()); | |
1807 } | 1790 } |
1808 | 1791 |
1809 TEST_F(MediaSourcePlayerTest, VideoDemuxerConfigChangeWithAdaptivePlayback) { | 1792 TEST_F(MediaSourcePlayerTest, VideoDemuxerConfigChangeWithAdaptivePlayback) { |
1810 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1793 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1811 | 1794 |
1812 // Test that if codec supports adaptive playback, no new codec should be | 1795 // Test that if codec supports adaptive playback, no new codec should be |
1813 // created beyond the one used to decode the prefetch media data prior to | 1796 // created beyond the one used to decode the prefetch media data prior to |
1814 // the kConfigChanged. | 1797 // the kConfigChanged. |
1815 StartConfigChange(false, true, 1, true); | 1798 StartConfigChange(false, true, 1, true); |
1816 | 1799 |
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2199 | 2182 |
2200 DemuxerConfigs configs = CreateAudioDemuxerConfigs(kCodecVorbis, true); | 2183 DemuxerConfigs configs = CreateAudioDemuxerConfigs(kCodecVorbis, true); |
2201 DemuxerData data = CreateReadFromDemuxerAckWithConfigChanged( | 2184 DemuxerData data = CreateReadFromDemuxerAckWithConfigChanged( |
2202 true, 0, configs); | 2185 true, 0, configs); |
2203 player_.OnDemuxerDataAvailable(data); | 2186 player_.OnDemuxerDataAvailable(data); |
2204 WaitForAudioDecodeDone(); | 2187 WaitForAudioDecodeDone(); |
2205 DecodeAudioDataUntilOutputBecomesAvailable(); | 2188 DecodeAudioDataUntilOutputBecomesAvailable(); |
2206 } | 2189 } |
2207 | 2190 |
2208 } // namespace media | 2191 } // namespace media |
OLD | NEW |