diff options
author | qinmin@chromium.org <qinmin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-30 00:39:12 +0000 |
---|---|---|
committer | qinmin@chromium.org <qinmin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-30 00:39:12 +0000 |
commit | 34fccb876ba5248752cd0c02f5969effbc817578 (patch) | |
tree | 7eb342495fa99b1c724d31707dc208f40f68a56b /media | |
parent | 173472a41fb88ff09bc81cd24308c8aa8674be0a (diff) | |
download | chromium_src-34fccb876ba5248752cd0c02f5969effbc817578.zip chromium_src-34fccb876ba5248752cd0c02f5969effbc817578.tar.gz chromium_src-34fccb876ba5248752cd0c02f5969effbc817578.tar.bz2 |
Request new data after receiving an aborted access unit
Currently when decoder job has no data, it will call requestData().
When requestData() returns the new data, we immediately started decoding it by calling DecodeNextAccessUnit().
However, if the status of the access unit is kAborted, we treat it as an EOS.
This is wrong. Instead, we should ignore this access unit and pause the MediaSourcePlayer.
BUG=300078
Review URL: https://codereview.chromium.org/25142002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@225904 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r-- | media/base/android/media_decoder_job.cc | 8 | ||||
-rw-r--r-- | media/base/android/media_source_player.cc | 6 | ||||
-rw-r--r-- | media/base/android/media_source_player_unittest.cc | 26 |
3 files changed, 39 insertions, 1 deletions
diff --git a/media/base/android/media_decoder_job.cc b/media/base/android/media_decoder_job.cc index 8d6e0bd..153efe1 100644 --- a/media/base/android/media_decoder_job.cc +++ b/media/base/android/media_decoder_job.cc @@ -239,6 +239,13 @@ void MediaDecoderJob::DecodeInternal( } } + // For aborted access unit, just skip it and inform the player. + if (unit.status == DemuxerStream::kAborted) { + // TODO(qinmin): use a new enum instead of MEDIA_CODEC_STOPPED. + callback.Run(MEDIA_CODEC_STOPPED, start_presentation_timestamp, 0); + return; + } + MediaCodecStatus input_status = MEDIA_CODEC_INPUT_END_OF_STREAM; if (!input_eos_encountered_) { input_status = QueueInputBuffer(unit); @@ -307,7 +314,6 @@ void MediaDecoderJob::OnDecodeCompleted( MediaCodecStatus status, const base::TimeDelta& presentation_timestamp, size_t audio_output_bytes) { DCHECK(ui_loop_->BelongsToCurrentThread()); - DCHECK(status != MEDIA_CODEC_STOPPED || received_data_.access_units.empty()); if (destroy_pending_) { delete this; diff --git a/media/base/android/media_source_player.cc b/media/base/android/media_source_player.cc index 0e007b8..eae3757 100644 --- a/media/base/android/media_source_player.cc +++ b/media/base/android/media_source_player.cc @@ -494,6 +494,12 @@ void MediaSourcePlayer::MediaDecoderCallback( if (status == MEDIA_CODEC_NO_KEY) return; + // If the status is MEDIA_CODEC_STOPPED, stop decoding new data. The player is + // in the middle of a seek or stop event and needs to wait for the IPCs to + // come. + if (status == MEDIA_CODEC_STOPPED) + return; + if (status == MEDIA_CODEC_OK && is_clock_manager) StartStarvationCallback(presentation_timestamp); diff --git a/media/base/android/media_source_player_unittest.cc b/media/base/android/media_source_player_unittest.cc index fcaaa10..d9b6d0e 100644 --- a/media/base/android/media_source_player_unittest.cc +++ b/media/base/android/media_source_player_unittest.cc @@ -623,6 +623,32 @@ TEST_F(MediaSourcePlayerTest, ReplayAfterInputEOS) { EXPECT_EQ(3, demuxer_.num_data_requests()); } +TEST_F(MediaSourcePlayerTest, NoRequestForDataAfterAbort) { + if (!MediaCodecBridge::IsAvailable()) { + LOG(INFO) << "Could not run test - not supported on device."; + return; + } + + // Test that the decoder will request new data after receiving an aborted + // access unit. + StartAudioDecoderJob(); + EXPECT_EQ(1, demuxer_.num_data_requests()); + + // Send an aborted access unit. + DemuxerData data; + data.type = DemuxerStream::AUDIO; + data.access_units.resize(1); + data.access_units[0].status = DemuxerStream::kAborted; + player_.OnDemuxerDataAvailable(data); + EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); + // Wait for the decoder job to finish decoding. + while(GetMediaDecoderJob(true)->is_decoding()) + message_loop_.RunUntilIdle(); + + // No request will be sent for new data. + EXPECT_EQ(1, demuxer_.num_data_requests()); +} + // TODO(xhwang): Enable this test when the test devices are updated. TEST_F(MediaSourcePlayerTest, DISABLED_IsTypeSupported_Widevine) { if (!MediaCodecBridge::IsAvailable() || !MediaDrmBridge::IsAvailable()) { |