Capture Synchronization Milestone¶
Audit date: 2026-09-14. Original observations below describe C++ 0.5.4. The 0.5.5 update closes the identified portable-output gaps without adding tags or changing signatures, ABI 3 or host synchronization responsibilities. Seventeen explicit reverse APIs now cover 81 distinct ExifIFD tags, including camera text and excluding GPS, dates, geometry, IPTC and MakerNotes. This count does not measure all-EXIF or competitor coverage.
Development/correction and learning lifecycle in 0.8.11¶
The six existing development/correction fields A40D-A412 and LearningOptOutIn 9287 now use translation contract 2. Exact valid clean native matches gain Dirty while retaining values, wire hints/counts, origin and endian provenance. Dirty matches remain unchanged. Complete ReplaceExisting deletion retains typed native intent even when a key is absent; clean tombstones are promoted and dirty ones reused. Promotions and deletion intents consume operation limits, and new intents also consume entry limits. Conflict, source-mask and rollback rules remain.
Selected sources still require explicit host exif_version 300 or 310; translation never infers or changes ExifVersion or processing history. These APIs do not validate a complete destination EXIF profile. All seven fields use selective TIFF/BigTIFF/DNG merge and removal in both safety modes, including restored snapshots. The shared native allowlist grows from 77 to 84. Existing/template DNG version retention, source-pixel filters, ABI 4, snapshot v1 and host-owned synchronization remain unchanged.
LearningOptOutIn uses checked 16-bit word conversion from native provenance to canonical little endian and then to the target TIFF byte order. Unrelated UNDEFINED payloads remain opaque. Canonical encoding validates learning values before copying them.
Native EXIF text/version lifecycle in 0.8.10¶
The 13 existing text/version fields now have translation contract 2. Exact clean native matches gain Dirty while retaining bytes, encoding and wire provenance, including comment BOMs/padding and valid ASCII type 129. Complete eligible deletion retains typed intent even for absent keys. All 13 use the native TIFF/BigTIFF/DNG merge/removal path; the shared allowlist grows from 66 to 77. Explicit version changes still enforce charset and companion rules. Existing/template DNG preparation retains the target DNGVersion unless an eligible dirty version requests replacement. Fresh scaffolds retain their version-generation policy. ABI 4, snapshot v1 and host synchronization remain unchanged. See Metadata Translation.
Native structured capture lifecycle in 0.8.9¶
The four existing structured fields now have translation contract 2: exact clean native values gain Dirty, and complete eligible absent deletion retains typed intent. All four enter the native TIFF/BigTIFF/DNG merge/removal allowlist. Existing numeric endian conversion preserves string bytes and per-string BOMs. Rendered-image source filtering of CFA remains; filtering alone does not remove unselected destination metadata during selective merge. Explicit dirty native deletion supplies that intent. ABI 4, snapshot v1 and host synchronization remain unchanged. See Metadata Translation.
Typed editing and new fields in 0.5.6¶
The exact-key editor validates ordered Add/Set/Remove operations and the complete candidate before publication. It preserves source identity, updates wire hints and supports aliased output. Three additional capture fields and six environment fields extend the combined workflow to 55 unique native targets. Unknown raw rational denominators are preserved before reduction. The fixture covers typed XMP edits, twelve translators and serialized snapshots through JPEG, classic TIFF and BigTIFF add/replace paths. Python exposes both new translators; the installed shared-library check exercises the new C++ entry points. See Metadata Editing and Metadata Translation for contracts and limits. The earlier audit observations below retain their historical 46-target scope.
Fixes in 0.5.5¶
Primary ExifIFD FNumber, FocalLength and DigitalZoomRatio emit exact fractions.
Native rational and sensitivity scalar types/counts and ranges are checked
before claiming generated properties. Under CanonicalizeManaged, valid
generated replacements remove legacy scalar/indexed ISO and sensitivity
companion aliases across exif and exifEX. Missing or invalid replacements
retain source values. Replacement is per property and does not repair group
relationships.
Retained indexed ISOSpeedRatings keeps its recognized array name rather
than becoming unsupported ISO[1] when no replacement is available.
PreserveAll, reverse ambiguity/conflict rules and per-call transactions
remain unchanged. Combined regression coverage exercises all ten APIs, exact
boundaries, malformed values, policies and JPEG/classic TIFF/BigTIFF snapshots.
Regenerate older rounded packets from native originals to recover precision.
FocalLength portable fractions express millimeters without the `` mm`` suffix.
Implemented Targets¶
The API stems below have the prefix translate_xmp_ and suffix
_metadata. Detailed mappings, aliases, limits and removal rules are in
Metadata Translation.
API stem |
Targets |
Scope |
|---|---|---|
capture |
5 |
Exposure time, f-number, ISO, focal length, exposure bias |
capture_settings |
12 |
Closed capture-setting enums |
capture_rational |
4 |
Subject distance, digital zoom, exposure index, flash energy |
flash |
1 |
Flash bitfield |
light_source |
1 |
Defined light-source codes |
sensitivity |
7 |
ISO and its type/companion group |
camera_text |
6 |
Spectral, camera and lens printable-ASCII fields |
identity |
2 |
LensSpecification and ImageUniqueID |
apex |
5 |
Direct APEX values, including exposure bias |
capture_spatial |
5 |
Focal-plane resolution/unit and subject arrays |
capture_additional |
3 |
FocalLengthIn35mmFilm, FileSource, SceneType |
environment |
6 |
Temperature, Humidity, Pressure, WaterDepth, Acceleration, CameraElevationAngle |
image_encoding |
3 |
Gamma, CompressedBitsPerPixel, ComponentsConfiguration |
composite |
3 |
CompositeImage, SourceImageNumberOfCompositeImage, SourceExposureTimesOfCompositeImage |
structured_capture |
4 |
OECF, SpatialFrequencyResponse, CFAPattern, DeviceSettingDescription |
exif_text |
13 (10 new) |
UserComment, versions, EXIF 3 text and shared UTF-8 owner/lens fields |
development_correction |
6 |
DevelopmentType, DevelopmentTypeDescription and four correction fields |
ISO, ExposureBiasValue, CameraOwnerName, LensMake and LensModel are each shared by two APIs. The 86 mappings therefore cover 81 distinct tags.
Historical 0.5.4 Qualification and Gaps¶
Ordinary and fractional fixtures pass exact native type/count/value checks for
all 46 targets in JPEG and classic TIFF with explicit ReplaceExisting.
Reversing the call order gives the same native result; repeated calls add no
entries. These are bounded fixtures, not every accepted value or container.
The audit identifies these portable-output gaps in 0.5.4:
FNumber
17/6emits2.8, which reverses to14/5.FocalLength
50/3emits16.7 mm, which reverses to167/10.DigitalZoomRatio
1/3emits0.333333333333333. The exact reverse parser rejects that decimal as unrepresentable, rolling back the complete four-field rational call. ExposureTime, SubjectDistance, ExposureIndex and FlashEnergy retain their fractions in the tested packets.Existing
exif:ISOand generatedexifEX:PhotographicSensitivitycan both survive, including withCanonicalizeManaged. The sensitivity reverse API correctly rejects the eligible duplicate aliases.A malformed native SHORT for FNumber, FocalLength or DigitalZoomRatio can claim the property without emitting a value under
CurrentBehavior, hiding valid existing XMP.ExistingWinsretains it in these fixtures.
ExistingWins with PreserveAll retains the source fractions but still
has the ISO alias collision. Emitting only retained source XMP, with EXIF
projection disabled, gives an exact combined reverse round trip in both
fixtures. That choice requires complete authoritative XMP and does not
publish subsequent native-only edits.
Composition and Next Batch¶
Each reverse call is transactional. A sequence of calls is not one library transaction. Stage a candidate store/document and publish it only after every call succeeds. A late invalid SubjectLocation leaves the original document and the earlier successful Python candidate intact in the audit.
With All and default FailOnConflict, basic capture can create ISO before
the sensitivity call, which then rejects the incomplete native group. Calling
sensitivity first passes in the fixture. Explicit replacement passes in either
order. Assign ownership of shared targets or select a deliberate conflict
policy. Retain host synchronization for conflicting shared-object access.
Transfer does not invoke reverse translation. Source XMP, native metadata and destination carriers need explicit authority choices. Packet absence does not encode a deletion request; tombstones and carrier cleanup follow separate contracts. See XMP Sync And Writeback Policy.
The 0.5.5 fix retains API signatures and covers these acceptance checks:
Exact FNumber, FocalLength and DigitalZoomRatio output, including boundaries and permitted zero values.
Native scalar type/count validation before claiming generated properties.
Managed sensitivity alias reconciliation only when valid generated replacements exist, with legacy/indexed paths and conflict cases covered.
Combined ten-API, policy, rollback and JPEG/classic TIFF/BigTIFF checks, independent reads, and one platform matrix against the final patch.
The additional capture and environment batches are implemented in 0.5.6. Encoding and composite capture are implemented in 0.5.7 and structured capture in 0.5.8. Text/comment/version contracts are implemented in 0.5.9. The Standard EXIF Authoring Inventory selected existing-field validation, implemented in 0.5.10. The six EXIF 3.1 development/correction fields are implemented in 0.5.11; LearningOptOutIn/profile authoring are implemented in 0.5.12. MakerNote rewrite trust remains vendor-specific. Read/display support does not establish reverse writeback support. Downstream application acceptance and whole-corpus qualification are outside this audit.
Encoding and Composite Capture in 0.5.7¶
Two new APIs extend the combined fixture to 61 native tags across fourteen APIs. Direct serialization retains all 61. Target transfer filters the three source encoding fields under the existing destination-image policy, retaining 58. Composite exposure data retains exact fractions and unavailable summaries across both TIFF byte orders and snapshot persistence. See Metadata Translation.
Structured Capture Update (0.5.8)¶
OECF, SpatialFrequencyResponse, CFAPattern and DeviceSettingDescription add
four native targets in one transaction through
translate_xmp_structured_capture_metadata and its Python counterpart.
The 0.5.8 combined inventory was 65 distinct native tags across fifteen APIs
(62 retained by compatible-file transfer). ABI 3 and host synchronization
remain unchanged; big-endian snapshots for these four tags need a 0.5.8
reader. See Metadata Translation for the encoding, bounds and conflict contract.
EXIF Text and Version Update (0.5.9)¶
The new translate_xmp_exif_text_metadata API adds ten ExifIFD tags:
UserComment, both version fields and seven EXIF 3 text properties. It also
supports UTF-8 CameraOwnerName, LensMake and LensModel. The combined inventory
now covers 75 distinct ExifIFD tags across sixteen APIs; compatible-file transfer
retains 72. Artist/Software companions and the effective EXIF version are explicit.
The qualification includes exact native wire values, snapshots, both TIFF byte orders, Python and an installed shared consumer. The installed OIIO reader aborts on type129; direct TIFF byte checks and FFmpeg pixel hashes qualify the new data. ExifTool’s legacy UserComment decoder is not an EXIF 3 UTF-8 oracle. See Metadata Translation for the full contract and reader limitations.
EXIF 3.1 Development and Correction Update (0.5.11)¶
The six A40D-A412 development/correction fields use one bounded C++ and Python
transaction. DevelopmentType packs two choices from 1, 2 and 4 into a SHORT
and emits the published DevelopmentCharacterstic / FactoryDefault XMP
resource. A40E is UTF-8 TIFF type 129; A40F-A411 accept 0/1 and A412 accepts
0..3. The host supplies EXIF version 0300 or 0310 for selected writeback.
OpenMeta does not change ExifVersion or infer RAW/MakerNote processing history.
Present values remain in compatible-file and rendered-image transfer. See
Metadata Translation.
The remaining standard fields and profile gaps are recorded in Standard EXIF Authoring Inventory, including the next batch’s acceptance criteria. Copyright’s two-part NUL-separated representation remains outside this text extension. Downstream application acceptance stays on hold; fuzzy search remains lowest priority.
Native Encoding and Composite Lifecycle in 0.8.8¶
The six existing fields use translation contract 2: exact clean native values
gain Dirty and eligible absent deletion retains typed intent. Composite
ReplaceExisting also clears omitted destination companions. The composite
fields enter the TIFF/BigTIFF/DNG merge/removal allowlist. Encoding fields retain
source-pixel transfer exclusions; canonical serialization retains all six.
ABI 4, snapshot v1 and host synchronization remain unchanged.