This document summarizes the current read-path coverage in OpenMeta.
It is meant to answer four basic questions:
- which containers are scanned
- which metadata families are decoded into
MetaStore - where display-name mapping exists
- what can be dumped or exported today
Yes: supported in current codePartial: supported, but still bounded or best-effortNo: not supported yet
Host integrations can query the same kind of runtime support information with
openmeta/metadata_capabilities.h. That API reports read, structured decode,
transfer preparation, target edit, and raw-preservation support by target
format and metadata family.
For the public camera RAW read-depth plan against ExifTool-style coverage, see raw_read_parity_plan.md.
Current tracked-gate status:
- EXIF tag-id compare gates are passing on tracked
HEIC/HEIF,CR3, and mixed RAW corpora. - Standalone EXIF/TIFF payload recovery is covered for files with a short
non-TIFF prefix or a malformed JPEG prefix before the
Exifpreamble. - EXR header metadata compare is passing for the documented name/type/value-class contract.
- Sidecar export paths (
losslessandportable) are covered by baseline and smoke tests. - MakerNote coverage is tracked by baseline gates with broad vendor support; unknown vendor tags are preserved as raw metadata for lossless workflows. Current public naming includes Fujifilm flash white-balance and native RAF firmware fields, plus selected model-specific Sony correction-offset routes.
- Decoded vendor MakerNote sub-IFDs are interpreted/query metadata. Writers do not reconstruct MakerNote blobs from those decoded fields; they preserve the original raw MakerNote payload when it is present.
- Metadata-family presence gates for XMP, ICC, IPTC-IIM, Photoshop IRB, and
JUMBF/C2PA are clean on the tracked still-image corpus. Current read coverage
includes EXIF/TIFF-carried ICC/IPTC payloads, bare JPEG APP1 XMP packets, and
XMP packets using alternate
xmpmetanamespace prefixes. - BMFF edge-path tests include
ilocconstruction-method-2 relation variants and safe-skip handling for invalid references.
| Container / input type | Block discovery | Structured decode in simple_meta_read(...) |
Notes |
|---|---|---|---|
| JPEG | Yes | Yes | EXIF, standard and bare APP1 XMP, extended XMP, ICC, MPF, Photoshop IRB, comments, vendor APP blocks, and bounded JUMBF/C2PA |
| PNG | Yes | Yes | EXIF, XMP, ICC, structured PNG text, and bounded JUMBF/C2PA |
| WebP | Yes | Yes | EXIF, XMP, ICC, and bounded JUMBF/C2PA |
| GIF | Yes | Partial | XMP, ICC, and structured comments |
| TIFF / DNG / TIFF-based RAW | Yes | Yes | EXIF, MakerNote, XMP, IPTC, Photoshop IRB, ICC, GeoTIFF, and bounded JUMBF/C2PA |
| CRW / CIFF | Yes | Partial | Recursive CIFF directories, stable scalar/subtable decode, derived EXIF bridge, and bounded native Canon CIFF naming/projection |
| RAF / X3F | Partial | Partial | RAF includes header-declared preview-JPEG EXIF/XMP discovery, FujiIFD/TIFF follow path, native RAF header/directory geometry tags, RAFData geometry projection, and standalone XMP fallback; X3F includes header fields, known PROP properties, section-directory JPEG metadata follow path, and legacy embedded-EXIF fallback |
| JP2 | Yes | Yes | EXIF, XMP, IPTC, ICC, and GeoTIFF |
| JXL | Yes | Yes | EXIF, XMP, and bounded JUMBF/C2PA; supported brob wrapped metadata is decoded |
| HEIF / AVIF / CR3 | Yes | Partial | EXIF, XMP, ICC, CR3 maker blocks, BMFF derived fields including avif/avis/avio AVIF brands, and bounded JUMBF/C2PA |
| EXR | n/a via scan_auto(...) |
Yes | Header attributes only; no pixel decode |
| Metadata family | Decode | Name mapping | Dump / export | Notes |
|---|---|---|---|---|
EXIF (MetaKeyKind::ExifTag) |
Yes | Yes | Yes | Standard EXIF plus pointer IFDs, including current EXIF 3.1 learning/development/correction/noise tag names and bounded correction/noise value labels |
| MakerNote | Partial / Yes | Partial / Yes | Lossless yes; portable limited | Broad vendor coverage; unknown tags may remain raw; selected version/firmware payloads, live-vendor scalar fields, Fujifilm flash white-balance and native RAF firmware names, selected Sony correction-offset routes, Reconyx scalar/string-coded fields, Microsoft stitch fields, Nintendo category fields, Sanyo public-context scalar fields, current Canon RF/Nikon Z lens labels, and an ambiguous Pentax Sigma/Samsung/Tokina lens-family label have bounded display helpers |
XMP (MetaKeyKind::XmpProperty) |
Yes | Native schema/path | Yes | Requires Expat at build time |
ICC (IccHeaderField, IccTag) |
Yes | Yes | Yes | Header fields plus tag table; raw tag payload preserved |
IPTC-IIM (IptcDataset) |
Yes | Yes | Yes | Raw dataset bytes preserved |
Photoshop IRB (PhotoshopIrb) |
Yes | Partial / Yes | Yes | Raw resources preserved, bounded interpreted subset, fixed-layout, Lightroom workflow, IPTC-NAA byte count, working-path and numbered clipping-path record summaries, descriptor-header, scalar/class/alias/reference, enum, and nested list/object summaries, embedded IPTC/XMP/ICC decode |
| MPF | Yes | Yes | Yes | Basic TIFF-IFD decode |
GeoTIFF (GeotiffKey) |
Yes | Yes | Yes | GeoKeyDirectoryTag decode |
BMFF derived fields (BmffField) |
Yes | Yes | Yes | ftyp brand names including avif/avis/avio AVIF-compatible brands, item-info, ipco, ipma, iref, grpl, iloc/idat, bounded grid/iovl/iden construction semantics, graph summaries with component roles, member item IDs, semantic/relation counts and policy hints, aux semantics, primary item properties, primary metadata-carrier flags, primary sidecar summaries, primary-scene summaries, and bounded primary-linked image roles |
JUMBF / C2PA (JumbfField, JumbfCborKey) |
Partial | Yes | Yes | Draft structural and semantic layer with box labels; not full conformance |
EXR attributes (ExrAttribute) |
Yes | Native names | Yes | Header attributes only |
OpenMeta now does more than a pure derived-EXIF bridge:
- common native CIFF tags are named
- a bounded set of native subtables is projected
- stable scalar native CIFF fields are decoded where the layout is clear
It is still a partial lane compared to the deepest legacy Canon tooling.
OpenMeta now follows both RAF metadata carriers that matter for common camera files:
- the header-declared preview JPEG is scanned for standard EXIF/XMP-style metadata
- the header-declared FujiIFD/TIFF area is scanned for native RAF/raw fields
- native RAF header, directory, and RAFData-derived fields are classified as source-specific metadata for rendered-transfer safety
Deeper model-specific RAF sections remain a partial lane.
OpenMeta now has a bounded native Sigma X3F lane:
- common X3F header fields are decoded as
x3f_header - stable header-extension adjustment fields are decoded as
x3f_header_ext - known
PROPproperties are decoded asx3f_prop - section-directory JPEG metadata is followed for embedded EXIF/XMP-style metadata blocks, with the older embedded-EXIF scan kept as fallback
Deeper image-processing/compression sections remain partial and should only be promoted when fields can be typed, named, and safety-classified.
OpenMeta preserves raw IRB resources and also decodes a bounded interpreted subset. That subset includes common fixed-layout resources and descriptor-header summaries such as:
Photoshop2InfoPhotoshop2ColorTableResolutionInfoAlphaChannelsNamesDisplayInfoPStringCaptionBorderInformationBackgroundColorVersionInfoPrintFlags- print-flag byte fields
EffectiveBWQuickMaskInfoRawImageModeJPEG_QualityGridGuidesInfo- legacy halftone, transfer-function, duotone-image, and EPS byte summaries
PhotoshopBGRThumbnail/PhotoshopThumbnailheadersSpotHalftoneUnicodeAlphaNamesAlphaIdentifiersJumpToXPEPPrintScaleInfoPixelInfoAutoSaveFilePathAutoSaveFormatXMLDataImageReadyVariablesImageReadyDataSetsLightroomWorkflowIPTCDataBytesColorSamplersResource/ColorSamplersResource2headers and recordsWorkingPathand numbered path resources as byte counts plus record counts/selectors- descriptor-header summaries, bounded scalar, class, alias, enum, and
objreference item bodies, raw-data descriptor byte counts, and bounded nested list/object traversal with item paths, depths, list indices, and parsed-value counts for resources such asLayerComps,MeasurementScale,HDRToningInfo,PrintInfo,TimelineInfo,SheetDisclosure,OnionSkins,CountInfo,PrintInfo2,PrintStyle,PathSelectionState, andOriginPathInfo ChannelOptionsPrintFlagsInfoClippingPathNameMacintoshPrintInfo,MacintoshNSPrintInfo,WindowsDEVMODE,AlternateDuotoneColors,AlternateSpotColors, ObsoletePhotoshopTag1, ObsoletePhotoshopTag2, and ObsoletePhotoshopTag3 byte counts- embedded IPTC-NAA, ICC, EXIF, EXIF2, and XMP resource byte counts
When enabled, embedded IPTC-IIM, XMP, and ICC payloads in IRB resources are also decoded into their regular OpenMeta entry families.
Current Photoshop IRB interpretation status:
| Resource area | Status | Notes |
|---|---|---|
| Raw IRB resources | Preserved | Every accepted resource keeps a lossless PhotoshopIrb raw entry. |
| Embedded IPTC/XMP/ICC/EXIF carriers | Interpreted where enabled | Payload bytes remain preserved; enabled decoders also emit regular family entries. |
| Fixed-layout scalar/string resources | Interpreted | Resolution, alpha/caption strings, version, print flags, quick mask, JPEG quality, URL/list, pixel info, autosave strings, XMLData, ImageReady text, Lightroom workflow text, and similar bounded fields. |
| Geometry/display/color-sampler/path headers | Interpreted / record-summary | Display/grid/thumbnail/color-sampler headers are decoded; path resources expose byte counts, record counts, and selectors without interpreting Bezier payloads. |
| Descriptor-backed Photoshop resources | Descriptor header plus bounded item summaries | Descriptor version, remaining byte count, class ID/name, item count, complete value bodies for bool, long, comp, doub, UntF, TEXT, enum, type, and GlbC, opaque byte counts for alis and tdta, nested object/list paths, depths, list indices, list/object counts, and parsed-value count fields are emitted. Bounded obj streams expose ordered property, class, enumerated, offset, identifier, index, and name references with paths, depths, indices, class IDs/names, subtype values, and parsed counters. Alias/raw payload contents and full Photoshop action execution semantics remain out of scope for this subset. |
| Legacy halftone/transfer/duotone/EPS resources | Header / byte-count only | OpenMeta emits byte counts and first header words where safe, without claiming full Photoshop semantics. |
| Proprietary, obsolete, or OS-specific resources | Raw-preserved, selected byte counts | Kept losslessly; selected stable resource IDs expose byte counts without claiming payload semantics. |
This is useful, but it is still not full Photoshop-resource parity.
Descriptor reference traversal accepts at most 64 items in one obj value
and 128 reference items across one descriptor. Unknown, incomplete, or excess
reference data stops traversal and emits DescriptorItemParseTruncated; a
partially decoded reference element is never emitted.
OpenMeta now has a bounded semantic model on top of raw item discovery:
ftyp.*, including brand names and compatible-brand counts- primary item properties, primary metadata-carrier flags, primary sidecar counts/flags for linked metadata and image sidecars, content-bound C2PA/JUMBF sidecar policy hints, and compact primary-scene node/edge summaries
ipcoproperty-container summaries with total, known, unknown, and per-known-type property countsipmaitem-property association rows with item ids, property indices, essential flags, and known property type names- per-known-property
ipma.<type>association, primary-association, and essential-count rollups for common primary-item properties iinf/infeitem-info rows- item type-name and semantic labels for EXIF, XMP, JUMBF, C2PA, ICC profile, image, URI, auxiliary, thumbnail, derived-image, and content-description items
- aggregate item semantic counters for known, metadata, image, EXIF, XMP, JUMBF, C2PA, ICC profile, auxiliary, derived, thumbnail, content-description, URI, and JSON roles
- whole-scene item graph counters for known items, image/metadata/content-bound metadata nodes, selected image-role nodes, relation edges, item groups, and conservative content-bound metadata / multi-image policy hints including explicit multi-image policy text
- bounded scene graph component counters for observed relation graph nodes, connected components, image and multi-image components, isolated image nodes, components with content-bound metadata, per-component role text, ordered member item IDs, known/unknown and semantic node counts, isolated state, typed auxiliary/derived/thumbnail/content-description edge counts, alpha/depth/disparity/matte auxiliary edge counts, primary graph-component nodes/edges, primary component content-bound flags, primary component multi-image candidates and policy text, and primary component content-bound metadata policy
- typed
iref.<type>.*rows, including direction-correct endpoint roles and named item-id aliases forauxl,dimg,thmb, andcdsc; literalfrom_item_idandto_item_idrows remain unchanged - bounded
grplitem-group rows and per-group-type summaries, including group semantics and ordered entity roles foraltr,ster, andpymd - bounded
iloc/idatitem-data layout summaries, including construction methods, extent counts, total extent byte counts, idat byte counts, and primary-item location aliases - bounded
grid,iovl, andidenderived-image construction rows with ordereddimgsource IDs, descriptor/source/construction validity, grid rows, columns, tile coordinates and output size, overlay canvas/background and signed source offsets, identity sources, primary aliases, bounded method-2 item-offset descriptor chains, descriptor reference depth, derived-graph cycle/missing-source/truncated-reference validation, and a source-boundcontainer_graphconcept for query/transfer diagnostics tilitiled-image items and boundedtilCversion-0 configuration fields, including tile width/height, up to eight extra dimensions, required single-ispe/single-tilCassociation checks, ceil-divided tile rows/columns, overflow-checked expected tile counts,dinf/dref/detimapping, internaltile_item_typeand nestedtipaassociations, bounded external URL components, logical-ilocoffset tables, explicit or sequentially inferred tile sizes, empty-tile state, complete-configuration validity, and source-bound query/transfer diagnostics- graph summaries
auxC-typed auxiliary semantics- bounded primary-linked image-role fields, separate primary inbound derived-image and outbound derived-source summaries, compact primary sidecar aggregate fields, and compact primary-scene aggregate fields
- primary
colrsummaries fornclx/nclccolor fields and ICC profile-size carriers - primary
pasp,pixi, andclapitem-property summaries for pixel aspect ratio, pixel component bit depth, and clean aperture
This is intentionally smaller than a full QuickTime/BMFF semantic model.
Derived descriptors are interpreted from complete method-0 file extents,
method-1 idat extents, and bounded method-2 item-offset chains. Method-2
resolution follows ordered iref iloc references, rejects reserved or
out-of-range indexes, detects recursion cycles, validates every source range,
and never materializes a complete logical item. External data references other
than bounded tiled-image deti URL state and incomplete extent inventories
remain structural-only. Tiled-image offset-table validation scans at most
262144 entries and emits at most 64 rows; URL components retain at most 512
bytes for field output. Larger valid structures remain visible through counts
and truncation fields but do not receive complete-configuration validity.
OpenMeta decodes:
- direct
Exif - direct
xml - direct
jumb - direct
c2pa - wrapped
brobforms for those same realtypes
Other brob realtypes are still out of scope.
Current support is intentionally draft:
- structural BMFF box decode
- JUMBF box labels from parsed
jumdboxes - bounded CBOR traversal
- draft
c2pa.semantic.*projection - draft verify scaffolding with opt-in trusted certificate-chain enforcement
What this means in practice:
- OpenMeta can expose useful manifest / claim / signature / ingredient shape information
- OpenMeta can report signature verification and certificate-chain trust as
separate signals, or fail verification when
verify_require_trusted_chain/--c2pa-verify-require-trusted-chainis set - OpenMeta does not yet claim full C2PA manifest semantics or full policy validation
| Tool | Purpose | Current state |
|---|---|---|
metaread |
Human-readable metadata listing | Shows decoded entries with mapped names where available |
metavalidate |
Metadata validation | Reports decode-status and validation issues with machine-readable issue codes |
metadump |
Sidecar and preview dump tool | Supports lossless and portable sidecar output plus preview extraction |
thumdump |
Preview extractor | Extracts embedded preview candidates |
metatransfer |
Transfer/edit smoke tool | Exercises the transfer core for supported target families |
- independently authored conformance-file validation for the recently standardized BMFF tiled-image layout
- additional
JXL brobrealtypes beyondExif,xml,jumb, andc2pa - full
JUMBF/C2PAsemantics and policy validation - deeper RAF model-specific native tables and X3F image-processing sections beyond the current bounded carrier/header/property lanes
- full Photoshop action execution semantics, opaque alias/raw descriptor payload interpretation, and broader IRB interpretation beyond the current subset