From 81d5e7f014e90d517a09fd2c095eada1d8a9ab67 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 7 Apr 2022 22:16:52 -0500 Subject: [PATCH] Wait for the VDPAU output surface to be idle in waitToRender() --- app/streaming/video/ffmpeg-renderers/vdpau.cpp | 13 ++++++++++++- app/streaming/video/ffmpeg-renderers/vdpau.h | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/streaming/video/ffmpeg-renderers/vdpau.cpp b/app/streaming/video/ffmpeg-renderers/vdpau.cpp index 91d11537..1e6f0027 100644 --- a/app/streaming/video/ffmpeg-renderers/vdpau.cpp +++ b/app/streaming/video/ffmpeg-renderers/vdpau.cpp @@ -474,6 +474,15 @@ void VDPAURenderer::renderOverlay(VdpOutputSurface destination, Overlay::Overlay } } +void VDPAURenderer::waitToRender() +{ + VdpOutputSurface chosenSurface = m_OutputSurface[m_NextSurfaceIndex]; + + // Wait for the next render target surface to be idle before proceeding + VdpTime pts; + m_VdpPresentationQueueBlockUntilSurfaceIdle(m_PresentationQueue, chosenSurface, &pts); +} + void VDPAURenderer::renderFrame(AVFrame* frame) { VdpStatus status; @@ -524,7 +533,9 @@ void VDPAURenderer::renderFrame(AVFrame* frame) } } - // Wait for this frame to be off the screen + // Wait for this frame to be off the screen. This will usually be a no-op + // since it already happened in waitToRender(). However, that won't be the + // case is when frame pacing is enabled. VdpTime pts; m_VdpPresentationQueueBlockUntilSurfaceIdle(m_PresentationQueue, chosenSurface, &pts); diff --git a/app/streaming/video/ffmpeg-renderers/vdpau.h b/app/streaming/video/ffmpeg-renderers/vdpau.h index 4e57ca0d..7955fdf0 100644 --- a/app/streaming/video/ffmpeg-renderers/vdpau.h +++ b/app/streaming/video/ffmpeg-renderers/vdpau.h @@ -16,6 +16,7 @@ public: virtual bool initialize(PDECODER_PARAMETERS params) override; virtual bool prepareDecoderContext(AVCodecContext* context, AVDictionary** options) override; virtual void notifyOverlayUpdated(Overlay::OverlayType type) override; + virtual void waitToRender() override; virtual void renderFrame(AVFrame* frame) override; virtual bool needsTestFrame() override; virtual int getDecoderColorspace() override;