summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorqinmin@chromium.org <qinmin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-01 16:50:56 +0000
committerqinmin@chromium.org <qinmin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-01 16:50:56 +0000
commitd06d2274454d1e9c519749f41a540c31b8fb7519 (patch)
treee69a8eb76127d8cda0419b73e1cf1c485df2c983
parent0c2bda5034b3c3bc50a5af24efe0207047c1482e (diff)
downloadchromium_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.cc8
-rw-r--r--media/base/android/media_source_player.cc6
-rw-r--r--media/base/android/media_source_player_unittest.cc26
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()) {