diff options
author | qinmin@chromium.org <qinmin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-01 16:50:56 +0000 |
---|---|---|
committer | qinmin@chromium.org <qinmin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-01 16:50:56 +0000 |
commit | d06d2274454d1e9c519749f41a540c31b8fb7519 (patch) | |
tree | e69a8eb76127d8cda0419b73e1cf1c485df2c983 | |
parent | 0c2bda5034b3c3bc50a5af24efe0207047c1482e (diff) | |
download | chromium_src-d06d2274454d1e9c519749f41a540c31b8fb7519.zip chromium_src-d06d2274454d1e9c519749f41a540c31b8fb7519.tar.gz chromium_src-d06d2274454d1e9c519749f41a540c31b8fb7519.tar.bz2 |
Merge 225904 "Request new data after receiving an aborted access..."
> 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
TBR=qinmin@chromium.org
Review URL: https://codereview.chromium.org/25537003
git-svn-id: svn://svn.chromium.org/chrome/branches/1650/src@226249 0039d316-1c4b-4281-b951-d872f2087c98
-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 41a13b0..496c515 100644 --- a/media/base/android/media_source_player.cc +++ b/media/base/android/media_source_player.cc @@ -478,6 +478,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 ccce9ae..a08a746 100644 --- a/media/base/android/media_source_player_unittest.cc +++ b/media/base/android/media_source_player_unittest.cc @@ -566,6 +566,32 @@ TEST_F(MediaSourcePlayerTest, ReplayAfterInputEOS) { EXPECT_EQ(3, demuxer_.num_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()) { |