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