# Changelog

## Version 0.23.0 (unreleased)

- feat: add `static_simd` Cargo feature
- chore!: bump MSRV to 1.89 (required for `target_feature = "avx512*"`)

## Version 0.22.2

- feat: Make DetectionResults Deserialize
- perf: add SSE2 for `sum_8x8_block`

## Version 0.22.1

- perf: Revert NonZeroUsize changes as these actually had a negative performance impact

## Version 0.22.0

- chore!: bump for breaking change in av-decoders

## Version 0.21.2

- fix: Avoid an edge case in predict_dc_intra SIMD
- perf: Use NonZeroUsize to elide many unneeded div by zero checks
- perf: Eliminate some unneeded bounds checking

## Version 0.21.1

- Update to `v_frame` 0.5. This fixes breakages that occurred on HBD with some decoders.

## Version 0.21.0 [yanked]

- [Breaking] update to `v_frame` 0.4

## Version 0.20.0

- Update decoders for Vapoursynth R73 compatibility

## Version 0.19.2

- Significantly improve threading performance by decoding on a separate thread

## Version 0.19.1

- Use fixed ffms2 implementation

## Version 0.19.0 [yanked]

- Add `ffms2` feature for using ffms2 as a decoder

## Version 0.18.0

- Update `av_decoders` crate to `0.5.0` for ffmpeg 8.0 support

## Version 0.17.3

- Update `av_decoders` crate from `0.3.0` to `0.4.0`

## Version 0.17.2

- Update `av_decoders` crate from `0.2.0` to `0.3.0`

## Version 0.17.1

- Make the fields on `ScenecutResult` public so that it can actually be useful

## Version 0.17.0

- [Breaking] Update the `analyze_next_frame` method to also return the frame scores, if present
- [Breaking] Update the `DetectionResults` to also return frame scores

## Version 0.16.0

- [Breaking] Use `av_decoders` crate instead of providing our own decoder structs
- [Breaking] Bump minimum rust version to 1.86
- Bump Rust edition to 2024, since the minimum Rust version had to be bumped anyway

## Version 0.15.0

- [Breaking] Remove `CpuFeatureLevel` struct and params. This removes the ability
  to disable SIMD at runtime, but this isn't a particularly useful feature
  and added code complexity.
- Refactor SIMD modules

## Version 0.14.1

- Readd support for caching intra costs
- Expose structs for advanced API users

## Version 0.14.0

- [Breaking/Feature] Add `SceneDetectionSpeed::None`, which will only place keyframes at fixed intervals without running dynamic detection
- Migrate detection code from rav1e into this crate

## Version 0.13.0

- [Breaking] Update ffmpeg-the-third to 3.x
- Update all other dependencies to latest version

## Version 0.12.2

- Enable threading for ffmpeg decoder, should greatly improve speed

## Version 0.12.0

- [Breaking] Move `VideoDetails` struct from `y4m` module to `decoder` module, since it is not specific to y4m
- Add support for Ffmpeg decoder (requires Cargo `ffmpeg` feature, disabled by default)

## Version 0.11.0

- Add support for Vapoursynth decoder (requires Cargo `vapoursynth` feature, disabled by default)
- Breaking change required to add a wrapper enum defining which decoder is being used

## Version 0.10.0

- Bump `rav1e` dependency to `0.7`

## Version 0.9.0

- Bump `y4m` dependency to `0.8`

## Version 0.8.1

- Finally release a new version because we can depend on rav1e 0.6.1

## Version 0.8.0

- Upgrade clap to 4.0
- Add frame limit arg to API
- [Breaking] Change `progress_callback` to take a &dyn Fn
- Misc improvements including some speedups from rav1e
- Update to Rust edition 2021

## Version 0.7.2

- Bump to the final release of rav1e 0.5
- Bump other dependencies to latest versions
- Fix another inconsistency with rav1e's scene detection
- Improve precision of FPS calculation

## Version 0.7.1

- Fix an inconsistency with how rav1e's scene detection works
- Fix some CLI help text

## Version 0.7.0

- Bump rav1e dependency to 0.5-beta.2, which brings a new, improved scenechange algorithm.
  Medium is equivalent to the old slow level, but with improvements. The fast level
  also has improvements. The new slow level is a new algorithm with a higher accuracy
  than the previous two algorithms.
- The `--fast-mode` CLI argument is removed in favor of a `--speed` or `-s` argument,
  which takes a 0, 1, or 2 (for slow, medium, or fast). The default is 0 for slow.

## Version 0.6.0

- Bump rav1e dependency to 0.5. This should bring significant performance improvements,
  but may cause breaking changes.

## Version 0.5.0

- Bump rav1e dependency to 0.4
- Expose `new_detector` and `detect_scene_changes` since these
  may be useful in some situations to use directly

## Version 0.4.2

- Fix compilation on non-x86 targets
- Bump various dependencies

## Version 0.4.1

- Improve performance and memory usage

## Version 0.4.0

- [Breaking, New Feature] `detect_scene_changes` returns a `DetectionOptions` struct,
  which includes the list of scenecut frames, and the total count
  of frames in the video. The CLI output will reflect this as well.
- [Breaking] Replace the default algorithm with an 8x8-block cost-based algorithm.
  This is more accurate in many cases.
- [Breaking] As a result of the above change, now requires nasm for compilation.
  No action is needed if you use a prebuilt binary.
- [Breaking] Replace the `use_chroma` option with a `fast_analysis` option.
  The new name is more accurate, as the updated algorithm will always analyze
  only the luma plane.
- [Breaking] Move the `progress_callback` parameter from `DetectionOptions`
  to `detect_scene_changes`, since it only applies to that interface.
- [New Feature] Expose the `SceneChangeDetector` struct, which allows
  going frame-by-frame to analyze a clip. Needed for some use cases.
  `detect_scene_changes` is the simpler, preferred interface.
- The library for inputting frame data has been replaced
  with one that matches rav1e.
- Simplify/optimize some internal code.

## Version 0.3.0

- [Breaking, New Feature] Add the ability to pass a `progress_callback` function
  to the `DetectionOptions`.

## Version 0.2.0

- [Breaking] Update `y4m` dependency to 0.5

## Version 0.1.0

- Initial release
