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