refactor(plugin): de-Qt oakplugin and wrap it in a pure C ABI

- de-Qt src/plugin/src (olivehost/oliveplugininstance/oliveclip/
  paraminstance/image/pluginprogressreporter); QMessageBox/
  QApplication replaced by facade callbacks
- new C ABI in include/plugin/{error,host,instance}.h with
  refcounted OakPluginInstance value handle
- paraminstance bridges via oaknode C ABI (OakNodeNode value handle,
  oaknode_node_identity registry); undo via oakundo C ABI
- oliveclip textures are OakRenderTexture value handles; oakrender
  gains texture/copier/ticket C API additions
- oaknode gains get_input_at_time/set_input_at_time_undoable/
  node_identity/sequence_from_node/sequence_set_default_parameters/
  find_input_footage
- move avframeptr.h to src/common/src (shared by codec and render)
- node transition pluginSupport stubs bridge the real oakplugin
  headers; all oaknode-building standalone trees add src/plugin and
  link oakplugin into their test binaries
- plugin tests self-sufficient (ipc shim, OfxHost force_load,
  PRE_TEST discovery, OCIO env); timeline standalone gains
  render/c_api
- restore ffmpegdecoder.cpp in src/codec/src/ffmpeg/CMakeLists.txt
  (dropped in 3d004c081, caused jump-to-0 in decoder/encoder tests)

All six standalone trees green: codec 22, audio 40, task 110,
render 49, timeline 121, plugin 100.
This commit is contained in:
2026-08-07 22:18:36 +08:00
parent 0462842f8c
commit fd2111d560
54 changed files with 6014 additions and 324 deletions
+25
View File
@@ -98,3 +98,28 @@ ldd liboakengine.so | grep oak # 只见 oak* 模
- instanceShadertoy 类插件(CI 里可用的)创建/参数/渲染一帧非空。
- progress:回调触发与 cancel。
- `oakplugin_debug_alive_count()` 泄漏断言。
## 6. 实施现状(2026-08-05
已完成。src/plugin/src/ 六个类(olivehost/oliveplugininstance/
oliveclip/paraminstance/image/pluginprogressreporter)全部去Qt
QMessageBox/QApplication 依赖删除,改为 §4 裁决的 facade 回调
装配。C ABI 落在 include/plugin/{error,host,instance}.h
OakPluginInstance 为引用计数值句柄(ctx/addref/release/
abi_version)。
偏离手册之处:
- paraminstance 不直接持有 Node*,改持 OakNodeNode 值句柄,参数
读写全部经 oaknode C ABInode↔instance 的身份路由用新增的
oaknode_node_identity() 注册表实现。
- oliveclip 的纹理为 OakRenderTexture 值句柄,oakrender 因此补了
texture/copier/ticket 一族 C API。
- oaknode 的 transition stubsrc/node/transition/pluginSupport/
桥接 oakplugin 真身头,liboaknode 运行期引用 oakplugin 符号
dynamic_lookup);所有构建 oaknode 的 standalone 树都要把
src/plugin 加进构建,测试二进制必须链接 oakplugin。
验证:build-oakplugin 100/100codec 22/22、audio 40/40、
task 110/110、render 49/49、timeline 121/121(均含 oakplugin
接入后的全量回归)。
+32
View File
@@ -285,3 +285,35 @@ ColorManager)去Qt化过程中的删除与语义变化,迁移调用方时需
必须同时链两个库(各 standalone 驱动已接线)。
- oakcommon xml C API 新增 get_native 借用访问器(C++ only),
oaktimeline 的 load/save 经它取回 XmlStreamReader/Writer。
## oakplugin 去Qt化的删除与语义变更(2026-08-05)
- olivehost/oliveplugininstance/oliveclip/paraminstance/image/
pluginprogressreporter 六个类去QtQMessageBox/QApplication 全部
删除,宿主消息与 undo 提交改为 facade 回调
set_host_message_handler / set_undo_submit_callback /
ActiveViewerProvider / set_main_thread_id)。
- paraminstance 的参数桥改走 oaknode C APInode_ 为 OakNodeNode
值句柄);undo 命令走 oakundo C APInode↔instance 路由用新增的
oaknode_node_identity() 注册表。
- oliveclip 的纹理改 OakRenderTexture 值句柄;为此 oakrender C API
新增 texture is_dummy/get_frame/width/height/fb_format/
wrap_native 与 copier/ticket 族。
- oaknode C API 新增 get_input_at_time/set_input_at_time_undoable
(_into)/node_identity/sequence_from_node/
sequence_set_default_parameters/find_input_footage。
- avframeptr.h 从 src/codec/src/ffmpeg/ 上移到 src/common/src/
codec 与 render 共用),transition 里的旧拷贝已删。
- 新 C ABIinclude/plugin/{error,host,instance}.h
OakPluginInstance 为引用计数值句柄。
- oaknode 的 transition stubsrc/node/transition/pluginSupport/
{oliveplugininstance,olivehost}.h)改为桥接 oakplugin 真身头,
liboaknode 因此引用 oakplugin 符号;凡构建 oaknode 的 standalone
树(codec/audio/task/render/timeline)都必须
add_subdirectory(src/plugin),且测试二进制要链接 oakplugin,
否则 dynamic_lookup 悬空符号 jump-to-0EXC_BAD_ACCESS
address=0x0)。
- 修复 ffmpegdecoder.cpp 被 3d004c081 误删出
src/codec/src/ffmpeg/CMakeLists.txt 的回归:FFmpegDecoder 构造
函数在 flat namespace 悬空,decoder probe/decode/encoder
roundtrip 三个测试 jump-to-0。