Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(873)

Unified Diff: media/base/android/media_source_player.cc

Issue 79283006: Let only seeks reset Android MSE stream playback completion (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased and addresses PS3 comments Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/base/android/media_source_player.h ('k') | media/base/android/media_source_player_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 4c6cb9c1215602e934600f547b83d2470eb53928..af2ccaf3fc0ef7917e5fc19de9f71002bbe4fa70 100644
--- a/media/base/android/media_source_player.cc
+++ b/media/base/android/media_source_player.cc
@@ -73,8 +73,8 @@ MediaSourcePlayer::MediaSourcePlayer(
video_codec_(kUnknownVideoCodec),
num_channels_(0),
sampling_rate_(0),
- audio_finished_(true),
- video_finished_(true),
+ audio_finished_(false),
+ video_finished_(false),
playing_(false),
is_audio_encrypted_(false),
is_video_encrypted_(false),
@@ -318,8 +318,6 @@ void MediaSourcePlayer::StartInternal() {
return;
}
- audio_finished_ = false;
- video_finished_ = false;
SetPendingEvent(PREFETCH_REQUEST_EVENT_PENDING);
ProcessPendingEvents();
}
@@ -451,6 +449,9 @@ void MediaSourcePlayer::OnDemuxerSeekDone(
audio_timestamp_helper_->SetBaseTimestamp(actual_browser_seek_time);
}
+ audio_finished_ = false;
+ video_finished_ = false;
+
base::TimeDelta current_time = GetCurrentTime();
// TODO(qinmin): Simplify the logic by using |start_presentation_timestamp_|
// to preroll media decoder jobs. Currently |start_presentation_timestamp_|
@@ -530,15 +531,19 @@ void MediaSourcePlayer::ProcessPendingEvents() {
if (IsEventPending(PREFETCH_REQUEST_EVENT_PENDING)) {
DVLOG(1) << __FUNCTION__ << " : Handling PREFETCH_REQUEST_EVENT.";
- int count = (audio_decoder_job_ ? 1 : 0) + (video_decoder_job_ ? 1 : 0);
+ DCHECK(audio_decoder_job_ || AudioFinishedOrNoAudio());
+ DCHECK(video_decoder_job_ || VideoFinishedOrNoVideo());
+
+ int count = ((AudioFinishedOrNoAudio()) ? 0 : 1) +
+ ((VideoFinishedOrNoVideo()) ? 0 : 1);
base::Closure barrier = BarrierClosure(count, base::Bind(
&MediaSourcePlayer::OnPrefetchDone, weak_this_.GetWeakPtr()));
- if (audio_decoder_job_)
+ if (!AudioFinishedOrNoAudio())
audio_decoder_job_->Prefetch(barrier);
- if (video_decoder_job_)
+ if (!VideoFinishedOrNoVideo())
video_decoder_job_->Prefetch(barrier);
SetPendingEvent(PREFETCH_DONE_EVENT_PENDING);
@@ -590,13 +595,13 @@ void MediaSourcePlayer::MediaDecoderCallback(
return;
}
- if (pending_event_ != NO_EVENT_PENDING) {
- ProcessPendingEvents();
+ if (status == MEDIA_CODEC_OUTPUT_END_OF_STREAM) {
+ PlaybackCompleted(is_audio);
return;
}
- if (status == MEDIA_CODEC_OUTPUT_END_OF_STREAM) {
- PlaybackCompleted(is_audio);
+ if (pending_event_ != NO_EVENT_PENDING) {
+ ProcessPendingEvents();
return;
}
@@ -643,6 +648,7 @@ void MediaSourcePlayer::MediaDecoderCallback(
void MediaSourcePlayer::DecodeMoreAudio() {
DVLOG(1) << __FUNCTION__;
DCHECK(!audio_decoder_job_->is_decoding());
+ DCHECK(!AudioFinishedOrNoAudio());
if (audio_decoder_job_->Decode(
start_time_ticks_, start_presentation_timestamp_, base::Bind(
@@ -672,6 +678,7 @@ void MediaSourcePlayer::DecodeMoreAudio() {
void MediaSourcePlayer::DecodeMoreVideo() {
DVLOG(1) << __FUNCTION__;
DCHECK(!video_decoder_job_->is_decoding());
+ DCHECK(!VideoFinishedOrNoVideo());
if (video_decoder_job_->Decode(
start_time_ticks_, start_presentation_timestamp_, base::Bind(
@@ -710,12 +717,15 @@ void MediaSourcePlayer::PlaybackCompleted(bool is_audio) {
else
video_finished_ = true;
- if ((!HasAudio() || audio_finished_) && (!HasVideo() || video_finished_)) {
+ if (AudioFinishedOrNoAudio() && VideoFinishedOrNoVideo()) {
playing_ = false;
clock_.Pause();
start_time_ticks_ = base::TimeTicks();
manager()->OnPlaybackComplete(player_id());
}
+
+ if (pending_event_ != NO_EVENT_PENDING)
qinmin 2013/12/04 00:20:16 i think you should process the pending events firs
wolenetz 2013/12/05 01:03:28 From our chats/analyses, MediaDecoderCallback() ca
+ ProcessPendingEvents();
}
void MediaSourcePlayer::ClearDecodingData() {
@@ -735,6 +745,14 @@ bool MediaSourcePlayer::HasAudio() {
return kUnknownAudioCodec != audio_codec_;
}
+bool MediaSourcePlayer::AudioFinishedOrNoAudio() {
+ return audio_finished_ || !HasAudio();
+}
+
+bool MediaSourcePlayer::VideoFinishedOrNoVideo() {
+ return video_finished_ || !HasVideo();
+}
+
void MediaSourcePlayer::ConfigureAudioDecoderJob() {
if (!HasAudio()) {
audio_decoder_job_.reset();
@@ -916,10 +934,15 @@ void MediaSourcePlayer::OnPrefetchDone() {
if (!clock_.IsPlaying())
clock_.Play();
- if (audio_decoder_job_)
+ if (!AudioFinishedOrNoAudio()) {
+ DCHECK(audio_decoder_job_);
DecodeMoreAudio();
- if (video_decoder_job_)
+ }
+
+ if (!VideoFinishedOrNoVideo()) {
+ DCHECK(video_decoder_job_);
DecodeMoreVideo();
+ }
}
const char* MediaSourcePlayer::GetEventName(PendingEventFlags event) {
« no previous file with comments | « media/base/android/media_source_player.h ('k') | media/base/android/media_source_player_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698