diff options
Diffstat (limited to 'media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp')
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp | 45 |
1 files changed, 28 insertions, 17 deletions
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp index 35ed43f..8f213da 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp @@ -395,29 +395,40 @@ void NuPlayer::Renderer::onQueueBuffer(const sp<AMessage> &msg) { postDrainVideoQueue(); } - if (mSyncQueues && !mAudioQueue.empty() && !mVideoQueue.empty()) { - int64_t firstAudioTimeUs; - int64_t firstVideoTimeUs; - CHECK((*mAudioQueue.begin()).mBuffer->meta() - ->findInt64("timeUs", &firstAudioTimeUs)); - CHECK((*mVideoQueue.begin()).mBuffer->meta() - ->findInt64("timeUs", &firstVideoTimeUs)); + if (!mSyncQueues || mAudioQueue.empty() || mVideoQueue.empty()) { + return; + } - int64_t diff = firstVideoTimeUs - firstAudioTimeUs; + sp<ABuffer> firstAudioBuffer = (*mAudioQueue.begin()).mBuffer; + sp<ABuffer> firstVideoBuffer = (*mVideoQueue.begin()).mBuffer; - LOGV("queueDiff = %.2f secs", diff / 1E6); + if (firstAudioBuffer == NULL || firstVideoBuffer == NULL) { + // EOS signalled on either queue. + syncQueuesDone(); + return; + } - if (diff > 100000ll) { - // Audio data starts More than 0.1 secs before video. - // Drop some audio. + int64_t firstAudioTimeUs; + int64_t firstVideoTimeUs; + CHECK(firstAudioBuffer->meta() + ->findInt64("timeUs", &firstAudioTimeUs)); + CHECK(firstVideoBuffer->meta() + ->findInt64("timeUs", &firstVideoTimeUs)); - (*mAudioQueue.begin()).mNotifyConsumed->post(); - mAudioQueue.erase(mAudioQueue.begin()); - return; - } + int64_t diff = firstVideoTimeUs - firstAudioTimeUs; - syncQueuesDone(); + LOGV("queueDiff = %.2f secs", diff / 1E6); + + if (diff > 100000ll) { + // Audio data starts More than 0.1 secs before video. + // Drop some audio. + + (*mAudioQueue.begin()).mNotifyConsumed->post(); + mAudioQueue.erase(mAudioQueue.begin()); + return; } + + syncQueuesDone(); } void NuPlayer::Renderer::syncQueuesDone() { |