Files
oak-editor/TODO-zh.md
T
2026-01-05 00:03:51 +08:00

66 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 拆成“优先级 + 预计工作量 + 依赖关系”的形式,方便你逐条推进。