pipeline_integration_test.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_util.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/decoder_buffer.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/decryptor_client.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/test_data_util.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/crypto/aes_decryptor.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AtMost; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kSourceId[] = "SourceId"; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kClearKeySystem[] = "org.w3.clearkey"; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint8 kInitData[] = { 0x69, 0x6e, 0x69, 0x74 }; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kWebM[] = "video/webm; codecs=\"vp8,vorbis\""; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kAudioOnlyWebM[] = "video/webm; codecs=\"vorbis\""; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kVideoOnlyWebM[] = "video/webm; codecs=\"vp8\""; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kMP4[] = "video/mp4; codecs=\"avc1.4D4041,mp4a.40.2\""; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Key used to encrypt video track in test file "bear-320x240-encrypted.webm". 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint8 kSecretKey[] = { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kAppendWholeFile = -1; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper class that emulates calls made on the ChunkDemuxer by the 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Media Source API. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockMediaSource { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockMediaSource(const std::string& filename, const std::string& mimetype, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int initial_append_size) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : url_(GetTestDataURL(filename)), 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_position_(0), 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initial_append_size_(initial_append_size), 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mimetype_(mimetype) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunk_demuxer_ = new ChunkDemuxer( 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&MockMediaSource::DemuxerOpened, base::Unretained(this)), 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&MockMediaSource::DemuxerNeedKey, base::Unretained(this))); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_data_ = ReadTestDataFile(filename); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (initial_append_size_ == kAppendWholeFile) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initial_append_size_ = file_data_->GetDataSize(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GT(initial_append_size_, 0); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LE(initial_append_size_, file_data_->GetDataSize()); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockMediaSource() {} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<ChunkDemuxer>& demuxer() const { return chunk_demuxer_; } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_decryptor_client(DecryptorClient* decryptor_client) { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decryptor_client_ = decryptor_client; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Seek(int new_position, int seek_append_size) { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunk_demuxer_->StartWaitingForSeek(); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunk_demuxer_->Abort(kSourceId); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(new_position, 0); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LT(new_position, file_data_->GetDataSize()); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_position_ = new_position; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendData(seek_append_size); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AppendData(int size) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(chunk_demuxer_.get()); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LT(current_position_, file_data_->GetDataSize()); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LE(current_position_ + size, file_data_->GetDataSize()); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(chunk_demuxer_->AppendData( 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSourceId, file_data_->GetData() + current_position_, size)); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_position_ += size; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AppendAtTime(const base::TimeDelta& timestampOffset, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* pData, int size) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(chunk_demuxer_->SetTimestampOffset(kSourceId, timestampOffset)); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(chunk_demuxer_->AppendData(kSourceId, pData, size)); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(chunk_demuxer_->SetTimestampOffset(kSourceId, base::TimeDelta())); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void EndOfStream() { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunk_demuxer_->EndOfStream(PIPELINE_OK); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Abort() { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!chunk_demuxer_.get()) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunk_demuxer_->Shutdown(); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunk_demuxer_ = NULL; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DemuxerOpened() { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->PostTask( 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, base::Bind(&MockMediaSource::DemuxerOpenedTask, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DemuxerOpenedTask() { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t semicolon = mimetype_.find(";"); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string type = mimetype_.substr(0, semicolon); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t quote1 = mimetype_.find("\""); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t quote2 = mimetype_.find("\"", quote1 + 1); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string codecStr = mimetype_.substr(quote1 + 1, quote2 - quote1 - 1); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> codecs; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tokenize(codecStr, ",", &codecs); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_EQ(chunk_demuxer_->AddId(kSourceId, type, codecs), ChunkDemuxer::kOk); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendData(initial_append_size_); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DemuxerNeedKey(const std::string& type, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_array<uint8> init_data, int init_data_size) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(init_data.get()); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GT(init_data_size, 0); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(decryptor_client_); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decryptor_client_->NeedKey("", "", type, init_data.Pass(), init_data_size); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url_; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<DecoderBuffer> file_data_; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int current_position_; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int initial_append_size_; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mimetype_; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ChunkDemuxer> chunk_demuxer_; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DecryptorClient* decryptor_client_; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeDecryptorClient : public DecryptorClient { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDecryptorClient() : decryptor_(this) {} 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AesDecryptor* decryptor() { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &decryptor_; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DecryptorClient implementation. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void KeyAdded(const std::string& key_system, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& session_id) { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kClearKeySystem, key_system); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(session_id.empty()); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void KeyError(const std::string& key_system, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& session_id, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AesDecryptor::KeyError error_code, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int system_code) { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void KeyMessage(const std::string& key_system, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& session_id, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_array<uint8> message, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int message_length, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& default_url) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kClearKeySystem, key_system); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(session_id.empty()); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(message.get()); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(message_length, 0); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_key_system_ = key_system; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_session_id_ = session_id; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void NeedKey(const std::string& key_system, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& session_id, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& type, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_array<uint8> init_data, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int init_data_length) { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_key_system_ = key_system; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_session_id_ = session_id; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When NeedKey is called from the demuxer, the |key_system| will be empty. 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In this case, we need to call GenerateKeyRequest() to initialize a 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // session (which will call KeyMessage). 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_key_system_.empty()) { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(current_session_id_.empty()); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(decryptor_.GenerateKeyRequest( 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kClearKeySystem, type, kInitData, arraysize(kInitData))); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(current_key_system_.empty()); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(current_session_id_.empty()); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decryptor_.AddKey(current_key_system_, kSecretKey, arraysize(kSecretKey), 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) init_data.get(), init_data_length, current_session_id_); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AesDecryptor decryptor_; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string current_key_system_; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string current_session_id_; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PipelineIntegrationTest 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public testing::Test, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public PipelineIntegrationTestBase { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartPipelineWithMediaSource(MockMediaSource* source) { 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*this, OnBufferingState(Pipeline::kHaveMetadata)) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AtMost(1)); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*this, OnBufferingState(Pipeline::kPrerollCompleted)) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AtMost(1)); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pipeline_->Start( 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateFilterCollection(source->demuxer(), NULL), 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PipelineIntegrationTest::OnEnded, base::Unretained(this)), 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PipelineIntegrationTest::OnError, base::Unretained(this)), 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitOnStatusCB(PIPELINE_OK), 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PipelineIntegrationTest::OnBufferingState, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartPipelineWithEncryptedMedia( 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockMediaSource* source, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDecryptorClient* encrypted_media) { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*this, OnBufferingState(Pipeline::kHaveMetadata)) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AtMost(1)); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*this, OnBufferingState(Pipeline::kPrerollCompleted)) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(AtMost(1)); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pipeline_->Start( 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateFilterCollection(source->demuxer(), encrypted_media->decryptor()), 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PipelineIntegrationTest::OnEnded, base::Unretained(this)), 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PipelineIntegrationTest::OnError, base::Unretained(this)), 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitOnStatusCB(PIPELINE_OK), 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PipelineIntegrationTest::OnBufferingState, 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->set_decryptor_client(encrypted_media); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verifies that seeking works properly for ChunkDemuxer when the 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // seek happens while there is a pending read on the ChunkDemuxer 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and no data is available. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool TestSeekDuringRead(const std::string& filename, 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mimetype, 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int initial_append_size, 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta start_seek_time, 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta seek_time, 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int seek_file_position, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int seek_append_size) { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockMediaSource source(filename, mimetype, initial_append_size); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartPipelineWithMediaSource(&source); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pipeline_status_ != PIPELINE_OK) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!WaitUntilCurrentTimeIsAfter(start_seek_time)) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.Seek(seek_file_position, seek_append_size); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Seek(seek_time)) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.EndOfStream(); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.Abort(); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stop(); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlayback) { 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Start(GetTestDataURL("bear-320x240.webm"), PIPELINE_OK)); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlaybackHashed) { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Start(GetTestDataURL("bear-320x240.webm"), PIPELINE_OK, true)); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GetVideoHash(), "f0be120a90a811506777c99a2cdf7cc1"); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GetAudioHash(), "5699a4415b620e45b9d0aae531c9df76"); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlayback_MediaSource) { 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockMediaSource source("bear-320x240.webm", kWebM, 219229); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartPipelineWithMediaSource(&source); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.EndOfStream(); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(pipeline_status_, PIPELINE_OK); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pipeline_->GetBufferedTimeRanges().size(), 1u); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds(), 0); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds(), 2737); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.Abort(); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stop(); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PipelineIntegrationTest, MediaSource_ConfigChange_WebM) { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockMediaSource source("bear-320x240-16x9-aspect.webm", kWebM, 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAppendWholeFile); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartPipelineWithMediaSource(&source); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<DecoderBuffer> second_file = 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReadTestDataFile("bear-640x360.webm"); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.AppendAtTime(base::TimeDelta::FromSeconds(2), 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_file->GetData(), second_file->GetDataSize()); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.EndOfStream(); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(pipeline_status_, PIPELINE_OK); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pipeline_->GetBufferedTimeRanges().size(), 1u); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds(), 0); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds(), 4763); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.Abort(); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stop(); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD) || defined(USE_PROPRIETARY_CODECS) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PipelineIntegrationTest, MediaSource_ConfigChange_MP4) { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockMediaSource source("bear.640x360_dash.mp4", kMP4, kAppendWholeFile); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartPipelineWithMediaSource(&source); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<DecoderBuffer> second_file = 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReadTestDataFile("bear.1280x720_dash.mp4"); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.AppendAtTime(base::TimeDelta::FromSeconds(2), 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_file->GetData(), second_file->GetDataSize()); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.EndOfStream(); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(pipeline_status_, PIPELINE_OK); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pipeline_->GetBufferedTimeRanges().size(), 1u); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds(), 0); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds(), 4736); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.Abort(); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stop(); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PipelineIntegrationTest, BasicPlayback_16x9AspectRatio) { 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Start(GetTestDataURL("bear-320x240-16x9-aspect.webm"), 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PIPELINE_OK)); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PipelineIntegrationTest, EncryptedPlayback) { 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockMediaSource source("bear-320x240-encrypted.webm", kWebM, 219816); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDecryptorClient encrypted_media; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartPipelineWithEncryptedMedia(&source, &encrypted_media); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.EndOfStream(); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(PIPELINE_OK, pipeline_status_); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.Abort(); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stop(); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(acolwell): Fix flakiness http://crbug.com/117921 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PipelineIntegrationTest, DISABLED_SeekWhilePaused) { 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Start(GetTestDataURL("bear-320x240.webm"), PIPELINE_OK)); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration(pipeline_->GetMediaDuration()); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta start_seek_time(duration / 4); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta seek_time(duration * 3 / 4); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilCurrentTimeIsAfter(start_seek_time)); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pause(); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Seek(seek_time)); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pipeline_->GetMediaTime(), seek_time); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure seeking after reaching the end works as expected. 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pause(); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Seek(seek_time)); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pipeline_->GetMediaTime(), seek_time); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(acolwell): Fix flakiness http://crbug.com/117921 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PipelineIntegrationTest, DISABLED_SeekWhilePlaying) { 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Start(GetTestDataURL("bear-320x240.webm"), PIPELINE_OK)); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration(pipeline_->GetMediaDuration()); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta start_seek_time(duration / 4); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta seek_time(duration * 3 / 4); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Play(); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilCurrentTimeIsAfter(start_seek_time)); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Seek(seek_time)); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(pipeline_->GetMediaTime(), seek_time); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure seeking after reaching the end works as expected. 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Seek(seek_time)); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(pipeline_->GetMediaTime(), seek_time); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitUntilOnEnded()); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify audio decoder & renderer can handle aborted demuxer reads. 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PipelineIntegrationTest, ChunkDemuxerAbortRead_AudioOnly) { 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(TestSeekDuringRead("bear-320x240-audio-only.webm", kAudioOnlyWebM, 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8192, 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(464), 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(617), 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x10CA, 19730)); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify video decoder & renderer can handle aborted demuxer reads. 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PipelineIntegrationTest, ChunkDemuxerAbortRead_VideoOnly) { 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(TestSeekDuringRead("bear-320x240-video-only.webm", kVideoOnlyWebM, 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32768, 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(200), 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1668), 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x1C896, 65536)); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 451