Index: media/base/android/media_source_player.cc |
diff --git a/media/base/android/media_source_player.cc b/media/base/android/media_source_player.cc |
index c4998e8174e6eef78d442af9cb8f3030c20fc934..e1b4603a239aad127936d63140fbfdb45c4f9ad8 100644 |
--- a/media/base/android/media_source_player.cc |
+++ b/media/base/android/media_source_player.cc |
@@ -19,7 +19,7 @@ |
#include "media/base/android/media_drm_bridge.h" |
#include "media/base/android/media_player_manager.h" |
#include "media/base/android/video_decoder_job.h" |
-#include "media/base/buffers.h" |
+ |
namespace media { |
@@ -297,35 +297,15 @@ void MediaSourcePlayer::StartInternal() { |
void MediaSourcePlayer::OnDemuxerConfigsAvailable( |
const DemuxerConfigs& configs) { |
DVLOG(1) << __FUNCTION__; |
+ DCHECK(!HasAudio() && !HasVideo()); |
duration_ = configs.duration; |
clock_.SetDuration(duration_); |
- audio_codec_ = configs.audio_codec; |
- num_channels_ = configs.audio_channels; |
- sampling_rate_ = configs.audio_sampling_rate; |
- is_audio_encrypted_ = configs.is_audio_encrypted; |
- audio_extra_data_ = configs.audio_extra_data; |
- video_codec_ = configs.video_codec; |
- width_ = configs.video_size.width(); |
- height_ = configs.video_size.height(); |
- is_video_encrypted_ = configs.is_video_encrypted; |
+ SetDemuxerConfigs(configs, true); |
+ SetDemuxerConfigs(configs, false); |
manager()->OnMediaMetadataChanged( |
player_id(), duration_, width_, height_, true); |
- |
- if (IsEventPending(CONFIG_CHANGE_EVENT_PENDING)) { |
- if (reconfig_audio_decoder_) |
- ConfigureAudioDecoderJob(); |
- |
- if (reconfig_video_decoder_) |
- ConfigureVideoDecoderJob(); |
- |
- ClearPendingEvent(CONFIG_CHANGE_EVENT_PENDING); |
- |
- // Resume decoding after the config change if we are still playing. |
- if (playing_) |
- StartInternal(); |
- } |
} |
void MediaSourcePlayer::OnDemuxerDataAvailable(const DemuxerData& data) { |
@@ -496,8 +476,16 @@ void MediaSourcePlayer::ProcessPendingEvents() { |
if (IsEventPending(CONFIG_CHANGE_EVENT_PENDING)) { |
DVLOG(1) << __FUNCTION__ << " : Handling CONFIG_CHANGE_EVENT."; |
DCHECK(reconfig_audio_decoder_ || reconfig_video_decoder_); |
- demuxer_->RequestDemuxerConfigs(); |
- return; |
+ manager()->OnMediaMetadataChanged( |
+ player_id(), duration_, width_, height_, true); |
+ |
+ if (reconfig_audio_decoder_) |
+ ConfigureAudioDecoderJob(); |
+ |
+ if (reconfig_video_decoder_) |
+ ConfigureVideoDecoderJob(); |
+ |
+ ClearPendingEvent(CONFIG_CHANGE_EVENT_PENDING); |
} |
if (IsEventPending(SURFACE_CHANGE_EVENT_PENDING)) { |
@@ -524,7 +512,6 @@ void MediaSourcePlayer::ProcessPendingEvents() { |
DCHECK(audio_decoder_job_ || AudioFinished()); |
DCHECK(video_decoder_job_ || VideoFinished()); |
- |
int count = (AudioFinished() ? 0 : 1) + (VideoFinished() ? 0 : 1); |
// It is possible that all streams have finished decode, yet starvation |
@@ -649,12 +636,13 @@ void MediaSourcePlayer::MediaDecoderCallback( |
start_time_ticks_ = base::TimeTicks::Now(); |
} |
- if (is_audio) { |
+ if (is_audio) |
DecodeMoreAudio(); |
- return; |
- } |
+ else |
+ DecodeMoreVideo(); |
- DecodeMoreVideo(); |
+ if (IsEventPending(CONFIG_CHANGE_EVENT_PENDING)) |
+ ProcessPendingEvents(); |
} |
void MediaSourcePlayer::DecodeMoreAudio() { |
@@ -662,21 +650,22 @@ void MediaSourcePlayer::DecodeMoreAudio() { |
DCHECK(!audio_decoder_job_->is_decoding()); |
DCHECK(!AudioFinished()); |
- if (audio_decoder_job_->Decode( |
+ DemuxerConfigs* configs = audio_decoder_job_->Decode( |
start_time_ticks_, |
start_presentation_timestamp_, |
base::Bind(&MediaSourcePlayer::MediaDecoderCallback, |
weak_factory_.GetWeakPtr(), |
- true))) { |
+ true)); |
+ if (!configs) { |
TRACE_EVENT_ASYNC_BEGIN0("media", "MediaSourcePlayer::DecodeMoreAudio", |
audio_decoder_job_.get()); |
return; |
} |
// Failed to start the next decode. |
- // Wait for demuxer ready message. |
DCHECK(!reconfig_audio_decoder_); |
reconfig_audio_decoder_ = true; |
+ SetDemuxerConfigs(*configs, true); |
// Config change may have just been detected on the other stream. If so, |
// don't send a duplicate demuxer config request. |
@@ -686,7 +675,6 @@ void MediaSourcePlayer::DecodeMoreAudio() { |
} |
SetPendingEvent(CONFIG_CHANGE_EVENT_PENDING); |
- ProcessPendingEvents(); |
} |
void MediaSourcePlayer::DecodeMoreVideo() { |
@@ -694,26 +682,26 @@ void MediaSourcePlayer::DecodeMoreVideo() { |
DCHECK(!video_decoder_job_->is_decoding()); |
DCHECK(!VideoFinished()); |
- if (video_decoder_job_->Decode( |
+ DemuxerConfigs* configs = video_decoder_job_->Decode( |
start_time_ticks_, |
start_presentation_timestamp_, |
base::Bind(&MediaSourcePlayer::MediaDecoderCallback, |
weak_factory_.GetWeakPtr(), |
- false))) { |
+ false)); |
+ if (!configs) { |
TRACE_EVENT_ASYNC_BEGIN0("media", "MediaSourcePlayer::DecodeMoreVideo", |
video_decoder_job_.get()); |
return; |
} |
// Failed to start the next decode. |
- // Wait for demuxer ready message. |
- |
// After this detection of video config change, next video data received |
// will begin with I-frame. |
next_video_data_is_iframe_ = true; |
DCHECK(!reconfig_video_decoder_); |
reconfig_video_decoder_ = true; |
+ SetDemuxerConfigs(*configs, false); |
// Config change may have just been detected on the other stream. If so, |
// don't send a duplicate demuxer config request. |
@@ -723,7 +711,6 @@ void MediaSourcePlayer::DecodeMoreVideo() { |
} |
SetPendingEvent(CONFIG_CHANGE_EVENT_PENDING); |
- ProcessPendingEvents(); |
} |
void MediaSourcePlayer::PlaybackCompleted(bool is_audio) { |
@@ -974,6 +961,9 @@ void MediaSourcePlayer::OnPrefetchDone() { |
if (!VideoFinished()) |
DecodeMoreVideo(); |
+ |
+ if (IsEventPending(CONFIG_CHANGE_EVENT_PENDING)) |
+ ProcessPendingEvents(); |
} |
const char* MediaSourcePlayer::GetEventName(PendingEventFlags event) { |
@@ -1014,4 +1004,20 @@ void MediaSourcePlayer::ClearPendingEvent(PendingEventFlags event) { |
pending_event_ &= ~event; |
} |
+void MediaSourcePlayer::SetDemuxerConfigs(const DemuxerConfigs& configs, |
+ bool is_audio) { |
+ if (is_audio) { |
+ audio_codec_ = configs.audio_codec; |
+ num_channels_ = configs.audio_channels; |
+ sampling_rate_ = configs.audio_sampling_rate; |
+ is_audio_encrypted_ = configs.is_audio_encrypted; |
+ audio_extra_data_ = configs.audio_extra_data; |
+ } else { |
+ video_codec_ = configs.video_codec; |
+ width_ = configs.video_size.width(); |
+ height_ = configs.video_size.height(); |
+ is_video_encrypted_ = configs.is_video_encrypted; |
+ } |
+} |
+ |
} // namespace media |