15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/filters/pipeline_integration_test_base.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/command_line.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "build/build_config.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "media/base/cdm_promise.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/decoder_buffer.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "media/base/media_keys.h" 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "media/base/media_switches.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/test_data_util.h" 17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "media/cdm/aes_decryptor.h" 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "media/cdm/json_web_key.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "media/filters/chunk_demuxer.h" 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/filters/renderer_impl.h" 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gmock/include/gmock/gmock.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochusing testing::_; 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing testing::AnyNumber; 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing testing::AtLeast; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AtMost; 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochusing testing::SaveArg; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kSourceId[] = "SourceId"; 3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kInitData[] = { 0x69, 0x6e, 0x69, 0x74 }; 3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kWebM[] = "video/webm; codecs=\"vp8,vorbis\""; 3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kWebMVP9[] = "video/webm; codecs=\"vp9\""; 3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kAudioOnlyWebM[] = "video/webm; codecs=\"vorbis\""; 3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kOpusAudioOnlyWebM[] = "video/webm; codecs=\"opus\""; 3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kVideoOnlyWebM[] = "video/webm; codecs=\"vp8\""; 3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kMP4VideoType[] = "video/mp4"; 4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kMP4AudioType[] = "audio/mp4"; 4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(USE_PROPRIETARY_CODECS) 4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)const char kADTS[] = "audio/aac"; 4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kMP4[] = "video/mp4; codecs=\"avc1.4D4041,mp4a.40.2\""; 4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kMP4Video[] = "video/mp4; codecs=\"avc1.4D4041\""; 458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)const char kMP4VideoAVC3[] = "video/mp4; codecs=\"avc3.64001f\""; 4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kMP4Audio[] = "audio/mp4; codecs=\"mp4a.40.2\""; 4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kMP3[] = "audio/mpeg"; 4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif // defined(USE_PROPRIETARY_CODECS) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Key used to encrypt test files. 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kSecretKey[] = { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The key ID for all encrypted files. 5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kKeyId[] = { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int kAppendWholeFile = -1; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Constants for the Media Source config change tests. 6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int kAppendTimeSec = 1; 6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int kAppendTimeMs = kAppendTimeSec * 1000; 67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst int k320WebMFileDurationMs = 2736; 680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int k640WebMFileDurationMs = 2749; 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst int kOpusEndTrimmingWebMFileDurationMs = 2741; 70e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochconst int kVP9WebMFileDurationMs = 2736; 710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int kVP8AWebMFileDurationMs = 2733; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(USE_PROPRIETARY_CODECS) 7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int k640IsoFileDurationMs = 2737; 7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int k640IsoCencFileDurationMs = 2736; 7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int k1280IsoFileDurationMs = 2736; 77e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochconst int k1280IsoAVC3FileDurationMs = 2736; 7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif // defined(USE_PROPRIETARY_CODECS) 793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Return a timeline offset for bear-320x240-live.webm. 810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic base::Time kLiveTimelineOffset() { 820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // The file contians the following UTC timeline offset: 830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // 2012-11-10 12:34:56.789123456 840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Since base::Time only has a resolution of microseconds, 850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // construct a base::Time for 2012-11-10 12:34:56.789123. 860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::Time::Exploded exploded_time; 870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch exploded_time.year = 2012; 880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch exploded_time.month = 11; 890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch exploded_time.day_of_month = 10; 900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch exploded_time.hour = 12; 910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch exploded_time.minute = 34; 920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch exploded_time.second = 56; 930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch exploded_time.millisecond = 789; 940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::Time timeline_offset = base::Time::FromUTCExploded(exploded_time); 950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch timeline_offset += base::TimeDelta::FromMicroseconds(123); 970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return timeline_offset; 990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// FFmpeg only supports time a resolution of seconds so this 1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// helper function truncates a base::Time to seconds resolution. 1030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic base::Time TruncateToFFmpegTimeResolution(base::Time t) { 1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::Time::Exploded exploded_time; 1050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch t.UTCExplode(&exploded_time); 1060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch exploded_time.millisecond = 0; 1070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return base::Time::FromUTCExploded(exploded_time); 1090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Note: Tests using this class only exercise the DecryptingDemuxerStream path. 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// They do not exercise the Decrypting{Audio|Video}Decoder path. 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeEncryptedMedia { 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Defines the behavior of the "app" that responds to EME events. 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class AppBase { 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~AppBase() {} 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void OnSessionMessage(const std::string& web_session_id, 121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<uint8>& message, 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& destination_url) = 0; 123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void OnSessionClosed(const std::string& web_session_id) = 0; 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnSessionKeysChange(const std::string& web_session_id, 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool has_additional_usable_key) = 0; 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Errors are not expected unless overridden. 130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void OnSessionError(const std::string& web_session_id, 131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& error_name, 132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32 system_code, 133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& error_message) { 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAIL() << "Unexpected Key Error"; 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void NeedKey(const std::string& type, 138424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const std::vector<uint8>& init_data, 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AesDecryptor* decryptor) = 0; 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeEncryptedMedia(AppBase* app) 143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : decryptor_(base::Bind(&FakeEncryptedMedia::OnSessionMessage, 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Unretained(this)), 145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&FakeEncryptedMedia::OnSessionClosed, 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Unretained(this)), 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&FakeEncryptedMedia::OnSessionKeysChange, 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Unretained(this))), 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) app_(app) {} 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AesDecryptor* decryptor() { 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &decryptor_; 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Callbacks for firing session events. Delegate to |app_|. 156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void OnSessionMessage(const std::string& web_session_id, 157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<uint8>& message, 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& destination_url) { 159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) app_->OnSessionMessage(web_session_id, message, destination_url); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void OnSessionClosed(const std::string& web_session_id) { 163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) app_->OnSessionClosed(web_session_id); 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OnSessionKeysChange(const std::string& web_session_id, 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool has_additional_usable_key) { 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci app_->OnSessionKeysChange(web_session_id, has_additional_usable_key); 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void OnSessionError(const std::string& web_session_id, 172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& error_name, 173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32 system_code, 174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& error_message) { 175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) app_->OnSessionError( 176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_session_id, error_name, system_code, error_message); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void NeedKey(const std::string& type, 180424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const std::vector<uint8>& init_data) { 1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) app_->NeedKey(type, init_data, &decryptor_); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AesDecryptor decryptor_; 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<AppBase> app_; 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)enum PromiseResult { RESOLVED, REJECTED }; 190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Provides |kSecretKey| in response to needkey. 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class KeyProvidingApp : public FakeEncryptedMedia::AppBase { 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) KeyProvidingApp() {} 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void OnResolveWithSession(PromiseResult expected, 197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& web_session_id) { 198f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(expected, RESOLVED); 199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_GT(web_session_id.length(), 0ul); 200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) current_session_id_ = web_session_id; 201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void OnResolve(PromiseResult expected) { 204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(expected, RESOLVED); 205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void OnReject(PromiseResult expected, 208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media::MediaKeys::Exception exception_code, 209f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32 system_code, 210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& error_message) { 211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(expected, REJECTED); 212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<SimpleCdmPromise> CreatePromise(PromiseResult expected) { 215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<media::SimpleCdmPromise> promise(new media::SimpleCdmPromise( 216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind( 217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &KeyProvidingApp::OnResolve, base::Unretained(this), expected), 218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind( 219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &KeyProvidingApp::OnReject, base::Unretained(this), expected))); 220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return promise.Pass(); 221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<NewSessionCdmPromise> CreateSessionPromise( 224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PromiseResult expected) { 225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<media::NewSessionCdmPromise> promise( 226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new media::NewSessionCdmPromise( 227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&KeyProvidingApp::OnResolveWithSession, 228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Unretained(this), 229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) expected), 230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind( 231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &KeyProvidingApp::OnReject, base::Unretained(this), expected))); 232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return promise.Pass(); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void OnSessionMessage(const std::string& web_session_id, 236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<uint8>& message, 23746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const GURL& destination_url) OVERRIDE { 238f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(web_session_id.empty()); 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(message.empty()); 240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(current_session_id_, web_session_id); 241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnSessionClosed(const std::string& web_session_id) OVERRIDE { 244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(current_session_id_, web_session_id); 245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnSessionKeysChange(const std::string& web_session_id, 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool has_additional_usable_key) OVERRIDE { 249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(current_session_id_, web_session_id); 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(has_additional_usable_key, true); 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void NeedKey(const std::string& type, 254424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const std::vector<uint8>& init_data, 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AesDecryptor* decryptor) OVERRIDE { 256f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (current_session_id_.empty()) { 257f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) decryptor->CreateSession(type, 258f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kInitData, 259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) arraysize(kInitData), 260f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MediaKeys::TEMPORARY_SESSION, 261f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CreateSessionPromise(RESOLVED)); 262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(current_session_id_.empty()); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Clear Key really needs the key ID in |init_data|. For WebM, they are the 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // same, but this is not the case for ISO CENC. Therefore, provide the 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // correct key ID. 268424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const uint8* key_id = init_data.empty() ? NULL : &init_data[0]; 269424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) size_t key_id_length = init_data.size(); 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type == kMP4AudioType || type == kMP4VideoType) { 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key_id = kKeyId; 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key_id_length = arraysize(kKeyId); 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Convert key into a JSON structure and then add it. 276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string jwk = GenerateJWKSet( 277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) kSecretKey, arraysize(kSecretKey), key_id, key_id_length); 278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) decryptor->UpdateSession(current_session_id_, 279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) reinterpret_cast<const uint8*>(jwk.data()), 280f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) jwk.size(), 281f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CreatePromise(RESOLVED)); 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 284f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string current_session_id_; 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class RotatingKeyProvidingApp : public KeyProvidingApp { 288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RotatingKeyProvidingApp() : num_distint_need_key_calls_(0) {} 290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual ~RotatingKeyProvidingApp() { 291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Expect that NeedKey is fired multiple times with different |init_data|. 292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_GT(num_distint_need_key_calls_, 1u); 293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void NeedKey(const std::string& type, 296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::vector<uint8>& init_data, 297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AesDecryptor* decryptor) OVERRIDE { 298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Skip the request if the |init_data| has been seen. 299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (init_data == prev_init_data_) 300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) prev_init_data_ = init_data; 302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ++num_distint_need_key_calls_; 303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 304f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) decryptor->CreateSession(type, 305f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) vector_as_array(&init_data), 306f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) init_data.size(), 307f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MediaKeys::TEMPORARY_SESSION, 308f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CreateSessionPromise(RESOLVED)); 309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<uint8> key_id; 311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<uint8> key; 312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(GetKeyAndKeyId(init_data, &key, &key_id)); 313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Convert key into a JSON structure and then add it. 315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string jwk = GenerateJWKSet(vector_as_array(&key), 316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) key.size(), 317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) vector_as_array(&key_id), 318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) key_id.size()); 319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) decryptor->UpdateSession(current_session_id_, 320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) reinterpret_cast<const uint8*>(jwk.data()), 321f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) jwk.size(), 322f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CreatePromise(RESOLVED)); 323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool GetKeyAndKeyId(std::vector<uint8> init_data, 327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<uint8>* key, 328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<uint8>* key_id) { 329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // For WebM, init_data is key_id; for ISO CENC, init_data should contain 330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // the key_id. We assume key_id is in the end of init_data here (that is 331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // only a reasonable assumption for WebM and clear key ISO CENC). 332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK_GE(init_data.size(), arraysize(kKeyId)); 333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<uint8> key_id_from_init_data( 334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) init_data.end() - arraysize(kKeyId), init_data.end()); 335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) key->assign(kSecretKey, kSecretKey + arraysize(kSecretKey)); 337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) key_id->assign(kKeyId, kKeyId + arraysize(kKeyId)); 338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The Key and KeyId for this testing key provider are created by left 340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // rotating kSecretKey and kKeyId. Note that this implementation is only 341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // intended for testing purpose. The actual key rotation algorithm can be 342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // much more complicated. 343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Find out the rotating position from |key_id_from_init_data| and apply on 344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // |key|. 345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t pos = 0; pos < arraysize(kKeyId); ++pos) { 346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::rotate(key_id->begin(), key_id->begin() + pos, key_id->end()); 347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (*key_id == key_id_from_init_data) { 348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::rotate(key->begin(), key->begin() + pos, key->end()); 349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<uint8> prev_init_data_; 356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) uint32 num_distint_need_key_calls_; 357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Ignores needkey and does not perform a license request 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NoResponseApp : public FakeEncryptedMedia::AppBase { 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 362f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void OnSessionMessage(const std::string& web_session_id, 363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<uint8>& message, 364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& default_url) OVERRIDE { 365f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(web_session_id.empty()); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(message.empty()); 367f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FAIL() << "Unexpected Message"; 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnSessionClosed(const std::string& web_session_id) OVERRIDE { 371f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(web_session_id.empty()); 3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FAIL() << "Unexpected Closed"; 373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnSessionKeysChange(const std::string& web_session_id, 3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool has_additional_usable_key) OVERRIDE { 377f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(web_session_id.empty()); 3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(has_additional_usable_key, true); 379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 380f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void NeedKey(const std::string& type, 382424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const std::vector<uint8>& init_data, 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AesDecryptor* decryptor) OVERRIDE { 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper class that emulates calls made on the ChunkDemuxer by the 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Media Source API. 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockMediaSource { 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 391effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch MockMediaSource(const std::string& filename, 392effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::string& mimetype, 3936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) int initial_append_size) 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : file_path_(GetTestDataFilePath(filename)), 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_position_(0), 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initial_append_size_(initial_append_size), 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mimetype_(mimetype), 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chunk_demuxer_(new ChunkDemuxer( 399effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::Bind(&MockMediaSource::DemuxerOpened, base::Unretained(this)), 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MockMediaSource::DemuxerNeedKey, 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)), 402effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch LogCB(), 4030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch true)), 4046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) owned_chunk_demuxer_(chunk_demuxer_) { 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_data_ = ReadTestDataFile(filename); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (initial_append_size_ == kAppendWholeFile) 409ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch initial_append_size_ = file_data_->data_size(); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GT(initial_append_size_, 0); 412ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DCHECK_LE(initial_append_size_, file_data_->data_size()); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockMediaSource() {} 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<Demuxer> GetDemuxer() { return owned_chunk_demuxer_.Pass(); } 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void set_need_key_cb(const Demuxer::NeedKeyCB& need_key_cb) { 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) need_key_cb_ = need_key_cb; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void Seek(base::TimeDelta seek_time, int new_position, int seek_append_size) { 424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch chunk_demuxer_->StartWaitingForSeek(seek_time); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) chunk_demuxer_->Abort( 427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSourceId, 428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::TimeDelta(), kInfiniteDuration(), &last_timestamp_offset_); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(new_position, 0); 431ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DCHECK_LT(new_position, file_data_->data_size()); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_position_ = new_position; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendData(seek_append_size); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AppendData(int size) { 438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(chunk_demuxer_); 439ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DCHECK_LT(current_position_, file_data_->data_size()); 440ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DCHECK_LE(current_position_ + size, file_data_->data_size()); 441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chunk_demuxer_->AppendData( 443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kSourceId, file_data_->data() + current_position_, size, 4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeDelta(), kInfiniteDuration(), &last_timestamp_offset_, 4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&MockMediaSource::InitSegmentReceived, 4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Unretained(this))); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_position_ += size; 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) void AppendAtTime(base::TimeDelta timestamp_offset, 45123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const uint8* pData, 45223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int size) { 453a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CHECK(!chunk_demuxer_->IsParsingMediaSegment(kSourceId)); 454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chunk_demuxer_->AppendData(kSourceId, pData, size, 455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeDelta(), kInfiniteDuration(), 4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ×tamp_offset, 4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&MockMediaSource::InitSegmentReceived, 4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Unretained(this))); 45923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) last_timestamp_offset_ = timestamp_offset; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 462010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void AppendAtTimeWithWindow(base::TimeDelta timestamp_offset, 463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::TimeDelta append_window_start, 464010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::TimeDelta append_window_end, 465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const uint8* pData, 466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int size) { 467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CHECK(!chunk_demuxer_->IsParsingMediaSegment(kSourceId)); 468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) chunk_demuxer_->AppendData(kSourceId, 469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pData, 470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size, 471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) append_window_start, 472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) append_window_end, 4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ×tamp_offset, 4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&MockMediaSource::InitSegmentReceived, 4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Unretained(this))); 476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) last_timestamp_offset_ = timestamp_offset; 477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void EndOfStream() { 480ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch chunk_demuxer_->MarkEndOfStream(PIPELINE_OK); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Abort() { 484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!chunk_demuxer_) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunk_demuxer_->Shutdown(); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunk_demuxer_ = NULL; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DemuxerOpened() { 491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->PostTask( 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, base::Bind(&MockMediaSource::DemuxerOpenedTask, 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DemuxerOpenedTask() { 49758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // This code assumes that |mimetype_| is one of the following forms. 49858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // 1. audio/mpeg 49958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // 2. video/webm;codec="vorbis,vp8". 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t semicolon = mimetype_.find(";"); 50158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string type = mimetype_; 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> codecs; 50358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (semicolon != std::string::npos) { 50458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) type = mimetype_.substr(0, semicolon); 50558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) size_t codecs_param_start = mimetype_.find("codecs=\"", semicolon); 50658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 50758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CHECK_NE(codecs_param_start, std::string::npos); 50858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 50958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) codecs_param_start += 8; // Skip over the codecs=". 51058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 51158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) size_t codecs_param_end = mimetype_.find("\"", codecs_param_start); 51258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 51358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CHECK_NE(codecs_param_end, std::string::npos); 51458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 51558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string codecs_param = 51658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) mimetype_.substr(codecs_param_start, 51758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) codecs_param_end - codecs_param_start); 51858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Tokenize(codecs_param, ",", &codecs); 51958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) CHECK_EQ(chunk_demuxer_->AddId(kSourceId, type, codecs), ChunkDemuxer::kOk); 522c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendData(initial_append_size_); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DemuxerNeedKey(const std::string& type, 527424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const std::vector<uint8>& init_data) { 528424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DCHECK(!init_data.empty()); 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(!need_key_cb_.is_null()); 5304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) need_key_cb_.Run(type, init_data); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::TimeDelta last_timestamp_offset() const { 53423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return last_timestamp_offset_; 53523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 53623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 5371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MOCK_METHOD0(InitSegmentReceived, void(void)); 5381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_path_; 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<DecoderBuffer> file_data_; 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int current_position_; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int initial_append_size_; 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mimetype_; 545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ChunkDemuxer* chunk_demuxer_; 546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<Demuxer> owned_chunk_demuxer_; 5474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Demuxer::NeedKeyCB need_key_cb_; 54823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::TimeDelta last_timestamp_offset_; 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PipelineIntegrationTest 5526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) : public testing::Test, 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public PipelineIntegrationTestBase { 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartPipelineWithMediaSource(MockMediaSource* source) { 5561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(*source, InitSegmentReceived()).Times(AtLeast(1)); 557116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*this, OnMetadata(_)) 558116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .Times(AtMost(1)) 5590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch .WillRepeatedly(SaveArg<0>(&metadata_)); 560116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*this, OnBufferingStateChanged(BUFFERING_HAVE_ENOUGH)) 561116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .Times(AtMost(1)); 5621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci demuxer_ = source->GetDemuxer().Pass(); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pipeline_->Start( 5641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci demuxer_.get(), 5651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateRenderer(NULL), 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PipelineIntegrationTest::OnEnded, base::Unretained(this)), 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PipelineIntegrationTest::OnError, base::Unretained(this)), 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitOnStatusCB(PIPELINE_OK), 569effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::Bind(&PipelineIntegrationTest::OnMetadata, 570effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::Unretained(this)), 571116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&PipelineIntegrationTest::OnBufferingStateChanged, 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this)), 5731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Closure(), 5741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&PipelineIntegrationTest::OnAddTextTrack, 5751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Unretained(this))); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void StartHashedPipelineWithMediaSource(MockMediaSource* source) { 58068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) hashing_enabled_ = true; 58168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) StartPipelineWithMediaSource(source); 58268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 58368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartPipelineWithEncryptedMedia( 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockMediaSource* source, 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeEncryptedMedia* encrypted_media) { 5871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(*source, InitSegmentReceived()).Times(AtLeast(1)); 588116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*this, OnMetadata(_)) 589116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .Times(AtMost(1)) 5900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch .WillRepeatedly(SaveArg<0>(&metadata_)); 591116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*this, OnBufferingStateChanged(BUFFERING_HAVE_ENOUGH)) 592116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .Times(AtMost(1)); 5931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci demuxer_ = source->GetDemuxer().Pass(); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pipeline_->Start( 5951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci demuxer_.get(), 5961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateRenderer(encrypted_media->decryptor()), 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PipelineIntegrationTest::OnEnded, base::Unretained(this)), 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PipelineIntegrationTest::OnError, base::Unretained(this)), 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitOnStatusCB(PIPELINE_OK), 600effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::Bind(&PipelineIntegrationTest::OnMetadata, 601effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::Unretained(this)), 602116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&PipelineIntegrationTest::OnBufferingStateChanged, 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this)), 6041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Closure(), 6051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&PipelineIntegrationTest::OnAddTextTrack, 6061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Unretained(this))); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->set_need_key_cb(base::Bind(&FakeEncryptedMedia::NeedKey, 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(encrypted_media))); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verifies that seeking works properly for ChunkDemuxer when the 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // seek happens while there is a pending read on the ChunkDemuxer 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and no data is available. 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool TestSeekDuringRead(const std::string& filename, 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mimetype, 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int initial_append_size, 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta start_seek_time, 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta seek_time, 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int seek_file_position, 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int seek_append_size) { 6246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MockMediaSource source(filename, mimetype, initial_append_size); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartPipelineWithMediaSource(&source); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pipeline_status_ != PIPELINE_OK) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!WaitUntilCurrentTimeIsAfter(start_seek_time)) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 634eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch source.Seek(seek_time, seek_file_position, seek_append_size); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Seek(seek_time)) 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.EndOfStream(); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.Abort(); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stop(); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlayback) { 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(Start(GetTestDataFilePath("bear-320x240.webm"), PIPELINE_OK)); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PipelineIntegrationTest, BasicPlaybackOpusOgg) { 6555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(Start(GetTestDataFilePath("bear-opus.ogg"), PIPELINE_OK)); 6565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Play(); 6585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(WaitUntilOnEnded()); 6605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 6615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlaybackHashed) { 6633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(Start( 6643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetTestDataFilePath("bear-320x240.webm"), PIPELINE_OK, kHashed)); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("f0be120a90a811506777c99a2cdf7cc1", GetVideoHash()); 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("-3.59,-2.06,-0.43,2.15,0.77,-0.95,", GetAudioHash()); 6720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE(demuxer_->GetTimelineOffset().is_null()); 6730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 6740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 6750529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(PipelineIntegrationTest, BasicPlaybackLive) { 6760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(Start( 6770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GetTestDataFilePath("bear-320x240-live.webm"), PIPELINE_OK, kHashed)); 6780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 6790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Play(); 6800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 6810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(WaitUntilOnEnded()); 6820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 6830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ("f0be120a90a811506777c99a2cdf7cc1", GetVideoHash()); 6840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ("-3.59,-2.06,-0.43,2.15,0.77,-0.95,", GetAudioHash()); 6850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 6860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // TODO: Fix FFmpeg code to return higher resolution time values so 6870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // we don't have to truncate our expectations here. 6880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(TruncateToFFmpegTimeResolution(kLiveTimelineOffset()), 6890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch demuxer_->GetTimelineOffset()); 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(PipelineIntegrationTest, F32PlaybackHashed) { 6933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE( 6943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Start(GetTestDataFilePath("sfx_f32le.wav"), PIPELINE_OK, kHashed)); 695868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Play(); 696868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 697868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(std::string(kNullVideoHash), GetVideoHash()); 698868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ("3.03,2.86,2.99,3.31,3.57,4.06,", GetAudioHash()); 699868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 700868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 70190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlaybackEncrypted) { 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_need_key_cb(base::Bind(&FakeEncryptedMedia::NeedKey, 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(&encrypted_media))); 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(Start(GetTestDataFilePath("bear-320x240-av_enc-av.webm"), 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) encrypted_media.decryptor())); 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Play(); 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Stop(); 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlayback_MediaSource) { 7166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MockMediaSource source("bear-320x240.webm", kWebM, 219229); 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartPipelineWithMediaSource(&source); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.EndOfStream(); 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(k320WebMFileDurationMs, 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 7280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 7290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE(demuxer_->GetTimelineOffset().is_null()); 7300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch source.Abort(); 7310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Stop(); 7320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 7330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 7346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlayback_MediaSource_Live) { 7356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MockMediaSource source("bear-320x240-live.webm", kWebM, 219221); 7360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch StartPipelineWithMediaSource(&source); 7370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch source.EndOfStream(); 7380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 7390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 7400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); 7410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(k320WebMFileDurationMs, 7420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); 7430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 7440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Play(); 7450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 7460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(WaitUntilOnEnded()); 7470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 7480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(kLiveTimelineOffset(), 7490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch demuxer_->GetTimelineOffset()); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.Abort(); 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stop(); 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlayback_MediaSource_VP9_WebM) { 7556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MockMediaSource source("bear-vp9.webm", kWebMVP9, 67504); 756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StartPipelineWithMediaSource(&source); 757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source.EndOfStream(); 758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); 761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(kVP9WebMFileDurationMs, 762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); 763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Play(); 765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source.Abort(); 768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Stop(); 769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlayback_MediaSource_VP8A_WebM) { 7726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MockMediaSource source("bear-vp8a.webm", kVideoOnlyWebM, kAppendWholeFile); 77390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) StartPipelineWithMediaSource(&source); 77490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) source.EndOfStream(); 77590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 77690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 77790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); 77890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(kVP8AWebMFileDurationMs, 77990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); 78090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 78190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Play(); 78290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 78390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 78490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) source.Abort(); 78590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Stop(); 78690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 78790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlayback_MediaSource_Opus_WebM) { 78958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MockMediaSource source("bear-opus-end-trimming.webm", kOpusAudioOnlyWebM, 7906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kAppendWholeFile); 79158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartPipelineWithMediaSource(&source); 79258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) source.EndOfStream(); 79358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 79458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 79558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); 7960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(kOpusEndTrimmingWebMFileDurationMs, 79758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); 79858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Play(); 79958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 80058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 80158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) source.Abort(); 80258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Stop(); 80358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 80458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Flaky. http://crbug.com/304776 8066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, DISABLED_MediaSource_Opus_Seeking_WebM) { 80768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) MockMediaSource source("bear-opus-end-trimming.webm", kOpusAudioOnlyWebM, 8086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kAppendWholeFile); 80968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) StartHashedPipelineWithMediaSource(&source); 81068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 81168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 81268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); 8130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(kOpusEndTrimmingWebMFileDurationMs, 81468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); 81568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 81668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeDelta start_seek_time = base::TimeDelta::FromMilliseconds(1000); 81768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(2000); 81868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 81968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Play(); 82068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(WaitUntilCurrentTimeIsAfter(start_seek_time)); 82168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) source.Seek(seek_time, 0x1D5, 34017); 82268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) source.EndOfStream(); 82368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(Seek(seek_time)); 82468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 82568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 82668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 82768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ("0.76,0.20,-0.82,-0.58,-1.29,-0.29,", GetAudioHash()); 82868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 82968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) source.Abort(); 83068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Stop(); 83168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 83268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 8336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, MediaSource_ConfigChange_WebM) { 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockMediaSource source("bear-320x240-16x9-aspect.webm", kWebM, 8356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kAppendWholeFile); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartPipelineWithMediaSource(&source); 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<DecoderBuffer> second_file = 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReadTestDataFile("bear-640x360.webm"); 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), 842ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch second_file->data(), second_file->data_size()); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.EndOfStream(); 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kAppendTimeMs + k640WebMFileDurationMs, 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(WaitUntilOnEnded()); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.Abort(); 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stop(); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, MediaSource_ConfigChange_Encrypted_WebM) { 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockMediaSource source("bear-320x240-16x9-aspect-av_enc-av.webm", kWebM, 8606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kAppendWholeFile); 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartPipelineWithEncryptedMedia(&source, &encrypted_media); 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DecoderBuffer> second_file = 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ReadTestDataFile("bear-640x360-av_enc-av.webm"); 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), 868ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch second_file->data(), second_file->data_size()); 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.EndOfStream(); 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); 8740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(kAppendTimeMs + k640WebMFileDurationMs, 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Play(); 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(WaitUntilOnEnded()); 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.Abort(); 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Stop(); 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Config changes from encrypted to clear are not currently supported. 8856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaSource_ConfigChange_ClearThenEncrypted_WebM) { 8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockMediaSource source("bear-320x240-16x9-aspect.webm", kWebM, 8886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kAppendWholeFile); 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartPipelineWithEncryptedMedia(&source, &encrypted_media); 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DecoderBuffer> second_file = 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ReadTestDataFile("bear-640x360-av_enc-av.webm"); 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), 896ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch second_file->data(), second_file->data_size()); 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.EndOfStream(); 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.Run(); 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(PIPELINE_ERROR_DECODE, pipeline_status_); 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The second video was not added, so its time has not been added. 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(k320WebMFileDurationMs, 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Play(); 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(PIPELINE_ERROR_DECODE, WaitUntilEndedOrError()); 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.Abort(); 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Config changes from clear to encrypted are not currently supported. 9166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaSource_ConfigChange_EncryptedThenClear_WebM) { 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockMediaSource source("bear-320x240-16x9-aspect-av_enc-av.webm", kWebM, 9196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kAppendWholeFile); 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartPipelineWithEncryptedMedia(&source, &encrypted_media); 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DecoderBuffer> second_file = 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ReadTestDataFile("bear-640x360.webm"); 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), 927ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch second_file->data(), second_file->data_size()); 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.EndOfStream(); 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The second video was not added, so its time has not been added. 9340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(k320WebMFileDurationMs, 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Play(); 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(PIPELINE_ERROR_DECODE, WaitUntilEndedOrError()); 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.Abort(); 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(USE_PROPRIETARY_CODECS) 9446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, MediaSource_ADTS) { 9456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MockMediaSource source("sfx.adts", kADTS, kAppendWholeFile); 94623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) StartPipelineWithMediaSource(&source); 94723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) source.EndOfStream(); 94823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 94923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 95023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); 95123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(325, pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); 95223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 95323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) Play(); 95423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 95523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_TRUE(WaitUntilOnEnded()); 95623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 95723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 9586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, MediaSource_ADTS_TimestampOffset) { 9596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MockMediaSource source("sfx.adts", kADTS, kAppendWholeFile); 96046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) StartHashedPipelineWithMediaSource(&source); 96123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(325, source.last_timestamp_offset().InMilliseconds()); 96223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 96346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Trim off multiple frames off the beginning of the segment which will cause 96446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // the first decoded frame to be incorrect if preroll isn't implemented. 96546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::TimeDelta adts_preroll_duration = 96646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::TimeDelta::FromSecondsD(2.5 * 1024 / 44100); 96746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::TimeDelta append_time = 96846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) source.last_timestamp_offset() - adts_preroll_duration; 96946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 97023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_refptr<DecoderBuffer> second_file = ReadTestDataFile("sfx.adts"); 97146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) source.AppendAtTimeWithWindow(append_time, 97246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) append_time + adts_preroll_duration, 97346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) kInfiniteDuration(), 97446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) second_file->data(), 97546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) second_file->data_size()); 97623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) source.EndOfStream(); 97723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 97846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(592, source.last_timestamp_offset().InMilliseconds()); 97923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 98023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); 98146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(592, pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); 98223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 98323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) Play(); 98423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 98523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_TRUE(WaitUntilOnEnded()); 98646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 98746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Verify preroll is stripped. 98846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("-0.06,0.97,-0.90,-0.70,-0.53,-0.34,", GetAudioHash()); 98923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 99023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 991010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlaybackHashed_MP3) { 992010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(Start(GetTestDataFilePath("sfx.mp3"), PIPELINE_OK, kHashed)); 993010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 994010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Play(); 995010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 996010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 997010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 998010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify codec delay and preroll are stripped. 999010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ("3.05,2.87,3.00,3.32,3.58,4.08,", GetAudioHash()); 1000010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1001010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 10026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, MediaSource_MP3) { 10036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MockMediaSource source("sfx.mp3", kMP3, kAppendWholeFile); 10040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch StartHashedPipelineWithMediaSource(&source); 100558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) source.EndOfStream(); 100658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 100723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 100823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); 10090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(313, pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); 101023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 101158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Play(); 101258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 101358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(WaitUntilOnEnded()); 10140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 101546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Verify that codec delay was stripped. 101646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("1.01,2.71,4.18,4.32,3.04,1.12,", GetAudioHash()); 101758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 101858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, MediaSource_MP3_TimestampOffset) { 10206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MockMediaSource source("sfx.mp3", kMP3, kAppendWholeFile); 102123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) StartPipelineWithMediaSource(&source); 10220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(313, source.last_timestamp_offset().InMilliseconds()); 102323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1024010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // There are 576 silent frames at the start of this mp3. The second append 1025010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // should trim them off. 1026010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::TimeDelta mp3_preroll_duration = 1027010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::TimeDelta::FromSecondsD(576.0 / 44100); 1028010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::TimeDelta append_time = 1029010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) source.last_timestamp_offset() - mp3_preroll_duration; 1030010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 103123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_refptr<DecoderBuffer> second_file = ReadTestDataFile("sfx.mp3"); 1032010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) source.AppendAtTimeWithWindow(append_time, 1033010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) append_time + mp3_preroll_duration, 1034010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kInfiniteDuration(), 1035010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) second_file->data(), 1036010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) second_file->data_size()); 103723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) source.EndOfStream(); 103823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1039010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(613, source.last_timestamp_offset().InMilliseconds()); 104023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 104123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); 1042010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(613, pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); 104323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 104423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) Play(); 104523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 104623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_TRUE(WaitUntilOnEnded()); 104723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 104858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, MediaSource_MP3_Icecast) { 10506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MockMediaSource source("icy_sfx.mp3", kMP3, kAppendWholeFile); 105158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartPipelineWithMediaSource(&source); 105258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) source.EndOfStream(); 105358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 105458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Play(); 105558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 105658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(WaitUntilOnEnded()); 105758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 105858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, MediaSource_ConfigChange_MP4) { 10606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MockMediaSource source("bear-640x360-av_frag.mp4", kMP4, kAppendWholeFile); 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartPipelineWithMediaSource(&source); 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<DecoderBuffer> second_file = 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ReadTestDataFile("bear-1280x720-av_frag.mp4"); 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), 1067ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch second_file->data(), second_file->data_size()); 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.EndOfStream(); 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kAppendTimeMs + k1280IsoFileDurationMs, 10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(WaitUntilOnEnded()); 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.Abort(); 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Stop(); 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaSource_ConfigChange_Encrypted_MP4_CENC_VideoOnly) { 10856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MockMediaSource source("bear-640x360-v_frag-cenc.mp4", kMP4Video, 10866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kAppendWholeFile); 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartPipelineWithEncryptedMedia(&source, &encrypted_media); 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DecoderBuffer> second_file = 10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ReadTestDataFile("bear-1280x720-v_frag-cenc.mp4"); 10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), 1094ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch second_file->data(), second_file->data_size()); 10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.EndOfStream(); 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kAppendTimeMs + k1280IsoFileDurationMs, 11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Play(); 11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(WaitUntilOnEnded()); 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.Abort(); 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stop(); 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, 1111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MediaSource_ConfigChange_Encrypted_MP4_CENC_KeyRotation_VideoOnly) { 11126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MockMediaSource source("bear-640x360-v_frag-cenc-key_rotation.mp4", kMP4Video, 11136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kAppendWholeFile); 1114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FakeEncryptedMedia encrypted_media(new RotatingKeyProvidingApp()); 1115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) StartPipelineWithEncryptedMedia(&source, &encrypted_media); 1116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<DecoderBuffer> second_file = 1118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ReadTestDataFile("bear-1280x720-v_frag-cenc-key_rotation.mp4"); 1119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), 1121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) second_file->data(), second_file->data_size()); 1122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) source.EndOfStream(); 1124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 1126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); 1127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(kAppendTimeMs + k1280IsoFileDurationMs, 1128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); 1129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Play(); 1131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(WaitUntilOnEnded()); 1133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) source.Abort(); 1134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Stop(); 1135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Config changes from clear to encrypted are not currently supported. 11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(ddorwin): Figure out why this CHECKs in AppendAtTime(). 11396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, 11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISABLED_MediaSource_ConfigChange_ClearThenEncrypted_MP4_CENC) { 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockMediaSource source("bear-640x360-av_frag.mp4", kMP4Video, 11426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kAppendWholeFile); 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartPipelineWithEncryptedMedia(&source, &encrypted_media); 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DecoderBuffer> second_file = 11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ReadTestDataFile("bear-1280x720-v_frag-cenc.mp4"); 11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), 1150ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch second_file->data(), second_file->data_size()); 11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.EndOfStream(); 11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.Run(); 11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(PIPELINE_ERROR_DECODE, pipeline_status_); 11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); 11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The second video was not added, so its time has not been added. 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(k640IsoFileDurationMs, 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); 11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Play(); 11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(PIPELINE_ERROR_DECODE, WaitUntilEndedOrError()); 11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.Abort(); 11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Config changes from encrypted to clear are not currently supported. 11706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, 11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaSource_ConfigChange_EncryptedThenClear_MP4_CENC) { 11726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MockMediaSource source("bear-640x360-v_frag-cenc.mp4", kMP4Video, 11736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kAppendWholeFile); 11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); 11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartPipelineWithEncryptedMedia(&source, &encrypted_media); 11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DecoderBuffer> second_file = 11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ReadTestDataFile("bear-1280x720-av_frag.mp4"); 11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), 1181ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch second_file->data(), second_file->data_size()); 11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.EndOfStream(); 11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); 11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The second video was not added, so its time has not been added. 11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(k640IsoCencFileDurationMs, 11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); 11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Play(); 11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(PIPELINE_ERROR_DECODE, WaitUntilEndedOrError()); 11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.Abort(); 11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verify files which change configuration midstream fail gracefully. 11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PipelineIntegrationTest, MidStreamConfigChangesFail) { 11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(Start( 12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetTestDataFilePath("midstream_config_change.mp3"), PIPELINE_OK)); 12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Play(); 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(WaitUntilEndedOrError(), PIPELINE_ERROR_DECODE); 12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlayback_16x9AspectRatio) { 12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(Start(GetTestDataFilePath("bear-320x240-16x9-aspect.webm"), 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PIPELINE_OK)); 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, EncryptedPlayback_WebM) { 12156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MockMediaSource source("bear-320x240-av_enc-av.webm", kWebM, 219816); 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartPipelineWithEncryptedMedia(&source, &encrypted_media); 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.EndOfStream(); 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(PIPELINE_OK, pipeline_status_); 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.Abort(); 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stop(); 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, EncryptedPlayback_ClearStart_WebM) { 12306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MockMediaSource source("bear-320x240-av_enc-av_clear-1s.webm", kWebM, 12316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kAppendWholeFile); 12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); 12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartPipelineWithEncryptedMedia(&source, &encrypted_media); 12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.EndOfStream(); 12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(PIPELINE_OK, pipeline_status_); 12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Play(); 12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.Abort(); 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Stop(); 12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, EncryptedPlayback_NoEncryptedFrames_WebM) { 12466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MockMediaSource source("bear-320x240-av_enc-av_clear-all.webm", kWebM, 12476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kAppendWholeFile); 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeEncryptedMedia encrypted_media(new NoResponseApp()); 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartPipelineWithEncryptedMedia(&source, &encrypted_media); 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.EndOfStream(); 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(PIPELINE_OK, pipeline_status_); 12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Play(); 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.Abort(); 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Stop(); 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(USE_PROPRIETARY_CODECS) 12626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, EncryptedPlayback_MP4_CENC_VideoOnly) { 12636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MockMediaSource source("bear-1280x720-v_frag-cenc.mp4", kMP4Video, 12646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kAppendWholeFile); 12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); 12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartPipelineWithEncryptedMedia(&source, &encrypted_media); 12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.EndOfStream(); 12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(PIPELINE_OK, pipeline_status_); 12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Play(); 12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.Abort(); 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Stop(); 12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, EncryptedPlayback_MP4_CENC_AudioOnly) { 12796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MockMediaSource source("bear-1280x720-a_frag-cenc.mp4", kMP4Audio, 12806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kAppendWholeFile); 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); 12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartPipelineWithEncryptedMedia(&source, &encrypted_media); 12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.EndOfStream(); 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(PIPELINE_OK, pipeline_status_); 12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Play(); 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.Abort(); 12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Stop(); 12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, 12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EncryptedPlayback_NoEncryptedFrames_MP4_CENC_VideoOnly) { 12966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MockMediaSource source("bear-1280x720-v_frag-cenc_clear-all.mp4", kMP4Video, 12976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kAppendWholeFile); 12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeEncryptedMedia encrypted_media(new NoResponseApp()); 12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartPipelineWithEncryptedMedia(&source, &encrypted_media); 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.EndOfStream(); 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(PIPELINE_OK, pipeline_status_); 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Play(); 13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.Abort(); 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Stop(); 13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EncryptedPlayback_NoEncryptedFrames_MP4_CENC_AudioOnly) { 13136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MockMediaSource source("bear-1280x720-a_frag-cenc_clear-all.mp4", kMP4Audio, 13146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kAppendWholeFile); 13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeEncryptedMedia encrypted_media(new NoResponseApp()); 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartPipelineWithEncryptedMedia(&source, &encrypted_media); 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.EndOfStream(); 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(PIPELINE_OK, pipeline_status_); 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Play(); 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.Abort(); 13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Stop(); 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 13286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlayback_MediaSource_VideoOnly_MP4_AVC3) { 13298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockMediaSource source("bear-1280x720-v_frag-avc3.mp4", kMP4VideoAVC3, 13306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kAppendWholeFile); 13318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) StartPipelineWithMediaSource(&source); 13328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) source.EndOfStream(); 13338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 13348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 13358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); 13368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(k1280IsoAVC3FileDurationMs, 13378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); 13388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 13398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Play(); 13408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 13418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 13428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) source.Abort(); 13438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Stop(); 13448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 13458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 13466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, EncryptedPlayback_MP4_CENC_KeyRotation_Video) { 1347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MockMediaSource source("bear-1280x720-v_frag-cenc-key_rotation.mp4", 13486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kMP4Video, kAppendWholeFile); 1349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FakeEncryptedMedia encrypted_media(new RotatingKeyProvidingApp()); 1350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) StartPipelineWithEncryptedMedia(&source, &encrypted_media); 1351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) source.EndOfStream(); 1353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(PIPELINE_OK, pipeline_status_); 1354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Play(); 1356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 1358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) source.Abort(); 1359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Stop(); 1360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 13626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, EncryptedPlayback_MP4_CENC_KeyRotation_Audio) { 1363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MockMediaSource source("bear-1280x720-a_frag-cenc-key_rotation.mp4", 13646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) kMP4Audio, kAppendWholeFile); 1365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FakeEncryptedMedia encrypted_media(new RotatingKeyProvidingApp()); 1366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) StartPipelineWithEncryptedMedia(&source, &encrypted_media); 1367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) source.EndOfStream(); 1369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(PIPELINE_OK, pipeline_status_); 1370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Play(); 1372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 1374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) source.Abort(); 1375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Stop(); 1376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(acolwell): Fix flakiness http://crbug.com/117921 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PipelineIntegrationTest, DISABLED_SeekWhilePaused) { 13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(Start(GetTestDataFilePath("bear-320x240.webm"), PIPELINE_OK)); 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration(pipeline_->GetMediaDuration()); 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta start_seek_time(duration / 4); 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta seek_time(duration * 3 / 4); 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilCurrentTimeIsAfter(start_seek_time)); 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pause(); 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Seek(seek_time)); 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pipeline_->GetMediaTime(), seek_time); 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure seeking after reaching the end works as expected. 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pause(); 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Seek(seek_time)); 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pipeline_->GetMediaTime(), seek_time); 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(acolwell): Fix flakiness http://crbug.com/117921 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PipelineIntegrationTest, DISABLED_SeekWhilePlaying) { 14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(Start(GetTestDataFilePath("bear-320x240.webm"), PIPELINE_OK)); 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration(pipeline_->GetMediaDuration()); 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta start_seek_time(duration / 4); 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta seek_time(duration * 3 / 4); 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilCurrentTimeIsAfter(start_seek_time)); 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Seek(seek_time)); 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(pipeline_->GetMediaTime(), seek_time); 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure seeking after reaching the end works as expected. 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Seek(seek_time)); 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(pipeline_->GetMediaTime(), seek_time); 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(USE_PROPRIETARY_CODECS) 1424116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(PipelineIntegrationTest, Rotated_Metadata_0) { 1425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(Start(GetTestDataFilePath("bear_rotate_0.mp4"), PIPELINE_OK)); 1426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_EQ(VIDEO_ROTATION_0, metadata_.video_rotation); 1427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1428116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1429116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(PipelineIntegrationTest, Rotated_Metadata_90) { 1430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(Start(GetTestDataFilePath("bear_rotate_90.mp4"), PIPELINE_OK)); 1431116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_EQ(VIDEO_ROTATION_90, metadata_.video_rotation); 1432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1434116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(PipelineIntegrationTest, Rotated_Metadata_180) { 1435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(Start(GetTestDataFilePath("bear_rotate_180.mp4"), PIPELINE_OK)); 1436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_EQ(VIDEO_ROTATION_180, metadata_.video_rotation); 1437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1439116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(PipelineIntegrationTest, Rotated_Metadata_270) { 1440116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(Start(GetTestDataFilePath("bear_rotate_270.mp4"), PIPELINE_OK)); 1441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_EQ(VIDEO_ROTATION_270, metadata_.video_rotation); 1442116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 1444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify audio decoder & renderer can handle aborted demuxer reads. 14466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, ChunkDemuxerAbortRead_AudioOnly) { 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(TestSeekDuringRead("bear-320x240-audio-only.webm", kAudioOnlyWebM, 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8192, 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(464), 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(617), 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x10CA, 19730)); 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify video decoder & renderer can handle aborted demuxer reads. 14556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PipelineIntegrationTest, ChunkDemuxerAbortRead_VideoOnly) { 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(TestSeekDuringRead("bear-320x240-video-only.webm", kVideoOnlyWebM, 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32768, 1458effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::TimeDelta::FromMilliseconds(167), 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1668), 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x1C896, 65536)); 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verify that Opus audio in WebM containers can be played back. 14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlayback_AudioOnly_Opus_WebM) { 14650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ASSERT_TRUE(Start(GetTestDataFilePath("bear-opus-end-trimming.webm"), 14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PIPELINE_OK)); 14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Play(); 14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verify that VP9 video in WebM containers can be played back. 1472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlayback_VideoOnly_VP9_WebM) { 14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(Start(GetTestDataFilePath("bear-vp9.webm"), 14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PIPELINE_OK)); 14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Play(); 14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verify that VP9 video and Opus audio in the same WebM container can be played 14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// back. 1481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlayback_VP9_Opus_WebM) { 14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(Start(GetTestDataFilePath("bear-vp9-opus.webm"), 14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PIPELINE_OK)); 14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Play(); 14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify that VP8 video with alpha channel can be played back. 1489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlayback_VP8A_WebM) { 1490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(Start(GetTestDataFilePath("bear-vp8a.webm"), 1491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PIPELINE_OK)); 1492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Play(); 1493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 1494b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(last_video_frame_format_, VideoFrame::YV12A); 1495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Verify that VP8A video with odd width/height can be played back. 1498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlayback_VP8A_Odd_WebM) { 1499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(Start(GetTestDataFilePath("bear-vp8a-odd-dimensions.webm"), 1500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PIPELINE_OK)); 1501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Play(); 1502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 1503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(last_video_frame_format_, VideoFrame::YV12A); 1504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1506116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Verify that VP9 video with odd width/height can be played back. 1507116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(PipelineIntegrationTest, BasicPlayback_VP9_Odd_WebM) { 1508116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(Start(GetTestDataFilePath("bear-vp9-odd-dimensions.webm"), 1509116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PIPELINE_OK)); 1510116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Play(); 1511116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(WaitUntilOnEnded()); 1512116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1513116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 151490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Verify that VP8 video with inband text track can be played back. 15151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(PipelineIntegrationTest, BasicPlayback_VP8_WebVTT_WebM) { 15161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(*this, OnAddTextTrack(_, _)); 151790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(Start(GetTestDataFilePath("bear-vp8-webvtt.webm"), 151890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PIPELINE_OK)); 151990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Play(); 152090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 152190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 152290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 152346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Verify that VP9 video with 4:4:4 subsampling can be played back. 15245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(PipelineIntegrationTest, P444_VP9_WebM) { 152546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_TRUE(Start(GetTestDataFilePath("bear-320x240-P444.webm"), 152646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PIPELINE_OK)); 152746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) Play(); 152846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 152946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(last_video_frame_format_, VideoFrame::YV24); 153046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 153146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1532f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Verify that videos with an odd frame size playback successfully. 1533f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlayback_OddVideoSize) { 1534f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(Start(GetTestDataFilePath("butterfly-853x480.webm"), 1535f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PIPELINE_OK)); 1536f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Play(); 1537f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 1538f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 1539f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1540116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Verify that OPUS audio in a webm which reports a 44.1kHz sample rate plays 1541116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// correctly at 48kHz 1542116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(PipelineIntegrationTest, BasicPlayback_Opus441kHz) { 1543116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(Start(GetTestDataFilePath("sfx-opus-441.webm"), PIPELINE_OK)); 1544116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Play(); 1545116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(WaitUntilOnEnded()); 1546116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(48000, 1547116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch demuxer_->GetStream(DemuxerStream::AUDIO) 1548116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->audio_decoder_config() 1549116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .samples_per_second()); 1550116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1551116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1552116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Same as above but using MediaSource. 1553116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(PipelineIntegrationTest, BasicPlayback_MediaSource_Opus441kHz) { 1554116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MockMediaSource source( 1555116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "sfx-opus-441.webm", kOpusAudioOnlyWebM, kAppendWholeFile); 1556116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch StartPipelineWithMediaSource(&source); 1557116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch source.EndOfStream(); 1558116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Play(); 1559116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(WaitUntilOnEnded()); 1560116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch source.Abort(); 1561116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Stop(); 1562116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(48000, 1563116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch demuxer_->GetStream(DemuxerStream::AUDIO) 1564116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->audio_decoder_config() 1565116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .samples_per_second()); 1566116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1567116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 15685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Ensures audio-only playback with missing or negative timestamps works. Tests 15695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// the common live-streaming case for chained ogg. See http://crbug.com/396864. 15705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlaybackChainedOgg) { 15715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(Start(GetTestDataFilePath("double-sfx.ogg"), PIPELINE_OK)); 15725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Play(); 15735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 15741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_EQ(base::TimeDelta(), demuxer_->GetStartTime()); 15755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 15765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 15775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Ensures audio-video playback with missing or negative timestamps fails softly 15785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// instead of crashing. See http://crbug.com/396864. 15795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlaybackChainedOggVideo) { 15805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(Start(GetTestDataFilePath("double-bear.ogv"), PIPELINE_OK)); 15815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Play(); 15825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(PIPELINE_ERROR_DECODE, WaitUntilEndedOrError()); 15831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_EQ(base::TimeDelta(), demuxer_->GetStartTime()); 15841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 15851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 15861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that we signal ended even when audio runs longer than video track. 15871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(PipelineIntegrationTest, BasicPlaybackAudioLongerThanVideo) { 15881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(Start(GetTestDataFilePath("bear_audio_longer_than_video.ogv"), 15891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PIPELINE_OK)); 15901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Audio track is 2000ms. Video track is 1001ms. Duration should be higher 15911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // of the two. 15921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(2000, pipeline_->GetMediaDuration().InMilliseconds()); 15931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Play(); 15941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(WaitUntilOnEnded()); 15951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 15961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 15971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that we signal ended even when audio runs shorter than video track. 15981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(PipelineIntegrationTest, BasicPlaybackAudioShorterThanVideo) { 15991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(Start(GetTestDataFilePath("bear_audio_shorter_than_video.ogv"), 16001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PIPELINE_OK)); 16011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Audio track is 500ms. Video track is 1001ms. Duration should be higher of 16021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // the two. 16031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1001, pipeline_->GetMediaDuration().InMilliseconds()); 16041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Play(); 16051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(WaitUntilOnEnded()); 16061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 16071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 16081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(PipelineIntegrationTest, BasicPlaybackPositiveStartTime) { 16091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE( 16101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Start(GetTestDataFilePath("nonzero-start-time.webm"), PIPELINE_OK)); 16111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Play(); 16121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(WaitUntilOnEnded()); 16131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_EQ(base::TimeDelta::FromMicroseconds(396000), 16141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci demuxer_->GetStartTime()); 16155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 16165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 1618