Make sure we post a video event when seeking after seeing video EOS before.
Change-Id: I513bf94c0732a85324160977ea5723d8aafd6aba
related-to-bug: 3316960
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index 435a1b0..37a93a4 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -575,7 +575,7 @@
int64_t audioTimeUs = mAudioPlayer->getMediaTimeUs();
int64_t videoLateByUs = audioTimeUs - mVideoTimeUs;
- if (videoLateByUs > 300000ll) {
+ if (!(mFlags & VIDEO_AT_EOS) && videoLateByUs > 300000ll) {
LOGV("video late by %lld ms.", videoLateByUs / 1000ll);
notifyListener_l(
@@ -1052,7 +1052,8 @@
}
else if (mSeeking != NO_SEEK) {
*positionUs = mSeekTimeUs;
- } else if (mVideoSource != NULL) {
+ } else if (mVideoSource != NULL
+ && (mAudioPlayer == NULL || !(mFlags & VIDEO_AT_EOS))) {
Mutex::Autolock autoLock(mMiscStateLock);
*positionUs = mVideoTimeUs;
} else if (mAudioPlayer != NULL) {
@@ -1094,6 +1095,14 @@
play_l();
}
+ if ((mFlags & PLAYING) && mVideoSource != NULL && (mFlags & VIDEO_AT_EOS)) {
+ // Video playback completed before, there's no pending
+ // video event right now. In order for this new seek
+ // to be honored, we need to post one.
+
+ postVideoEvent_l();
+ }
+
mSeeking = SEEK;
mSeekNotificationSent = false;
mSeekTimeUs = timeUs;
@@ -1277,6 +1286,7 @@
mAudioPlayer->seekTo(videoTimeUs < 0 ? mSeekTimeUs : videoTimeUs);
mWatchForAudioSeekComplete = true;
+ mWatchForAudioEOS = true;
} else if (!mSeekNotificationSent) {
// If we're playing video only, report seek complete now,
// otherwise audio player will notify us later.
@@ -1367,6 +1377,11 @@
}
finishSeekIfNecessary(-1);
+ if (mAudioPlayer != NULL
+ && !(mFlags & (AUDIO_RUNNING | SEEK_PREVIEW))) {
+ startAudioPlayer_l();
+ }
+
mFlags |= VIDEO_AT_EOS;
postStreamDoneEvent_l(err);
return;