Home | History | Annotate | Download | only in android
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <string>
      6 
      7 #include "base/basictypes.h"
      8 #include "base/memory/scoped_ptr.h"
      9 #include "base/strings/stringprintf.h"
     10 #include "media/base/android/media_codec_bridge.h"
     11 #include "media/base/android/media_drm_bridge.h"
     12 #include "media/base/android/media_player_manager.h"
     13 #include "media/base/android/media_source_player.h"
     14 #include "media/base/bind_to_loop.h"
     15 #include "media/base/decoder_buffer.h"
     16 #include "media/base/test_data_util.h"
     17 #include "testing/gmock/include/gmock/gmock.h"
     18 #include "ui/gl/android/surface_texture.h"
     19 
     20 namespace media {
     21 
     22 // Helper macro to skip the test if MediaCodecBridge isn't available.
     23 #define SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE()        \
     24   do {                                                            \
     25     if (!MediaCodecBridge::IsAvailable()) {                       \
     26       VLOG(0) << "Could not run test - not supported on device."; \
     27       return;                                                     \
     28     }                                                             \
     29   } while (0)
     30 
     31 static const int kDefaultDurationInMs = 10000;
     32 
     33 static const char kAudioMp4[] = "audio/mp4";
     34 static const char kVideoMp4[] = "video/mp4";
     35 static const char kAudioWebM[] = "audio/webm";
     36 static const char kVideoWebM[] = "video/webm";
     37 
     38 // TODO(wolenetz/qinmin): Simplify tests with more effective mock usage, and
     39 // fix flaky pointer-based MDJ inequality testing. See http://crbug.com/327839.
     40 
     41 // Mock of MediaPlayerManager for testing purpose
     42 class MockMediaPlayerManager : public MediaPlayerManager {
     43  public:
     44   explicit MockMediaPlayerManager(base::MessageLoop* message_loop)
     45       : message_loop_(message_loop),
     46         playback_completed_(false) {}
     47   virtual ~MockMediaPlayerManager() {}
     48 
     49   // MediaPlayerManager implementation.
     50   virtual void RequestMediaResources(int player_id) OVERRIDE {}
     51   virtual void ReleaseMediaResources(int player_id) OVERRIDE {}
     52   virtual MediaResourceGetter* GetMediaResourceGetter() OVERRIDE {
     53     return NULL;
     54   }
     55   virtual void OnTimeUpdate(int player_id,
     56                             base::TimeDelta current_time) OVERRIDE {}
     57   virtual void OnMediaMetadataChanged(
     58       int player_id, base::TimeDelta duration, int width, int height,
     59       bool success) OVERRIDE {}
     60   virtual void OnPlaybackComplete(int player_id) OVERRIDE {
     61     playback_completed_ = true;
     62     if (message_loop_->is_running())
     63       message_loop_->Quit();
     64   }
     65   virtual void OnMediaInterrupted(int player_id) OVERRIDE {}
     66   virtual void OnBufferingUpdate(int player_id, int percentage) OVERRIDE {}
     67   virtual void OnSeekComplete(int player_id,
     68                               const base::TimeDelta& current_time) OVERRIDE {}
     69   virtual void OnError(int player_id, int error) OVERRIDE {}
     70   virtual void OnVideoSizeChanged(int player_id, int width,
     71                                   int height) OVERRIDE {}
     72   virtual MediaPlayerAndroid* GetFullscreenPlayer() OVERRIDE { return NULL; }
     73   virtual MediaPlayerAndroid* GetPlayer(int player_id) OVERRIDE { return NULL; }
     74   virtual void DestroyAllMediaPlayers() OVERRIDE {}
     75   virtual MediaDrmBridge* GetDrmBridge(int media_keys_id) OVERRIDE {
     76     return NULL;
     77   }
     78   virtual void OnProtectedSurfaceRequested(int player_id) OVERRIDE {}
     79   virtual void OnSessionCreated(int media_keys_id,
     80                                 uint32 session_id,
     81                                 const std::string& web_session_id) OVERRIDE {}
     82   virtual void OnSessionMessage(int media_keys_id,
     83                                 uint32 session_id,
     84                                 const std::vector<uint8>& message,
     85                                 const std::string& destination_url) OVERRIDE {}
     86   virtual void OnSessionReady(int media_keys_id, uint32 session_id) OVERRIDE {}
     87   virtual void OnSessionClosed(int media_keys_id, uint32 session_id) OVERRIDE {}
     88   virtual void OnSessionError(int media_keys_id,
     89                               uint32 session_id,
     90                               media::MediaKeys::KeyError error_code,
     91                               int system_code) OVERRIDE {}
     92 
     93   bool playback_completed() const {
     94     return playback_completed_;
     95   }
     96 
     97  private:
     98   base::MessageLoop* message_loop_;
     99   bool playback_completed_;
    100 
    101   DISALLOW_COPY_AND_ASSIGN(MockMediaPlayerManager);
    102 };
    103 
    104 class MockDemuxerAndroid : public DemuxerAndroid {
    105  public:
    106   explicit MockDemuxerAndroid(base::MessageLoop* message_loop)
    107       : message_loop_(message_loop),
    108         num_data_requests_(0),
    109         num_seek_requests_(0),
    110         num_browser_seek_requests_(0),
    111         num_config_requests_(0) {}
    112   virtual ~MockDemuxerAndroid() {}
    113 
    114   virtual void Initialize(DemuxerAndroidClient* client) OVERRIDE {}
    115   virtual void RequestDemuxerConfigs() OVERRIDE {
    116     num_config_requests_++;
    117   }
    118   virtual void RequestDemuxerData(DemuxerStream::Type type) OVERRIDE {
    119     num_data_requests_++;
    120     if (message_loop_->is_running())
    121       message_loop_->Quit();
    122   }
    123   virtual void RequestDemuxerSeek(const base::TimeDelta& time_to_seek,
    124                                   bool is_browser_seek) OVERRIDE {
    125     num_seek_requests_++;
    126     if (is_browser_seek)
    127       num_browser_seek_requests_++;
    128   }
    129 
    130   int num_data_requests() const { return num_data_requests_; }
    131   int num_seek_requests() const { return num_seek_requests_; }
    132   int num_browser_seek_requests() const { return num_browser_seek_requests_; }
    133   int num_config_requests() const { return num_config_requests_; }
    134 
    135  private:
    136   base::MessageLoop* message_loop_;
    137 
    138   // The number of encoded data requests this object has seen.
    139   int num_data_requests_;
    140 
    141   // The number of regular and browser seek requests this object has seen.
    142   int num_seek_requests_;
    143 
    144   // The number of browser seek requests this object has seen.
    145   int num_browser_seek_requests_;
    146 
    147   // The number of demuxer config requests this object has seen.
    148   int num_config_requests_;
    149 
    150   DISALLOW_COPY_AND_ASSIGN(MockDemuxerAndroid);
    151 };
    152 
    153 class MediaSourcePlayerTest : public testing::Test {
    154  public:
    155   MediaSourcePlayerTest()
    156       : manager_(&message_loop_),
    157         demuxer_(new MockDemuxerAndroid(&message_loop_)),
    158         player_(0, &manager_, scoped_ptr<DemuxerAndroid>(demuxer_)),
    159         decoder_callback_hook_executed_(false),
    160         surface_texture_a_is_next_(true) {}
    161   virtual ~MediaSourcePlayerTest() {}
    162 
    163  protected:
    164   // Get the decoder job from the MediaSourcePlayer.
    165   MediaDecoderJob* GetMediaDecoderJob(bool is_audio) {
    166     if (is_audio) {
    167       return reinterpret_cast<MediaDecoderJob*>(
    168           player_.audio_decoder_job_.get());
    169     }
    170     return reinterpret_cast<MediaDecoderJob*>(
    171         player_.video_decoder_job_.get());
    172   }
    173 
    174   // Get the per-job prerolling status from the MediaSourcePlayer's job matching
    175   // |is_audio|. Caller must guard against NPE if the player's job is NULL.
    176   bool IsPrerolling(bool is_audio) {
    177     return GetMediaDecoderJob(is_audio)->prerolling();
    178   }
    179 
    180   // Get the preroll timestamp from the MediaSourcePlayer.
    181   base::TimeDelta GetPrerollTimestamp() {
    182     return player_.preroll_timestamp_;
    183   }
    184 
    185   // Simulate player has reached starvation timeout.
    186   void TriggerPlayerStarvation() {
    187     player_.decoder_starvation_callback_.Cancel();
    188     player_.OnDecoderStarved();
    189   }
    190 
    191   // Release() the player.
    192   void ReleasePlayer() {
    193     EXPECT_TRUE(player_.IsPlaying());
    194     player_.Release();
    195     EXPECT_FALSE(player_.IsPlaying());
    196     EXPECT_FALSE(GetMediaDecoderJob(true));
    197     EXPECT_FALSE(GetMediaDecoderJob(false));
    198   }
    199 
    200   // Upon the next successful decode callback, post a task to call Release()
    201   // on the |player_|. TEST_F's do not have access to the private player
    202   // members, hence this helper method.
    203   // Prevent usage creep of MSP::set_decode_callback_for_testing() by
    204   // only using it for the ReleaseWithOnPrefetchDoneAlreadyPosted test.
    205   void OnNextTestDecodeCallbackPostTaskToReleasePlayer() {
    206     player_.set_decode_callback_for_testing(media::BindToLoop(
    207       message_loop_.message_loop_proxy(),
    208       base::Bind(
    209           &MediaSourcePlayerTest::ReleaseWithPendingPrefetchDoneVerification,
    210           base::Unretained(this))));
    211   }
    212 
    213   // Asynch test callback posted upon decode completion to verify that a pending
    214   // prefetch done event is cleared across |player_|'s Release(). This helps
    215   // ensure the ReleaseWithOnPrefetchDoneAlreadyPosted test scenario is met.
    216   void ReleaseWithPendingPrefetchDoneVerification() {
    217     EXPECT_TRUE(player_.IsEventPending(player_.PREFETCH_DONE_EVENT_PENDING));
    218     ReleasePlayer();
    219     EXPECT_FALSE(player_.IsEventPending(player_.PREFETCH_DONE_EVENT_PENDING));
    220     EXPECT_FALSE(decoder_callback_hook_executed_);
    221     decoder_callback_hook_executed_ = true;
    222   }
    223 
    224   // Inspect internal pending_event_ state of |player_|. This is for infrequent
    225   // use by tests, only where required.
    226   bool IsPendingSurfaceChange() {
    227     return player_.IsEventPending(player_.SURFACE_CHANGE_EVENT_PENDING);
    228   }
    229 
    230   DemuxerConfigs CreateAudioDemuxerConfigs(AudioCodec audio_codec) {
    231     DemuxerConfigs configs;
    232     configs.audio_codec = audio_codec;
    233     configs.audio_channels = 2;
    234     configs.is_audio_encrypted = false;
    235     configs.duration_ms = kDefaultDurationInMs;
    236 
    237     if (audio_codec == kCodecVorbis) {
    238       configs.audio_sampling_rate = 44100;
    239       scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile(
    240           "vorbis-extradata");
    241       configs.audio_extra_data = std::vector<uint8>(
    242           buffer->data(),
    243           buffer->data() + buffer->data_size());
    244       return configs;
    245     }
    246 
    247     // Other codecs are not yet supported by this helper.
    248     EXPECT_EQ(audio_codec, kCodecAAC);
    249 
    250     configs.audio_sampling_rate = 48000;
    251     uint8 aac_extra_data[] = { 0x13, 0x10 };
    252     configs.audio_extra_data = std::vector<uint8>(
    253         aac_extra_data,
    254         aac_extra_data + 2);
    255     return configs;
    256   }
    257 
    258   DemuxerConfigs CreateVideoDemuxerConfigs() {
    259     DemuxerConfigs configs;
    260     configs.video_codec = kCodecVP8;
    261     configs.video_size = gfx::Size(320, 240);
    262     configs.is_video_encrypted = false;
    263     configs.duration_ms = kDefaultDurationInMs;
    264     return configs;
    265   }
    266 
    267   DemuxerConfigs CreateAudioVideoDemuxerConfigs() {
    268     DemuxerConfigs configs = CreateAudioDemuxerConfigs(kCodecVorbis);
    269     configs.video_codec = kCodecVP8;
    270     configs.video_size = gfx::Size(320, 240);
    271     configs.is_video_encrypted = false;
    272     return configs;
    273   }
    274 
    275   DemuxerConfigs CreateDemuxerConfigs(bool have_audio, bool have_video) {
    276     DCHECK(have_audio || have_video);
    277 
    278     if (have_audio && !have_video)
    279       return CreateAudioDemuxerConfigs(kCodecVorbis);
    280 
    281     if (have_video && !have_audio)
    282       return CreateVideoDemuxerConfigs();
    283 
    284     return CreateAudioVideoDemuxerConfigs();
    285   }
    286 
    287   // Starts an audio decoder job. Verifies player behavior relative to
    288   // |expect_player_requests_data|.
    289   void StartAudioDecoderJob(bool expect_player_requests_data) {
    290     Start(CreateAudioDemuxerConfigs(kCodecVorbis), expect_player_requests_data);
    291   }
    292 
    293   // Starts a video decoder job. Verifies player behavior relative to
    294   // |expect_player_requests_data|.
    295   void StartVideoDecoderJob(bool expect_player_requests_data) {
    296     Start(CreateVideoDemuxerConfigs(), expect_player_requests_data);
    297   }
    298 
    299   // Starts decoding the data. Verifies player behavior relative to
    300   // |expect_player_requests_data|.
    301   void Start(const DemuxerConfigs& configs, bool expect_player_requests_data) {
    302     bool has_audio = configs.audio_codec != kUnknownAudioCodec;
    303     bool has_video = configs.video_codec != kUnknownVideoCodec;
    304     int original_num_data_requests = demuxer_->num_data_requests();
    305     int expected_request_delta = expect_player_requests_data ?
    306         ((has_audio ? 1 : 0) + (has_video ? 1 : 0)) : 0;
    307 
    308     player_.OnDemuxerConfigsAvailable(configs);
    309     player_.Start();
    310 
    311     EXPECT_TRUE(player_.IsPlaying());
    312     EXPECT_EQ(original_num_data_requests + expected_request_delta,
    313               demuxer_->num_data_requests());
    314 
    315     // Verify player has decoder job iff the config included the media type for
    316     // the job and the player is expected to request data due to Start(), above.
    317     EXPECT_EQ(expect_player_requests_data && has_audio,
    318               GetMediaDecoderJob(true) != NULL);
    319     EXPECT_EQ(expect_player_requests_data && has_video,
    320               GetMediaDecoderJob(false) != NULL);
    321   }
    322 
    323   AccessUnit CreateAccessUnitWithData(bool is_audio, int audio_packet_id) {
    324     AccessUnit unit;
    325 
    326     unit.status = DemuxerStream::kOk;
    327     scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile(
    328         is_audio ? base::StringPrintf("vorbis-packet-%d", audio_packet_id)
    329             : "vp8-I-frame-320x240");
    330     unit.data = std::vector<uint8>(
    331         buffer->data(), buffer->data() + buffer->data_size());
    332 
    333     if (is_audio) {
    334       // Vorbis needs 4 extra bytes padding on Android to decode properly. Check
    335       // NuMediaExtractor.cpp in Android source code.
    336       uint8 padding[4] = { 0xff , 0xff , 0xff , 0xff };
    337       unit.data.insert(unit.data.end(), padding, padding + 4);
    338     }
    339 
    340     return unit;
    341   }
    342 
    343   DemuxerData CreateReadFromDemuxerAckForAudio(int packet_id) {
    344     DemuxerData data;
    345     data.type = DemuxerStream::AUDIO;
    346     data.access_units.resize(1);
    347     data.access_units[0] = CreateAccessUnitWithData(true, packet_id);
    348     return data;
    349   }
    350 
    351   DemuxerData CreateReadFromDemuxerAckForVideo() {
    352     DemuxerData data;
    353     data.type = DemuxerStream::VIDEO;
    354     data.access_units.resize(1);
    355     data.access_units[0] = CreateAccessUnitWithData(false, 0);
    356     return data;
    357   }
    358 
    359   DemuxerData CreateEOSAck(bool is_audio) {
    360     DemuxerData data;
    361     data.type = is_audio ? DemuxerStream::AUDIO : DemuxerStream::VIDEO;
    362     data.access_units.resize(1);
    363     data.access_units[0].status = DemuxerStream::kOk;
    364     data.access_units[0].end_of_stream = true;
    365     return data;
    366   }
    367 
    368   DemuxerData CreateAbortedAck(bool is_audio) {
    369     DemuxerData data;
    370     data.type = is_audio ? DemuxerStream::AUDIO : DemuxerStream::VIDEO;
    371     data.access_units.resize(1);
    372     data.access_units[0].status = DemuxerStream::kAborted;
    373     return data;
    374   }
    375 
    376   // Helper method for use at test start. It starts an audio decoder job and
    377   // immediately feeds it some data to decode. Then, without letting the decoder
    378   // job complete a decode cycle, it also starts player SeekTo(). Upon return,
    379   // the player should not yet have sent the DemuxerSeek IPC request, though
    380   // seek event should be pending. The audio decoder job will also still be
    381   // decoding.
    382   void StartAudioDecoderJobAndSeekToWhileDecoding(
    383       const base::TimeDelta& seek_time) {
    384     EXPECT_FALSE(GetMediaDecoderJob(true));
    385     EXPECT_FALSE(player_.IsPlaying());
    386     EXPECT_EQ(0, demuxer_->num_data_requests());
    387     EXPECT_EQ(0.0, GetPrerollTimestamp().InMillisecondsF());
    388     EXPECT_EQ(player_.GetCurrentTime(), GetPrerollTimestamp());
    389     StartAudioDecoderJob(true);
    390     EXPECT_FALSE(GetMediaDecoderJob(true)->is_decoding());
    391     player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0));
    392     EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
    393     player_.SeekTo(seek_time);
    394     EXPECT_EQ(0.0, GetPrerollTimestamp().InMillisecondsF());
    395     EXPECT_EQ(0, demuxer_->num_seek_requests());
    396   }
    397 
    398   // Seek, including simulated receipt of |kAborted| read between SeekTo() and
    399   // OnDemuxerSeekDone(). Use this helper method only when the player already
    400   // has created the decoder job. Exactly one request for more data is expected
    401   // following the seek, so use this helper for players with only audio or only
    402   // video.
    403   void SeekPlayerWithAbort(bool is_audio, const base::TimeDelta& seek_time) {
    404     int original_num_seeks = demuxer_->num_seek_requests();
    405     int original_num_data_requests = demuxer_->num_data_requests();
    406 
    407     // Initiate a seek. Skip the round-trip of requesting seek from renderer.
    408     // Instead behave as if the renderer has asked us to seek.
    409     player_.SeekTo(seek_time);
    410 
    411     // Verify that the seek does not occur until previously outstanding data
    412     // request is satisfied.
    413     EXPECT_EQ(original_num_seeks, demuxer_->num_seek_requests());
    414 
    415     // Simulate seeking causes the demuxer to abort the outstanding read
    416     // caused by the seek.
    417     player_.OnDemuxerDataAvailable(CreateAbortedAck(is_audio));
    418 
    419     // Verify that the seek is requested.
    420     EXPECT_EQ(original_num_seeks + 1, demuxer_->num_seek_requests());
    421 
    422     // Send back the seek done notification. This should trigger the player to
    423     // call OnReadFromDemuxer() again.
    424     EXPECT_EQ(original_num_data_requests, demuxer_->num_data_requests());
    425     player_.OnDemuxerSeekDone(kNoTimestamp());
    426     EXPECT_EQ(original_num_data_requests + 1, demuxer_->num_data_requests());
    427 
    428     // No other seek should have been requested.
    429     EXPECT_EQ(original_num_seeks + 1, demuxer_->num_seek_requests());
    430   }
    431 
    432   DemuxerData CreateReadFromDemuxerAckWithConfigChanged(bool is_audio,
    433                                                         int config_unit_index) {
    434     DemuxerData data;
    435     data.type = is_audio ? DemuxerStream::AUDIO : DemuxerStream::VIDEO;
    436     data.access_units.resize(config_unit_index + 1);
    437 
    438     for (int i = 0; i < config_unit_index; ++i)
    439       data.access_units[i] = CreateAccessUnitWithData(is_audio, i);
    440 
    441     data.access_units[config_unit_index].status = DemuxerStream::kConfigChanged;
    442     return data;
    443   }
    444 
    445   // Valid only for video-only player tests. If |trigger_with_release_start| is
    446   // true, triggers the browser seek with a Release() + video data received +
    447   // Start() with a new surface. If false, triggers the browser seek by
    448   // setting a new video surface after beginning decode of received video data.
    449   // Such data receipt causes possibility that an I-frame is not next, and
    450   // browser seek results once decode completes and surface change processing
    451   // begins.
    452   void BrowserSeekPlayer(bool trigger_with_release_start) {
    453     int expected_num_data_requests = demuxer_->num_data_requests() + 1;
    454     int expected_num_seek_requests = demuxer_->num_seek_requests();
    455     int expected_num_browser_seek_requests =
    456         demuxer_->num_browser_seek_requests();
    457 
    458     EXPECT_FALSE(GetMediaDecoderJob(false));
    459     CreateNextTextureAndSetVideoSurface();
    460     StartVideoDecoderJob(true);
    461 
    462     if (trigger_with_release_start) {
    463       ReleasePlayer();
    464 
    465       // Simulate demuxer's response to the video data request.
    466       player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo());
    467       EXPECT_FALSE(GetMediaDecoderJob(false));
    468       EXPECT_FALSE(player_.IsPlaying());
    469       EXPECT_EQ(expected_num_seek_requests, demuxer_->num_seek_requests());
    470 
    471       CreateNextTextureAndSetVideoSurface();
    472       StartVideoDecoderJob(false);
    473     } else {
    474       // Simulate demuxer's response to the video data request.
    475       player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo());
    476 
    477       // While the decoder is decoding, trigger a browser seek by changing
    478       // surface. Demuxer does not know of browser seek in advance, so no
    479       // |kAborted| data is required (though |kAborted| can certainly occur for
    480       // any pending read in reality due to renderer preparing for a regular
    481       // seek).
    482       CreateNextTextureAndSetVideoSurface();
    483 
    484       // Browser seek should not begin until decoding has completed.
    485       EXPECT_TRUE(GetMediaDecoderJob(false));
    486       EXPECT_EQ(expected_num_seek_requests, demuxer_->num_seek_requests());
    487 
    488       // Wait for the decoder job to finish decoding and be reset pending the
    489       // browser seek.
    490       while (GetMediaDecoderJob(false))
    491         message_loop_.RunUntilIdle();
    492     }
    493 
    494     // Only one browser seek should have been initiated, and no further data
    495     // should have been requested.
    496     expected_num_seek_requests++;
    497     expected_num_browser_seek_requests++;
    498     EXPECT_EQ(expected_num_seek_requests, demuxer_->num_seek_requests());
    499     EXPECT_EQ(expected_num_browser_seek_requests,
    500               demuxer_->num_browser_seek_requests());
    501     EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests());
    502   }
    503 
    504   // Creates a new decoder job and feeds it data ending with a |kConfigChanged|
    505   // access unit. If |config_unit_in_prefetch| is true, sends feeds the config
    506   // change AU in response to the job's first read request (prefetch). If
    507   // false, regular data is fed and decoded prior to feeding the config change
    508   // AU in response to the second data request (after prefetch completed).
    509   // |config_unit_index| controls which access unit is |kConfigChanged|.
    510   void StartConfigChange(bool is_audio,
    511                          bool config_unit_in_prefetch,
    512                          int config_unit_index) {
    513     int expected_num_config_requests = demuxer_->num_config_requests();
    514 
    515     EXPECT_FALSE(GetMediaDecoderJob(is_audio));
    516     if (is_audio) {
    517       StartAudioDecoderJob(true);
    518     } else {
    519       CreateNextTextureAndSetVideoSurface();
    520       StartVideoDecoderJob(true);
    521     }
    522 
    523     int expected_num_data_requests = demuxer_->num_data_requests();
    524 
    525     // Feed and decode a standalone access unit so the player exits prefetch.
    526     if (!config_unit_in_prefetch) {
    527       if (is_audio)
    528         player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0));
    529       else
    530         player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo());
    531 
    532       message_loop_.Run();
    533 
    534       // We should have completed the prefetch phase at this point.
    535       expected_num_data_requests++;
    536       EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests());
    537     }
    538 
    539     EXPECT_EQ(expected_num_config_requests, demuxer_->num_config_requests());
    540 
    541     // Feed and decode access units with data for any units prior to
    542     // |config_unit_index|, and a |kConfigChanged| unit at that index.
    543     // Player should prepare to reconfigure the decoder job, and should request
    544     // new demuxer configs.
    545     player_.OnDemuxerDataAvailable(
    546         CreateReadFromDemuxerAckWithConfigChanged(is_audio, config_unit_index));
    547     WaitForDecodeDone(is_audio, !is_audio);
    548 
    549     expected_num_config_requests++;
    550     EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests());
    551     EXPECT_EQ(expected_num_config_requests, demuxer_->num_config_requests());
    552   }
    553 
    554   void CreateNextTextureAndSetVideoSurface() {
    555     gfx::SurfaceTexture* surface_texture;
    556     if (surface_texture_a_is_next_) {
    557       surface_texture_a_ = new gfx::SurfaceTexture(next_texture_id_++);
    558       surface_texture = surface_texture_a_.get();
    559     } else {
    560       surface_texture_b_ = new gfx::SurfaceTexture(next_texture_id_++);
    561       surface_texture = surface_texture_b_.get();
    562     }
    563 
    564     surface_texture_a_is_next_ = !surface_texture_a_is_next_;
    565     gfx::ScopedJavaSurface surface = gfx::ScopedJavaSurface(surface_texture);
    566     player_.SetVideoSurface(surface.Pass());
    567   }
    568 
    569   // Wait for one or both of the jobs to complete decoding. Decoder jobs are
    570   // assumed to exist for any stream whose decode completion is awaited.
    571   void WaitForDecodeDone(bool wait_for_audio, bool wait_for_video) {
    572     DCHECK(wait_for_audio || wait_for_video);
    573 
    574     while ((wait_for_audio && GetMediaDecoderJob(true) &&
    575                GetMediaDecoderJob(true)->is_decoding()) ||
    576            (wait_for_video && GetMediaDecoderJob(false) &&
    577                GetMediaDecoderJob(false)->is_decoding())) {
    578       message_loop_.RunUntilIdle();
    579     }
    580   }
    581 
    582   void WaitForAudioDecodeDone() {
    583     WaitForDecodeDone(true, false);
    584   }
    585 
    586   void WaitForVideoDecodeDone() {
    587     WaitForDecodeDone(false, true);
    588   }
    589 
    590   void WaitForAudioVideoDecodeDone() {
    591     WaitForDecodeDone(true, true);
    592   }
    593 
    594   // If |send_eos| is true, generates EOS for the stream corresponding to
    595   // |eos_for_audio|. Verifies that playback completes and no further data
    596   // is requested.
    597   // If |send_eos| is false, then it is assumed that caller previously arranged
    598   // for player to receive EOS for each stream, but the player has not yet
    599   // decoded all of them. In this case, |eos_for_audio| is ignored.
    600   void VerifyPlaybackCompletesOnEOSDecode(bool send_eos, bool eos_for_audio) {
    601     int original_num_data_requests = demuxer_->num_data_requests();
    602     if (send_eos)
    603       player_.OnDemuxerDataAvailable(CreateEOSAck(eos_for_audio));
    604     EXPECT_FALSE(manager_.playback_completed());
    605     message_loop_.Run();
    606     EXPECT_TRUE(manager_.playback_completed());
    607     EXPECT_EQ(original_num_data_requests, demuxer_->num_data_requests());
    608   }
    609 
    610   void VerifyCompletedPlaybackResumesOnSeekPlusStart(bool have_audio,
    611                                                      bool have_video) {
    612     DCHECK(have_audio || have_video);
    613 
    614     EXPECT_TRUE(manager_.playback_completed());
    615 
    616     player_.SeekTo(base::TimeDelta());
    617     player_.OnDemuxerSeekDone(kNoTimestamp());
    618     Start(CreateDemuxerConfigs(have_audio, have_video), true);
    619   }
    620 
    621   // Starts the appropriate decoder jobs according to |have_audio| and
    622   // |have_video|. Then starts seek during decode of EOS or non-EOS according to
    623   // |eos_audio| and |eos_video|. Simulates seek completion and verifies that
    624   // playback never completed. |eos_{audio,video}| is ignored if the
    625   // corresponding |have_{audio,video}| is false.
    626   void VerifySeekDuringEOSDecodePreventsPlaybackCompletion(bool have_audio,
    627                                                            bool have_video,
    628                                                            bool eos_audio,
    629                                                            bool eos_video) {
    630     DCHECK(have_audio || have_video);
    631 
    632     if (have_video)
    633       CreateNextTextureAndSetVideoSurface();
    634 
    635     Start(CreateDemuxerConfigs(have_audio, have_video), true);
    636 
    637     if (have_audio)
    638       player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0));
    639 
    640     if (have_video)
    641       player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo());
    642 
    643     // Run until more data is requested a number of times equal to the number of
    644     // media types configured. Since prefetching may be in progress, we cannot
    645     // reliably expect Run() to complete until we have sent demuxer data for all
    646     // configured media types, above.
    647     for (int i = 0; i < (have_audio ? 1 : 0) + (have_video ? 1 : 0); i++)
    648       message_loop_.Run();
    649 
    650     // Simulate seek while decoding EOS or non-EOS for the appropriate
    651     // stream(s).
    652     if (have_audio) {
    653       if (eos_audio)
    654         player_.OnDemuxerDataAvailable(CreateEOSAck(true));
    655       else
    656         player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(1));
    657     }
    658 
    659     if (have_video) {
    660       if (eos_video)
    661         player_.OnDemuxerDataAvailable(CreateEOSAck(false));
    662       else
    663         player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo());
    664     }
    665 
    666     player_.SeekTo(base::TimeDelta());
    667     EXPECT_EQ(0, demuxer_->num_seek_requests());
    668     WaitForDecodeDone(have_audio, have_video);
    669     EXPECT_EQ(1, demuxer_->num_seek_requests());
    670 
    671     player_.OnDemuxerSeekDone(kNoTimestamp());
    672     EXPECT_FALSE(manager_.playback_completed());
    673   }
    674 
    675   base::TimeTicks StartTimeTicks() {
    676     return player_.start_time_ticks_;
    677   }
    678 
    679   bool IsTypeSupported(const std::vector<uint8>& scheme_uuid,
    680                        const std::string& security_level,
    681                        const std::string& container,
    682                        const std::vector<std::string>& codecs) {
    683     return MediaSourcePlayer::IsTypeSupported(
    684         scheme_uuid, security_level, container, codecs);
    685   }
    686 
    687   base::MessageLoop message_loop_;
    688   MockMediaPlayerManager manager_;
    689   MockDemuxerAndroid* demuxer_;  // Owned by |player_|.
    690   MediaSourcePlayer player_;
    691 
    692   // Track whether a possibly asynch decoder callback test hook has run.
    693   bool decoder_callback_hook_executed_;
    694 
    695   // We need to keep the surface texture while the decoder is actively decoding.
    696   // Otherwise, it may trigger unexpected crashes on some devices. To switch
    697   // surfaces, tests need to create a new surface texture without releasing
    698   // their previous one. In CreateNextTextureAndSetVideoSurface(), we toggle
    699   // between two surface textures, only replacing the N-2 texture. Assumption is
    700   // that no more than N-1 texture is in use by decoder when
    701   // CreateNextTextureAndSetVideoSurface() is called.
    702   scoped_refptr<gfx::SurfaceTexture> surface_texture_a_;
    703   scoped_refptr<gfx::SurfaceTexture> surface_texture_b_;
    704   bool surface_texture_a_is_next_;
    705   int next_texture_id_;
    706 
    707   DISALLOW_COPY_AND_ASSIGN(MediaSourcePlayerTest);
    708 };
    709 
    710 TEST_F(MediaSourcePlayerTest, StartAudioDecoderWithValidConfig) {
    711   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
    712 
    713   // Test audio decoder job will be created when codec is successfully started.
    714   StartAudioDecoderJob(true);
    715   EXPECT_EQ(0, demuxer_->num_seek_requests());
    716 }
    717 
    718 TEST_F(MediaSourcePlayerTest, StartAudioDecoderWithInvalidConfig) {
    719   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
    720 
    721   // Test audio decoder job will not be created when failed to start the codec.
    722   DemuxerConfigs configs = CreateAudioDemuxerConfigs(kCodecVorbis);
    723   // Replace with invalid |audio_extra_data|
    724   configs.audio_extra_data.clear();
    725   uint8 invalid_codec_data[] = { 0x00, 0xff, 0xff, 0xff, 0xff };
    726   configs.audio_extra_data.insert(configs.audio_extra_data.begin(),
    727                                  invalid_codec_data, invalid_codec_data + 4);
    728   Start(configs, false);
    729   EXPECT_EQ(0, demuxer_->num_seek_requests());
    730 }
    731 
    732 TEST_F(MediaSourcePlayerTest, StartVideoCodecWithValidSurface) {
    733   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
    734 
    735   // Test video decoder job will be created when surface is valid.
    736   // Video decoder job will not be created until surface is available.
    737   StartVideoDecoderJob(false);
    738 
    739   // Set both an initial and a later video surface without receiving any
    740   // demuxed data yet.
    741   CreateNextTextureAndSetVideoSurface();
    742   MediaDecoderJob* first_job = GetMediaDecoderJob(false);
    743   EXPECT_TRUE(first_job);
    744   CreateNextTextureAndSetVideoSurface();
    745 
    746   // Setting another surface will not create a new job until any pending
    747   // read is satisfied (and job is no longer decoding).
    748   EXPECT_EQ(first_job, GetMediaDecoderJob(false));
    749 
    750   // No seeks, even on setting surface, should have occurred. (Browser seeks can
    751   // occur on setting surface, but only after previously receiving video data.)
    752   EXPECT_EQ(0, demuxer_->num_seek_requests());
    753 
    754   // Note, the decoder job for the second surface set, above, will be created
    755   // only after the pending read is satisfied and decoded, and the resulting
    756   // browser seek is done. See BrowserSeek_* tests for this coverage.
    757 }
    758 
    759 TEST_F(MediaSourcePlayerTest, StartVideoCodecWithInvalidSurface) {
    760   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
    761 
    762   // Test video decoder job will not be created when surface is invalid.
    763   scoped_refptr<gfx::SurfaceTexture> surface_texture(
    764       new gfx::SurfaceTexture(0));
    765   gfx::ScopedJavaSurface surface(surface_texture.get());
    766   StartVideoDecoderJob(false);
    767 
    768   // Release the surface texture.
    769   surface_texture = NULL;
    770   player_.SetVideoSurface(surface.Pass());
    771 
    772   // Player should not seek the demuxer on setting initial surface.
    773   EXPECT_EQ(0, demuxer_->num_seek_requests());
    774 
    775   EXPECT_FALSE(GetMediaDecoderJob(false));
    776   EXPECT_EQ(0, demuxer_->num_data_requests());
    777 }
    778 
    779 TEST_F(MediaSourcePlayerTest, ReadFromDemuxerAfterSeek) {
    780   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
    781 
    782   // Test decoder job will resend a ReadFromDemuxer request after seek.
    783   StartAudioDecoderJob(true);
    784   SeekPlayerWithAbort(true, base::TimeDelta());
    785 }
    786 
    787 TEST_F(MediaSourcePlayerTest, SetSurfaceWhileSeeking) {
    788   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
    789 
    790   // Test SetVideoSurface() will not cause an extra seek while the player is
    791   // waiting for demuxer to indicate seek is done.
    792   // Player is still waiting for SetVideoSurface(), so no request is sent.
    793   StartVideoDecoderJob(false);  // Verifies no data requested.
    794 
    795   // Initiate a seek. Skip requesting element seek of renderer.
    796   // Instead behave as if the renderer has asked us to seek.
    797   EXPECT_EQ(0, demuxer_->num_seek_requests());
    798   player_.SeekTo(base::TimeDelta());
    799   EXPECT_EQ(1, demuxer_->num_seek_requests());
    800 
    801   CreateNextTextureAndSetVideoSurface();
    802   EXPECT_FALSE(GetMediaDecoderJob(false));
    803   EXPECT_EQ(1, demuxer_->num_seek_requests());
    804 
    805   // Reconfirm player has not yet requested data.
    806   EXPECT_EQ(0, demuxer_->num_data_requests());
    807 
    808   // Send the seek done notification. The player should start requesting data.
    809   player_.OnDemuxerSeekDone(kNoTimestamp());
    810   EXPECT_TRUE(GetMediaDecoderJob(false));
    811   EXPECT_EQ(1, demuxer_->num_data_requests());
    812 
    813   // Reconfirm exactly 1 seek request has been made of demuxer, and that it
    814   // was not a browser seek request.
    815   EXPECT_EQ(1, demuxer_->num_seek_requests());
    816   EXPECT_EQ(0, demuxer_->num_browser_seek_requests());
    817 }
    818 
    819 TEST_F(MediaSourcePlayerTest, ChangeMultipleSurfaceWhileDecoding) {
    820   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
    821 
    822   // Test MediaSourcePlayer can switch multiple surfaces during decoding.
    823   CreateNextTextureAndSetVideoSurface();
    824   StartVideoDecoderJob(true);
    825   EXPECT_EQ(0, demuxer_->num_seek_requests());
    826 
    827   // Send the first input chunk.
    828   player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo());
    829 
    830   // While the decoder is decoding, change multiple surfaces. Pass an empty
    831   // surface first.
    832   gfx::ScopedJavaSurface empty_surface;
    833   player_.SetVideoSurface(empty_surface.Pass());
    834   // Next, pass a new non-empty surface.
    835   CreateNextTextureAndSetVideoSurface();
    836 
    837   // Wait for the decoder job to finish decoding and be reset pending a browser
    838   // seek.
    839   while (GetMediaDecoderJob(false))
    840     message_loop_.RunUntilIdle();
    841 
    842   // Only one browser seek should have been initiated. No further data request
    843   // should have been processed on |message_loop_| before surface change event
    844   // became pending, above.
    845   EXPECT_EQ(1, demuxer_->num_browser_seek_requests());
    846   EXPECT_EQ(1, demuxer_->num_data_requests());
    847 
    848   // Simulate browser seek is done and confirm player requests more data for new
    849   // video decoder job.
    850   player_.OnDemuxerSeekDone(player_.GetCurrentTime());
    851   EXPECT_TRUE(GetMediaDecoderJob(false));
    852   EXPECT_EQ(2, demuxer_->num_data_requests());
    853   EXPECT_EQ(1, demuxer_->num_seek_requests());
    854 }
    855 
    856 TEST_F(MediaSourcePlayerTest, AudioOnlyStartAfterSeekFinish) {
    857   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
    858 
    859   // Test audio decoder job will not start until pending seek event is handled.
    860   DemuxerConfigs configs = CreateAudioDemuxerConfigs(kCodecVorbis);
    861   player_.OnDemuxerConfigsAvailable(configs);
    862   EXPECT_FALSE(GetMediaDecoderJob(true));
    863 
    864   // Initiate a seek. Skip requesting element seek of renderer.
    865   // Instead behave as if the renderer has asked us to seek.
    866   player_.SeekTo(base::TimeDelta());
    867   EXPECT_EQ(1, demuxer_->num_seek_requests());
    868 
    869   player_.Start();
    870   EXPECT_FALSE(GetMediaDecoderJob(true));
    871   EXPECT_EQ(0, demuxer_->num_data_requests());
    872 
    873   // Sending back the seek done notification.
    874   player_.OnDemuxerSeekDone(kNoTimestamp());
    875   EXPECT_TRUE(GetMediaDecoderJob(true));
    876   EXPECT_EQ(1, demuxer_->num_data_requests());
    877 
    878   // Reconfirm exactly 1 seek request has been made of demuxer.
    879   EXPECT_EQ(1, demuxer_->num_seek_requests());
    880 }
    881 
    882 TEST_F(MediaSourcePlayerTest, VideoOnlyStartAfterSeekFinish) {
    883   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
    884 
    885   // Test video decoder job will not start until pending seek event is handled.
    886   CreateNextTextureAndSetVideoSurface();
    887   DemuxerConfigs configs = CreateVideoDemuxerConfigs();
    888   player_.OnDemuxerConfigsAvailable(configs);
    889   EXPECT_FALSE(GetMediaDecoderJob(false));
    890 
    891   // Initiate a seek. Skip requesting element seek of renderer.
    892   // Instead behave as if the renderer has asked us to seek.
    893   player_.SeekTo(base::TimeDelta());
    894   EXPECT_EQ(1, demuxer_->num_seek_requests());
    895 
    896   player_.Start();
    897   EXPECT_FALSE(GetMediaDecoderJob(false));
    898   EXPECT_EQ(0, demuxer_->num_data_requests());
    899 
    900   // Sending back the seek done notification.
    901   player_.OnDemuxerSeekDone(kNoTimestamp());
    902   EXPECT_TRUE(GetMediaDecoderJob(false));
    903   EXPECT_EQ(1, demuxer_->num_data_requests());
    904 
    905   // Reconfirm exactly 1 seek request has been made of demuxer.
    906   EXPECT_EQ(1, demuxer_->num_seek_requests());
    907 }
    908 
    909 TEST_F(MediaSourcePlayerTest, StartImmediatelyAfterPause) {
    910   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
    911 
    912   // Test that if the decoding job is not fully stopped after Pause(),
    913   // calling Start() will be a noop.
    914   StartAudioDecoderJob(true);
    915 
    916   MediaDecoderJob* decoder_job = GetMediaDecoderJob(true);
    917   EXPECT_FALSE(GetMediaDecoderJob(true)->is_decoding());
    918 
    919   // Sending data to player.
    920   player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0));
    921   EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
    922 
    923   // Decoder job will not immediately stop after Pause() since it is
    924   // running on another thread.
    925   player_.Pause(true);
    926   EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
    927 
    928   // Nothing happens when calling Start() again.
    929   player_.Start();
    930   // Verify that Start() will not destroy and recreate the decoder job.
    931   EXPECT_EQ(decoder_job, GetMediaDecoderJob(true));
    932   EXPECT_EQ(1, demuxer_->num_data_requests());
    933   EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
    934   message_loop_.Run();
    935   // The decoder job should finish and a new request will be sent.
    936   EXPECT_EQ(2, demuxer_->num_data_requests());
    937   EXPECT_FALSE(GetMediaDecoderJob(true)->is_decoding());
    938 }
    939 
    940 TEST_F(MediaSourcePlayerTest, DecoderJobsCannotStartWithoutAudio) {
    941   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
    942 
    943   // Test that when Start() is called, video decoder jobs will wait for audio
    944   // decoder job before start decoding the data.
    945   CreateNextTextureAndSetVideoSurface();
    946   Start(CreateAudioVideoDemuxerConfigs(), true);
    947   MediaDecoderJob* audio_decoder_job = GetMediaDecoderJob(true);
    948   MediaDecoderJob* video_decoder_job = GetMediaDecoderJob(false);
    949 
    950   EXPECT_FALSE(audio_decoder_job->is_decoding());
    951   EXPECT_FALSE(video_decoder_job->is_decoding());
    952 
    953   // Sending video data to player, video decoder should not start.
    954   player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo());
    955   EXPECT_FALSE(video_decoder_job->is_decoding());
    956 
    957   // Sending audio data to player, both decoders should start now.
    958   player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0));
    959   EXPECT_TRUE(audio_decoder_job->is_decoding());
    960   EXPECT_TRUE(video_decoder_job->is_decoding());
    961 
    962   // No seeks should have occurred.
    963   EXPECT_EQ(0, demuxer_->num_seek_requests());
    964 }
    965 
    966 TEST_F(MediaSourcePlayerTest, StartTimeTicksResetAfterDecoderUnderruns) {
    967   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
    968 
    969   // Test start time ticks will reset after decoder job underruns.
    970   StartAudioDecoderJob(true);
    971 
    972   // For the first couple chunks, the decoder job may return
    973   // DECODE_FORMAT_CHANGED status instead of DECODE_SUCCEEDED status. Decode
    974   // more frames to guarantee that DECODE_SUCCEEDED will be returned.
    975   for (int i = 0; i < 4; ++i) {
    976     player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(i));
    977     EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
    978     message_loop_.Run();
    979   }
    980 
    981   // The decoder job should finish and a new request will be sent.
    982   EXPECT_EQ(5, demuxer_->num_data_requests());
    983   EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
    984   base::TimeTicks previous = StartTimeTicks();
    985 
    986   // Let the decoder timeout and execute the OnDecoderStarved() callback.
    987   base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100));
    988 
    989   EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
    990   EXPECT_TRUE(StartTimeTicks() != base::TimeTicks());
    991   message_loop_.RunUntilIdle();
    992 
    993   // Send new data to the decoder so it can finish the currently
    994   // pending decode.
    995   player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(3));
    996   WaitForAudioDecodeDone();
    997 
    998   // Verify the start time ticks is cleared at this point because the
    999   // player is prefetching.
   1000   EXPECT_TRUE(StartTimeTicks() == base::TimeTicks());
   1001 
   1002   // Send new data to the decoder so it can finish prefetching. This should
   1003   // reset the start time ticks.
   1004   player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(3));
   1005   EXPECT_TRUE(StartTimeTicks() != base::TimeTicks());
   1006 
   1007   base::TimeTicks current = StartTimeTicks();
   1008   EXPECT_LE(100.0, (current - previous).InMillisecondsF());
   1009 }
   1010 
   1011 TEST_F(MediaSourcePlayerTest, V_SecondAccessUnitIsEOSAndResumePlayAfterSeek) {
   1012   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1013 
   1014   // Test MediaSourcePlayer can replay video after input EOS is reached.
   1015   CreateNextTextureAndSetVideoSurface();
   1016   StartVideoDecoderJob(true);
   1017 
   1018   // Send the first input chunk.
   1019   player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo());
   1020   message_loop_.Run();
   1021 
   1022   VerifyPlaybackCompletesOnEOSDecode(true, false);
   1023   VerifyCompletedPlaybackResumesOnSeekPlusStart(false, true);
   1024 }
   1025 
   1026 TEST_F(MediaSourcePlayerTest, A_FirstAccessUnitIsEOSAndResumePlayAfterSeek) {
   1027   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1028 
   1029   // Test decode of audio EOS buffer without any prior decode. See also
   1030   // http://b/11696552.
   1031   // Also tests that seeking+Start() after completing audio playback resumes
   1032   // playback.
   1033   Start(CreateAudioDemuxerConfigs(kCodecAAC), true);
   1034   VerifyPlaybackCompletesOnEOSDecode(true, true);
   1035   VerifyCompletedPlaybackResumesOnSeekPlusStart(true, false);
   1036 }
   1037 
   1038 TEST_F(MediaSourcePlayerTest, V_FirstAccessUnitAfterSeekIsEOS) {
   1039   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1040 
   1041   // Test decode of video EOS buffer, just after seeking, without any prior
   1042   // decode (other than the simulated |kAborted| resulting from the seek
   1043   // process.)
   1044   CreateNextTextureAndSetVideoSurface();
   1045   StartVideoDecoderJob(true);
   1046   SeekPlayerWithAbort(false, base::TimeDelta());
   1047   VerifyPlaybackCompletesOnEOSDecode(true, false);
   1048 }
   1049 
   1050 TEST_F(MediaSourcePlayerTest, A_FirstAccessUnitAfterSeekIsEOS) {
   1051   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1052 
   1053   // Test decode of audio EOS buffer, just after seeking, without any prior
   1054   // decode (other than the simulated |kAborted| resulting from the seek
   1055   // process.) See also http://b/11696552.
   1056   Start(CreateAudioDemuxerConfigs(kCodecAAC), true);
   1057   SeekPlayerWithAbort(true, base::TimeDelta());
   1058   VerifyPlaybackCompletesOnEOSDecode(true, true);
   1059 }
   1060 
   1061 TEST_F(MediaSourcePlayerTest, AV_PlaybackCompletionAcrossConfigChange) {
   1062   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1063 
   1064   // Test that if one stream (audio) has completed decode of EOS and the other
   1065   // stream (video) processes config change, that subsequent video EOS completes
   1066   // A/V playback.
   1067   // Also tests that seeking+Start() after completing playback resumes playback.
   1068   CreateNextTextureAndSetVideoSurface();
   1069   Start(CreateAudioVideoDemuxerConfigs(), true);
   1070 
   1071   player_.OnDemuxerDataAvailable(CreateEOSAck(true));  // Audio EOS
   1072   EXPECT_EQ(0, demuxer_->num_config_requests());
   1073   player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckWithConfigChanged(
   1074       false, 0));  // Video |kConfigChanged| as first unit.
   1075 
   1076   WaitForAudioVideoDecodeDone();
   1077 
   1078   EXPECT_EQ(1, demuxer_->num_config_requests());
   1079   EXPECT_EQ(2, demuxer_->num_data_requests());
   1080   player_.OnDemuxerConfigsAvailable(CreateAudioVideoDemuxerConfigs());
   1081   EXPECT_EQ(3, demuxer_->num_data_requests());
   1082 
   1083   // At no time after completing audio EOS decode, above, should the
   1084   // audio decoder job resume decoding. Send and decode video EOS.
   1085   VerifyPlaybackCompletesOnEOSDecode(true, false);
   1086   VerifyCompletedPlaybackResumesOnSeekPlusStart(true, true);
   1087 }
   1088 
   1089 TEST_F(MediaSourcePlayerTest, VA_PlaybackCompletionAcrossConfigChange) {
   1090   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1091 
   1092   // Test that if one stream (video) has completed decode of EOS and the other
   1093   // stream (audio) processes config change, that subsequent audio EOS completes
   1094   // A/V playback.
   1095   // Also tests that seeking+Start() after completing playback resumes playback.
   1096   CreateNextTextureAndSetVideoSurface();
   1097   Start(CreateAudioVideoDemuxerConfigs(), true);
   1098 
   1099   player_.OnDemuxerDataAvailable(CreateEOSAck(false));  // Video EOS
   1100   EXPECT_EQ(0, demuxer_->num_config_requests());
   1101   player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckWithConfigChanged(
   1102       true, 0));  // Audio |kConfigChanged| as first unit.
   1103 
   1104   WaitForAudioVideoDecodeDone();
   1105 
   1106   // TODO(wolenetz/qinmin): Prevent redundant demuxer config request and change
   1107   // expectation to 1 here. See http://crbug.com/325528.
   1108   EXPECT_EQ(2, demuxer_->num_config_requests());
   1109   EXPECT_EQ(2, demuxer_->num_data_requests());
   1110   player_.OnDemuxerConfigsAvailable(CreateAudioVideoDemuxerConfigs());
   1111   EXPECT_EQ(3, demuxer_->num_data_requests());
   1112 
   1113   // At no time after completing video EOS decode, above, should the
   1114   // video decoder job resume decoding. Send and decode audio EOS.
   1115   VerifyPlaybackCompletesOnEOSDecode(true, true);
   1116   VerifyCompletedPlaybackResumesOnSeekPlusStart(true, true);
   1117 }
   1118 
   1119 TEST_F(MediaSourcePlayerTest, AV_NoPrefetchForFinishedVideoOnAudioStarvation) {
   1120   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1121 
   1122   // Test that if one stream (video) has completed decode of EOS, prefetch
   1123   // resulting from player starvation occurs only for the other stream (audio),
   1124   // and responding to that prefetch with EOS completes A/V playback, even if
   1125   // another starvation occurs during the latter EOS's decode.
   1126   CreateNextTextureAndSetVideoSurface();
   1127   Start(CreateAudioVideoDemuxerConfigs(), true);
   1128 
   1129   player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0));
   1130   player_.OnDemuxerDataAvailable(CreateEOSAck(false));  // Video EOS
   1131 
   1132   // Wait until video EOS is processed and more data (assumed to be audio) is
   1133   // requested.
   1134   while (demuxer_->num_data_requests() < 3)
   1135     message_loop_.RunUntilIdle();
   1136   WaitForVideoDecodeDone();
   1137   EXPECT_EQ(3, demuxer_->num_data_requests());
   1138 
   1139   // Simulate decoder underrun to trigger prefetch while still decoding audio.
   1140   player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(1));
   1141   EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding() &&
   1142               !GetMediaDecoderJob(false)->is_decoding());
   1143   TriggerPlayerStarvation();
   1144 
   1145   // Complete the audio decode that was in progress when simulated player
   1146   // starvation was triggered.
   1147   WaitForAudioDecodeDone();
   1148   EXPECT_EQ(4, demuxer_->num_data_requests());
   1149 
   1150   player_.OnDemuxerDataAvailable(CreateEOSAck(true));  // Audio EOS
   1151   EXPECT_FALSE(GetMediaDecoderJob(false)->is_decoding());
   1152   EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
   1153 
   1154   // Simulate another decoder underrun to trigger prefetch while decoding EOS.
   1155   TriggerPlayerStarvation();
   1156   VerifyPlaybackCompletesOnEOSDecode(false, true /* ignored */);
   1157 }
   1158 
   1159 TEST_F(MediaSourcePlayerTest, V_StarvationDuringEOSDecode) {
   1160   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1161 
   1162   // Test that video-only playback completes without further data requested when
   1163   // starvation occurs during EOS decode.
   1164   CreateNextTextureAndSetVideoSurface();
   1165   StartVideoDecoderJob(true);
   1166   player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo());
   1167   message_loop_.Run();
   1168 
   1169   // Simulate decoder underrun to trigger prefetch while decoding EOS.
   1170   player_.OnDemuxerDataAvailable(CreateEOSAck(false));  // Video EOS
   1171   EXPECT_TRUE(GetMediaDecoderJob(false)->is_decoding());
   1172   TriggerPlayerStarvation();
   1173   VerifyPlaybackCompletesOnEOSDecode(false, false /* ignored */);
   1174 }
   1175 
   1176 TEST_F(MediaSourcePlayerTest, A_StarvationDuringEOSDecode) {
   1177   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1178 
   1179   // Test that audio-only playback completes without further data requested when
   1180   // starvation occurs during EOS decode.
   1181   StartAudioDecoderJob(true);
   1182   player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0));
   1183   message_loop_.Run();
   1184 
   1185   // Simulate decoder underrun to trigger prefetch while decoding EOS.
   1186   player_.OnDemuxerDataAvailable(CreateEOSAck(true));  // Audio EOS
   1187   EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
   1188   TriggerPlayerStarvation();
   1189   VerifyPlaybackCompletesOnEOSDecode(false, true /* ignored */);
   1190 }
   1191 
   1192 TEST_F(MediaSourcePlayerTest, AV_SeekDuringEOSDecodePreventsCompletion) {
   1193   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1194 
   1195   // Test that seek supercedes audio+video playback completion on simultaneous
   1196   // audio and video EOS decode, if SeekTo() occurs during these EOS decodes.
   1197   VerifySeekDuringEOSDecodePreventsPlaybackCompletion(true, true, true, true);
   1198 }
   1199 
   1200 TEST_F(MediaSourcePlayerTest, AV_SeekDuringAudioEOSDecodePreventsCompletion) {
   1201   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1202 
   1203   // Test that seek supercedes audio+video playback completion on simultaneous
   1204   // audio EOS and video non-EOS decode, if SeekTo() occurs during these
   1205   // decodes.
   1206   VerifySeekDuringEOSDecodePreventsPlaybackCompletion(true, true, true, false);
   1207 }
   1208 
   1209 TEST_F(MediaSourcePlayerTest, AV_SeekDuringVideoEOSDecodePreventsCompletion) {
   1210   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1211 
   1212   // Test that seek supercedes audio+video playback completion on simultaneous
   1213   // audio non-EOS and video EOS decode, if SeekTo() occurs during these
   1214   // decodes.
   1215   VerifySeekDuringEOSDecodePreventsPlaybackCompletion(true, true, false, true);
   1216 }
   1217 
   1218 TEST_F(MediaSourcePlayerTest, V_SeekDuringEOSDecodePreventsCompletion) {
   1219   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1220 
   1221   // Test that seek supercedes video-only playback completion on EOS decode, if
   1222   // SeekTo() occurs during EOS decode.
   1223   VerifySeekDuringEOSDecodePreventsPlaybackCompletion(false, true, false, true);
   1224 }
   1225 
   1226 TEST_F(MediaSourcePlayerTest, A_SeekDuringEOSDecodePreventsCompletion) {
   1227   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1228 
   1229   // Test that seek supercedes audio-only playback completion on EOS decode, if
   1230   // SeekTo() occurs during EOS decode.
   1231   VerifySeekDuringEOSDecodePreventsPlaybackCompletion(true, false, true, false);
   1232 }
   1233 
   1234 TEST_F(MediaSourcePlayerTest, NoRequestForDataAfterAbort) {
   1235   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1236 
   1237   // Test that the decoder will not request new data after receiving an aborted
   1238   // access unit.
   1239   StartAudioDecoderJob(true);
   1240 
   1241   // Send an aborted access unit.
   1242   player_.OnDemuxerDataAvailable(CreateAbortedAck(true));
   1243   EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
   1244   WaitForAudioDecodeDone();
   1245 
   1246   // No request will be sent for new data.
   1247   EXPECT_EQ(1, demuxer_->num_data_requests());
   1248 
   1249   // No seek requests should have occurred.
   1250   EXPECT_EQ(0, demuxer_->num_seek_requests());
   1251 }
   1252 
   1253 TEST_F(MediaSourcePlayerTest, DemuxerDataArrivesAfterRelease) {
   1254   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1255 
   1256   // Test that the decoder should not crash if demuxer data arrives after
   1257   // Release().
   1258   StartAudioDecoderJob(true);
   1259 
   1260   ReleasePlayer();
   1261   player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0));
   1262 
   1263   // The decoder job should have been released.
   1264   EXPECT_FALSE(player_.IsPlaying());
   1265 
   1266   // No further data should have been requested.
   1267   EXPECT_EQ(1, demuxer_->num_data_requests());
   1268 
   1269   // No seek requests should have occurred.
   1270   EXPECT_EQ(0, demuxer_->num_seek_requests());
   1271 }
   1272 
   1273 TEST_F(MediaSourcePlayerTest, BrowserSeek_RegularSeekPendsBrowserSeekDone) {
   1274   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1275 
   1276   // Test that a browser seek, once started, delays a newly arrived regular
   1277   // SeekTo() request's demuxer seek until the browser seek is done.
   1278   BrowserSeekPlayer(false);
   1279 
   1280   // Simulate renderer requesting a regular seek while browser seek in progress.
   1281   player_.SeekTo(base::TimeDelta());
   1282   EXPECT_FALSE(GetMediaDecoderJob(false));
   1283 
   1284   // Simulate browser seek is done. Confirm player requests the regular seek,
   1285   // still has no video decoder job configured, and has not requested any
   1286   // further data since the surface change event became pending in
   1287   // BrowserSeekPlayer().
   1288   EXPECT_EQ(1, demuxer_->num_seek_requests());
   1289   player_.OnDemuxerSeekDone(base::TimeDelta());
   1290   EXPECT_FALSE(GetMediaDecoderJob(false));
   1291   EXPECT_EQ(2, demuxer_->num_seek_requests());
   1292   EXPECT_EQ(1, demuxer_->num_browser_seek_requests());
   1293   EXPECT_EQ(1, demuxer_->num_data_requests());
   1294 
   1295   // Simulate regular seek is done and confirm player requests more data for
   1296   // new video decoder job.
   1297   player_.OnDemuxerSeekDone(kNoTimestamp());
   1298   EXPECT_TRUE(GetMediaDecoderJob(false));
   1299   EXPECT_EQ(2, demuxer_->num_data_requests());
   1300   EXPECT_EQ(2, demuxer_->num_seek_requests());
   1301 }
   1302 
   1303 TEST_F(MediaSourcePlayerTest, NoSeekForInitialReleaseAndStart) {
   1304   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1305 
   1306   // Test that no seek is requested if player Release() + Start() occurs prior
   1307   // to receiving any data.
   1308   CreateNextTextureAndSetVideoSurface();
   1309   StartVideoDecoderJob(true);
   1310   ReleasePlayer();
   1311 
   1312   // Pass a new non-empty surface.
   1313   CreateNextTextureAndSetVideoSurface();
   1314 
   1315   player_.Start();
   1316 
   1317   // TODO(wolenetz/qinmin): Multiple in-flight data requests for same stream
   1318   // should be prevented. See http://crbug.com/306314.
   1319   EXPECT_EQ(2, demuxer_->num_data_requests());
   1320   EXPECT_TRUE(GetMediaDecoderJob(false));
   1321 
   1322   EXPECT_EQ(0, demuxer_->num_seek_requests());
   1323 }
   1324 
   1325 TEST_F(MediaSourcePlayerTest, BrowserSeek_MidStreamReleaseAndStart) {
   1326   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1327 
   1328   // Test that one browser seek is requested if player Release() + Start(), with
   1329   // video data received between Release() and Start().
   1330   BrowserSeekPlayer(true);
   1331   EXPECT_EQ(1, demuxer_->num_data_requests());
   1332 
   1333   // Simulate browser seek is done and confirm player requests more data.
   1334   player_.OnDemuxerSeekDone(base::TimeDelta());
   1335   EXPECT_TRUE(GetMediaDecoderJob(false));
   1336   EXPECT_EQ(2, demuxer_->num_data_requests());
   1337   EXPECT_EQ(1, demuxer_->num_seek_requests());
   1338 }
   1339 
   1340 TEST_F(MediaSourcePlayerTest, PrerollAudioAfterSeek) {
   1341   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1342 
   1343   // Test decoder job will preroll the media to the seek position.
   1344   StartAudioDecoderJob(true);
   1345 
   1346   SeekPlayerWithAbort(true, base::TimeDelta::FromMilliseconds(100));
   1347   EXPECT_TRUE(IsPrerolling(true));
   1348   EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF());
   1349 
   1350   // Send some data before the seek position.
   1351   for (int i = 1; i < 4; ++i) {
   1352     player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(i));
   1353     EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
   1354     message_loop_.Run();
   1355   }
   1356   EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF());
   1357   EXPECT_TRUE(IsPrerolling(true));
   1358 
   1359   // Send data after the seek position.
   1360   DemuxerData data = CreateReadFromDemuxerAckForAudio(3);
   1361   data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(100);
   1362   player_.OnDemuxerDataAvailable(data);
   1363   message_loop_.Run();
   1364   EXPECT_LT(100.0, player_.GetCurrentTime().InMillisecondsF());
   1365   EXPECT_FALSE(IsPrerolling(true));
   1366 }
   1367 
   1368 TEST_F(MediaSourcePlayerTest, PrerollVideoAfterSeek) {
   1369   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1370 
   1371   // Test decoder job will preroll the media to the seek position.
   1372   CreateNextTextureAndSetVideoSurface();
   1373   StartVideoDecoderJob(true);
   1374 
   1375   SeekPlayerWithAbort(false, base::TimeDelta::FromMilliseconds(100));
   1376   EXPECT_TRUE(IsPrerolling(false));
   1377   EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF());
   1378 
   1379   // Send some data before the seek position.
   1380   DemuxerData data;
   1381   for (int i = 1; i < 4; ++i) {
   1382     data = CreateReadFromDemuxerAckForVideo();
   1383     data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(i * 30);
   1384     player_.OnDemuxerDataAvailable(data);
   1385     EXPECT_TRUE(GetMediaDecoderJob(false)->is_decoding());
   1386     message_loop_.Run();
   1387   }
   1388   EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF());
   1389   EXPECT_TRUE(IsPrerolling(false));
   1390 
   1391   // Send data at the seek position.
   1392   data = CreateReadFromDemuxerAckForVideo();
   1393   data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(100);
   1394   player_.OnDemuxerDataAvailable(data);
   1395   message_loop_.Run();
   1396 
   1397   // TODO(wolenetz/qinmin): Player's maintenance of current time for video-only
   1398   // streams depends on decoder output, which may be initially inaccurate, and
   1399   // encoded video test data may also need updating. Verify at least that AU
   1400   // timestamp-based preroll logic has determined video preroll has completed.
   1401   // See http://crbug.com/310823 and http://b/11356652.
   1402   EXPECT_FALSE(IsPrerolling(false));
   1403 }
   1404 
   1405 TEST_F(MediaSourcePlayerTest, SeekingAfterCompletingPrerollRestartsPreroll) {
   1406   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1407 
   1408   // Test decoder job will begin prerolling upon seek, when it was not
   1409   // prerolling prior to the seek.
   1410   StartAudioDecoderJob(true);
   1411   MediaDecoderJob* decoder_job = GetMediaDecoderJob(true);
   1412   EXPECT_TRUE(IsPrerolling(true));
   1413 
   1414   // Complete the initial preroll by feeding data to the decoder.
   1415   for (int i = 0; i < 4; ++i) {
   1416     player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(i));
   1417     EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
   1418     message_loop_.Run();
   1419   }
   1420   EXPECT_LT(0.0, player_.GetCurrentTime().InMillisecondsF());
   1421   EXPECT_FALSE(IsPrerolling(true));
   1422 
   1423   SeekPlayerWithAbort(true, base::TimeDelta::FromMilliseconds(500));
   1424 
   1425   // Prerolling should have begun again.
   1426   EXPECT_TRUE(IsPrerolling(true));
   1427   EXPECT_EQ(500.0, GetPrerollTimestamp().InMillisecondsF());
   1428 
   1429   // Send data at and after the seek position. Prerolling should complete.
   1430   for (int i = 0; i < 4; ++i) {
   1431     DemuxerData data = CreateReadFromDemuxerAckForAudio(i);
   1432     data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(
   1433         500 + 30 * (i - 1));
   1434     player_.OnDemuxerDataAvailable(data);
   1435     EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
   1436     message_loop_.Run();
   1437   }
   1438   EXPECT_LT(500.0, player_.GetCurrentTime().InMillisecondsF());
   1439   EXPECT_FALSE(IsPrerolling(true));
   1440 
   1441   // Throughout this test, we should have not re-created the decoder job, so
   1442   // IsPrerolling() transition from false to true was not due to constructor
   1443   // initialization. It was due to BeginPrerolling().
   1444   EXPECT_EQ(decoder_job, GetMediaDecoderJob(true));
   1445 }
   1446 
   1447 TEST_F(MediaSourcePlayerTest, PrerollContinuesAcrossReleaseAndStart) {
   1448   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1449 
   1450   // Test decoder job will resume media prerolling if interrupted by Release()
   1451   // and Start().
   1452   StartAudioDecoderJob(true);
   1453 
   1454   SeekPlayerWithAbort(true, base::TimeDelta::FromMilliseconds(100));
   1455   EXPECT_TRUE(IsPrerolling(true));
   1456   EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF());
   1457 
   1458   // Send some data before the seek position.
   1459   // Test uses 'large' number of iterations because decoder job may not get
   1460   // MEDIA_CODEC_OK output status until after a few dequeue output attempts.
   1461   // This allows decoder status to stabilize prior to AU timestamp reaching
   1462   // the preroll target.
   1463   DemuxerData data;
   1464   for (int i = 0; i < 10; ++i) {
   1465     data = CreateReadFromDemuxerAckForAudio(3);
   1466     data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(i * 10);
   1467     if (i == 1) {
   1468       // While still prerolling, Release() and Start() the player.
   1469       // TODO(qinmin): Simulation of multiple in-flight data requests (one from
   1470       // before Release(), one from after Start()) is not included here, and
   1471       // neither is any data enqueued for later decode if it arrives after
   1472       // Release() and before Start(). See http://crbug.com/306314. Assumption
   1473       // for this test, to prevent flakiness until the bug is fixed, is the
   1474       // first request's data arrives before Start(). Though that data is not
   1475       // seen by decoder, this assumption allows preroll continuation
   1476       // verification and prevents multiple in-flight data requests.
   1477       ReleasePlayer();
   1478       player_.OnDemuxerDataAvailable(data);
   1479       message_loop_.RunUntilIdle();
   1480       EXPECT_FALSE(GetMediaDecoderJob(true));
   1481       StartAudioDecoderJob(true);
   1482     } else {
   1483       player_.OnDemuxerDataAvailable(data);
   1484       EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
   1485       message_loop_.Run();
   1486     }
   1487     EXPECT_TRUE(IsPrerolling(true));
   1488   }
   1489   EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF());
   1490   EXPECT_TRUE(IsPrerolling(true));
   1491 
   1492   // Send data after the seek position.
   1493   data = CreateReadFromDemuxerAckForAudio(3);
   1494   data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(100);
   1495   player_.OnDemuxerDataAvailable(data);
   1496   message_loop_.Run();
   1497   EXPECT_LT(100.0, player_.GetCurrentTime().InMillisecondsF());
   1498   EXPECT_FALSE(IsPrerolling(true));
   1499 }
   1500 
   1501 TEST_F(MediaSourcePlayerTest, PrerollContinuesAcrossConfigChange) {
   1502   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1503 
   1504   // Test decoder job will resume media prerolling if interrupted by
   1505   // |kConfigChanged| and OnDemuxerConfigsAvailable().
   1506   StartAudioDecoderJob(true);
   1507 
   1508   SeekPlayerWithAbort(true, base::TimeDelta::FromMilliseconds(100));
   1509   EXPECT_TRUE(IsPrerolling(true));
   1510   EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF());
   1511 
   1512   // In response to data request, simulate that demuxer signals config change by
   1513   // sending an AU with |kConfigChanged|. Player should prepare to reconfigure
   1514   // the audio decoder job, and should request new demuxer configs.
   1515   DemuxerData data = CreateReadFromDemuxerAckWithConfigChanged(true, 0);
   1516   EXPECT_EQ(0, demuxer_->num_config_requests());
   1517   player_.OnDemuxerDataAvailable(data);
   1518   EXPECT_EQ(1, demuxer_->num_config_requests());
   1519 
   1520   // Simulate arrival of new configs.
   1521   player_.OnDemuxerConfigsAvailable(CreateAudioDemuxerConfigs(kCodecVorbis));
   1522 
   1523   // Send some data before the seek position.
   1524   for (int i = 1; i < 4; ++i) {
   1525     player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(i));
   1526     EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
   1527     message_loop_.Run();
   1528   }
   1529   EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF());
   1530   EXPECT_TRUE(IsPrerolling(true));
   1531 
   1532   // Send data after the seek position.
   1533   data = CreateReadFromDemuxerAckForAudio(3);
   1534   data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(100);
   1535   player_.OnDemuxerDataAvailable(data);
   1536   message_loop_.Run();
   1537   EXPECT_LT(100.0, player_.GetCurrentTime().InMillisecondsF());
   1538   EXPECT_FALSE(IsPrerolling(true));
   1539 }
   1540 
   1541 TEST_F(MediaSourcePlayerTest, SimultaneousAudioVideoConfigChange) {
   1542   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1543 
   1544   // Test that the player allows simultaneous audio and video config change,
   1545   // such as might occur during OnPrefetchDone() if next access unit for both
   1546   // audio and video jobs is |kConfigChanged|.
   1547   CreateNextTextureAndSetVideoSurface();
   1548   Start(CreateAudioVideoDemuxerConfigs(), true);
   1549   MediaDecoderJob* first_audio_job = GetMediaDecoderJob(true);
   1550   MediaDecoderJob* first_video_job = GetMediaDecoderJob(false);
   1551 
   1552   // Simulate audio |kConfigChanged| prefetched as standalone access unit.
   1553   player_.OnDemuxerDataAvailable(
   1554       CreateReadFromDemuxerAckWithConfigChanged(true, 0));
   1555   EXPECT_EQ(0, demuxer_->num_config_requests());  // No OnPrefetchDone() yet.
   1556 
   1557   // Simulate video |kConfigChanged| prefetched as standalone access unit.
   1558   player_.OnDemuxerDataAvailable(
   1559       CreateReadFromDemuxerAckWithConfigChanged(false, 0));
   1560   EXPECT_EQ(1, demuxer_->num_config_requests());  // OnPrefetchDone() occurred.
   1561   EXPECT_EQ(2, demuxer_->num_data_requests());  // No more data requested yet.
   1562 
   1563   // No job re-creation should occur until the requested configs arrive.
   1564   EXPECT_EQ(first_audio_job, GetMediaDecoderJob(true));
   1565   EXPECT_EQ(first_video_job, GetMediaDecoderJob(false));
   1566 
   1567   player_.OnDemuxerConfigsAvailable(CreateAudioVideoDemuxerConfigs());
   1568   EXPECT_EQ(4, demuxer_->num_data_requests());
   1569   MediaDecoderJob* second_audio_job = GetMediaDecoderJob(true);
   1570   MediaDecoderJob* second_video_job = GetMediaDecoderJob(false);
   1571   EXPECT_NE(first_audio_job, second_audio_job);
   1572   EXPECT_NE(first_video_job, second_video_job);
   1573   EXPECT_TRUE(second_audio_job && second_video_job);
   1574 
   1575   // Confirm no further demuxer configs requested.
   1576   EXPECT_EQ(1, demuxer_->num_config_requests());
   1577 }
   1578 
   1579 TEST_F(MediaSourcePlayerTest, DemuxerConfigRequestedIfInPrefetchUnit0) {
   1580   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1581 
   1582   // Test that the player detects need for and requests demuxer configs if
   1583   // the |kConfigChanged| unit is the very first unit in the set of units
   1584   // received in OnDemuxerDataAvailable() ostensibly while
   1585   // |PREFETCH_DONE_EVENT_PENDING|.
   1586   StartConfigChange(true, true, 0);
   1587 }
   1588 
   1589 TEST_F(MediaSourcePlayerTest, DemuxerConfigRequestedIfInPrefetchUnit1) {
   1590   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1591 
   1592   // Test that the player detects need for and requests demuxer configs if
   1593   // the |kConfigChanged| unit is not the first unit in the set of units
   1594   // received in OnDemuxerDataAvailable() ostensibly while
   1595   // |PREFETCH_DONE_EVENT_PENDING|.
   1596   StartConfigChange(true, true, 1);
   1597 }
   1598 
   1599 TEST_F(MediaSourcePlayerTest, DemuxerConfigRequestedIfInUnit0AfterPrefetch) {
   1600   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1601 
   1602   // Test that the player detects need for and requests demuxer configs if
   1603   // the |kConfigChanged| unit is the very first unit in the set of units
   1604   // received in OnDemuxerDataAvailable() from data requested ostensibly while
   1605   // not prefetching.
   1606   StartConfigChange(true, false, 0);
   1607 }
   1608 
   1609 TEST_F(MediaSourcePlayerTest, DemuxerConfigRequestedIfInUnit1AfterPrefetch) {
   1610   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1611 
   1612   // Test that the player detects need for and requests demuxer configs if
   1613   // the |kConfigChanged| unit is not the first unit in the set of units
   1614   // received in OnDemuxerDataAvailable() from data requested ostensibly while
   1615   // not prefetching.
   1616   StartConfigChange(true, false, 1);
   1617 }
   1618 
   1619 TEST_F(MediaSourcePlayerTest, BrowserSeek_PrerollAfterBrowserSeek) {
   1620   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1621 
   1622   // Test decoder job will preroll the media to the actual seek position
   1623   // resulting from a browser seek.
   1624   BrowserSeekPlayer(false);
   1625 
   1626   // Simulate browser seek is done, but to a later time than was requested.
   1627   EXPECT_LT(player_.GetCurrentTime().InMillisecondsF(), 100);
   1628   player_.OnDemuxerSeekDone(base::TimeDelta::FromMilliseconds(100));
   1629   EXPECT_TRUE(GetMediaDecoderJob(false));
   1630   EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF());
   1631   EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF());
   1632   EXPECT_EQ(2, demuxer_->num_data_requests());
   1633 
   1634   // Send some data with access unit timestamps before the actual browser seek
   1635   // position. This is a bit unrealistic in this case where the browser seek
   1636   // jumped forward and next data from demuxer would normally begin at this
   1637   // browser seek position, immediately completing preroll. For simplicity and
   1638   // coverage, this test simulates the more common condition that AUs received
   1639   // after browser seek begin with timestamps before the seek target, and don't
   1640   // immediately complete preroll.
   1641   DemuxerData data;
   1642   for (int i = 1; i < 4; ++i) {
   1643     data = CreateReadFromDemuxerAckForVideo();
   1644     data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(i * 30);
   1645     player_.OnDemuxerDataAvailable(data);
   1646     EXPECT_TRUE(GetMediaDecoderJob(false)->is_decoding());
   1647     message_loop_.Run();
   1648     EXPECT_TRUE(IsPrerolling(false));
   1649   }
   1650 
   1651   EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF());
   1652 
   1653   // Send data after the browser seek position.
   1654   data = CreateReadFromDemuxerAckForVideo();
   1655   data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(120);
   1656   player_.OnDemuxerDataAvailable(data);
   1657   message_loop_.Run();
   1658   EXPECT_FALSE(IsPrerolling(false));
   1659 }
   1660 
   1661 TEST_F(MediaSourcePlayerTest, VideoDemuxerConfigChange) {
   1662   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1663 
   1664   // Test that video config change notification results in request for demuxer
   1665   // configuration, and that a video decoder job results without any browser
   1666   // seek necessary once the new demuxer config arrives.
   1667   StartConfigChange(false, true, 1);
   1668   MediaDecoderJob* first_job = GetMediaDecoderJob(false);
   1669   EXPECT_TRUE(first_job);
   1670   EXPECT_EQ(1, demuxer_->num_data_requests());
   1671   EXPECT_EQ(1, demuxer_->num_config_requests());
   1672 
   1673   // Simulate arrival of new configs.
   1674   player_.OnDemuxerConfigsAvailable(CreateVideoDemuxerConfigs());
   1675 
   1676   // New video decoder job should have been created and configured, without any
   1677   // browser seek.
   1678   MediaDecoderJob* second_job = GetMediaDecoderJob(false);
   1679   EXPECT_TRUE(second_job);
   1680   EXPECT_NE(first_job, second_job);
   1681   EXPECT_EQ(2, demuxer_->num_data_requests());
   1682   EXPECT_EQ(1, demuxer_->num_config_requests());
   1683   EXPECT_EQ(0, demuxer_->num_seek_requests());
   1684 }
   1685 
   1686 TEST_F(MediaSourcePlayerTest, VideoConfigChangeContinuesAcrossSeek) {
   1687   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1688 
   1689   // Test if a demuxer config request is pending (due to previously receiving
   1690   // |kConfigChanged|), and a seek request arrives prior to demuxer configs,
   1691   // then seek is processed first, followed by the decoder config change.
   1692   // This assumes the demuxer sends |kConfigChanged| read response prior to
   1693   // canceling any reads pending seek; no |kAborted| is involved in this test.
   1694   StartConfigChange(false, false, 1);
   1695   MediaDecoderJob* first_job = GetMediaDecoderJob(false);
   1696   EXPECT_TRUE(first_job);
   1697   EXPECT_EQ(1, demuxer_->num_config_requests());
   1698   EXPECT_EQ(2, demuxer_->num_data_requests());
   1699   EXPECT_EQ(0, demuxer_->num_seek_requests());
   1700 
   1701   player_.SeekTo(base::TimeDelta::FromMilliseconds(100));
   1702 
   1703   // Verify that the seek is requested immediately.
   1704   EXPECT_EQ(1, demuxer_->num_seek_requests());
   1705 
   1706   // Simulate unlikely delayed arrival of the demuxer configs, completing the
   1707   // config change.
   1708   // TODO(wolenetz): Is it even possible for requested demuxer configs to be
   1709   // delayed until after a SeekTo request arrives?
   1710   player_.OnDemuxerConfigsAvailable(CreateVideoDemuxerConfigs());
   1711 
   1712   MediaDecoderJob* second_job = GetMediaDecoderJob(false);
   1713   EXPECT_NE(first_job, second_job);
   1714   EXPECT_TRUE(second_job);
   1715 
   1716   // Send back the seek done notification. This should finish the seek and
   1717   // trigger the player to request more data.
   1718   EXPECT_EQ(2, demuxer_->num_data_requests());
   1719   player_.OnDemuxerSeekDone(kNoTimestamp());
   1720   EXPECT_EQ(3, demuxer_->num_data_requests());
   1721 }
   1722 
   1723 TEST_F(MediaSourcePlayerTest, NewSurfaceWhileChangingConfigs) {
   1724   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1725 
   1726   // Test that no seek or duplicated demuxer config request results from a
   1727   // SetVideoSurface() that occurs while the player is expecting new demuxer
   1728   // configs. This test may be good to keep beyond browser seek hack.
   1729   StartConfigChange(false, false, 1);
   1730   MediaDecoderJob* first_job = GetMediaDecoderJob(false);
   1731   EXPECT_TRUE(first_job);
   1732   EXPECT_EQ(1, demuxer_->num_config_requests());
   1733   EXPECT_EQ(2, demuxer_->num_data_requests());
   1734 
   1735   CreateNextTextureAndSetVideoSurface();
   1736 
   1737   // Surface change processing (including decoder job re-creation) should
   1738   // not occur until the pending video config change is completed.
   1739   EXPECT_EQ(first_job, GetMediaDecoderJob(false));
   1740 
   1741   player_.OnDemuxerConfigsAvailable(CreateVideoDemuxerConfigs());
   1742   MediaDecoderJob* second_job = GetMediaDecoderJob(false);
   1743   EXPECT_NE(first_job, second_job);
   1744   EXPECT_TRUE(second_job);
   1745 
   1746   EXPECT_EQ(3, demuxer_->num_data_requests());
   1747   EXPECT_EQ(1, demuxer_->num_config_requests());
   1748   EXPECT_EQ(0, demuxer_->num_seek_requests());
   1749 }
   1750 
   1751 TEST_F(MediaSourcePlayerTest,
   1752        BrowserSeek_DecoderStarvationWhilePendingSurfaceChange) {
   1753   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1754 
   1755   // Test video decoder starvation while handling a pending surface change
   1756   // should not cause any crashes.
   1757   CreateNextTextureAndSetVideoSurface();
   1758   StartVideoDecoderJob(true);
   1759   DemuxerData data = CreateReadFromDemuxerAckForVideo();
   1760   player_.OnDemuxerDataAvailable(data);
   1761 
   1762   // Trigger a surface change and decoder starvation.
   1763   CreateNextTextureAndSetVideoSurface();
   1764   TriggerPlayerStarvation();
   1765   WaitForVideoDecodeDone();
   1766 
   1767   // Surface change should trigger a seek.
   1768   EXPECT_EQ(1, demuxer_->num_browser_seek_requests());
   1769   player_.OnDemuxerSeekDone(base::TimeDelta());
   1770   EXPECT_TRUE(GetMediaDecoderJob(false));
   1771 
   1772   // A new data request should be sent.
   1773   EXPECT_EQ(2, demuxer_->num_data_requests());
   1774 }
   1775 
   1776 TEST_F(MediaSourcePlayerTest, ReleaseWithOnPrefetchDoneAlreadyPosted) {
   1777   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1778 
   1779   // Test if OnPrefetchDone() had already been posted before and is executed
   1780   // after Release(), then player does not DCHECK. This test is fragile to
   1781   // change to MediaDecoderJob::Prefetch() implementation; it assumes task
   1782   // is posted to run |prefetch_cb| if the job already HasData().
   1783   // TODO(wolenetz): Remove MSP::set_decode_callback_for_testing() if this test
   1784   // becomes obsolete. See http://crbug.com/304234.
   1785   StartAudioDecoderJob(true);
   1786 
   1787   // Escape the original prefetch by decoding a single access unit.
   1788   player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0));
   1789   message_loop_.Run();
   1790 
   1791   // Prime the job with a few more access units, so that a later prefetch,
   1792   // triggered by starvation to simulate decoder underrun, can trivially
   1793   // post task to run OnPrefetchDone().
   1794   player_.OnDemuxerDataAvailable(
   1795       CreateReadFromDemuxerAckWithConfigChanged(true, 4));
   1796   EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
   1797 
   1798   // Simulate decoder underrun, so trivial prefetch starts while still decoding.
   1799   // The prefetch and posting of OnPrefetchDone() will not occur until next
   1800   // MediaDecoderCallBack() occurs.
   1801   TriggerPlayerStarvation();
   1802 
   1803   // Upon the next successful decode callback, post a task to call Release() on
   1804   // the |player_|, such that the trivial OnPrefetchDone() task posting also
   1805   // occurs and should execute after the Release().
   1806   OnNextTestDecodeCallbackPostTaskToReleasePlayer();
   1807 
   1808   while (GetMediaDecoderJob(true))
   1809     message_loop_.RunUntilIdle();
   1810   EXPECT_TRUE(decoder_callback_hook_executed_);
   1811   EXPECT_EQ(2, demuxer_->num_data_requests());
   1812 
   1813   // Player should have no decoder job until after Start().
   1814   StartAudioDecoderJob(true);
   1815 }
   1816 
   1817 TEST_F(MediaSourcePlayerTest, SeekToThenReleaseThenDemuxerSeekAndDone) {
   1818   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1819 
   1820   // Test if Release() occurs after SeekTo(), but the DemuxerSeek IPC request
   1821   // has not yet been sent, then the seek request is sent after Release(). Also,
   1822   // test if OnDemuxerSeekDone() occurs prior to next Start(), then the player
   1823   // will resume correct post-seek preroll upon Start().
   1824   StartAudioDecoderJobAndSeekToWhileDecoding(
   1825       base::TimeDelta::FromMilliseconds(100));
   1826   ReleasePlayer();
   1827   EXPECT_EQ(1, demuxer_->num_seek_requests());
   1828 
   1829   player_.OnDemuxerSeekDone(kNoTimestamp());
   1830   EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF());
   1831   EXPECT_FALSE(GetMediaDecoderJob(true));
   1832   EXPECT_FALSE(player_.IsPlaying());
   1833 
   1834   // Player should begin prefetch and resume preroll upon Start().
   1835   EXPECT_EQ(1, demuxer_->num_data_requests());
   1836   StartAudioDecoderJob(true);
   1837   EXPECT_TRUE(IsPrerolling(true));
   1838   EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF());
   1839 
   1840   // No further seek should have been requested since Release(), above.
   1841   EXPECT_EQ(1, demuxer_->num_seek_requests());
   1842 }
   1843 
   1844 TEST_F(MediaSourcePlayerTest, SeekToThenReleaseThenDemuxerSeekThenStart) {
   1845   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1846 
   1847   // Test if Release() occurs after SeekTo(), but the DemuxerSeek IPC request
   1848   // has not yet been sent, then the seek request is sent after Release(). Also,
   1849   // test if OnDemuxerSeekDone() does not occur until after the next Start(),
   1850   // then the player remains pending seek done until (and resumes correct
   1851   // post-seek preroll after) OnDemuxerSeekDone().
   1852   StartAudioDecoderJobAndSeekToWhileDecoding(
   1853       base::TimeDelta::FromMilliseconds(100));
   1854   ReleasePlayer();
   1855   EXPECT_EQ(1, demuxer_->num_seek_requests());
   1856 
   1857   // Player should not prefetch upon Start() nor create the decoder job, due to
   1858   // awaiting DemuxerSeekDone.
   1859   EXPECT_EQ(1, demuxer_->num_data_requests());
   1860   StartAudioDecoderJob(false);
   1861 
   1862   player_.OnDemuxerSeekDone(kNoTimestamp());
   1863   EXPECT_TRUE(GetMediaDecoderJob(true));
   1864   EXPECT_TRUE(IsPrerolling(true));
   1865   EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF());
   1866   EXPECT_EQ(2, demuxer_->num_data_requests());
   1867 
   1868   // No further seek should have been requested since Release(), above.
   1869   EXPECT_EQ(1, demuxer_->num_seek_requests());
   1870 }
   1871 
   1872 TEST_F(MediaSourcePlayerTest, SeekToThenDemuxerSeekThenReleaseThenSeekDone) {
   1873   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1874 
   1875   // Test if Release() occurs after a SeekTo()'s subsequent DemuxerSeek IPC
   1876   // request and OnDemuxerSeekDone() arrives prior to the next Start(), then the
   1877   // player will resume correct post-seek preroll upon Start().
   1878   StartAudioDecoderJobAndSeekToWhileDecoding(
   1879       base::TimeDelta::FromMilliseconds(100));
   1880   WaitForAudioDecodeDone();
   1881   EXPECT_EQ(1, demuxer_->num_seek_requests());
   1882 
   1883   ReleasePlayer();
   1884   player_.OnDemuxerSeekDone(kNoTimestamp());
   1885   EXPECT_FALSE(player_.IsPlaying());
   1886   EXPECT_FALSE(GetMediaDecoderJob(true));
   1887   EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF());
   1888 
   1889   // Player should begin prefetch and resume preroll upon Start().
   1890   EXPECT_EQ(1, demuxer_->num_data_requests());
   1891   StartAudioDecoderJob(true);
   1892   EXPECT_TRUE(IsPrerolling(true));
   1893   EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF());
   1894 
   1895   // No further seek should have been requested since before Release(), above.
   1896   EXPECT_EQ(1, demuxer_->num_seek_requests());
   1897 }
   1898 
   1899 TEST_F(MediaSourcePlayerTest, SeekToThenReleaseThenStart) {
   1900   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1901 
   1902   // Test if Release() occurs after a SeekTo()'s subsequent DemuxerSeeK IPC
   1903   // request and OnDemuxerSeekDone() does not occur until after the next
   1904   // Start(), then the player remains pending seek done until (and resumes
   1905   // correct post-seek preroll after) OnDemuxerSeekDone().
   1906   StartAudioDecoderJobAndSeekToWhileDecoding(
   1907       base::TimeDelta::FromMilliseconds(100));
   1908   WaitForAudioDecodeDone();
   1909   EXPECT_EQ(1, demuxer_->num_seek_requests());
   1910 
   1911   ReleasePlayer();
   1912   EXPECT_EQ(1, demuxer_->num_data_requests());
   1913   StartAudioDecoderJob(false);
   1914 
   1915   player_.OnDemuxerSeekDone(kNoTimestamp());
   1916   EXPECT_TRUE(GetMediaDecoderJob(true));
   1917   EXPECT_TRUE(IsPrerolling(true));
   1918   EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF());
   1919   EXPECT_EQ(2, demuxer_->num_data_requests());
   1920 
   1921   // No further seek should have been requested since before Release(), above.
   1922   EXPECT_EQ(1, demuxer_->num_seek_requests());
   1923 }
   1924 
   1925 TEST_F(MediaSourcePlayerTest, ConfigChangedThenReleaseThenConfigsAvailable) {
   1926   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1927 
   1928   // Test if Release() occurs after |kConfigChanged| detected, new configs
   1929   // requested of demuxer, and the requested configs arrive before the next
   1930   // Start(), then the player completes the pending config change processing on
   1931   // their receipt.
   1932   StartConfigChange(true, true, 0);
   1933   ReleasePlayer();
   1934 
   1935   player_.OnDemuxerConfigsAvailable(CreateAudioDemuxerConfigs(kCodecVorbis));
   1936   EXPECT_FALSE(GetMediaDecoderJob(true));
   1937   EXPECT_FALSE(player_.IsPlaying());
   1938   EXPECT_EQ(1, demuxer_->num_data_requests());
   1939 
   1940   // Player should resume upon Start(), even without further configs supplied.
   1941   player_.Start();
   1942   EXPECT_TRUE(GetMediaDecoderJob(true));
   1943   EXPECT_TRUE(player_.IsPlaying());
   1944   EXPECT_EQ(2, demuxer_->num_data_requests());
   1945 
   1946   // No further config request should have occurred since StartConfigChange().
   1947   EXPECT_EQ(1, demuxer_->num_config_requests());
   1948 }
   1949 
   1950 TEST_F(MediaSourcePlayerTest, ConfigChangedThenReleaseThenStart) {
   1951   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1952 
   1953   // Test if Release() occurs after |kConfigChanged| detected, new configs
   1954   // requested of demuxer, and the requested configs arrive after the next
   1955   // Start(), then the player pends job creation until the new configs arrive.
   1956   StartConfigChange(true, true, 0);
   1957   ReleasePlayer();
   1958 
   1959   player_.Start();
   1960   EXPECT_TRUE(player_.IsPlaying());
   1961   EXPECT_FALSE(GetMediaDecoderJob(true));
   1962   EXPECT_EQ(1, demuxer_->num_data_requests());
   1963 
   1964   player_.OnDemuxerConfigsAvailable(CreateAudioDemuxerConfigs(kCodecVorbis));
   1965   EXPECT_TRUE(GetMediaDecoderJob(true));
   1966   EXPECT_EQ(2, demuxer_->num_data_requests());
   1967 
   1968   // No further config request should have occurred since StartConfigChange().
   1969   EXPECT_EQ(1, demuxer_->num_config_requests());
   1970 }
   1971 
   1972 TEST_F(MediaSourcePlayerTest, BrowserSeek_ThenReleaseThenDemuxerSeekDone) {
   1973   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   1974 
   1975   // Test that Release() after a browser seek's DemuxerSeek IPC request has been
   1976   // sent behaves similar to a regular seek: if OnDemuxerSeekDone() occurs
   1977   // before the next Start()+SetVideoSurface(), then the player will resume
   1978   // correct post-seek preroll upon Start()+SetVideoSurface().
   1979   BrowserSeekPlayer(false);
   1980   base::TimeDelta expected_preroll_timestamp = player_.GetCurrentTime();
   1981   ReleasePlayer();
   1982 
   1983   player_.OnDemuxerSeekDone(expected_preroll_timestamp);
   1984   EXPECT_FALSE(player_.IsPlaying());
   1985   EXPECT_FALSE(GetMediaDecoderJob(false));
   1986   EXPECT_EQ(expected_preroll_timestamp, GetPrerollTimestamp());
   1987 
   1988   // Player should begin prefetch and resume preroll upon Start().
   1989   EXPECT_EQ(1, demuxer_->num_data_requests());
   1990   CreateNextTextureAndSetVideoSurface();
   1991   StartVideoDecoderJob(true);
   1992   EXPECT_TRUE(IsPrerolling(false));
   1993   EXPECT_EQ(expected_preroll_timestamp, GetPrerollTimestamp());
   1994   EXPECT_EQ(expected_preroll_timestamp, player_.GetCurrentTime());
   1995 
   1996   // No further seek should have been requested since BrowserSeekPlayer().
   1997   EXPECT_EQ(1, demuxer_->num_seek_requests());
   1998 }
   1999 
   2000 TEST_F(MediaSourcePlayerTest, BrowserSeek_ThenReleaseThenStart) {
   2001   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   2002 
   2003   // Test that Release() after a browser seek's DemuxerSeek IPC request has been
   2004   // sent behaves similar to a regular seek: if OnDemuxerSeekDone() does not
   2005   // occur until after the next Start()+SetVideoSurface(), then the player
   2006   // remains pending seek done until (and resumes correct post-seek preroll
   2007   // after) OnDemuxerSeekDone().
   2008   BrowserSeekPlayer(false);
   2009   base::TimeDelta expected_preroll_timestamp = player_.GetCurrentTime();
   2010   ReleasePlayer();
   2011 
   2012   EXPECT_EQ(1, demuxer_->num_data_requests());
   2013   CreateNextTextureAndSetVideoSurface();
   2014   StartVideoDecoderJob(false);
   2015 
   2016   player_.OnDemuxerSeekDone(expected_preroll_timestamp);
   2017   EXPECT_TRUE(GetMediaDecoderJob(false));
   2018   EXPECT_TRUE(IsPrerolling(false));
   2019   EXPECT_EQ(expected_preroll_timestamp, GetPrerollTimestamp());
   2020   EXPECT_EQ(expected_preroll_timestamp, player_.GetCurrentTime());
   2021   EXPECT_EQ(2, demuxer_->num_data_requests());
   2022 
   2023   // No further seek should have been requested since BrowserSeekPlayer().
   2024   EXPECT_EQ(1, demuxer_->num_seek_requests());
   2025 }
   2026 
   2027 // TODO(xhwang): Once we add tests to cover DrmBridge, update this test to
   2028 // also verify that the job is successfully created if SetDrmBridge(), Start()
   2029 // and eventually OnMediaCrypto() occur. This would increase test coverage of
   2030 // http://crbug.com/313470 and allow us to remove inspection of internal player
   2031 // pending event state. See http://crbug.com/313860.
   2032 TEST_F(MediaSourcePlayerTest, SurfaceChangeClearedEvenIfMediaCryptoAbsent) {
   2033   SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
   2034 
   2035   // Test that |SURFACE_CHANGE_EVENT_PENDING| is not pending after
   2036   // SetVideoSurface() for a player configured for encrypted video, when the
   2037   // player has not yet received media crypto.
   2038   DemuxerConfigs configs = CreateVideoDemuxerConfigs();
   2039   configs.is_video_encrypted = true;
   2040 
   2041   player_.OnDemuxerConfigsAvailable(configs);
   2042   CreateNextTextureAndSetVideoSurface();
   2043   EXPECT_FALSE(IsPendingSurfaceChange());
   2044   EXPECT_FALSE(GetMediaDecoderJob(false));
   2045 }
   2046 
   2047 // TODO(xhwang): Enable this test when the test devices are updated.
   2048 TEST_F(MediaSourcePlayerTest, DISABLED_IsTypeSupported_Widevine) {
   2049   if (!MediaCodecBridge::IsAvailable() || !MediaDrmBridge::IsAvailable()) {
   2050     VLOG(0) << "Could not run test - not supported on device.";
   2051     return;
   2052   }
   2053 
   2054   uint8 kWidevineUUID[] = { 0xED, 0xEF, 0x8B, 0xA9, 0x79, 0xD6, 0x4A, 0xCE,
   2055                             0xA3, 0xC8, 0x27, 0xDC, 0xD5, 0x1D, 0x21, 0xED };
   2056 
   2057   std::vector<uint8> widevine_uuid(kWidevineUUID,
   2058                                    kWidevineUUID + arraysize(kWidevineUUID));
   2059 
   2060   // We test "L3" fully. But for "L1" we don't check the result as it depend on
   2061   // whether the test device supports "L1" decoding.
   2062 
   2063   std::vector<std::string> codec_avc(1, "avc1");
   2064   std::vector<std::string> codec_aac(1, "mp4a");
   2065   std::vector<std::string> codec_avc_aac(1, "avc1");
   2066   codec_avc_aac.push_back("mp4a");
   2067 
   2068   EXPECT_TRUE(IsTypeSupported(widevine_uuid, "L3", kVideoMp4, codec_avc));
   2069   IsTypeSupported(widevine_uuid, "L1", kVideoMp4, codec_avc);
   2070 
   2071   // TODO(xhwang): L1/L3 doesn't apply to audio, so the result is messy.
   2072   // Clean this up after we have a solution to specifying decoding mode.
   2073   EXPECT_TRUE(IsTypeSupported(widevine_uuid, "L3", kAudioMp4, codec_aac));
   2074   IsTypeSupported(widevine_uuid, "L1", kAudioMp4, codec_aac);
   2075 
   2076   EXPECT_TRUE(IsTypeSupported(widevine_uuid, "L3", kVideoMp4, codec_avc_aac));
   2077   IsTypeSupported(widevine_uuid, "L1", kVideoMp4, codec_avc_aac);
   2078 
   2079   std::vector<std::string> codec_vp8(1, "vp8");
   2080   std::vector<std::string> codec_vorbis(1, "vorbis");
   2081   std::vector<std::string> codec_vp8_vorbis(1, "vp8");
   2082   codec_vp8_vorbis.push_back("vorbis");
   2083 
   2084   // TODO(xhwang): WebM is actually not supported but currently
   2085   // MediaDrmBridge.isCryptoSchemeSupported() doesn't check the container type.
   2086   // Fix isCryptoSchemeSupported() and update this test as necessary.
   2087   EXPECT_TRUE(IsTypeSupported(widevine_uuid, "L3", kVideoWebM, codec_vp8));
   2088   IsTypeSupported(widevine_uuid, "L1", kVideoWebM, codec_vp8);
   2089 
   2090   // TODO(xhwang): L1/L3 doesn't apply to audio, so the result is messy.
   2091   // Clean this up after we have a solution to specifying decoding mode.
   2092   EXPECT_TRUE(IsTypeSupported(widevine_uuid, "L3", kAudioWebM, codec_vorbis));
   2093   IsTypeSupported(widevine_uuid, "L1", kAudioWebM, codec_vorbis);
   2094 
   2095   EXPECT_TRUE(
   2096       IsTypeSupported(widevine_uuid, "L3", kVideoWebM, codec_vp8_vorbis));
   2097   IsTypeSupported(widevine_uuid, "L1", kVideoWebM, codec_vp8_vorbis);
   2098 }
   2099 
   2100 TEST_F(MediaSourcePlayerTest, IsTypeSupported_InvalidUUID) {
   2101   if (!MediaCodecBridge::IsAvailable() || !MediaDrmBridge::IsAvailable()) {
   2102     VLOG(0) << "Could not run test - not supported on device.";
   2103     return;
   2104   }
   2105 
   2106   uint8 kInvalidUUID[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
   2107                            0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
   2108 
   2109   std::vector<uint8> invalid_uuid(kInvalidUUID,
   2110                                   kInvalidUUID + arraysize(kInvalidUUID));
   2111 
   2112   std::vector<std::string> codec_avc(1, "avc1");
   2113   EXPECT_FALSE(IsTypeSupported(invalid_uuid, "L3", kVideoMp4, codec_avc));
   2114   EXPECT_FALSE(IsTypeSupported(invalid_uuid, "L1", kVideoMp4, codec_avc));
   2115 }
   2116 
   2117 // TODO(xhwang): Are these IsTypeSupported tests device specific?
   2118 // TODO(xhwang): Add more IsTypeSupported tests.
   2119 
   2120 }  // namespace media
   2121