| 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();
|
|
|
|
|