diff options
Diffstat (limited to 'media/libstagefright/wifi-display/sink/DirectRenderer.cpp')
-rw-r--r-- | media/libstagefright/wifi-display/sink/DirectRenderer.cpp | 53 |
1 files changed, 42 insertions, 11 deletions
diff --git a/media/libstagefright/wifi-display/sink/DirectRenderer.cpp b/media/libstagefright/wifi-display/sink/DirectRenderer.cpp index b53252d..5efcd17 100644 --- a/media/libstagefright/wifi-display/sink/DirectRenderer.cpp +++ b/media/libstagefright/wifi-display/sink/DirectRenderer.cpp @@ -39,8 +39,11 @@ DirectRenderer::DirectRenderer( : mSurfaceTex(bufferProducer), mVideoDecoderNotificationPending(false), mRenderPending(false), - mFirstRenderTimeUs(-1ll), - mFirstRenderRealUs(-1ll) { + mTimeOffsetUs(0ll), + mLatencySum(0ll), + mLatencyCount(0), + mNumFramesLate(0), + mNumFrames(0) { } DirectRenderer::~DirectRenderer() { @@ -53,6 +56,29 @@ DirectRenderer::~DirectRenderer() { } } +void DirectRenderer::setTimeOffset(int64_t offset) { + mTimeOffsetUs = offset; +} + +int64_t DirectRenderer::getAvgLatenessUs() { + if (mLatencyCount == 0) { + return 0ll; + } + + int64_t avgLatencyUs = mLatencySum / mLatencyCount; + + mLatencySum = 0ll; + mLatencyCount = 0; + + if (mNumFrames > 0) { + ALOGI("%d / %d frames late", mNumFramesLate, mNumFrames); + mNumFramesLate = 0; + mNumFrames = 0; + } + + return avgLatencyUs; +} + void DirectRenderer::onMessageReceived(const sp<AMessage> &msg) { switch (msg->what()) { case kWhatVideoDecoderNotify: @@ -224,14 +250,17 @@ void DirectRenderer::onVideoDecoderNotify() { } void DirectRenderer::queueOutputBuffer(size_t index, int64_t timeUs) { -#if 0 +#if 1 OutputInfo info; info.mIndex = index; - info.mTimeUs = timeUs; + info.mTimeUs = timeUs + mTimeOffsetUs; mOutputBuffers.push_back(info); scheduleRenderIfNecessary(); #else + mLatencySum += ALooper::GetNowUs() - (timeUs + mTimeOffsetUs); + ++mLatencyCount; + status_t err = mVideoDecoder->renderOutputBufferAndRelease(index); CHECK_EQ(err, (status_t)OK); #endif @@ -247,13 +276,7 @@ void DirectRenderer::scheduleRenderIfNecessary() { int64_t timeUs = (*mOutputBuffers.begin()).mTimeUs; int64_t nowUs = ALooper::GetNowUs(); - if (mFirstRenderTimeUs < 0ll) { - mFirstRenderTimeUs = timeUs; - mFirstRenderRealUs = nowUs; - } - - int64_t whenUs = timeUs - mFirstRenderTimeUs + mFirstRenderRealUs; - int64_t delayUs = whenUs - nowUs; + int64_t delayUs = timeUs - nowUs; (new AMessage(kWhatRender, id()))->post(delayUs); } @@ -270,6 +293,14 @@ void DirectRenderer::onRender() { break; } + if (info.mTimeUs + 15000ll < nowUs) { + ++mNumFramesLate; + } + ++mNumFrames; + + mLatencySum += nowUs - info.mTimeUs; + ++mLatencyCount; + status_t err = mVideoDecoder->renderOutputBufferAndRelease(info.mIndex); CHECK_EQ(err, (status_t)OK); |