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

Reply via email to