From a8fbe686e21be69936a67d985f9bc233ed6e250f Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 11 Apr 2020 17:37:00 +1000 Subject: [PATCH] openglrenderer: retrieve frame in each worker thread rather than in the proxy thread Since we now have decoders in each thread, we can parallelize by retrieving frames in each thread as well. --- app/render/backend/opengl/openglproxy.cpp | 9 +-------- app/render/backend/opengl/openglproxy.h | 2 +- app/render/backend/opengl/openglworker.cpp | 6 +++++- app/render/backend/opengl/openglworker.h | 2 +- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/app/render/backend/opengl/openglproxy.cpp b/app/render/backend/opengl/openglproxy.cpp index d3510db4a..04f6e7d43 100644 --- a/app/render/backend/opengl/openglproxy.cpp +++ b/app/render/backend/opengl/openglproxy.cpp @@ -67,7 +67,7 @@ bool OpenGLProxy::Init() return true; } -void OpenGLProxy::FrameToValue(DecoderPtr decoder, StreamPtr stream, const TimeRange &range, NodeValueTable* table) +void OpenGLProxy::FrameToValue(FramePtr frame, StreamPtr stream, const TimeRange &range, NodeValueTable* table) { // Ensure stream is video or image type if (stream->type() != Stream::kVideo && stream->type() != Stream::kImage) { @@ -105,13 +105,6 @@ void OpenGLProxy::FrameToValue(DecoderPtr decoder, StreamPtr stream, const TimeR ColorManager::OCIOMethod ocio_method = ColorManager::GetOCIOMethodForMode(video_params_.mode()); - FramePtr frame = decoder->RetrieveVideo(range.in(), video_params_.divider()); - - if (!frame) { - // Nothing to be done - return; - } - // OCIO's CPU conversion is more accurate, so for online we render on CPU but offline we render GPU if (ocio_method == ColorManager::kOCIOAccurate) { bool has_alpha = PixelFormat::FormatHasAlphaChannel(frame->format()); diff --git a/app/render/backend/opengl/openglproxy.h b/app/render/backend/opengl/openglproxy.h index 77ee7a89b..1203b9330 100644 --- a/app/render/backend/opengl/openglproxy.h +++ b/app/render/backend/opengl/openglproxy.h @@ -63,7 +63,7 @@ public: void Close(); - void FrameToValue(DecoderPtr decoder, StreamPtr stream, const TimeRange &range, NodeValueTable* table); + void FrameToValue(FramePtr frame, StreamPtr stream, const TimeRange &range, NodeValueTable* table); void RunNodeAccelerated(const Node *node, const TimeRange &range, const NodeValueDatabase &input_params, NodeValueTable* output_params); diff --git a/app/render/backend/opengl/openglworker.cpp b/app/render/backend/opengl/openglworker.cpp index edff4f17b..b141cb3b0 100644 --- a/app/render/backend/opengl/openglworker.cpp +++ b/app/render/backend/opengl/openglworker.cpp @@ -38,7 +38,11 @@ OpenGLWorker::OpenGLWorker(VideoRenderFrameCache *frame_cache, QObject *parent) void OpenGLWorker::FrameToValue(DecoderPtr decoder, StreamPtr stream, const TimeRange &range, NodeValueTable *table) { - emit RequestFrameToValue(decoder, stream, range, table); + FramePtr frame = decoder->RetrieveVideo(range.in(), video_params().divider()); + + if (frame) { + emit RequestFrameToValue(frame, stream, range, table); + } } void OpenGLWorker::RunNodeAccelerated(const Node *node, const TimeRange &range, const NodeValueDatabase &input_params, NodeValueTable *output_params) diff --git a/app/render/backend/opengl/openglworker.h b/app/render/backend/opengl/openglworker.h index d8321d674..1ec1846e9 100644 --- a/app/render/backend/opengl/openglworker.h +++ b/app/render/backend/opengl/openglworker.h @@ -38,7 +38,7 @@ public: QObject* parent = nullptr); signals: - void RequestFrameToValue(DecoderPtr decoder, StreamPtr stream, const TimeRange &range, NodeValueTable* table); + void RequestFrameToValue(FramePtr frame, StreamPtr stream, const TimeRange &range, NodeValueTable* table); void RequestRunNodeAccelerated(const Node *node, const TimeRange &range, const NodeValueDatabase &input_params, NodeValueTable* output_params);