# Changelog

All notable changes to `exiftool-rs` are documented here.

## [0.6.1] - 2026-06-14

### Performance

- **Memory-mapped reads.** Files are now `mmap`-ed instead of being read fully
  into memory. The container readers walk by offset (MP4/MOV skip `mdat`,
  Matroska stops at the first `Cluster`, Android MP4s keep `moov` at the end), so
  only the header pages are faulted in. A multi-gigabyte video is parsed by
  touching a few MB rather than allocating and reading the whole file: a real
  2 GB MP4 now parses in ~0 ms with ~9 MB RSS (was a multi-minute stall on very
  large files). Falls back to a plain read when mapping is unavailable. (#5)

### Added

- **QuickTime Keys metadata**: Android device info `AndroidMake`, `AndroidModel`,
  `AndroidVersion` (and other mapped `keys`/`ilst` entries), with QuickTime-style
  `meta` (no version/flags) detection. (#5)
- **Color representation** (`colr` atom): `ColorProfiles`, `ColorPrimaries`,
  `TransferCharacteristics`, `MatrixCoefficients`, `VideoFullRangeFlag`.
- **PreviewImage / ThumbnailImage** from QuickTime `mcvr`/`snal`/`tnal` atoms.

### Fixed

- **Rotation**: the per-track `tkhd` matrix was read 4 bytes early (zeroing the
  rotation sub-matrix); now read at the correct offset and computed via an exact
  port of ExifTool's `GetRotationAngle`. `MatrixStructure` is now emitted per
  track.
- **FilePermissions**: emit the ls-style `-rw-rw-r--` string (with the full octal
  mode as the `-n` value) instead of bare `664`.
- **File dates**: `FileModifyDate`/`FileAccessDate`/`FileInodeChangeDate` now use
  local time with a numeric timezone offset, matching `ConvertUnixTime($val,1)`.
- **FileSize**: raw value stored without 32-bit truncation (files > 4 GB).
- **QuickTime duplicate-tag priority**: `mdhd`/`hdlr` tags follow last-wins while
  `tkhd` tags are Priority-0 (first-wins), matching ExifTool's `FoundTag` rule —
  correct primary `HandlerType`/`MediaDuration`/etc. on multi-track files.

### Test corpus

- Added `tests/images/Android.mp4` (sample from #5) with `.tags`/`.vals` oracles;
  0 name and 0 value deltas vs ExifTool 13.53.

## [0.6.0] - 2026-06-12

### Highlights

- **100% value parity** with Perl ExifTool 13.53 across the entire test corpus
  (in addition to the existing 100% tag-name parity). Every tag value the
  reference tool reports is now reproduced byte-for-byte, validated by the
  ratcheting regression suite (`tests/expected_values/*.vals`).

### Added / Fixed (selected)

This release closes out the long tail of value-parity work across most readers:

- **Offset handling**: file-absolute IsOffset tags for embedded EXIF/TIFF in MIFF,
  JP2 (GeoJP2/EXIF uuid), Nikon/Olympus PreviewImageStart, RAF/X3F/RW2.
- **Binary-size reporting**: `(Binary data N bytes)` now uses the formatted-value
  length where ExifTool does (DICOM PixelData, Olympus/Sanyo DataDump), and the
  correct embedded length for FLIR RawThermalImage, Canon CR3 PRVW, TNEF RTF,
  Google HDRPlusMakerNote.
- **Multi-source precedence**: per-source priority for the synthetic multi-format
  test file (CIFF/SPIFF/NITF/PictureInfo/GraphConv/MIE/FotoStation/APP10), Minolta
  CameraSettings (PRIORITY 0), QuickTime mdat, SubIFD pyramid, VCard sub-documents,
  Composite Red/BlueBalance.
- **Conversions**: Pentax TvExposureTimeSetting, Canon Sharpness/RFLensType/
  CustomControls, OlympusE1 BlueBalance rounding, PrintLensID sub-variant
  disambiguation (Pentax/Sigma LensID).
- **Encoding**: Latin-1 raw-byte round-tripping for Real.ra / PSP Copyright.
- **Format-specific**: APP10 PhotoStudio Unicode comment, ASF IsVBR (Metadata
  object), PCAP TimeStamp (reproduces ExifTool's known low-word read behaviour),
  Lytro JSON arrays, Google XMP container, XMP struct-list semantics, and the full
  PLUS LDF MediaSummaryCode vocabulary.

### Resolved issues

- #1 — FLIR R-JPEG support (thermal data, FLIR maker notes).
- #2 — Windows/Tauri build conflict, via the opt-in `win-icon` feature (#3).

### Notes

- Android video device info (`AndroidVersion`/`AndroidMake`/`AndroidModel`, issue
  #4 / PR #5) is **not** included in this release. These come from the QuickTime
  `keys`/`ProcessKeys` metadata mechanism (`com.android.*`), which is distinct from
  the Google/Pixel image maker notes already supported. It remains a candidate for
  a future release.

## [0.5.0] and earlier

See the git history and tags for prior releases.
