Add OFX plugin support and related infrastructure

This commit extends the OFX plugin support in Olive by:

- Initializing and scanning for OFX plugins
- Updating PluginNode to handle OFX plugin parameters and inputs
- Adding necessary methods and properties for OFX plugin integration
- Enhancing NodeFactory to include OFX plugin nodes
- Refactoring and renaming OliveInstance to OlivePluginInstance
- Introducing new classes for parameter handling (ParamInstance)
- Adding PluginJob for rendering OFX plugins
- Adjusting CMakeLists.txt files to include new source files
This commit is contained in:
2025-11-09 17:03:56 +08:00
parent 26e6924cdf
commit 8a7b6cf869
23 changed files with 545 additions and 90 deletions
+3 -1
View File
@@ -22,5 +22,7 @@ set(OLIVE_SOURCES
render/job/generatejob.h
render/job/samplejob.h
render/job/shaderjob.h
PARENT_SCOPE
render/job/pluginjob.h
render/job/pluginjob.cpp
PARENT_SCOPE
)
+7 -7
View File
@@ -33,22 +33,22 @@ public:
{
}
NodeValue Get(const QString &input) const
virtual NodeValue Get(const QString &input) const
{
return value_map_.value(input);
}
void Insert(const QString &input, const NodeValueRow &row)
virtual void Insert(const QString &input, const NodeValueRow &row)
{
value_map_.insert(input, row.value(input));
}
void Insert(const QString &input, const NodeValue &value)
virtual void Insert(const QString &input, const NodeValue &value)
{
value_map_.insert(input, value);
}
void Insert(const NodeValueRow &row)
virtual void Insert(const NodeValueRow &row)
{
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
value_map_.insert(row);
@@ -59,16 +59,16 @@ public:
#endif
}
const NodeValueRow &GetValues() const
virtual const NodeValueRow &GetValues() const
{
return value_map_;
}
NodeValueRow &GetValues()
virtual NodeValueRow &GetValues()
{
return value_map_;
}
private:
protected:
NodeValueRow value_map_;
};
+25
View File
@@ -0,0 +1,25 @@
/*
* Olive Community Edition - Non-Linear Video Editor
* Copyright (C) 2025 Olive CE Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "pluginjob.h"
namespace olive {
namespace plugin {
} // plugin
} // olive
+50
View File
@@ -0,0 +1,50 @@
/*
* Olive Community Edition - Non-Linear Video Editor
* Copyright (C) 2025 Olive CE Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef PLUGINJOB_H
#define PLUGINJOB_H
#include "acceleratedjob.h"
#include "pluginSupport/OlivePluginInstance.h"
#include <any>
namespace olive {
namespace plugin {
class PluginJob :public AcceleratedJob{
public:
explicit PluginJob(std::shared_ptr<OlivePluginInstance> pluginInstance, NodeValueRow row): AcceleratedJob()
{
this->pluginInstance = pluginInstance;
}
private:
std::shared_ptr<OlivePluginInstance> pluginInstance;
QHash<OfxTime, QHash<QString, std::any>> paramsOnTime;
QHash<QString, std::any> params;
};
} // plugin
} // olive
#endif //PLUGINJOB_H
+1
View File
@@ -0,0 +1 @@
target_sources(libolive-editor PRIVATE pluginrenderer.cpp pluginrenderer.h)
+33
View File
@@ -0,0 +1,33 @@
/*
* Olive Community Edition - Non-Linear Video Editor
* Copyright (C) 2025 Olive CE Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
//
// Created by mikesolar on 25-10-19.
//
#include "pluginrenderer.h"
#include "pluginSupport/OlivePluginInstance.h"
void olive::plugin::PluginRenderer::Blit(QVariant shader, ShaderJob job,
Texture *destination,
VideoParams destination_params,
bool clear_destination)
{
}
+46
View File
@@ -0,0 +1,46 @@
/*
* Olive Community Edition - Non-Linear Video Editor
* Copyright (C) 2025 Olive CE Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
//
// Created by mikesolar on 25-10-19.
//
#ifndef PLUGINRENDERER_H
#define PLUGINRENDERER_H
#include "render/renderer.h"
namespace olive
{
namespace plugin{
class PluginRenderer : public olive::Renderer{
Q_OBJECT
public:
PluginRenderer(QObject *parent=nullptr):Renderer(parent){};
protected:
void Blit(QVariant shader,
ShaderJob job,
Texture *destination,
VideoParams destination_params,
bool clear_destination) override;
};
}
}
#endif //PLUGINRENDERER_H
+5 -4
View File
@@ -169,7 +169,7 @@ void RenderProcessor::Run()
}
// if is a plugin
Node *node=ticket_->property("node").value<Node*>();
/*Node *node=ticket_->property("node").value<Node*>();
if (node && node->getPlugin()) {
std::shared_ptr<OFX::Host::ImageEffect::ImageEffectPlugin> plugin
= node->getPlugin();
@@ -214,7 +214,7 @@ void RenderProcessor::Run()
int numFramesToRender=ticket_->property("time").value<rational>().toDouble()
* params.frame_rate().toDouble();
stat = instance->beginRenderAction(0, numFramesToRender, 1.0, false, renderScale, /*sequential=*/true, /*interactive=*/false
stat = instance->beginRenderAction(0, numFramesToRender, 1.0, false, renderScale, /*sequential=#1#true, /*interactive=#1#false
);
if (stat != kOfxStatOK && stat != kOfxStatReplyDefault) {
ticket_->Finish();
@@ -239,7 +239,7 @@ void RenderProcessor::Run()
assert(stat == kOfxStatOK || stat == kOfxStatReplyDefault);
// render a frame
stat = instance->renderAction(t,kOfxImageFieldBoth,renderWindow, renderScale, /*sequential=*/true, /*interactive=*/false, /*draft=*/false);
stat = instance->renderAction(t,kOfxImageFieldBoth,renderWindow, renderScale, /*sequential=#1#true, /*interactive=#1#false, /*draft=#1#false);
assert(stat == kOfxStatOK);
// get the output image buffer
@@ -250,9 +250,10 @@ void RenderProcessor::Run()
exportToPPM(ss.str(), outputImage);
}
instance->endRenderAction(0, numFramesToRender, 1.0, false, renderScale, /*sequential=*/true, /*interactive=*/false
instance->endRenderAction(0, numFramesToRender, 1.0, false, renderScale, /*sequential=#1#true, /*interactive=#1#false
);
}
*/
switch (type) {
case RenderManager::kTypeVideo: {