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                               &timestamp_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                               &timestamp_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