@@ -813,8 +813,8 @@ Read release gate:
813813 - ` SimpleMetaRead.* `
814814 - ` XmpDecodeTest.* `
815815 - ` JumbfDecode.* `
816- - ` OiioAdapter.* `
817816 - ` OcioAdapter.* `
817+ - ` ExrAdapter.* `
818818 - ` ValidateFile.* `
819819
820820Build + run:
@@ -1059,84 +1059,56 @@ If you are building offline (or want strict control of the build environment),
10591059install ` scikit-build-core ` into your Python environment and enable:
10601060` -DOPENMETA_WHEEL_NO_BUILD_ISOLATION=ON ` .
10611061
1062- ## Interop Adapters
1062+ ## Interop Surfaces
10631063
1064- Interop adapter APIs for ASF integration targets :
1064+ Interop surfaces are split deliberately :
10651065
1066- - ` openmeta/interop_export.h ` : shared traversal and naming styles
1067- (` Canonical ` , ` XmpPortable ` , ` Oiio ` ).
1068- - ` openmeta/oiio_adapter.h ` : flat OIIO-style name/value export.
1069- - ` openmeta/ocio_adapter.h ` : deterministic OCIO-style metadata tree export.
1070- - ` openmeta/exr_adapter.h ` : EXR-native per-part attribute export.
1066+ - export-only naming/traversal surface:
1067+ ` openmeta/interop_export.h ` with the shared export naming styles. This is
1068+ the intended base for host-owned metadata mapping layers.
1069+ - export-only adapter:
1070+ ` openmeta/ocio_adapter.h ` for deterministic OCIO-style metadata trees.
1071+ - host-apply adapter:
1072+ ` openmeta/exr_adapter.h ` for EXR-native per-part attribute export.
1073+ - direct bridge:
1074+ ` openmeta/dng_sdk_adapter.h ` for applications that already use Adobe DNG
1075+ SDK objects/files.
1076+ - narrow translator:
1077+ ` openmeta/libraw_adapter.h ` for explicit orientation mapping into LibRaw's
1078+ flip convention.
10711079
10721080Current Python binding entry points:
10731081
10741082- ` Document.export_names(style=..., include_makernotes=...) `
1075- - ` Document.oiio_attributes(...) `
1076- - ` Document.unsafe_oiio_attributes(...) `
1077- - ` Document.oiio_attributes_typed(...) `
1078- - ` Document.unsafe_oiio_attributes_typed(...) `
10791083- ` Document.ocio_metadata_tree(...) `
10801084- ` Document.unsafe_ocio_metadata_tree(...) `
10811085- ` Document.dump_xmp_sidecar(format=...) `
10821086
1083- Current C++ adapter entry points:
1084-
1085- - ` openmeta/oiio_adapter.h ` :
1086- - safe API: ` collect_oiio_attributes_safe(..., InteropSafetyError*) `
1087- - unsafe API: ` collect_oiio_attributes(...) `
1088- - ` collect_oiio_attributes(..., const OiioAdapterRequest&) ` (stable flat request API)
1089- - ` collect_oiio_attributes(..., const OiioAdapterOptions&) ` (advanced/legacy shape)
1090- - safe typed API: ` collect_oiio_attributes_typed_safe(..., InteropSafetyError*) `
1091- - unsafe typed API: ` collect_oiio_attributes_typed(...) `
1092- - ` collect_oiio_attributes_typed(..., const OiioAdapterRequest&) ` (typed values)
1093- - ` collect_oiio_attributes_typed(..., const OiioAdapterOptions&) ` (typed values)
1094- - typed payload model: ` OiioTypedValue ` / ` OiioTypedAttribute `
1095- - prepared transfer bridge:
1096- ` collect_oiio_transfer_payload_views(...) `
1097- returns one zero-copy payload list over a ` PreparedTransferBundle `
1098- for host/plugin write integrations
1099- - owned transfer bridge:
1100- ` build_oiio_transfer_payload_batch(...) `
1101- copies that same payload contract into one stable owned batch for caching
1102- or cross-layer handoff
1103- - persisted payload bridge:
1104- ` collect_oiio_transfer_payload_views(const PreparedTransferPayloadBatch&, ...) `
1105- and ` replay_oiio_transfer_payload_batch(...) `
1106- consume the same semantic payload contract after
1107- ` serialize_prepared_transfer_payload_batch(...) ` /
1108- ` deserialize_prepared_transfer_payload_batch(...) `
1087+ Current C++ interop entry points:
1088+
1089+ - ` openmeta/interop_export.h ` :
1090+ - ` visit_metadata(...) `
1091+ - use the shared naming styles when a host-owned metadata mapping layer
1092+ needs deterministic exported names
11091093- ` openmeta/exr_adapter.h ` :
11101094 - ` build_exr_attribute_batch(...) `
1111- exports one owned EXR-native attribute batch from ` MetaStore `
1112- - the batch carries:
1113- ` part_index ` , ` name ` , ` type_name ` , ` value ` bytes, and ` is_opaque `
11141095 - ` build_exr_attribute_part_spans(...) `
1115- groups the batch into deterministic contiguous per-part spans
11161096 - ` build_exr_attribute_part_views(...) `
1117- exposes zero-copy grouped per-part views over the same batch
11181097 - ` replay_exr_attribute_batch(...) `
1119- replays the grouped batch through explicit host callbacks
1120- - unlike the prepared JPEG/TIFF/JXL transfer path, this bridge is
1121- store-based because typed ` MetaValue ` entries must be re-encoded into EXR
1122- attribute bytes
1123-
1124- Python typed behavior:
1125- - ` Document.oiio_attributes(...) ` is safe-by-default and raises on unsafe raw
1126- byte payloads; use ` Document.unsafe_oiio_attributes(...) ` for legacy/raw
1127- fallback output.
1128- - ` Document.oiio_attributes_typed(...) ` decodes text values to Python ` str ` in
1129- safe mode and raises on unsafe/invalid text bytes.
1130- - ` Document.unsafe_oiio_attributes_typed(...) ` returns raw text bytes for
1131- explicit unsafe workflows.
1132- - ` Document.ocio_metadata_tree(...) ` is safe-by-default and raises on unsafe
1133- raw byte payloads; use ` Document.unsafe_ocio_metadata_tree(...) ` for
1134- legacy/raw fallback output.
1098+ - the batch carries:
1099+ ` part_index ` , ` name ` , ` type_name ` , ` value ` bytes, and ` is_opaque `
11351100- ` openmeta/ocio_adapter.h ` :
11361101 - safe API: ` build_ocio_metadata_tree_safe(..., InteropSafetyError*) `
11371102 - unsafe API: ` build_ocio_metadata_tree(...) `
1138- - ` build_ocio_metadata_tree(..., const OcioAdapterRequest&) ` (stable flat request API)
1139- - ` build_ocio_metadata_tree(..., const OcioAdapterOptions&) ` (advanced/legacy shape)
1103+ - ` build_ocio_metadata_tree(..., const OcioAdapterRequest&) `
1104+ - ` build_ocio_metadata_tree(..., const OcioAdapterOptions&) `
1105+
1106+ Python interop behavior:
1107+ - ` Document.export_names(style=ExportNameStyle.FlatHost, ...) ` exposes the
1108+ shared flat-host naming contract used by host-side metadata mapping layers.
1109+ - ` Document.ocio_metadata_tree(...) ` is safe-by-default and raises on unsafe
1110+ raw byte payloads; use ` Document.unsafe_ocio_metadata_tree(...) ` for
1111+ legacy/raw fallback output.
11401112
11411113Current C++ sidecar entry points:
11421114
@@ -1255,36 +1227,20 @@ Draft C++ transfer entry points (prepare/emit scaffold):
12551227 without pushing route parsing into host adapters.
12561228 - ` replay_prepared_transfer_package_batch(...) ` is the matching target-neutral
12571229 callback replay path over the same persisted batch.
1258- - ` collect_oiio_transfer_package_views(...) ` is the first host bridge above
1259- that persisted batch: it now maps the target-neutral semantic package view
1260- into OIIO-oriented names, so the host no longer depends on the original
1261- prepared bundle lifetime or route parsing.
1262- - ` collect_oiio_transfer_payload_views(...) ` and
1263- ` build_oiio_transfer_payload_batch(...) ` now sit on top of the generic
1264- semantic payload layer rather than re-classifying prepared blocks inside
1265- the OIIO adapter.
1266- - ` replay_oiio_transfer_package_batch(...) ` is the higher-level consume path
1267- above that same persisted batch, replaying semantic package chunks through
1268- explicit host callbacks in deterministic output order.
1269- - ` PreparedTransferAdapterView ` is the parallel adapter-facing surface for
1270- host integrations that want explicit per-block operations without route
1271- parsing.
1272- - ` collect_oiio_transfer_payload_views(...) ` is the first thin
1273- host-facing bridge on top of that adapter view, exposing one zero-copy
1274- OIIO-oriented semantic payload list without adding new transfer core
1275- logic.
1276- - ` build_oiio_transfer_payload_batch(...) ` is the owned form of that
1277- bridge when the host needs payload lifetime independent from the
1278- prepared bundle.
1279- - ` build_exr_attribute_batch(...) ` ,
1280- ` build_exr_attribute_part_spans(...) ` ,
1281- ` build_exr_attribute_part_views(...) ` , and
1282- ` replay_exr_attribute_batch(...) ` are the EXR-native bridge for
1283- OpenEXR/OIIO header-attribute workflows. They stay outside the
1284- ` PreparedTransferBundle ` path because EXR metadata is attribute-native,
1285- not block-native.
1286- - ` build_prepared_transfer_emit_package(...) ` ,
1287- ` build_prepared_transfer_adapter_view(...) ` ,
1230+ - OpenMeta no longer ships an in-library host-specific payload/package
1231+ bridge above the target-neutral package and adapter surfaces.
1232+ - ` PreparedTransferAdapterView ` is the parallel adapter-facing surface for
1233+ host integrations that want explicit per-block operations without route
1234+ parsing.
1235+ - ` build_exr_attribute_batch(...) ` ,
1236+ ` build_exr_attribute_part_spans(...) ` ,
1237+ ` build_exr_attribute_part_views(...) ` , and
1238+ ` replay_exr_attribute_batch(...) ` are the EXR-native bridge for
1239+ OpenEXR header-attribute workflows. They stay outside the
1240+ ` PreparedTransferBundle ` path because EXR metadata is attribute-native,
1241+ not block-native.
1242+ - ` build_prepared_transfer_emit_package(...) ` ,
1243+ ` build_prepared_transfer_adapter_view(...) ` ,
12881244 ` emit_prepared_transfer_adapter_view(...) ` ,
12891245 ` build_prepared_bundle_jpeg_package(...) ` ,
12901246 ` build_prepared_bundle_tiff_package(...) ` , and
@@ -1328,27 +1284,29 @@ Current adapter/name-policy behavior:
13281284- ` ExportNamePolicy::ExifToolAlias ` applies compatibility aliases for
13291285 interop-name parity workflows.
13301286- ` ExportNamePolicy::Spec ` preserves spec/native names.
1331- - OIIO adapter keeps numeric unknown names (for example ` Exif_0x.... ` ) even
1332- when value formatting is empty, and keeps ` Exif:MakerNote ` in spec mode .
1287+ - Shared flat-host interop naming keeps numeric unknown names (for example
1288+ ` Exif_0x.... ` ) for parity workflows .
13331289- When DNG context is detected (` DNGVersion ` present in the same IFD), DNG
13341290 color/CCM tags are exported with dedicated adapter namespaces:
1335- ` dng:* ` (portable) and ` DNG:* ` (OIIO) .
1291+ ` dng:* ` (portable) and a flat host-style variant .
13361292- ICC entries are exported with adapter-friendly names:
1337- ` icc:* ` (portable) and ` ICC:* ` (OIIO) , alongside canonical ` icc:header:* `
1338- / ` icc:tag:* ` naming.
1293+ ` icc:* ` (portable) and a flat host-style variant , alongside canonical
1294+ ` icc:header:* ` / ` icc:tag:* ` naming.
13391295
13401296Adapter-focused tests (public tree):
13411297
13421298``` bash
13431299cmake --build build-tests --target openmeta_tests
1344- ./build-tests/openmeta_tests --gtest_filter=' InteropExport.*:OiioAdapter.*:OcioAdapter.*'
1300+ ./build-tests/openmeta_tests --gtest_filter=' InteropExport.*:OcioAdapter.*:ExrAdapter.*'
1301+ ./build-tests/openmeta_tests --gtest_filter=' ExrAdapter.*'
13451302./build-tests/openmeta_tests --gtest_filter=' CrwCiffDecode.*'
13461303```
13471304
13481305Notes:
1306+ - ` InteropExport ` tests cover alias/spec behavior and the flat host-style
1307+ naming contract.
1308+ - ` ExrAdapter ` tests cover EXR batch export and replay behavior.
13491309- ` CrwCiffDecode ` tests cover CRW/CIFF derived EXIF mapping for legacy Canon RAW.
1350- - ` OiioAdapter ` tests cover stable handling of empty-value attributes needed by
1351- interop parity workflows.
13521310
13531311## Doxygen (Optional)
13541312
0 commit comments