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 7fbd9c0757ef8569ef69c61dc829302400d338bf..92f08cb91b1df9756704d2c9b530200cebec0f59 100644 |
--- a/media/base/android/media_source_player.cc |
+++ b/media/base/android/media_source_player.cc |
@@ -47,19 +47,24 @@ MediaSourcePlayer::MediaSourcePlayer( |
is_waiting_for_video_decoder_(false), |
prerolling_(true), |
weak_factory_(this) { |
+ media_stat_.reset(new MediaStatistics()); |
+ |
audio_decoder_job_.reset(new AudioDecoderJob( |
base::Bind(&DemuxerAndroid::RequestDemuxerData, |
base::Unretained(demuxer_.get()), |
DemuxerStream::AUDIO), |
base::Bind(&MediaSourcePlayer::OnDemuxerConfigsChanged, |
- weak_factory_.GetWeakPtr()))); |
+ weak_factory_.GetWeakPtr()), |
+ &media_stat_->audio_frame_stats())); |
video_decoder_job_.reset(new VideoDecoderJob( |
base::Bind(&DemuxerAndroid::RequestDemuxerData, |
base::Unretained(demuxer_.get()), |
DemuxerStream::VIDEO), |
base::Bind(request_media_resources_cb_, player_id), |
base::Bind(&MediaSourcePlayer::OnDemuxerConfigsChanged, |
- weak_factory_.GetWeakPtr()))); |
+ weak_factory_.GetWeakPtr()), |
+ &media_stat_->video_frame_stats())); |
+ |
demuxer_->Initialize(this); |
interpolator_.SetUpperBound(base::TimeDelta()); |
weak_this_ = weak_factory_.GetWeakPtr(); |
@@ -467,6 +472,7 @@ void MediaSourcePlayer::MediaDecoderCallback( |
DVLOG(1) << __FUNCTION__ << " : decode error"; |
Release(); |
manager()->OnError(player_id(), MEDIA_ERROR_DECODE); |
+ media_stat_->StopAndReport(GetCurrentTime()); |
return; |
} |
@@ -477,6 +483,7 @@ void MediaSourcePlayer::MediaDecoderCallback( |
// any other pending events only after handling EOS detection. |
if (IsEventPending(SEEK_EVENT_PENDING)) { |
ProcessPendingEvents(); |
+ media_stat_->StopAndReport(GetCurrentTime()); |
return; |
} |
@@ -497,13 +504,16 @@ void MediaSourcePlayer::MediaDecoderCallback( |
return; |
} |
- if (status == MEDIA_CODEC_OUTPUT_END_OF_STREAM) |
+ if (status == MEDIA_CODEC_OUTPUT_END_OF_STREAM) { |
+ media_stat_->StopAndReport(GetCurrentTime()); |
return; |
+ } |
if (!playing_) { |
if (is_clock_manager) |
interpolator_.StopInterpolating(); |
+ media_stat_->StopAndReport(GetCurrentTime()); |
return; |
} |
@@ -514,6 +524,7 @@ void MediaSourcePlayer::MediaDecoderCallback( |
} else { |
is_waiting_for_key_ = true; |
manager()->OnWaitingForDecryptionKey(player_id()); |
+ media_stat_->StopAndReport(GetCurrentTime()); |
} |
return; |
} |
@@ -531,8 +542,10 @@ void MediaSourcePlayer::MediaDecoderCallback( |
// If the status is MEDIA_CODEC_ABORT, 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_ABORT) |
+ if (status == MEDIA_CODEC_ABORT) { |
+ media_stat_->StopAndReport(GetCurrentTime()); |
return; |
+ } |
if (prerolling_ && IsPrerollFinished(is_audio)) { |
if (IsPrerollFinished(!is_audio)) { |
@@ -654,6 +667,8 @@ bool MediaSourcePlayer::VideoFinished() { |
void MediaSourcePlayer::OnDecoderStarved() { |
DVLOG(1) << __FUNCTION__; |
+ media_stat_->AddStarvation(); |
+ |
SetPendingEvent(PREFETCH_REQUEST_EVENT_PENDING); |
ProcessPendingEvents(); |
} |
@@ -720,6 +735,8 @@ void MediaSourcePlayer::OnPrefetchDone() { |
if (!interpolator_.interpolating()) |
interpolator_.StartInterpolating(); |
+ media_stat_->Start(start_presentation_timestamp_); |
+ |
if (!AudioFinished()) |
DecodeMoreAudio(); |