Releases: vbasky/revelo
revelo v0.4.6
fix: add banner to revelo-cli README
revelo v0.4.5
fix: add banner to facade crate README for crates.io rendering
revelo v0.4.4
Added
duration_ms()helper inrevelo-core— round-to-nearest duration
computation from sample counts. Applied to WAV and MP3 parsers for more
precise output. Ogg retains intentional truncation to match the mediainfo
oracle.- STATUS.md — project roadmap and status tracker, linked from the README.
## Statusand## Licensesections added to README.
Fixed
- Banner image URL — crates.io now shows the revelo banner (was a broken
relative path).
revelo v0.4.3
Added
- Apple MakerNote support — ~17 fields parsed clean-room from the on-disk
IFD (cross-referenced against ExifTool's printed output, not its tables):
MakerNoteVersion,AEStable/AETarget/AEAverage,AFStable,
AccelerationVector,FocusDistanceRange,ContentIdentifier,
ImageCaptureType,LivePhotoVideoIndex,HDRHeadroom,
SignalToNoiseRatio,PhotoIdentifier,ColorTemperature,CameraType,
FocusPosition. The default (BSD) build is unaffected by the GPL
exiftool-tablesfeature. - ICC profile header fields —
ProfileCMMType,ProfileVersion,
ProfileClass,ColorSpaceData,ProfileConnectionSpace,ProfileDateTime,
PrimaryPlatform,RenderingIntent,DeviceManufacturer/DeviceModel,
ProfileID/Description/Copyright,MediaWhitePoint, and the RGB matrix
columns. The profile is located by itsacspsignature, so embedded profiles
(JPEGAPP2, HEIC, raw.icc) are read correctly rather than from offset 0. - Composite/derived fields —
ScaleFactor35efl,CircleOfConfusion,
FieldOfView,HyperfocalDistance,LightValue. - Extra GPS fields surfaced in text output —
GPSSpeed,GPSImgDirection,
GPSDestBearing,GPSHPositioningError(and their reference tags).
Fixed
parse_iccread the wrong offset and emitted an emptyICC_Profile : ();
it now locates the profile correctly and no longer emits a spurious ICC
section for files without a profile.- Apple maker notes produced no output because the parser never skipped the
14-byteApple iOSheader and the hand-written tag table had incorrect IDs;
both are fixed. parse_xmpfailed to find the XMP packet embedded in JPEGs (it read from the
cursor over binary data); it now scans the whole file.- JPEG camera
Modelwas read past its NUL terminator (e.g.ION230 F→
ION230).
Changed
- Single EXIF walker.
revelo-parsers-tagis now the sole EXIF / GPS /
maker-note / ICC parser. The JPEG container parser no longer carries a
duplicate EXIF/TIFF walk — it parses only JPEG structure (geometry, chroma
subsampling, thumbnail), and the MediaInfo-vocabulary fields
(Recorded_Date,Encoded_Hardware_*, the photographic<extra>block) are
derived from the shared tag parse. Verified net-zero against a 104-file
sample corpus.
revelo v0.4.2
Fixed
- Panic-safety on malformed/truncated input: guard MP4
avcC/hvcCparsing
against truncated boxes; correct the SCTE-35 splice-header byte offsets and a
parse_splice_insertoff-by-one; checked/saturating size arithmetic in
AVI/MKV/MP4/MXF (safe on 32-bitwasm32). - Parsing correctness on valid files: honor TIFF byte order for EXIF
FLOAT/DOUBLE values; decode ELFe_type/e_machineper the file's endianness;
read AVC scaling-listdelta_scaleas signed Exp-Golomb; derive AV1 bit depth
fromcolor_config(); parse real VVC profile/tier/level and fix VVC RBSP
emulation-prevention removal; fixinfer_raw_formatreadingMakefrom the
wrong stream. - Exporters: XML-escape values and paths in ebuCore/MPEG-7/PBCore/RevTMD;
NISO/FIMS now emit the parsed stream fields instead of an empty shell; teletext
fills fields on partial packets; bound the VOB-PCMLPCMscan.
Changed
- Rewrote per-crate READMEs and added crate-level docs across the workspace; added
exif/exiftoolkeywords and richer descriptions for crates.io discoverability. - Release pipeline now publishes the
revelofacade andrevelo-exiftool-tables
(previously omitted from the publish list).
Note
- First crates.io publish of the
revelofacade crate.
revelo v0.4.1
Added
revelofacade crate — a singlerevelodependency replaces manually wiring
revelo-core,revelo-dispatcher, andrevelo-parsers-tag. The crate exposes:Metadata::from_file(path)andMetadata::from_bytes(bytes)— detect format,
parse container/codec metadata, and run EXIF/IPTC/XMP/ICC/C2PA tag extraction
in one call- Typed per-stream accessors:
.general(),.video(),.audio(),.text(),
.image(),.exif(),.iptc(),.xmp()— each yielding(&str, &str)pairs MediaFiletype alias forFileAnalyze(the old name continues to work)Metadata::streams()andinto_streams()for access to the raw
StreamCollection- Re-exports of
revelo_core,revelo_dispatcher, andrevelo_parsers_tag
so dependents get the full API from one crate - Pass-through
exiftool-tablesfeature that pulls the GPL/Artistic maker-note
tables crate
Changed
- README parser and crate counts are now auto-updated as part of the release
workflow (script runscargo metadataand counts#[test]annotations). - Release notes generation strips the
vprefix from the tag name before passing
it to the GitHub CLI.
Fixed
- Homebrew formula pushed to personal tap (
vbasky/homebrew-revelo) instead of
attempting an upstreamhomebrew-corePR (which cannot be automated reliably). - Homebrew install command corrected in README to match the personal tap URL.
revelo v0.4.0
Added
-
EXIF/IPTC/XMP/ICC/C2PA/MakerNotes promoted to their own stream sections
(revelo extensions beyond MediaInfo'sstream_t), matching how exiftool groups
metadata by family-0 type rather than folding everything into General. EXIF
streams from the container parser and the IFD walker are now merged into one. -
IPTC IIM now anchored to the Photoshop 8BIM Image Resource Block (resource
0x0404) instead of scanning raw bytes — fixes false-positive datasets (e.g. a
garbageHeadline) matched in compressed image data. -
Optional
exiftool-tablesfeature (off by default) — opt in to richer
maker-note tag names and PrintConv value decoding sourced from ExifTool, for 14
vendors (Apple, Canon, Casio, DJI, FLIR, FujiFilm, Minolta, Nikon, Olympus,
Panasonic, Pentax, Samsung, Sigma, Sony). The tables live in a separate
GPL/Artistic craterevelo-exiftool-tables(generated from ExifTool via
codegen/extract.pl); the default revelo build stays BSD-2-Clause and uses the
hand-written clean-room tables. Enabling the feature subjects the resulting
binary to GPL/Artistic terms. -
Canon maker-note decoding (under
exiftool-tables) — ExifTool-derived
ProcessBinaryDatasub-tables (CameraSettings, ShotInfo) are now decoded into
individual named, value-converted tags. Two correctness fixes make this work on
real files: the bare-IFD offset is no longer mis-detected when the first tag id
is0x0000(broke every Canon file whose maker note starts that way, e.g. the
IXUS), and a cross-validated FixBase recovers mis-based maker-note offsets in
edited/re-muxed files (matching exiftool's "Adjusted MakerNotes base by N").
Records are accepted only when their self-describing byte-count header validates,
so a wrong offset decodes nothing rather than garbage. The header-less
FIRST_ENTRY 0FocalLength sub-table is decoded only when FixBase confirmed the
base. The variable-length AFInfo (0x0012) record (NumAFPoints-driven
AFAreaXPositions[N]etc.) is hand-walked behind an exact total-size match, so a
mis-laid record decodes nothing. The newer AFInfo2 (0x0026) / AFInfo3 (0x003C,
SerialData) records — which lead with a self-validatingAFInfoSizeheader and
carry anAFAreaModeenum plus four[N]arrays — are decoded the same way. For
Main tags revelo's older bespoke table lacks, the fuller ExifTool Main table is
consulted under the feature. FurtherProcessBinaryDatasub-tables are decoded
with per-table element size — MyColors and ContrastInfo (int16), TimeInfo and
AspectInfo (int32), and FaceDetect3. ImageUniqueID (16-byte hex) and DateStampMode
decode too. Validated against real camera samples: IXUS 400 31%→99%, PowerShot S40
→99%, edited HDR files (AFInfo3, newer body) →100%, all with exact value matches. -
EXIF / Interop / Canon Main tag names aligned to ExifTool under
exiftool-tablesfor the handful of divergences (DateTime→ModifyDate,
DateTimeDigitized→CreateDate,PhotographicSensitivity→ISO,
PixelX/YDimension→ExifImage{Width,Height},
Interoperability{Index,Version}→Interop{Index,Version},
CanonOwnerName→OwnerName,CanonImageNumber→FileNumber,
CanonThumbnailValidArea→ThumbnailImageValidArea). Lens fields are
deliberately not remapped (the lens-formatting post-pass keys off the names).
With all of the above, clean Canon samples reach 99% tag parity with exiftool.
Fixed
- Maker-note parsing repaired for several vendors (BSD core, all builds). The
Fujifilm maker note read its IFD offset from the wrong byte (12 instead of 8) and
mis-resolved value offsets — it now parses against the full block from the correct
offset. Nikon Type 2/3 (embedded TIFF header at offset 10) is detected so COOLPIX
bodies parse. Header-less big-endian Konica-Minolta IFDs are now byte-order
detected. Underexiftool-tables, Nikon names are aligned to ExifTool. Validated
against real samples: Fujifilm 68%→98-100%, Nikon COOLPIX 63%→95%, Konica-Minolta
76%→97%. - Olympus "type-2" maker notes (
OLYMPUS\0II…) are now parsed: the main IFD plus
its nested Equipment / CameraSettings / RawDevelopment / ImageProcessing / FocusInfo
sub-IFDs (decoded via generated ExifTool tables under the feature). - Nikon AFInfo (0x0088) / FlashInfo (0x00A8) decoded on COOLPIX bodies.
- UNDEFINED (type 7) values are read as a single trimmed blob instead of a string
repeated from every byte offset (fixes e.g. PanasonicInternalSerialNumber). - Canon maker-note Main tag ids corrected (BSD core, all builds):
0x000Cis
the serial number (was mislabelledCanonModelID),0x0010is the model id
(wasCanonThumbnailValidArea),0x0013is the thumbnail valid area (was
missing),0x0015is the serial-number format,0x001CisDateStampMode(was
CanonAFInfo), and0x0028isImageUniqueIDrendered as 16-byte hex (was
CanonCRWParam). The model-name lookup now applies to0x0010instead of the
serial number at0x000C. Verified against exiftool's raw values.
Changed
- Dropped the
creatingLibraryheader from JSON and XML output. The block
(name/version/url) only identified the producing tool and carried nothing
about the parsed file, so it is no longer emitted. JSON now opens directly at
"media"; XML goes straight from the<MediaInfo>header to<media>. This is
a deliberate divergence frommediainfo's wire format — consumers that validate
against the published mediainfo schema or readcreatingLibrary.versionwill see
a missing key.revelo-diffstrips the oracle'screatingLibraryline before
comparing, so the diff harness stays focused on per-stream differences.
revelo v0.3.2
Fixed
- Panic-safety on malformed/truncated input: guard MP4
avcC/hvcCparsing
against truncated boxes; correct the SCTE-35 splice-header byte offsets and a
parse_splice_insertoff-by-one; checked/saturating size arithmetic in
AVI/MKV/MP4/MXF (safe on 32-bitwasm32).
revelo v0.3.1
Fixed
- JSON output now escapes control characters (U+0000–U+001F) as
\u00xx
instead of emitting raw bytes, producing valid JSON when binary metadata is
present. - JFIFVersion extracted from the JPEG APP0 segment (e.g.
1.01).
revelo v0.3.0
Added
- EXIF rewrite — full IFD chain traversal (IFD0, ExifIFD, GPS IFD, InteropIFD,
IFD1), 170+ tag names including EXIF, GPS, and maker-note tags parsed via IFD
iteration; GPS coordinates computed as decimal degrees (GPSLatitudeRef/
GPSLongitudeRef) - Lens specification formatting —
LensSpecfield computed from
LensModel,MaxApertureAtMinFocal,MaxApertureAtMaxFocal,MinFocalLength,
MaxFocalLength, andLensType;LensTypehex formatting - IPTC IIM enhanced — full 0x1C-delimited IIM dataset parsing, cross-reference
with IPTC-NAA tag keys viaparse_iim_buffor datasets > 0x80 bytes on 0x83BB
records - XMP enhanced — additional EXIF field name mappings (ExifIFD, GPS, IIM
cross-references) andXMP_xmpMM_*namespace tags - MakerNote stub —
parse_makernoteinfrastructure hook, returns()for now