66 lines
4.8 KiB
Markdown
66 lines
4.8 KiB
Markdown
# 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<uint8_t>`),填充 `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 拆成“优先级 + 预计工作量 + 依赖关系”的形式,方便你逐条推进。
|