| 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 | 38 |
| 39 // TODO(wolenetz/qinmin): Simplify tests with more effective mock usage, and | 39 // TODO(wolenetz/qinmin): Simplify tests with more effective mock usage, and |
| 40 // fix flaky pointer-based MDJ inequality testing. See http://crbug.com/327839. | 40 // fix flaky pointer-based MDJ inequality testing. See http://crbug.com/327839. |
| 41 | 41 |
| 42 // Mock of MediaPlayerManager for testing purpose. | 42 // Mock of MediaPlayerManager for testing purpose. |
| 43 class MockMediaPlayerManager : public MediaPlayerManager { | 43 class MockMediaPlayerManager : public MediaPlayerManager { |
| 44 public: | 44 public: |
| 45 explicit MockMediaPlayerManager(base::MessageLoop* message_loop) | 45 explicit MockMediaPlayerManager(base::MessageLoop* message_loop) |
| 46 : message_loop_(message_loop), | 46 : message_loop_(message_loop), |
| 47 playback_completed_(false), | 47 playback_completed_(false), |
| 48 num_resources_requested_(0), | |
| 49 num_metadata_changes_(0), | 48 num_metadata_changes_(0), |
| 50 timestamp_updated_(false), | 49 timestamp_updated_(false), |
| 51 allow_play_(true) {} | 50 allow_play_(true) {} |
| 52 ~MockMediaPlayerManager() override {} | 51 ~MockMediaPlayerManager() override {} |
| 53 | 52 |
| 54 // MediaPlayerManager implementation. | 53 // MediaPlayerManager implementation. |
| 55 MediaResourceGetter* GetMediaResourceGetter() override { return NULL; } | 54 MediaResourceGetter* GetMediaResourceGetter() override { return NULL; } |
| 56 MediaUrlInterceptor* GetMediaUrlInterceptor() override { return NULL; } | 55 MediaUrlInterceptor* GetMediaUrlInterceptor() override { return NULL; } |
| 57 void OnTimeUpdate(int player_id, | 56 void OnTimeUpdate(int player_id, |
| 58 base::TimeDelta current_time, | 57 base::TimeDelta current_time, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 73 } | 72 } |
| 74 void OnMediaInterrupted(int player_id) override {} | 73 void OnMediaInterrupted(int player_id) override {} |
| 75 void OnBufferingUpdate(int player_id, int percentage) override {} | 74 void OnBufferingUpdate(int player_id, int percentage) override {} |
| 76 void OnSeekComplete(int player_id, | 75 void OnSeekComplete(int player_id, |
| 77 const base::TimeDelta& current_time) override {} | 76 const base::TimeDelta& current_time) override {} |
| 78 void OnError(int player_id, int error) override {} | 77 void OnError(int player_id, int error) override {} |
| 79 void OnVideoSizeChanged(int player_id, int width, int height) override {} | 78 void OnVideoSizeChanged(int player_id, int width, int height) override {} |
| 80 void OnWaitingForDecryptionKey(int player_id) override {} | 79 void OnWaitingForDecryptionKey(int player_id) override {} |
| 81 MediaPlayerAndroid* GetFullscreenPlayer() override { return NULL; } | 80 MediaPlayerAndroid* GetFullscreenPlayer() override { return NULL; } |
| 82 MediaPlayerAndroid* GetPlayer(int player_id) override { return NULL; } | 81 MediaPlayerAndroid* GetPlayer(int player_id) override { return NULL; } |
| 82 void OnDecorderResourcesReleased(int player_id) {} |
| 83 | 83 |
| 84 bool RequestPlay(int player_id) override { | 84 bool RequestPlay(int player_id) override { |
| 85 return allow_play_; | 85 return allow_play_; |
| 86 } | 86 } |
| 87 | 87 |
| 88 bool playback_completed() const { | 88 bool playback_completed() const { |
| 89 return playback_completed_; | 89 return playback_completed_; |
| 90 } | 90 } |
| 91 | 91 |
| 92 int num_resources_requested() const { | |
| 93 return num_resources_requested_; | |
| 94 } | |
| 95 | |
| 96 int num_metadata_changes() const { | 92 int num_metadata_changes() const { |
| 97 return num_metadata_changes_; | 93 return num_metadata_changes_; |
| 98 } | 94 } |
| 99 | 95 |
| 100 void OnMediaResourcesRequested(int player_id) { | |
| 101 num_resources_requested_++; | |
| 102 } | |
| 103 | |
| 104 bool timestamp_updated() const { | 96 bool timestamp_updated() const { |
| 105 return timestamp_updated_; | 97 return timestamp_updated_; |
| 106 } | 98 } |
| 107 | 99 |
| 108 void ResetTimestampUpdated() { | 100 void ResetTimestampUpdated() { |
| 109 timestamp_updated_ = false; | 101 timestamp_updated_ = false; |
| 110 } | 102 } |
| 111 | 103 |
| 112 void set_allow_play(bool value) { | 104 void set_allow_play(bool value) { |
| 113 allow_play_ = value; | 105 allow_play_ = value; |
| 114 } | 106 } |
| 115 | 107 |
| 116 private: | 108 private: |
| 117 base::MessageLoop* message_loop_; | 109 base::MessageLoop* message_loop_; |
| 118 bool playback_completed_; | 110 bool playback_completed_; |
| 119 // The number of resource requests this object has seen. | |
| 120 int num_resources_requested_; | |
| 121 // The number of metadata changes reported by the player. | 111 // The number of metadata changes reported by the player. |
| 122 int num_metadata_changes_; | 112 int num_metadata_changes_; |
| 123 // Playback timestamp was updated. | 113 // Playback timestamp was updated. |
| 124 bool timestamp_updated_; | 114 bool timestamp_updated_; |
| 125 // Whether the manager will allow players that request playing. | 115 // Whether the manager will allow players that request playing. |
| 126 bool allow_play_; | 116 bool allow_play_; |
| 127 | 117 |
| 128 DISALLOW_COPY_AND_ASSIGN(MockMediaPlayerManager); | 118 DISALLOW_COPY_AND_ASSIGN(MockMediaPlayerManager); |
| 129 }; | 119 }; |
| 130 | 120 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 | 158 |
| 169 DISALLOW_COPY_AND_ASSIGN(MockDemuxerAndroid); | 159 DISALLOW_COPY_AND_ASSIGN(MockDemuxerAndroid); |
| 170 }; | 160 }; |
| 171 | 161 |
| 172 class MediaSourcePlayerTest : public testing::Test { | 162 class MediaSourcePlayerTest : public testing::Test { |
| 173 public: | 163 public: |
| 174 MediaSourcePlayerTest() | 164 MediaSourcePlayerTest() |
| 175 : manager_(&message_loop_), | 165 : manager_(&message_loop_), |
| 176 demuxer_(new MockDemuxerAndroid(&message_loop_)), | 166 demuxer_(new MockDemuxerAndroid(&message_loop_)), |
| 177 player_(0, &manager_, | 167 player_(0, &manager_, |
| 178 base::Bind(&MockMediaPlayerManager::OnMediaResourcesRequested, | 168 base::Bind(&MockMediaPlayerManager::OnDecorderResourcesReleased, |
| 179 base::Unretained(&manager_)), | 169 base::Unretained(&manager_)), |
| 180 scoped_ptr<DemuxerAndroid>(demuxer_), | 170 scoped_ptr<DemuxerAndroid>(demuxer_), |
| 181 GURL()), | 171 GURL()), |
| 182 decoder_callback_hook_executed_(false), | 172 decoder_callback_hook_executed_(false), |
| 183 surface_texture_a_is_next_(true) {} | 173 surface_texture_a_is_next_(true) {} |
| 184 | 174 |
| 185 ~MediaSourcePlayerTest() override {} | 175 ~MediaSourcePlayerTest() override {} |
| 186 | 176 |
| 187 protected: | 177 protected: |
| 188 // Get the decoder job from the MediaSourcePlayer. The return value must not | 178 // Get the decoder job from the MediaSourcePlayer. The return value must not |
| (...skipping 870 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1059 WaitForVideoDecodeDone(); | 1049 WaitForVideoDecodeDone(); |
| 1060 } | 1050 } |
| 1061 | 1051 |
| 1062 TEST_F(MediaSourcePlayerTest, ReleaseVideoDecoderResourcesWhileDecoding) { | 1052 TEST_F(MediaSourcePlayerTest, ReleaseVideoDecoderResourcesWhileDecoding) { |
| 1063 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1053 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
| 1064 | 1054 |
| 1065 // Test that if video decoder is released while decoding, the resources will | 1055 // Test that if video decoder is released while decoding, the resources will |
| 1066 // not be immediately released. | 1056 // not be immediately released. |
| 1067 CreateNextTextureAndSetVideoSurface(); | 1057 CreateNextTextureAndSetVideoSurface(); |
| 1068 StartVideoDecoderJob(); | 1058 StartVideoDecoderJob(); |
| 1069 // No resource is requested since there is no data to decode. | |
| 1070 EXPECT_EQ(0, manager_.num_resources_requested()); | |
| 1071 ReleasePlayer(); | 1059 ReleasePlayer(); |
| 1072 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo(false)); | 1060 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo(false)); |
| 1073 | 1061 |
| 1074 // Recreate the video decoder. | 1062 // Recreate the video decoder. |
| 1075 CreateNextTextureAndSetVideoSurface(); | 1063 CreateNextTextureAndSetVideoSurface(); |
| 1076 player_.Start(); | 1064 player_.Start(); |
| 1077 while (!GetMediaDecoderJob(false)->is_decoding()) | 1065 while (!GetMediaDecoderJob(false)->is_decoding()) |
| 1078 message_loop_.RunUntilIdle(); | 1066 message_loop_.RunUntilIdle(); |
| 1079 EXPECT_EQ(0, demuxer_->num_browser_seek_requests()); | 1067 EXPECT_EQ(0, demuxer_->num_browser_seek_requests()); |
| 1080 EXPECT_EQ(1, manager_.num_resources_requested()); | |
| 1081 ReleasePlayer(); | 1068 ReleasePlayer(); |
| 1082 // Wait for the media codec bridge to finish decoding and be reset. | 1069 // Wait for the media codec bridge to finish decoding and be reset. |
| 1083 while (GetMediaDecoderJob(false)->is_decoding()) | 1070 while (GetMediaDecoderJob(false)->is_decoding()) |
| 1084 message_loop_.RunUntilIdle(); | 1071 message_loop_.RunUntilIdle(); |
| 1085 } | 1072 } |
| 1086 | 1073 |
| 1087 TEST_F(MediaSourcePlayerTest, AudioOnlyStartAfterSeekFinish) { | 1074 TEST_F(MediaSourcePlayerTest, AudioOnlyStartAfterSeekFinish) { |
| 1088 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1075 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
| 1089 | 1076 |
| 1090 // Test audio decoder job will not start until pending seek event is handled. | 1077 // Test audio decoder job will not start until pending seek event is handled. |
| (...skipping 841 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1932 | 1919 |
| 1933 // Test that video config change notification results in creating a new | 1920 // Test that video config change notification results in creating a new |
| 1934 // video codec without any browser seek. | 1921 // video codec without any browser seek. |
| 1935 StartConfigChange(false, true, 1, false); | 1922 StartConfigChange(false, true, 1, false); |
| 1936 | 1923 |
| 1937 // New video codec should have been created and configured, without any | 1924 // New video codec should have been created and configured, without any |
| 1938 // browser seek. | 1925 // browser seek. |
| 1939 EXPECT_TRUE(GetMediaCodecBridge(false)); | 1926 EXPECT_TRUE(GetMediaCodecBridge(false)); |
| 1940 EXPECT_EQ(3, demuxer_->num_data_requests()); | 1927 EXPECT_EQ(3, demuxer_->num_data_requests()); |
| 1941 EXPECT_EQ(0, demuxer_->num_seek_requests()); | 1928 EXPECT_EQ(0, demuxer_->num_seek_requests()); |
| 1942 | |
| 1943 // 2 codecs should have been created, one before the config change, and one | |
| 1944 // after it. | |
| 1945 EXPECT_EQ(2, manager_.num_resources_requested()); | |
| 1946 WaitForVideoDecodeDone(); | 1929 WaitForVideoDecodeDone(); |
| 1947 } | 1930 } |
| 1948 | 1931 |
| 1949 TEST_F(MediaSourcePlayerTest, VideoDemuxerConfigChangeWithAdaptivePlayback) { | 1932 TEST_F(MediaSourcePlayerTest, VideoDemuxerConfigChangeWithAdaptivePlayback) { |
| 1950 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1933 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
| 1951 | 1934 |
| 1952 // Test that if codec supports adaptive playback, no new codec should be | 1935 // Test that if codec supports adaptive playback, no new codec should be |
| 1953 // created beyond the one used to decode the prefetch media data prior to | 1936 // created beyond the one used to decode the prefetch media data prior to |
| 1954 // the kConfigChanged. | 1937 // the kConfigChanged. |
| 1955 StartConfigChange(false, true, 1, true); | 1938 StartConfigChange(false, true, 1, true); |
| 1956 | 1939 |
| 1957 // No browser seek should be needed. | 1940 // No browser seek should be needed. |
| 1958 EXPECT_TRUE(GetMediaCodecBridge(false)); | 1941 EXPECT_TRUE(GetMediaCodecBridge(false)); |
| 1959 EXPECT_EQ(3, demuxer_->num_data_requests()); | 1942 EXPECT_EQ(3, demuxer_->num_data_requests()); |
| 1960 EXPECT_EQ(0, demuxer_->num_seek_requests()); | 1943 EXPECT_EQ(0, demuxer_->num_seek_requests()); |
| 1961 | |
| 1962 // Only 1 codec should have been created so far. | |
| 1963 EXPECT_EQ(1, manager_.num_resources_requested()); | |
| 1964 WaitForVideoDecodeDone(); | 1944 WaitForVideoDecodeDone(); |
| 1965 } | 1945 } |
| 1966 | 1946 |
| 1967 TEST_F(MediaSourcePlayerTest, DecoderDrainInterruptedBySeek) { | 1947 TEST_F(MediaSourcePlayerTest, DecoderDrainInterruptedBySeek) { |
| 1968 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1948 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
| 1969 | 1949 |
| 1970 // Test if a decoder is being drained while receiving a seek request, draining | 1950 // Test if a decoder is being drained while receiving a seek request, draining |
| 1971 // is canceled. | 1951 // is canceled. |
| 1972 SendConfigChangeToDecoder(true, false, 0, false); | 1952 SendConfigChangeToDecoder(true, false, 0, false); |
| 1973 EXPECT_TRUE(IsDrainingDecoder(true)); | 1953 EXPECT_TRUE(IsDrainingDecoder(true)); |
| (...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2406 | 2386 |
| 2407 EXPECT_EQ(demuxer_->num_data_requests(), 0); | 2387 EXPECT_EQ(demuxer_->num_data_requests(), 0); |
| 2408 player_.OnDemuxerConfigsAvailable(CreateDemuxerConfigs(true, true)); | 2388 player_.OnDemuxerConfigsAvailable(CreateDemuxerConfigs(true, true)); |
| 2409 | 2389 |
| 2410 manager_.set_allow_play(true); | 2390 manager_.set_allow_play(true); |
| 2411 player_.Start(); | 2391 player_.Start(); |
| 2412 EXPECT_TRUE(player_.IsPlaying()); | 2392 EXPECT_TRUE(player_.IsPlaying()); |
| 2413 } | 2393 } |
| 2414 | 2394 |
| 2415 } // namespace media | 2395 } // namespace media |
| OLD | NEW |