4.8 KiB
4.8 KiB
OpenFX 支持 TODO(中文说明)
下面是 README 里 OpenFX TODO 的中文翻译与详细说明。每条都尽量解释“是什么、为什么需要、该往哪里改”。
- 实现插件发现与加载流程
- 现状:
app/node/factory.cpp自己临时创建 Host/PluginCache 并扫描,loadPlugins()只是一段占位逻辑。 - 为什么需要:没有统一的发现/加载入口,插件扫描路径和实例化流程很容易分叉,后续维护困难。
- 已完成:
- 在
app/pluginSupport/OliveHost.cpp实现loadPlugins():创建 Host/PluginCache,注册到 OFX 全局缓存,设置 host path,按需追加路径并扫描插件文件。 app/node/factory.cpp统一通过loadPlugins()初始化插件,再从全局缓存取插件注册到节点库。
- 在
- 输出剪辑图像的缓冲区管理(Output Clip)
- 现状:
OliveClipInstance::getImage()返回空的 OFX Image,没有分配像素内存,也没有设置kOfxImagePropData。 - 为什么需要:插件渲染时会往
kOfxImagePropData写入像素,如果这里没分配就会导致崩溃或黑屏。 - 可能改动:为 Output Clip 分配像素缓冲(例如
std::vector<uint8_t>),填充kOfxImagePropData、kOfxImagePropRowBytes、kOfxImagePropBounds,并保证生命周期覆盖渲染过程。
- 输入剪辑图像的拉取(Input Clip Fetch)
- 现状:
OliveClipInstance::getImage()对输入剪辑直接返回一个空 Image,没有真正把输入帧填进去。 - 为什么需要:多数插件需要输入图像做处理,没有输入就无法正确工作。
- 可能改动:根据当前时间
time从渲染管线/缓存/纹理中取出输入帧,设置 OFX Image 的 data/bounds/rowBytes 等属性并返回。
- 渲染路径中设置每帧输出数据与 ROD/Bounds
- 现状:
app/render/plugin/pluginrenderer.cpp中已接了 Image->AVFrame,但仍需要保证每帧输出图像属性正确(ROD/Bounds)。 - 为什么需要:插件对 ROD 和 bounds 非常敏感,用错会导致裁剪错误或错位。
- 可能改动:在渲染前或 render action 前,按当前时间/ROI 计算并设置 Output Clip 的
kOfxImagePropBounds、kOfxImagePropRegionOfDefinition等。
- 参数类型支持不完整(Param Instances)
- 现状:
OlivePluginInstance::newParam()只支持少量类型,app/node/plugins/Plugin.cpp里也没有处理 Group/Page 等。 - 为什么需要:复杂插件大量依赖 String/3D/Custom 等参数,不支持就会缺参数或崩溃。
- 可能改动:补齐 String、Double3D/Integer3D、Group/Page、Custom/Bytes 等参数实例,并在节点输入映射里增加对应类型。
- editBegin/editEnd、Progress、Timeline 等回调还只是空实现
- 现状:
OlivePluginInstance中多处函数是空壳或默认返回。 - 为什么需要:插件在编辑参数、显示进度、根据时间线上下文渲染时依赖这些回调。
- 已完成:
- editBegin/editEnd:实现编辑会话计数,保证调用合法并可用于后续扩展。
- progressStart/Update/End:接入
ProgressDialog,支持取消并返回给插件停止信号。 - timeLineGetTime/GotoTime/Bounds:关联当前活跃的时间线/面板播放头,读取与设置时间。
- 持久消息展示与清理机制需要完善
- 现状:我们已在 Host/Instance 里保存消息并能弹窗,但 UI 面板还需要稳定地展示、更新和清理。
- 为什么需要:插件经常用 persistent message 提示错误或警告,需要可追踪、可清除。
- 已完成:
- Host/Instance 持久消息保存,节点右上角显示数量徽标。
- 参数面板顶部展示消息列表,并可点击清除按钮移除消息。
- 清除/新增消息后通过信号更新 UI。
- Project Extent / Fielding 行为待确认
- 现状:
OlivePluginInstance::getProjectExtent()有 “TODO” 注释。 - 为什么需要:OFX 插件会根据项目尺寸、扫描线场信息做渲染决策。
- 已完成:
getProjectExtent()明确返回项目宽高,不再留 TODO。getDefaultOutputFielding()根据VideoParams::interlacing()映射为 OFX fielding。- 渲染时
renderAction()的 field 参数根据项目是否交错决定(progressive 用None,interlaced 用Both)。
- OpenGL Render Suite 支持
- 现状:
OliveClipInstance::loadTexture()返回 null,OpenGL 渲染路径未实现。 - 为什么需要:有些 OFX 插件只支持 OpenGL 渲染,不支持 CPU 渲染。
- 已完成:
- Host 端声明
kOfxImageEffectPropOpenGLRenderSupported = true。 OliveClipInstance::loadTexture()返回真实的 OpenGL 纹理句柄。- 渲染前设置 Output Clip 的目标纹理,输入纹理走 OpenGL 纹理路径。
- Host 端声明
如果你希望,我可以把这些 TODO 拆成“优先级 + 预计工作量 + 依赖关系”的形式,方便你逐条推进。