Skip to content

Releases: vbasky/revelo

revelo v0.4.6

06 Jun 02:44

Choose a tag to compare

fix: add banner to revelo-cli README

revelo v0.4.5

06 Jun 02:38

Choose a tag to compare

fix: add banner to facade crate README for crates.io rendering

revelo v0.4.4

06 Jun 01:31

Choose a tag to compare

Added

  • duration_ms() helper in revelo-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.
  • ## Status and ## License sections added to README.

Fixed

  • Banner image URL — crates.io now shows the revelo banner (was a broken
    relative path).

revelo v0.4.3

31 May 13:52

Choose a tag to compare

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-tables feature.
  • ICC profile header fieldsProfileCMMType, ProfileVersion,
    ProfileClass, ColorSpaceData, ProfileConnectionSpace, ProfileDateTime,
    PrimaryPlatform, RenderingIntent, DeviceManufacturer/DeviceModel,
    ProfileID/Description/Copyright, MediaWhitePoint, and the RGB matrix
    columns. The profile is located by its acsp signature, so embedded profiles
    (JPEG APP2, HEIC, raw .icc) are read correctly rather than from offset 0.
  • Composite/derived fieldsScaleFactor35efl, CircleOfConfusion,
    FieldOfView, HyperfocalDistance, LightValue.
  • Extra GPS fields surfaced in text output — GPSSpeed, GPSImgDirection,
    GPSDestBearing, GPSHPositioningError (and their reference tags).

Fixed

  • parse_icc read the wrong offset and emitted an empty ICC_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-byte Apple iOS header and the hand-written tag table had incorrect IDs;
    both are fixed.
  • parse_xmp failed to find the XMP packet embedded in JPEGs (it read from the
    cursor over binary data); it now scans the whole file.
  • JPEG camera Model was read past its NUL terminator (e.g. ION230 F
    ION230).

Changed

  • Single EXIF walker. revelo-parsers-tag is 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

31 May 05:14

Choose a tag to compare

Fixed

  • Panic-safety on malformed/truncated input: guard MP4 avcC/hvcC parsing
    against truncated boxes; correct the SCTE-35 splice-header byte offsets and a
    parse_splice_insert off-by-one; checked/saturating size arithmetic in
    AVI/MKV/MP4/MXF (safe on 32-bit wasm32).
  • Parsing correctness on valid files: honor TIFF byte order for EXIF
    FLOAT/DOUBLE values; decode ELF e_type/e_machine per the file's endianness;
    read AVC scaling-list delta_scale as signed Exp-Golomb; derive AV1 bit depth
    from color_config(); parse real VVC profile/tier/level and fix VVC RBSP
    emulation-prevention removal; fix infer_raw_format reading Make from 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-PCM LPCM scan.

Changed

  • Rewrote per-crate READMEs and added crate-level docs across the workspace; added
    exif/exiftool keywords and richer descriptions for crates.io discoverability.
  • Release pipeline now publishes the revelo facade and revelo-exiftool-tables
    (previously omitted from the publish list).

Note

  • First crates.io publish of the revelo facade crate.

revelo v0.4.1

31 May 01:12

Choose a tag to compare

Added

  • revelo facade crate — a single revelo dependency replaces manually wiring
    revelo-core, revelo-dispatcher, and revelo-parsers-tag. The crate exposes:
    • Metadata::from_file(path) and Metadata::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
    • MediaFile type alias for FileAnalyze (the old name continues to work)
    • Metadata::streams() and into_streams() for access to the raw
      StreamCollection
    • Re-exports of revelo_core, revelo_dispatcher, and revelo_parsers_tag
      so dependents get the full API from one crate
    • Pass-through exiftool-tables feature 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 runs cargo metadata and counts #[test] annotations).
  • Release notes generation strips the v prefix 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 upstream homebrew-core PR (which cannot be automated reliably).
  • Homebrew install command corrected in README to match the personal tap URL.

revelo v0.4.0

31 May 00:36

Choose a tag to compare

Added

  • EXIF/IPTC/XMP/ICC/C2PA/MakerNotes promoted to their own stream sections
    (revelo extensions beyond MediaInfo's stream_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
    garbage Headline) matched in compressed image data.

  • Optional exiftool-tables feature (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 crate revelo-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
    ProcessBinaryData sub-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
    is 0x0000 (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 0 FocalLength 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-validating AFInfoSize header and
    carry an AFAreaMode enum 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. Further ProcessBinaryData sub-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-tables for the handful of divergences (DateTimeModifyDate,
    DateTimeDigitizedCreateDate, PhotographicSensitivityISO,
    PixelX/YDimensionExifImage{Width,Height},
    Interoperability{Index,Version}Interop{Index,Version},
    CanonOwnerNameOwnerName, CanonImageNumberFileNumber,
    CanonThumbnailValidAreaThumbnailImageValidArea). 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. Under exiftool-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. Panasonic InternalSerialNumber).
  • Canon maker-note Main tag ids corrected (BSD core, all builds): 0x000C is
    the serial number (was mislabelled CanonModelID), 0x0010 is the model id
    (was CanonThumbnailValidArea), 0x0013 is the thumbnail valid area (was
    missing), 0x0015 is the serial-number format, 0x001C is DateStampMode (was
    CanonAFInfo), and 0x0028 is ImageUniqueID rendered as 16-byte hex (was
    CanonCRWParam). The model-name lookup now applies to 0x0010 instead of the
    serial number at 0x000C. Verified against exiftool's raw values.

Changed

  • Dropped the creatingLibrary header 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 from mediainfo's wire format — consumers that validate
    against the published mediainfo schema or read creatingLibrary.version will see
    a missing key. revelo-diff strips the oracle's creatingLibrary line before
    comparing, so the diff harness stays focused on per-stream differences.

revelo v0.3.2

31 May 05:35

Choose a tag to compare

Fixed

  • Panic-safety on malformed/truncated input: guard MP4 avcC/hvcC parsing
    against truncated boxes; correct the SCTE-35 splice-header byte offsets and a
    parse_splice_insert off-by-one; checked/saturating size arithmetic in
    AVI/MKV/MP4/MXF (safe on 32-bit wasm32).

revelo v0.3.1

30 May 23:20

Choose a tag to compare

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

30 May 07:20

Choose a tag to compare

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 formattingLensSpec field computed from
    LensModel, MaxApertureAtMinFocal, MaxApertureAtMaxFocal, MinFocalLength,
    MaxFocalLength, and LensType; LensType hex formatting
  • IPTC IIM enhanced — full 0x1C-delimited IIM dataset parsing, cross-reference
    with IPTC-NAA tag keys via parse_iim_buf for datasets > 0x80 bytes on 0x83BB
    records
  • XMP enhanced — additional EXIF field name mappings (ExifIFD, GPS, IIM
    cross-references) and XMP_xmpMM_* namespace tags
  • MakerNote stubparse_makernote infrastructure hook, returns () for now