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