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 52b5eb44560f0c093c6df7dc22bbad667a5ed9f7..f328aeef82f8142908643f4f5f0bd6e7bf77284a 100644 |
--- a/media/base/android/media_source_player.cc |
+++ b/media/base/android/media_source_player.cc |
@@ -46,19 +46,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_->AudioFrames())); |
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_->VideoFrames())); |
+ |
demuxer_->Initialize(this); |
interpolator_.SetUpperBound(base::TimeDelta()); |
weak_this_ = weak_factory_.GetWeakPtr(); |
@@ -466,6 +471,7 @@ void MediaSourcePlayer::MediaDecoderCallback( |
DVLOG(1) << __FUNCTION__ << " : decode error"; |
Release(); |
manager()->OnError(player_id(), MEDIA_ERROR_DECODE); |
+ media_stat_->StopAndReport(); |
return; |
} |
@@ -476,6 +482,7 @@ void MediaSourcePlayer::MediaDecoderCallback( |
// any other pending events only after handling EOS detection. |
if (IsEventPending(SEEK_EVENT_PENDING)) { |
ProcessPendingEvents(); |
+ media_stat_->StopAndReport(); |
return; |
} |
@@ -493,16 +500,20 @@ void MediaSourcePlayer::MediaDecoderCallback( |
if (pending_event_ != NO_EVENT_PENDING) { |
ProcessPendingEvents(); |
+ media_stat_->StopAndReport(); |
return; |
} |
- if (status == MEDIA_CODEC_OUTPUT_END_OF_STREAM) |
+ if (status == MEDIA_CODEC_OUTPUT_END_OF_STREAM) { |
+ media_stat_->StopAndReport(); |
return; |
+ } |
if (!playing_) { |
if (is_clock_manager) |
interpolator_.StopInterpolating(); |
+ media_stat_->StopAndReport(); |
return; |
} |
@@ -514,6 +525,7 @@ void MediaSourcePlayer::MediaDecoderCallback( |
is_waiting_for_key_ = true; |
manager()->OnWaitingForDecryptionKey(player_id()); |
} |
+ media_stat_->StopAndReport(); |
return; |
} |
@@ -530,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(); |
return; |
+ } |
if (prerolling_ && IsPrerollFinished(is_audio)) { |
if (IsPrerollFinished(!is_audio)) { |
@@ -653,6 +667,8 @@ bool MediaSourcePlayer::VideoFinished() { |
void MediaSourcePlayer::OnDecoderStarved() { |
DVLOG(1) << __FUNCTION__; |
+ media_stat_->AddStarvation(); |
+ |
SetPendingEvent(PREFETCH_REQUEST_EVENT_PENDING); |
ProcessPendingEvents(); |
} |
@@ -719,6 +735,8 @@ void MediaSourcePlayer::OnPrefetchDone() { |
if (!interpolator_.interpolating()) |
interpolator_.StartInterpolating(); |
+ media_stat_->Start(); |
+ |
if (!AudioFinished()) |
DecodeMoreAudio(); |