EXR Metadata Contract¶
Goal¶
Define a stable representation for OpenEXR header metadata in MetaStore so
read/export workflows are deterministic and lossless.
Contract constant: kExrCanonicalEncodingVersion == 1.
Key Space¶
Each EXR attribute is keyed as MetaKeyKind::ExrAttribute with:
part_indexattribute
name
Wire Contract¶
For EXR entries:
Origin::wire_type.family = WireFamily::OtherOrigin::wire_type.code = EXR type codeOrigin::wire_count = raw attribute byte size
Unknown/custom EXR attribute types are preserved as:
MetaValueKind::Bytesraw payloadoptional
Origin::wire_type_namewith original EXR type string
Canonical Value Mapping¶
int-> scalarI32float-> scalarF32double-> scalarF64rational-> scalarSRationalstring-> text (ASCII/UTF-8/Unknown best-effort)v2*/v3*-> numeric arraysm33*/m44*-> numeric arrays (row-major)box2*-> arrays[min.x, min.y, max.x, max.y]compression/lineOrder/envmap/deepImageState-> scalarU8timecode->U32[2]keycode->I32[7]tiledesc->U32[3](x size, y size, mode)complex payloads (for example
chlist,preview,stringvector) remain bytes in core storage
Reference¶
Decoder API:
openmeta/exr_decode.hEXR tests:
tests/exr_decode_test.ccInterop naming:
interop_api.rst