From 43ba1c464202ede372f3d1510c7ba17ba79474fc Mon Sep 17 00:00:00 2001 From: Mike Solar Date: Thu, 14 May 2026 20:26:17 +0800 Subject: [PATCH] fix ofx plugin bug --- app/pluginSupport/OliveClip.h | 3 ++- app/render/plugin/pluginrenderer.cpp | 7 +++++++ app/widget/viewer/viewer.cpp | 12 ++++++++---- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/app/pluginSupport/OliveClip.h b/app/pluginSupport/OliveClip.h index bc9570dec..acea6d125 100644 --- a/app/pluginSupport/OliveClip.h +++ b/app/pluginSupport/OliveClip.h @@ -40,9 +40,10 @@ public: OliveClipInstance(OFX::Host::ImageEffect::Instance* effectInstance, OFX::Host::ImageEffect::ClipDescriptor& desc,VideoParams ¶ms) : ClipInstance(effectInstance, desc) + , params_(params) + , defaultRegionOfDefinitions_{0, 0, 0, 0} , name_(desc.getName()) { - params_ = params; } OFX::Host::ImageEffect::Image* getOutputImage(OfxTime time); diff --git a/app/render/plugin/pluginrenderer.cpp b/app/render/plugin/pluginrenderer.cpp index ed0cdf193..5d9fd971f 100644 --- a/app/render/plugin/pluginrenderer.cpp +++ b/app/render/plugin/pluginrenderer.cpp @@ -1043,6 +1043,13 @@ static olive::AVFramePtr ConvertFrameIfNeeded(olive::AVFramePtr src, int src_ch; GetOliveFormatFromAV(static_cast(src->format), &src_fmt, &src_ch); if (src_fmt != olive::core::PixelFormat::INVALID && src_ch > 0) { + // Ensure renderer's OpenGL context is current before GPU operations. + // The context may have been switched by upstream DownloadFromTexture calls. + auto *gl_renderer = dynamic_cast(renderer); + if (gl_renderer) { + gl_renderer->EnsureContextCurrent(__FUNCTION__); + } + olive::VideoParams src_vp(src->width, src->height, src_fmt, src_ch); int src_bpp = olive::VideoParams::GetBytesPerPixel(src_fmt, src_ch); int src_linesize_pixels = (src_bpp > 0) ? src->linesize[0] / src_bpp : src->width; diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index b6f39932e..09e030a1a 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -239,8 +239,10 @@ void ViewerWidget::ConnectNodeEvent(ViewerOutput *n) &ViewerWidget::UpdateTextureFromNode, Qt::QueuedConnection); connect(n, &ViewerOutput::AudioParamsChanged, this, &ViewerWidget::UpdateRendererAudioParameters); - connect(n->video_frame_cache(), &FrameHashCache::Invalidated, this, - &ViewerWidget::ViewerInvalidatedVideoRange); + if (FrameHashCache *cache = n->video_frame_cache()) { + connect(cache, &FrameHashCache::Invalidated, this, + &ViewerWidget::ViewerInvalidatedVideoRange); + } connect(n, &ViewerOutput::TextureInputChanged, this, &ViewerWidget::UpdateWaveformViewFromMode); @@ -295,8 +297,10 @@ void ViewerWidget::DisconnectNodeEvent(ViewerOutput *n) &ViewerWidget::UpdateTextureFromNode); disconnect(n, &ViewerOutput::AudioParamsChanged, this, &ViewerWidget::UpdateRendererAudioParameters); - disconnect(n->video_frame_cache(), &FrameHashCache::Invalidated, this, - &ViewerWidget::ViewerInvalidatedVideoRange); + if (FrameHashCache *cache = n->video_frame_cache()) { + disconnect(cache, &FrameHashCache::Invalidated, this, + &ViewerWidget::ViewerInvalidatedVideoRange); + } disconnect(n, &ViewerOutput::TextureInputChanged, this, &ViewerWidget::UpdateWaveformViewFromMode);