Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package ab-av1 for openSUSE:Factory checked in at 2026-02-20 17:46:39 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ab-av1 (Old) and /work/SRC/openSUSE:Factory/.ab-av1.new.1977 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ab-av1" Fri Feb 20 17:46:39 2026 rev:3 rq:1334186 version:0.11.0 Changes: -------- --- /work/SRC/openSUSE:Factory/ab-av1/ab-av1.changes 2025-11-24 14:15:50.062078339 +0100 +++ /work/SRC/openSUSE:Factory/.ab-av1.new.1977/ab-av1.changes 2026-02-20 17:54:28.177174122 +0100 @@ -1,0 +2,23 @@ +Fri Feb 20 12:53:05 UTC 2026 - Enrico Belleri <[email protected]> + +- Update to version 0.11.0: + * svt-av1: Support crf quarter steps: + + defaults to -crf-increment to 0.25 if svt-av1 >= 4.0.0 + * svt-av1: Widen default crf search range [10, 55] -> [5, 70] + +------------------------------------------------------------------- +Sun Feb 15 14:51:51 UTC 2026 - Enrico Belleri <[email protected]> + +- Update to version 0.10.4: + * Use ffmpeg `-fps_mode passthrough` for all sample encodes. + This improves VMAF scores in some cases. + * Use explicit pixel format in xpsnr calls, use highest quality + format of the ref & distorted streams. + This can improve scores in some cases. + * Wait for vmaf/xpsnr processes to finish e.g. to allow custom + logging to flush. + * Update sample-encode json output to use float `predicted_encode_seconds`. + * Fix higher crf-search VMAF tolerance than expected when using + `--crf-increment` values above 1. + +------------------------------------------------------------------- Old: ---- ab-av1-0.10.2.obscpio New: ---- ab-av1-0.11.0.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ab-av1.spec ++++++ --- /var/tmp/diff_new_pack.u7N5ig/_old 2026-02-20 17:54:29.437226907 +0100 +++ /var/tmp/diff_new_pack.u7N5ig/_new 2026-02-20 17:54:29.441227074 +0100 @@ -1,7 +1,7 @@ # # spec file for package ab-av1 # -# Copyright (c) 2025 SUSE LLC +# Copyright (c) 2026 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,7 +17,7 @@ Name: ab-av1 -Version: 0.10.2 +Version: 0.11.0 Release: 0 Summary: An AV1 video encoding wrapper License: MIT ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.u7N5ig/_old 2026-02-20 17:54:29.513230091 +0100 +++ /var/tmp/diff_new_pack.u7N5ig/_new 2026-02-20 17:54:29.517230258 +0100 @@ -1,5 +1,5 @@ -mtime: 1763885510 -commit: 129faf1dbfa030be65b1e365d580a7287fd14b3bd4caff5b9d8eaab090d65ec8 +mtime: 1771592080 +commit: e1791ee7374333dc03785c458d853be44cd05c1531f4136c9fc53b203b168141 url: https://src.opensuse.org/iDesmI/ab-av1 -revision: main +revision: factory ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.u7N5ig/_old 2026-02-20 17:54:29.601233778 +0100 +++ /var/tmp/diff_new_pack.u7N5ig/_new 2026-02-20 17:54:29.621234615 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/alexheretic/ab-av1.git</param> - <param name="changesrevision">061abdfdd19bcbd4341978ac8fc85366e38c1b2e</param></service></servicedata> + <param name="changesrevision">5b57da51034c26a5d9c171f7ea161def41da61fc</param></service></servicedata> (No newline at EOF) ++++++ ab-av1-0.10.2.obscpio -> ab-av1-0.11.0.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ab-av1-0.10.2/.github/workflows/ci.yml new/ab-av1-0.11.0/.github/workflows/ci.yml --- old/ab-av1-0.10.2/.github/workflows/ci.yml 2025-11-23 02:11:18.000000000 +0100 +++ new/ab-av1-0.11.0/.github/workflows/ci.yml 2026-02-20 12:16:35.000000000 +0100 @@ -13,7 +13,7 @@ RUST_BACKTRACE: 1 steps: - run: rustup update stable - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - run: cargo test --locked # check print-completions don't fail - run: cargo run --locked -- print-completions bash @@ -27,12 +27,12 @@ # RUST_BACKTRACE: 1 # steps: # - run: rustup update stable - # - uses: actions/checkout@v4 + # - uses: actions/checkout@v6 # - run: cargo check rustfmt: runs-on: ubuntu-latest steps: - run: rustup update stable - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - run: cargo fmt -- --check diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ab-av1-0.10.2/.github/workflows/release.yml new/ab-av1-0.11.0/.github/workflows/release.yml --- old/ab-av1-0.10.2/.github/workflows/release.yml 2025-11-23 02:11:18.000000000 +0100 +++ new/ab-av1-0.11.0/.github/workflows/release.yml 2026-02-20 12:16:35.000000000 +0100 @@ -12,7 +12,7 @@ steps: - run: rustup update stable - run: rustup target add x86_64-unknown-linux-musl - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - run: cargo build --release --locked --target=x86_64-unknown-linux-musl - run: tar c ab-av1 | zstd -T0 -19 > ab-av1-${{ github.ref_name }}-x86_64-unknown-linux-musl.tar.zst working-directory: target/x86_64-unknown-linux-musl/release/ @@ -27,7 +27,7 @@ runs-on: windows-latest steps: - run: rustup update stable - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - run: cargo build --release --locked - uses: svenstaro/upload-release-action@v2 with: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ab-av1-0.10.2/CHANGELOG.md new/ab-av1-0.11.0/CHANGELOG.md --- old/ab-av1-0.10.2/CHANGELOG.md 2025-11-23 02:11:18.000000000 +0100 +++ new/ab-av1-0.11.0/CHANGELOG.md 2026-02-20 12:16:35.000000000 +0100 @@ -1,3 +1,19 @@ +# v0.11.0 +* svt-av1: Support crf quarter steps. Default `--crf-increment` to 0.25 for this encoder. + This requires svt-av1 >= [v4.0.0](https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/CHANGELOG.md#400---2026-01-13), + if using an older version you may want to use crf-search with `--crf-increment 1`. +* svt-av1: Widen default crf search range [10, 55] -> [5, 70]. + +# v0.10.4 +* Use ffmpeg `-fps_mode passthrough` for all sample encodes. This improves VMAF scores in some cases. +* Use explicit pixel format in xpsnr calls, use highest quality format of the ref & distorted streams. + This can improve scores in some cases. +* Wait for vmaf/xpsnr processes to finish e.g. to allow custom logging to flush. +* Update sample-encode json output to use float `predicted_encode_seconds`. + +# v0.10.3 +* Fix higher crf-search VMAF tolerance than expected when using `--crf-increment` values above 1. + # v0.10.2 * Disallow having `--input` the same as `--output` as this can lead to unintended data loss. This may be explicitly overridden by passing `--overwrite-input`. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ab-av1-0.10.2/Cargo.lock new/ab-av1-0.11.0/Cargo.lock --- old/ab-av1-0.10.2/Cargo.lock 2025-11-23 02:11:18.000000000 +0100 +++ new/ab-av1-0.11.0/Cargo.lock 2026-02-20 12:16:35.000000000 +0100 @@ -4,7 +4,7 @@ [[package]] name = "ab-av1" -version = "0.10.2" +version = "0.11.0" dependencies = [ "anyhow", "async-stream", @@ -86,9 +86,9 @@ [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "arrayref" @@ -132,28 +132,29 @@ [[package]] name = "bitflags" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" [[package]] name = "blake3" -version = "1.8.2" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +checksum = "2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if", "constant_time_eq", + "cpufeatures", ] [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "byteorder" @@ -163,15 +164,15 @@ [[package]] name = "bytes" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "cc" -version = "1.2.47" +version = "1.2.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd405d82c84ff7f35739f175f67d8b9fb7687a0e84ccdc78bd3568839827cf07" +checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" dependencies = [ "find-msvc-tools", "shlex", @@ -185,9 +186,9 @@ [[package]] name = "clap" -version = "4.5.53" +version = "4.5.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" +checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a" dependencies = [ "clap_builder", "clap_derive", @@ -205,9 +206,9 @@ [[package]] name = "clap_builder" -version = "4.5.53" +version = "4.5.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" +checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876" dependencies = [ "anstream", "anstyle", @@ -218,18 +219,18 @@ [[package]] name = "clap_complete" -version = "4.5.61" +version = "4.5.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39615915e2ece2550c0149addac32fb5bd312c657f43845bb9088cb9c8a7c992" +checksum = "c757a3b7e39161a4e56f9365141ada2a6c915a8622c408ab6bb4b5d047371031" dependencies = [ "clap", ] [[package]] name = "clap_derive" -version = "4.5.49" +version = "4.5.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" +checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" dependencies = [ "heck", "proc-macro2", @@ -239,9 +240,9 @@ [[package]] name = "clap_lex" -version = "0.7.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" +checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" [[package]] name = "colorchoice" @@ -251,9 +252,9 @@ [[package]] name = "console" -version = "0.16.1" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b430743a6eb14e9764d4260d4c0d8123087d504eeb9c48f2b2a5e810dd369df4" +checksum = "03e45a4a8926227e4197636ba97a9fc9b00477e9f4bd711395687c5f0734bec4" dependencies = [ "encode_unicode", "libc", @@ -264,9 +265,18 @@ [[package]] name = "constant_time_eq" -version = "0.3.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] [[package]] name = "crc32fast" @@ -294,9 +304,9 @@ [[package]] name = "deranged" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +checksum = "cc3dc5ad92c2e2d1c193bbbbdf2ea477cb81331de4f3103f267ca18368b988c4" dependencies = [ "powerfmt", ] @@ -330,18 +340,18 @@ [[package]] name = "env_filter" -version = "0.1.4" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" +checksum = "7a1c3cc8e57274ec99de65301228b537f1e4eedc1b8e0f9411c6caac8ae7308f" dependencies = [ "log", ] [[package]] name = "env_logger" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" +checksum = "b2daee4ea451f429a58296525ddf28b45a3b64f1acf6587e2067437bb11e218d" dependencies = [ "anstream", "anstyle", @@ -378,9 +388,9 @@ [[package]] name = "find-msvc-tools" -version = "0.1.5" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "fs2" @@ -394,9 +404,9 @@ [[package]] name = "futures" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" dependencies = [ "futures-channel", "futures-core", @@ -409,9 +419,9 @@ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", "futures-sink", @@ -419,15 +429,15 @@ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" dependencies = [ "futures-core", "futures-task", @@ -436,15 +446,15 @@ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", @@ -453,21 +463,21 @@ [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-channel", "futures-core", @@ -477,7 +487,6 @@ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] @@ -492,9 +501,9 @@ [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "libc", @@ -515,9 +524,9 @@ [[package]] name = "indicatif" -version = "0.18.3" +version = "0.18.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9375e112e4b463ec1b1c6c011953545c65a30164fbab5b581df32b3abf0dcb88" +checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb" dependencies = [ "console", "portable-atomic", @@ -549,15 +558,15 @@ [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] name = "jiff" -version = "0.2.16" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49cce2b81f2098e7e3efc35bc2e0a6b7abec9d34128283d7a26fa8f32a6dbb35" +checksum = "c867c356cc096b33f4981825ab281ecba3db0acefe60329f044c1789d94c6543" dependencies = [ "jiff-static", "log", @@ -568,9 +577,9 @@ [[package]] name = "jiff-static" -version = "0.2.16" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "980af8b43c3ad5d8d349ace167ec8170839f753a42d233ba19e08afe1850fa69" +checksum = "f7946b4325269738f270bb55b3c19ab5c5040525f83fd625259422a9d25d9be5" dependencies = [ "proc-macro2", "quote", @@ -579,9 +588,9 @@ [[package]] name = "js-sys" -version = "0.3.82" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" dependencies = [ "once_cell", "wasm-bindgen", @@ -589,17 +598,17 @@ [[package]] name = "libc" -version = "0.2.177" +version = "0.2.182" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" [[package]] name = "libredox" -version = "0.1.10" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "libc", ] @@ -620,21 +629,21 @@ [[package]] name = "log" -version = "0.4.28" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "memchr" -version = "2.7.6" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "mio" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ "libc", "wasi", @@ -643,9 +652,9 @@ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" [[package]] name = "once_cell" @@ -697,22 +706,16 @@ checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] name = "portable-atomic" -version = "1.11.1" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" dependencies = [ "portable-atomic", ] @@ -725,18 +728,18 @@ [[package]] name = "proc-macro2" -version = "1.0.103" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.42" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" dependencies = [ "proc-macro2", ] @@ -763,11 +766,11 @@ [[package]] name = "rustix" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "errno", "libc", "linux-raw-sys", @@ -781,12 +784,6 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] name = "same-file" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -833,15 +830,15 @@ [[package]] name = "serde_json" -version = "1.0.145" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "itoa", "memchr", - "ryu", "serde", "serde_core", + "zmij", ] [[package]] @@ -858,18 +855,19 @@ [[package]] name = "signal-hook-registry" -version = "1.4.7" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ + "errno", "libc", ] [[package]] name = "slab" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "sled" @@ -901,9 +899,9 @@ [[package]] name = "syn" -version = "2.0.110" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -922,18 +920,18 @@ [[package]] name = "thiserror" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", @@ -942,29 +940,29 @@ [[package]] name = "time" -version = "0.3.44" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ "deranged", "num-conv", "powerfmt", - "serde", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" -version = "0.2.24" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" dependencies = [ "num-conv", "time-core", @@ -972,9 +970,9 @@ [[package]] name = "tokio" -version = "1.48.0" +version = "1.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" dependencies = [ "bytes", "libc", @@ -1011,9 +1009,9 @@ [[package]] name = "tokio-stream" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" dependencies = [ "futures-core", "pin-project-lite", @@ -1022,9 +1020,9 @@ [[package]] name = "tokio-util" -version = "0.7.17" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ "bytes", "futures-core", @@ -1035,9 +1033,9 @@ [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-width" @@ -1065,9 +1063,9 @@ [[package]] name = "wasm-bindgen" -version = "0.2.105" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" dependencies = [ "cfg-if", "once_cell", @@ -1078,9 +1076,9 @@ [[package]] name = "wasm-bindgen-macro" -version = "0.2.105" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1088,9 +1086,9 @@ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.105" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" dependencies = [ "bumpalo", "proc-macro2", @@ -1101,9 +1099,9 @@ [[package]] name = "wasm-bindgen-shared" -version = "0.2.105" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" dependencies = [ "unicode-ident", ] @@ -1237,3 +1235,9 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ab-av1-0.10.2/Cargo.toml new/ab-av1-0.11.0/Cargo.toml --- old/ab-av1-0.10.2/Cargo.toml 2025-11-23 02:11:18.000000000 +0100 +++ new/ab-av1-0.11.0/Cargo.toml 2026-02-20 12:16:35.000000000 +0100 @@ -1,6 +1,6 @@ [package] name = "ab-av1" -version = "0.10.2" +version = "0.11.0" authors = ["Alex Butler <[email protected]>"] edition = "2024" description = "AV1 encoding with fast VMAF sampling" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ab-av1-0.10.2/README.md new/ab-av1-0.11.0/README.md --- old/ab-av1-0.10.2/README.md 2025-11-23 02:11:18.000000000 +0100 +++ new/ab-av1-0.11.0/README.md 2026-02-20 12:16:35.000000000 +0100 @@ -77,6 +77,9 @@ ab-av1 xpsnr --reference <REFERENCE> --distorted <DISTORTED> ``` +## JSON output +See `--stdout-format json` [docs](./stdout-format-json.md). + ## Install ### Arch Linux Available in the [AUR](https://aur.archlinux.org/packages/ab-av1). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ab-av1-0.10.2/src/command/args/encode.rs new/ab-av1-0.11.0/src/command/args/encode.rs --- old/ab-av1-0.10.2/src/command/args/encode.rs 2025-11-23 02:11:18.000000000 +0100 +++ new/ab-av1-0.11.0/src/command/args/encode.rs 2026-02-20 12:16:35.000000000 +0100 @@ -128,14 +128,6 @@ } impl Encode { - pub fn to_encoder_args( - &self, - crf: f32, - probe: &Ffprobe, - ) -> anyhow::Result<FfmpegEncodeArgs<'_>> { - self.to_ffmpeg_args(crf, probe) - } - pub fn encode_hint(&self, crf: f32) -> String { let Self { encoder, @@ -190,7 +182,11 @@ hint } - fn to_ffmpeg_args(&self, crf: f32, probe: &Ffprobe) -> anyhow::Result<FfmpegEncodeArgs<'_>> { + pub fn to_ffmpeg_args( + &self, + crf: f32, + probe: &Ffprobe, + ) -> anyhow::Result<FfmpegEncodeArgs<'_>> { let vcodec = &self.encoder.0; let svtav1 = vcodec.as_ref() == "libsvtav1"; ensure!( @@ -213,6 +209,8 @@ _ => 0, }; svtav1_params.push(format!("scd={scd}")); + // include crf in svtav1-params to support quarter-steps + svtav1_params.push(format!("crf={crf}")); // add all --svt args svtav1_params.extend(self.svt_args.iter().map(|a| a.to_string())); } @@ -224,12 +222,12 @@ if let Some((opt, val)) = arg.split_once('=') { if opt == "svtav1-params" { svtav1_params.push(arg.clone()); - vec![].into_iter() + vec![] } else { - vec![opt.to_owned().into(), val.to_owned().into()].into_iter() + vec![opt.to_owned().into(), val.to_owned().into()] } } else { - vec![arg.clone().into()].into_iter() + vec![arg.clone().into()] } }) .collect(); @@ -382,6 +380,7 @@ pub fn default_crf_increment(&self) -> f32 { match self.as_str() { "libx264" | "libx265" => 0.1, + "libsvtav1" => 0.25, _ => 1.0, } } @@ -389,6 +388,7 @@ pub fn default_min_crf(&self) -> f32 { match self.as_str() { "mpeg2video" => 2.0, + "libsvtav1" => 5.0, _ => 10.0, } } @@ -399,7 +399,7 @@ "libx264" | "libx265" => 46.0, "mpeg2video" => 30.0, "hevc_videotoolbox" => 100.0, - // Works well for svt-av1 + "libsvtav1" => 70.0, _ => 55.0, } } @@ -653,7 +653,7 @@ .get(svtargs_idx + 1) .expect("missing -svtav1-params value") .as_str(); - assert_eq!(svtargs, "scd=1:film-grain=30"); + assert_eq!(svtargs, "scd=1:crf=32:film-grain=30"); assert!(input_args.is_empty()); } @@ -714,6 +714,6 @@ .get(svtargs_idx + 1) .expect("missing -svtav1-params value") .as_str(); - assert_eq!(svtargs, "scd=0"); + assert_eq!(svtargs, "scd=0:crf=32"); assert!(input_args.is_empty()); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ab-av1-0.10.2/src/command/crf_search.rs new/ab-av1-0.11.0/src/command/crf_search.rs --- old/ab-av1-0.10.2/src/command/crf_search.rs 2025-11-23 02:11:18.000000000 +0100 +++ new/ab-av1-0.11.0/src/command/crf_search.rs 2026-02-20 12:16:35.000000000 +0100 @@ -274,7 +274,7 @@ true => 0.05, // increment 1.0 => +0.1, +0.2, +0.4, +0.8 .. // increment 0.1 => +0.1, +0.1, +0.1, +0.16 .. - _ => (crf_increment * 2_f32.powi(run as i32 - 1) * 0.1).max(0.1), + _ => (crf_increment.min(1.0) * 2_f32.powi(run as i32 - 1) * 0.1).max(0.1), }; args.crf = q_conv.crf(q); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ab-av1-0.10.2/src/command/encode.rs new/ab-av1-0.11.0/src/command/encode.rs --- old/ab-av1-0.10.2/src/command/encode.rs 2025-11-23 02:11:18.000000000 +0100 +++ new/ab-av1-0.11.0/src/command/encode.rs 2026-02-20 12:16:35.000000000 +0100 @@ -85,7 +85,7 @@ } bar.set_message("encoding, "); - let mut enc_args = args.to_encoder_args(crf, &probe)?; + let mut enc_args = args.to_ffmpeg_args(crf, &probe)?; enc_args.video_only = video_only; let has_audio = probe.has_audio; if let Ok(d) = &probe.duration { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ab-av1-0.10.2/src/command/sample_encode.rs new/ab-av1-0.11.0/src/command/sample_encode.rs --- old/ab-av1-0.10.2/src/command/sample_encode.rs 2025-11-23 02:11:18.000000000 +0100 +++ new/ab-av1-0.11.0/src/command/sample_encode.rs 2026-02-20 12:16:35.000000000 +0100 @@ -7,7 +7,7 @@ sample_encode::cache::ScoringInfo, }, console_ext::style, - ffmpeg::{self, FfmpegEncodeArgs}, + ffmpeg::{self, FfmpegEncodeArgs, remove_arg}, ffprobe::{self, Ffprobe}, log::ProgressLogger, process::FfmpegOut, @@ -159,7 +159,11 @@ let input_pix_fmt = input_probe.pixel_format(); let input_is_image = input_probe.is_image; let input_len = fs::metadata(&*input).await?.len(); - let enc_args = args.to_encoder_args(crf, &input_probe)?; + let mut enc_args = args.to_ffmpeg_args(crf, &input_probe)?; + // ignore user -fps_mode for sample encoding, as we always use passthrough + remove_arg(&mut enc_args.output_args, "-fps_mode"); + remove_arg(&mut enc_args.output_args, "-vsync"); + let duration = input_probe.duration.clone()?; let input_fps = input_probe.fps.clone()?; let samples = sample_args.sample_count(duration).max(1); @@ -314,7 +318,6 @@ match vmaf { VmafOut::Done(score) => { vmaf_score = Some(score); - break; } VmafOut::Progress(FfmpegOut::Progress { time, fps, .. }) => { yield Update::Status(Status { @@ -360,7 +363,8 @@ }); let lavfi = super::xpsnr::lavfi( - score.reference_vfilter.as_deref().or(args.vfilter.as_deref()) + score.reference_vfilter.as_deref().or(args.vfilter.as_deref()), + PixelFormat::opt_max(enc_args.pix_fmt, input_pix_fmt), ); let xpsnr_out = xpsnr::run(&sample, &encoded_sample, &lavfi, xpsnr_opts.fps())?; let mut xpsnr_out = pin!(xpsnr_out); @@ -370,7 +374,6 @@ match next { XpsnrOut::Done(s) => { score = Some(s); - break; } XpsnrOut::Progress(FfmpegOut::Progress { time, fps, .. }) => { yield Update::Status(Status { @@ -718,7 +721,7 @@ let mut json = serde_json::json!({ "predicted_encode_size": predicted_encode_size, "predicted_encode_percent": encode_percent, - "predicted_encode_seconds": predicted_encode_time.as_secs(), + "predicted_encode_seconds": predicted_encode_time.as_secs_f64(), }); match score_kind { ScoreKind::Vmaf => json["vmaf"] = (*score).into(), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ab-av1-0.10.2/src/command/vmaf.rs new/ab-av1-0.11.0/src/command/vmaf.rs --- old/ab-av1-0.10.2/src/command/vmaf.rs 2025-11-23 02:11:18.000000000 +0100 +++ new/ab-av1-0.11.0/src/command/vmaf.rs 2026-02-20 12:16:35.000000000 +0100 @@ -83,7 +83,6 @@ match vmaf { VmafOut::Done(score) => { vmaf_score = Some(score); - break; } VmafOut::Progress(FfmpegOut::Progress { frame, fps, time, .. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ab-av1-0.10.2/src/command/xpsnr.rs new/ab-av1-0.11.0/src/command/xpsnr.rs --- old/ab-av1-0.10.2/src/command/xpsnr.rs 2025-11-23 02:11:18.000000000 +0100 +++ new/ab-av1-0.11.0/src/command/xpsnr.rs 2026-02-20 12:16:35.000000000 +0100 @@ -1,5 +1,8 @@ use crate::{ - command::{PROGRESS_CHARS, args}, + command::{ + PROGRESS_CHARS, + args::{self, PixelFormat}, + }, ffprobe, log::ProgressLogger, process::FfmpegOut, @@ -9,10 +12,9 @@ use clap::Parser; use indicatif::{ProgressBar, ProgressStyle}; use std::{ - borrow::Cow, + fmt::Write, path::PathBuf, pin::pin, - sync::LazyLock, time::{Duration, Instant}, }; use tokio_stream::StreamExt; @@ -55,12 +57,9 @@ bar.set_message("xpsnr running, "); let dprobe = ffprobe::probe(&distorted); - let rprobe = LazyLock::new(|| ffprobe::probe(&reference)); + let rprobe = ffprobe::probe(&reference); let nframes = dprobe.nframes().or_else(|_| rprobe.nframes()); - let duration = dprobe - .duration - .as_ref() - .or_else(|_| rprobe.duration.as_ref()); + let duration = dprobe.duration.as_ref().or(rprobe.duration.as_ref()); if let Ok(nframes) = nframes { bar.set_length(nframes); } @@ -68,7 +67,10 @@ let mut xpsnr_out = pin!(xpsnr::run( &reference, &distorted, - &lavfi(score.reference_vfilter.as_deref()), + &lavfi( + score.reference_vfilter.as_deref(), + PixelFormat::opt_max(dprobe.pixel_format(), rprobe.pixel_format()), + ), xpsnr.fps(), )?); let mut logger = ProgressLogger::new(module_path!(), Instant::now()); @@ -77,7 +79,6 @@ match next { XpsnrOut::Done(s) => { score = Some(s); - break; } XpsnrOut::Progress(FfmpegOut::Progress { frame, fps, time, .. @@ -102,23 +103,59 @@ Ok(()) } -pub fn lavfi(ref_vfilter: Option<&str>) -> Cow<'static, str> { - match ref_vfilter { - None => "xpsnr=stats_file=-".into(), - Some(vf) => format!("[0:v]{vf}[ref];[ref][1:v]xpsnr=stats_file=-").into(), +pub fn lavfi(ref_vfilter: Option<&str>, pix_fmt: Option<PixelFormat>) -> String { + let mut lavfi = String::from("[0:v]"); + if let Some(pix_fmt) = pix_fmt { + _ = write!(&mut lavfi, "format={pix_fmt}"); } + if let Some(vf) = ref_vfilter { + if pix_fmt.is_some() { + lavfi.push(','); + } + lavfi.push_str(vf); + } + lavfi.push_str("[ref];[1:v]"); + if let Some(pix_fmt) = pix_fmt { + _ = write!(&mut lavfi, "format={pix_fmt}"); + } + lavfi.push_str("[dis];[ref][dis]xpsnr=stats_file=-"); + lavfi } #[test] fn test_lavfi_default() { - assert_eq!(lavfi(None), "xpsnr=stats_file=-"); + assert_eq!( + lavfi(None, None), + "[0:v][ref];[1:v][dis];[ref][dis]xpsnr=stats_file=-" + ); } #[test] fn test_lavfi_ref_vfilter() { assert_eq!( - lavfi(Some("scale=1280:-1")), + lavfi(Some("scale=1280:-1"), None), "[0:v]scale=1280:-1[ref];\ - [ref][1:v]xpsnr=stats_file=-" + [1:v][dis];\ + [ref][dis]xpsnr=stats_file=-" + ); +} + +#[test] +fn test_lavfi_pixel_format() { + assert_eq!( + lavfi(None, Some(PixelFormat::Yuv420p10le)), + "[0:v]format=yuv420p10le[ref];\ + [1:v]format=yuv420p10le[dis];\ + [ref][dis]xpsnr=stats_file=-" + ); +} + +#[test] +fn test_lavfi_all() { + assert_eq!( + lavfi(Some("scale=640:-1"), Some(PixelFormat::Yuv420p10le)), + "[0:v]format=yuv420p10le,scale=640:-1[ref];\ + [1:v]format=yuv420p10le[dis];\ + [ref][dis]xpsnr=stats_file=-" ); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ab-av1-0.10.2/src/ffmpeg.rs new/ab-av1-0.11.0/src/ffmpeg.rs --- old/ab-av1-0.10.2/src/ffmpeg.rs 2025-11-23 02:11:18.000000000 +0100 +++ new/ab-av1-0.11.0/src/ffmpeg.rs 2026-02-20 12:16:35.000000000 +0100 @@ -54,6 +54,7 @@ self.preset.hash(state); self.output_args.hash(state); self.input_args.hash(state); + 20250103.hash(state); // introduced -fps_mode passthrough } } @@ -92,7 +93,9 @@ .arg2("-i", input) .arg2("-c:v", &*vcodec) .args(output_args.iter().map(|a| &**a)) - .arg2(vcodec.crf_arg(), crf) + // Avoid dropping or duplicating frames as this may negatively affect input/output analysis + .arg2("-fps_mode", "passthrough") + .arg2(vcodec.crf_arg(), vcodec.crf(crf)) .arg2_opt("-pix_fmt", pix_fmt.map(|v| v.as_str())) .arg2_opt(vcodec.preset_arg(), preset) .arg2_opt("-vf", vfilter) @@ -168,7 +171,7 @@ .arg2("-c:a", audio_codec) .arg2("-c:s", "copy") .args(output_args.iter().map(|a| &**a)) - .arg2(vcodec.crf_arg(), crf) + .arg2(vcodec.crf_arg(), vcodec.crf(crf)) .arg2_opt("-pix_fmt", pix_fmt.map(|v| v.as_str())) .arg2_opt(vcodec.preset_arg(), preset) .arg2_opt("-vf", vfilter) @@ -203,6 +206,8 @@ fn preset_arg(&self) -> &str; /// Arg to use crf values with, normally `-crf`. fn crf_arg(&self) -> &str; + /// crf value to pass to ffmpeg. + fn crf(&self, crf: f32) -> f32; } impl VCodecSpecific for Arc<str> { fn preset_arg(&self) -> &str { @@ -230,4 +235,27 @@ _ => "-crf", } } + + fn crf(&self, crf: f32) -> f32 { + match &**self { + // ffmpeg svt-av1 crf above 63 don't work, but up to 70 does work in -svtav1-params + "libsvtav1" => crf.min(63.0), + _ => crf, + } + } +} + +pub fn remove_arg(args: &mut Vec<Arc<String>>, arg: &'static str) { + let mut retain_next = true; + args.retain(|a| { + if **a == arg { + retain_next = false; + false + } else if !retain_next { + retain_next = true; + false + } else { + true + } + }); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ab-av1-0.10.2/stdout-format-json.md new/ab-av1-0.11.0/stdout-format-json.md --- old/ab-av1-0.10.2/stdout-format-json.md 1970-01-01 01:00:00.000000000 +0100 +++ new/ab-av1-0.11.0/stdout-format-json.md 2026-02-20 12:16:35.000000000 +0100 @@ -0,0 +1,22 @@ +# Messages output when using `--stdout-format json` + +## sample-encode +Single json emitted after sample encoding has finished. + +Field | Description | Type/Units +---|---|--- +`predicted_encode_percent` | Predicted output encode size percentage vs input | float +`predicted_encode_seconds` | Predicted output encode time in seconds | float +`predicted_encode_size` | Predicted output encode size in bytes | uint +`vmaf` | VMAF score (absent when using --xpsnr) | float +`xpsnr` | XPSNR score (present only when using --xpsnr) | float + +### Example +```json +{ + "predicted_encode_percent": 41.01556024884758, + "predicted_encode_seconds": 33, + "predicted_encode_size": 38889644, + "vmaf": 95.13105773925781 +} +``` ++++++ ab-av1.obsinfo ++++++ --- /var/tmp/diff_new_pack.u7N5ig/_old 2026-02-20 17:54:30.029251707 +0100 +++ /var/tmp/diff_new_pack.u7N5ig/_new 2026-02-20 17:54:30.033251875 +0100 @@ -1,5 +1,5 @@ name: ab-av1 -version: 0.10.2 -mtime: 1763860278 -commit: 692650560ae27cca0464bd43fd2935e866864ed3 +version: 0.11.0 +mtime: 1771586195 +commit: 5b57da51034c26a5d9c171f7ea161def41da61fc ++++++ build.specials.obscpio ++++++ ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2026-02-20 13:57:47.000000000 +0100 @@ -0,0 +1 @@ +.osc ++++++ vendor.tar.zst ++++++ /work/SRC/openSUSE:Factory/ab-av1/vendor.tar.zst /work/SRC/openSUSE:Factory/.ab-av1.new.1977/vendor.tar.zst differ: char 7, line 1
