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