Index: media/base/android/media_decoder_job.cc |
diff --git a/media/base/android/media_decoder_job.cc b/media/base/android/media_decoder_job.cc |
index 33b48302b0ec8f7dc447318efe424f9bf5a7a157..4370c7e340954f4edc5685b993c46d441b7ad70d 100644 |
--- a/media/base/android/media_decoder_job.cc |
+++ b/media/base/android/media_decoder_job.cc |
@@ -53,11 +53,6 @@ void MediaDecoderJob::OnDataReceived(const DemuxerData& data) { |
done_cb.Run(); |
} |
-bool MediaDecoderJob::HasData() const { |
- DCHECK(ui_loop_->BelongsToCurrentThread()); |
- return access_unit_index_ < received_data_.access_units.size(); |
-} |
- |
void MediaDecoderJob::Prefetch(const base::Closure& prefetch_cb) { |
DCHECK(ui_loop_->BelongsToCurrentThread()); |
DCHECK(on_data_received_cb_.is_null()); |
@@ -156,7 +151,7 @@ MediaCodecStatus MediaDecoderJob::QueueInputBuffer(const AccessUnit& unit) { |
// TODO(qinmin): skip frames if video is falling far behind. |
DCHECK_GE(input_buf_index, 0); |
if (unit.end_of_stream || unit.data.empty()) { |
- media_codec_bridge_->QueueEOS(input_buf_index_); |
+ media_codec_bridge_->QueueEOS(input_buf_index); |
return MEDIA_CODEC_INPUT_END_OF_STREAM; |
} |
@@ -185,10 +180,22 @@ MediaCodecStatus MediaDecoderJob::QueueInputBuffer(const AccessUnit& unit) { |
return status; |
} |
+bool MediaDecoderJob::HasData() const { |
+ DCHECK(ui_loop_->BelongsToCurrentThread()); |
+ DCHECK(!input_eos_encountered_ || |
+ (received_data_.access_units.size() > 0 && |
+ access_unit_index_ < received_data_.access_units.size())) |
+ << "access_unit_index_.size() " << received_data_.access_units.size() |
+ << " access_unit_index_ " << access_unit_index_; |
+ return access_unit_index_ < received_data_.access_units.size() || |
+ input_eos_encountered_; |
+} |
+ |
void MediaDecoderJob::RequestData(const base::Closure& done_cb) { |
DVLOG(1) << __FUNCTION__; |
DCHECK(ui_loop_->BelongsToCurrentThread()); |
DCHECK(on_data_received_cb_.is_null()); |
+ DCHECK(!input_eos_encountered_); |
received_data_ = DemuxerData(); |
access_unit_index_ = 0; |
@@ -252,10 +259,6 @@ void MediaDecoderJob::DecodeInternal( |
&output_eos_encountered); |
if (status != MEDIA_CODEC_OK) { |
- DCHECK(!(status == MEDIA_CODEC_OUTPUT_BUFFERS_CHANGED || |
- status == MEDIA_CODEC_OUTPUT_FORMAT_CHANGED) || |
- (input_status != MEDIA_CODEC_INPUT_END_OF_STREAM)); |
- |
if (status == MEDIA_CODEC_OUTPUT_BUFFERS_CHANGED) { |
media_codec_bridge_->GetOutputBuffers(); |
status = MEDIA_CODEC_OK; |
@@ -307,14 +310,24 @@ void MediaDecoderJob::OnDecodeCompleted( |
} |
DCHECK(!decode_cb_.is_null()); |
- |
- if (status != MEDIA_CODEC_ERROR && |
- status != MEDIA_CODEC_DEQUEUE_INPUT_AGAIN_LATER && |
- status != MEDIA_CODEC_INPUT_END_OF_STREAM && |
- status != MEDIA_CODEC_NO_KEY && |
- status != MEDIA_CODEC_STOPPED) { |
- access_unit_index_++; |
- } |
+ switch (status) { |
+ case MEDIA_CODEC_OK: |
+ case MEDIA_CODEC_DEQUEUE_OUTPUT_AGAIN_LATER: |
+ case MEDIA_CODEC_OUTPUT_BUFFERS_CHANGED: |
+ case MEDIA_CODEC_OUTPUT_FORMAT_CHANGED: |
+ case MEDIA_CODEC_OUTPUT_END_OF_STREAM: |
+ if (!input_eos_encountered_) |
+ access_unit_index_++; |
+ break; |
+ |
+ case MEDIA_CODEC_DEQUEUE_INPUT_AGAIN_LATER: |
+ case MEDIA_CODEC_INPUT_END_OF_STREAM: |
+ case MEDIA_CODEC_NO_KEY: |
+ case MEDIA_CODEC_STOPPED: |
+ case MEDIA_CODEC_ERROR: |
+ // Do nothing. |
+ break; |
+ }; |
stop_decode_pending_ = false; |
base::ResetAndReturn(&decode_cb_).Run(status, presentation_timestamp, |