| 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/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
| 10 #include "media/base/android/media_codec_bridge.h" | 10 #include "media/base/android/media_codec_bridge.h" |
| 11 #include "media/base/android/media_drm_bridge.h" | 11 #include "media/base/android/media_drm_bridge.h" |
| 12 #include "media/base/android/media_player_manager.h" | 12 #include "media/base/android/media_player_manager.h" |
| 13 #include "media/base/android/media_source_player.h" | 13 #include "media/base/android/media_source_player.h" |
| 14 #include "media/base/bind_to_current_loop.h" | 14 #include "media/base/bind_to_current_loop.h" |
| 15 #include "media/base/decoder_buffer.h" | 15 #include "media/base/decoder_buffer.h" |
| 16 #include "media/base/test_data_util.h" | 16 #include "media/base/test_data_util.h" |
| 17 #include "testing/gmock/include/gmock/gmock.h" | 17 #include "testing/gmock/include/gmock/gmock.h" |
| 18 #include "ui/gl/android/surface_texture.h" | 18 #include "ui/gl/android/surface_texture.h" |
| 19 | 19 |
| 20 #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. |
| 21 |
| 20 namespace media { | 22 namespace media { |
| 21 | 23 |
| 22 // Helper macro to skip the test if MediaCodecBridge isn't available. | 24 // Helper macro to skip the test if MediaCodecBridge isn't available. |
| 23 #define SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE() \ | 25 #define SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE() \ |
| 24 do { \ | 26 do { \ |
| 25 if (!MediaCodecBridge::IsAvailable()) { \ | 27 if (!MediaCodecBridge::IsAvailable()) { \ |
| 26 VLOG(0) << "Could not run test - not supported on device."; \ | 28 VLOG(0) << "Could not run test - not supported on device."; \ |
| 27 return; \ | 29 return; \ |
| 28 } \ | 30 } \ |
| 29 } while (0) | 31 } while (0) |
| (...skipping 695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 725 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 727 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
| 726 | 728 |
| 727 player_.OnDemuxerSeekDone(kNoTimestamp()); | 729 player_.OnDemuxerSeekDone(kNoTimestamp()); |
| 728 EXPECT_FALSE(manager_.playback_completed()); | 730 EXPECT_FALSE(manager_.playback_completed()); |
| 729 } | 731 } |
| 730 | 732 |
| 731 base::TimeTicks StartTimeTicks() { | 733 base::TimeTicks StartTimeTicks() { |
| 732 return player_.start_time_ticks_; | 734 return player_.start_time_ticks_; |
| 733 } | 735 } |
| 734 | 736 |
| 735 bool IsTypeSupported(const std::vector<uint8>& scheme_uuid, | 737 bool IsTypeSupported(const std::string& key_system, |
| 736 MediaDrmBridge::SecurityLevel security_level, | 738 MediaDrmBridge::SecurityLevel security_level, |
| 737 const std::string& container, | 739 const std::string& container, |
| 738 const std::vector<std::string>& codecs) { | 740 const std::vector<std::string>& codecs) { |
| 739 return MediaSourcePlayer::IsTypeSupported( | 741 return MediaSourcePlayer::IsTypeSupported( |
| 740 scheme_uuid, security_level, container, codecs); | 742 key_system, security_level, container, codecs); |
| 741 } | 743 } |
| 742 | 744 |
| 743 base::MessageLoop message_loop_; | 745 base::MessageLoop message_loop_; |
| 744 MockMediaPlayerManager manager_; | 746 MockMediaPlayerManager manager_; |
| 745 MockDemuxerAndroid* demuxer_; // Owned by |player_|. | 747 MockDemuxerAndroid* demuxer_; // Owned by |player_|. |
| 746 MediaSourcePlayer player_; | 748 MediaSourcePlayer player_; |
| 747 | 749 |
| 748 // Track whether a possibly async decoder callback test hook has run. | 750 // Track whether a possibly async decoder callback test hook has run. |
| 749 bool decoder_callback_hook_executed_; | 751 bool decoder_callback_hook_executed_; |
| 750 | 752 |
| (...skipping 1325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2076 EXPECT_FALSE(GetMediaDecoderJob(false)); | 2078 EXPECT_FALSE(GetMediaDecoderJob(false)); |
| 2077 } | 2079 } |
| 2078 | 2080 |
| 2079 // TODO(xhwang): Enable this test when the test devices are updated. | 2081 // TODO(xhwang): Enable this test when the test devices are updated. |
| 2080 TEST_F(MediaSourcePlayerTest, DISABLED_IsTypeSupported_Widevine) { | 2082 TEST_F(MediaSourcePlayerTest, DISABLED_IsTypeSupported_Widevine) { |
| 2081 if (!MediaCodecBridge::IsAvailable() || !MediaDrmBridge::IsAvailable()) { | 2083 if (!MediaCodecBridge::IsAvailable() || !MediaDrmBridge::IsAvailable()) { |
| 2082 VLOG(0) << "Could not run test - not supported on device."; | 2084 VLOG(0) << "Could not run test - not supported on device."; |
| 2083 return; | 2085 return; |
| 2084 } | 2086 } |
| 2085 | 2087 |
| 2086 uint8 kWidevineUUID[] = { 0xED, 0xEF, 0x8B, 0xA9, 0x79, 0xD6, 0x4A, 0xCE, | |
| 2087 0xA3, 0xC8, 0x27, 0xDC, 0xD5, 0x1D, 0x21, 0xED }; | |
| 2088 | |
| 2089 std::vector<uint8> widevine_uuid(kWidevineUUID, | |
| 2090 kWidevineUUID + arraysize(kWidevineUUID)); | |
| 2091 | |
| 2092 // We test "L3" fully. But for "L1" we don't check the result as it depend on | 2088 // We test "L3" fully. But for "L1" we don't check the result as it depend on |
| 2093 // whether the test device supports "L1" decoding. | 2089 // whether the test device supports "L1" decoding. |
| 2094 | 2090 |
| 2095 std::vector<std::string> codec_avc(1, "avc1"); | 2091 std::vector<std::string> codec_avc(1, "avc1"); |
| 2096 std::vector<std::string> codec_aac(1, "mp4a"); | 2092 std::vector<std::string> codec_aac(1, "mp4a"); |
| 2097 std::vector<std::string> codec_avc_aac(1, "avc1"); | 2093 std::vector<std::string> codec_avc_aac(1, "avc1"); |
| 2098 codec_avc_aac.push_back("mp4a"); | 2094 codec_avc_aac.push_back("mp4a"); |
| 2099 | 2095 |
| 2100 EXPECT_TRUE(IsTypeSupported(widevine_uuid, kL3, kVideoMp4, codec_avc)); | 2096 EXPECT_TRUE(IsTypeSupported(kWidevineKeySystem, kL3, kVideoMp4, codec_avc)); |
| 2101 IsTypeSupported(widevine_uuid, kL1, kVideoMp4, codec_avc); | 2097 IsTypeSupported(kWidevineKeySystem, kL1, kVideoMp4, codec_avc); |
| 2102 | 2098 |
| 2103 // TODO(xhwang): L1/L3 doesn't apply to audio, so the result is messy. | 2099 // TODO(xhwang): L1/L3 doesn't apply to audio, so the result is messy. |
| 2104 // Clean this up after we have a solution to specifying decoding mode. | 2100 // Clean this up after we have a solution to specifying decoding mode. |
| 2105 EXPECT_TRUE(IsTypeSupported(widevine_uuid, kL3, kAudioMp4, codec_aac)); | 2101 EXPECT_TRUE(IsTypeSupported(kWidevineKeySystem, kL3, kAudioMp4, codec_aac)); |
| 2106 IsTypeSupported(widevine_uuid, kL1, kAudioMp4, codec_aac); | 2102 IsTypeSupported(kWidevineKeySystem, kL1, kAudioMp4, codec_aac); |
| 2107 | 2103 |
| 2108 EXPECT_TRUE(IsTypeSupported(widevine_uuid, kL3, kVideoMp4, codec_avc_aac)); | 2104 EXPECT_TRUE( |
| 2109 IsTypeSupported(widevine_uuid, kL1, kVideoMp4, codec_avc_aac); | 2105 IsTypeSupported(kWidevineKeySystem, kL3, kVideoMp4, codec_avc_aac)); |
| 2106 IsTypeSupported(kWidevineKeySystem, kL1, kVideoMp4, codec_avc_aac); |
| 2110 | 2107 |
| 2111 std::vector<std::string> codec_vp8(1, "vp8"); | 2108 std::vector<std::string> codec_vp8(1, "vp8"); |
| 2112 std::vector<std::string> codec_vorbis(1, "vorbis"); | 2109 std::vector<std::string> codec_vorbis(1, "vorbis"); |
| 2113 std::vector<std::string> codec_vp8_vorbis(1, "vp8"); | 2110 std::vector<std::string> codec_vp8_vorbis(1, "vp8"); |
| 2114 codec_vp8_vorbis.push_back("vorbis"); | 2111 codec_vp8_vorbis.push_back("vorbis"); |
| 2115 | 2112 |
| 2116 // TODO(xhwang): WebM is actually not supported but currently | 2113 // TODO(xhwang): WebM is actually not supported but currently |
| 2117 // MediaDrmBridge.isCryptoSchemeSupported() doesn't check the container type. | 2114 // MediaDrmBridge.IsKeySystemSupportedWithType() doesn't check the container |
| 2118 // Fix isCryptoSchemeSupported() and update this test as necessary. | 2115 // type. |
| 2119 EXPECT_TRUE(IsTypeSupported(widevine_uuid, kL3, kVideoWebM, codec_vp8)); | 2116 // Fix IsKeySystemSupportedWithType() and update this test as necessary. |
| 2120 IsTypeSupported(widevine_uuid, kL1, kVideoWebM, codec_vp8); | 2117 EXPECT_TRUE(IsTypeSupported(kWidevineKeySystem, kL3, kVideoWebM, codec_vp8)); |
| 2118 IsTypeSupported(kWidevineKeySystem, kL1, kVideoWebM, codec_vp8); |
| 2121 | 2119 |
| 2122 // TODO(xhwang): L1/L3 doesn't apply to audio, so the result is messy. | 2120 // TODO(xhwang): L1/L3 doesn't apply to audio, so the result is messy. |
| 2123 // Clean this up after we have a solution to specifying decoding mode. | 2121 // Clean this up after we have a solution to specifying decoding mode. |
| 2124 EXPECT_TRUE(IsTypeSupported(widevine_uuid, kL3, kAudioWebM, codec_vorbis)); | 2122 EXPECT_TRUE( |
| 2125 IsTypeSupported(widevine_uuid, kL1, kAudioWebM, codec_vorbis); | 2123 IsTypeSupported(kWidevineKeySystem, kL3, kAudioWebM, codec_vorbis)); |
| 2124 IsTypeSupported(kWidevineKeySystem, kL1, kAudioWebM, codec_vorbis); |
| 2126 | 2125 |
| 2127 EXPECT_TRUE( | 2126 EXPECT_TRUE( |
| 2128 IsTypeSupported(widevine_uuid, kL3, kVideoWebM, codec_vp8_vorbis)); | 2127 IsTypeSupported(kWidevineKeySystem, kL3, kVideoWebM, codec_vp8_vorbis)); |
| 2129 IsTypeSupported(widevine_uuid, kL1, kVideoWebM, codec_vp8_vorbis); | 2128 IsTypeSupported(kWidevineKeySystem, kL1, kVideoWebM, codec_vp8_vorbis); |
| 2130 } | 2129 } |
| 2131 | 2130 |
| 2132 TEST_F(MediaSourcePlayerTest, IsTypeSupported_InvalidUUID) { | 2131 TEST_F(MediaSourcePlayerTest, IsTypeSupported_InvalidKeySystem) { |
| 2133 if (!MediaCodecBridge::IsAvailable() || !MediaDrmBridge::IsAvailable()) { | 2132 if (!MediaCodecBridge::IsAvailable() || !MediaDrmBridge::IsAvailable()) { |
| 2134 VLOG(0) << "Could not run test - not supported on device."; | 2133 VLOG(0) << "Could not run test - not supported on device."; |
| 2135 return; | 2134 return; |
| 2136 } | 2135 } |
| 2137 | 2136 |
| 2138 uint8 kInvalidUUID[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, | 2137 const char kInvalidKeySystem[] = "invalid.keysystem"; |
| 2139 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF }; | |
| 2140 | |
| 2141 std::vector<uint8> invalid_uuid(kInvalidUUID, | |
| 2142 kInvalidUUID + arraysize(kInvalidUUID)); | |
| 2143 | 2138 |
| 2144 std::vector<std::string> codec_avc(1, "avc1"); | 2139 std::vector<std::string> codec_avc(1, "avc1"); |
| 2145 EXPECT_FALSE(IsTypeSupported(invalid_uuid, kL3, kVideoMp4, codec_avc)); | 2140 EXPECT_FALSE(IsTypeSupported(kInvalidKeySystem, kL3, kVideoMp4, codec_avc)); |
| 2146 EXPECT_FALSE(IsTypeSupported(invalid_uuid, kL1, kVideoMp4, codec_avc)); | 2141 EXPECT_FALSE(IsTypeSupported(kInvalidKeySystem, kL1, kVideoMp4, codec_avc)); |
| 2147 } | 2142 } |
| 2148 | 2143 |
| 2149 // TODO(xhwang): Are these IsTypeSupported tests device specific? | 2144 // TODO(xhwang): Are these IsTypeSupported tests device specific? |
| 2150 // TODO(xhwang): Add more IsTypeSupported tests. | 2145 // TODO(xhwang): Add more IsTypeSupported tests. |
| 2151 | 2146 |
| 2152 } // namespace media | 2147 } // namespace media |
| OLD | NEW |