NuPlayerRenderer: allow video rendering after flushing audio
Test: test file can play
Bug: 129733716
Change-Id: Iaaac854267901bd577496689a2d997271c942000
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
index 65d6d61..39be40d 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
@@ -77,6 +77,10 @@
static const int64_t kMinimumAudioClockUpdatePeriodUs = 20 /* msec */ * 1000;
+// Default video frame display duration when only video exists.
+// Used to set max media time in MediaClock.
+static const int64_t kDefaultVideoFrameIntervalUs = 100000LL;
+
// static
const NuPlayer::Renderer::PcmInfo NuPlayer::Renderer::AUDIO_PCMINFO_INITIALIZER = {
AUDIO_CHANNEL_NONE,
@@ -314,11 +318,11 @@
mNotifyCompleteVideo |= notifyComplete;
++mVideoQueueGeneration;
++mVideoDrainGeneration;
+ mNextVideoTimeMediaUs = -1;
}
mMediaClock->clearAnchor();
mVideoLateByUs = 0;
- mNextVideoTimeMediaUs = -1;
mSyncQueues = false;
}
@@ -1302,7 +1306,7 @@
mNextVideoTimeMediaUs = mediaTimeUs;
if (!mHasAudio) {
// smooth out videos >= 10fps
- mMediaClock->updateMaxTimeMedia(mediaTimeUs + 100000);
+ mMediaClock->updateMaxTimeMedia(mediaTimeUs + kDefaultVideoFrameIntervalUs);
}
if (!mVideoSampleReceived || mediaTimeUs < mAudioFirstAnchorTimeMediaUs) {
@@ -1369,7 +1373,7 @@
&& mediaTimeUs > mLastAudioMediaTimeUs) {
// If audio ends before video, video continues to drive media clock.
// Also smooth out videos >= 10fps.
- mMediaClock->updateMaxTimeMedia(mediaTimeUs + 100000);
+ mMediaClock->updateMaxTimeMedia(mediaTimeUs + kDefaultVideoFrameIntervalUs);
}
}
} else {
@@ -1444,7 +1448,8 @@
}
} else {
mMediaClock->updateAnchor(
- mNextVideoTimeMediaUs, nowUs, mNextVideoTimeMediaUs + 100000);
+ mNextVideoTimeMediaUs, nowUs,
+ mNextVideoTimeMediaUs + kDefaultVideoFrameIntervalUs);
}
}
}
@@ -1597,6 +1602,14 @@
notifyComplete = mNotifyCompleteAudio;
mNotifyCompleteAudio = false;
mLastAudioMediaTimeUs = -1;
+
+ mHasAudio = false;
+ if (mNextVideoTimeMediaUs >= 0) {
+ int64_t nowUs = ALooper::GetNowUs();
+ mMediaClock->updateAnchor(
+ mNextVideoTimeMediaUs, nowUs,
+ mNextVideoTimeMediaUs + kDefaultVideoFrameIntervalUs);
+ }
} else {
notifyComplete = mNotifyCompleteVideo;
mNotifyCompleteVideo = false;