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 97fa39b528dd2257bd9048edeede9ff678d0d71f..4f720f8cbd2e51792e91ec86eca897a47d7439e1 100644 |
--- a/media/base/android/media_decoder_job.cc |
+++ b/media/base/android/media_decoder_job.cc |
@@ -289,8 +289,9 @@ MediaCodecStatus MediaDecoderJob::QueueInputBuffer(const AccessUnit& unit) { |
bool MediaDecoderJob::HasData() const { |
DCHECK(ui_task_runner_->BelongsToCurrentThread()); |
// When |input_eos_encountered_| is set, |access_unit_index_| and |
- // |current_demuxer_data_index_| must be pointing to an EOS unit. |
- // We'll reuse this unit to flush the decoder until we hit output EOS. |
+ // |current_demuxer_data_index_| must be pointing to an EOS unit, |
+ // or a |kConfigChanged| unit if |drain_decoder_| is true. In both cases, |
+ // we'll feed an EOS input unit to drain the decoder until we hit output EOS. |
DCHECK(!input_eos_encountered_ || !NoAccessUnitsRemainingInChunk(true)); |
return !NoAccessUnitsRemainingInChunk(true) || |
!NoAccessUnitsRemainingInChunk(false); |
@@ -332,16 +333,18 @@ void MediaDecoderJob::DecodeCurrentAccessUnit( |
const AccessUnit& access_unit = CurrentAccessUnit(); |
if (CurrentAccessUnit().status == DemuxerStream::kConfigChanged) { |
int index = CurrentReceivedDataChunkIndex(); |
- bool config_changed = SetDemuxerConfigs( |
- received_data_[index].demuxer_configs[0]); |
- if (config_changed) |
+ const DemuxerConfigs& configs = received_data_[index].demuxer_configs[0]; |
+ bool reconfigure_needed = IsCodecReconfigureNeeded(configs); |
+ // TODO(qinmin): |config_changed_cb_| should be run after draining finishes. |
+ // http://crbug.com/381975. |
+ if (SetDemuxerConfigs(configs)) |
config_changed_cb_.Run(); |
if (!drain_decoder_) { |
// If we haven't decoded any data yet, just skip the current access unit |
// and request the MediaCodec to be recreated on next Decode(). |
- if (skip_eos_enqueue_ || !config_changed) { |
+ if (skip_eos_enqueue_ || !reconfigure_needed) { |
need_to_reconfig_decoder_job_ = |
- need_to_reconfig_decoder_job_ || config_changed; |
+ need_to_reconfig_decoder_job_ || reconfigure_needed; |
ui_task_runner_->PostTask(FROM_HERE, base::Bind( |
&MediaDecoderJob::OnDecodeCompleted, base::Unretained(this), |
MEDIA_CODEC_OUTPUT_FORMAT_CHANGED, kNoTimestamp(), kNoTimestamp())); |
@@ -632,6 +635,13 @@ bool MediaDecoderJob::CreateMediaCodecBridge() { |
return CreateMediaCodecBridgeInternal(); |
} |
+bool MediaDecoderJob::IsCodecReconfigureNeeded( |
+ const DemuxerConfigs& configs) const { |
+ if (!AreDemuxerConfigsChanged(configs)) |
+ return false; |
+ return true; |
+} |
+ |
void MediaDecoderJob::ReleaseMediaCodecBridge() { |
if (!media_codec_bridge_) |
return; |