Skip to content

feat(nv21): NV21 (semi-planar 4:2:0, VU-ordered) via const-generic kernel share with NV12#3

Merged
uqio merged 2 commits intomainfrom
feat/nv21
Apr 19, 2026
Merged

feat(nv21): NV21 (semi-planar 4:2:0, VU-ordered) via const-generic kernel share with NV12#3
uqio merged 2 commits intomainfrom
feat/nv21

Conversation

@uqio
Copy link
Copy Markdown
Collaborator

@uqio uqio commented Apr 19, 2026

Summary

Adds NV21 support (Android MediaCodec's default 8-bit output format).
NV21 is structurally identical to NV12 — one full-size Y plane plus
one interleaved chroma plane at half width and half height — but the
chroma bytes are VU-ordered (V0, U0, V1, U1, …) instead of
NV12's UV-ordering.

The implementation shares every kernel with NV12 via
const SWAP_UV: bool monomorphization — zero runtime cost, ~5 lines
of diff per SIMD backend instead of ~150 lines of duplicated kernel
body. The swap is resolved at compile time; LLVM generates two
monomorphic copies (one per boolean value), each with the if SWAP_UV branch eliminated. Benchmarks confirm NV21 runs within
measurement noise of NV12 on every backend — see
#3 (comment).

New API surface

  • frame::Nv21Frame + Nv21FrameError — validated frame type,
    stride-aware, odd heights accepted, mirrors Nv12Frame's
    validation and error-variant shape.
  • yuv::{Nv21, Nv21Row, Nv21Sink, nv21_to} — marker type, row
    struct exposing y() / vu_half(), sink subtrait, walker.
  • row::nv21_to_rgb_row dispatcher with use_simd toggle.
  • impl PixelSink for MixedSinker<'_, Nv21> — full fallible contract
    (begin_frame preflight, OddWidth/DimensionMismatch/
    RowShapeMismatch { which: VuHalf, … }/RowIndexOutOfRange/
    GeometryOverflow).

Refactor: const-generic kernel share

Every backend now has one nv12_or_nv21_to_rgb_row_impl<const SWAP_UV: bool> helper with two thin public wrappers:

// Scalar + all 5 SIMD backends follow this pattern:
pub(crate) unsafe fn nv12_to_rgb_row(...) {
    nv12_or_nv21_to_rgb_row_impl::<false>(...);
}
pub(crate) unsafe fn nv21_to_rgb_row(...) {
    nv12_or_nv21_to_rgb_row_impl::<true>(...);
}

Inside the shared impl, the U/V output of the deinterleave step is
selected by SWAP_UV:

let (u_vec, v_vec) = if SWAP_UV {
    (odd_result, even_result)   // NV21: even=V, odd=U
} else {
    (even_result, odd_result)   // NV12: even=U, odd=V
};

Applied consistently across scalar, NEON (vld2_u8 result swap),
SSE4.1 (_mm_shuffle_epi8 mask pair swap), AVX2 (cast_si128 /
extracti128 swap after the permute4x64 fixup), AVX-512
(castsi512_si256 / extracti64x4 swap after the permutexvar
gather), and wasm simd128 (i8x16_shuffle result swap).

This is the pattern the project roadmap (docs/color-conversion-functions.md
§ 8) calls out for future format pairs — NV24/NV42, and an eventual
P010-with-VU-swapped twin will follow the same shape.

Tests

90 lib tests pass (7 new):

  • NV21 scalar-equivalence per arch: scalar and SIMD produce
    byte-identical output across all 6 color matrices and
    full/limited range.
  • check_nv21_matches_nv12_swapped per arch: builds a chroma
    stream with bytes swapped and verifies NV21 kernel on the swapped
    data produces the same RGB as NV12 on the original. Catches any
    stray SWAP_UV bug.
  • MixedSinker<Nv21> integration: luma-only, rgb-only, mixed
    three-output, and cross-format NV21-matches-NV12 tests.
  • Nv21Frame validation: 9 tests (zero/odd-width/
    odd-height-accepted/stride/plane-short/overflow/panic).

Error-type additions

  • RowSlice::VuHalf — new #[non_exhaustive] variant so NV21 users
    don't see misleading "UV Half" in RowShapeMismatch errors.
    Displays as "VU Half" via derive_more::Display.
  • MixedSinkerError::OddWidth message is now format-agnostic ("4:2:0 formats require even width") rather than listing only YUV420p / NV12.

Docs

  • src/lib.rsPixelSink docs unchanged (already cover the
    fallible contract from PR feat(NV12): NV12(semi-planar 4:2:0) + fallible PixelSink contract #2).
  • src/yuv/mod.rs top-level doc adds the NV21 bullet.
  • docs/color-conversion-functions.md:
    • entry #9 marked ✅ shipped v0.1
    • § 8 Rollout order rewritten with a Shipped block (v0.1 state)
      and a TODO plan (Ships 1–6): yuvj420pyuv420p10
      P010 → higher bit-depths → NV16/24/42 → alpha + niche u16
      variants. Value-first (HDR) ordering with the keystone
      dependency chain called out.
  • New section in § 1.2 explaining why the crate targets ~48 formats
    out of FFmpeg's ~180 AVPixelFormat enum: hardware handles,
    endian twins, legacy palette formats, libavfilter-internal floats
    aren't dedicated-kernel territory.

Benchmarks

Run across all 8 tiers (macOS NEON, macOS scalar-forced, Ubuntu
default/avx2-max/sse41-max/scalar/native, Windows default):
#3 (comment)

Headline: NV21 is within noise of NV12 on every tier, confirming
the const SWAP_UV monomorphization has zero runtime cost. At
1920 px:

Tier NV12 SIMD NV21 SIMD Δ
macOS NEON 760 ns 759 ns 0%
Ubuntu default (AVX2) 1674 1674 0%
Ubuntu sse41-max 1331 1325 −0.5%
Windows default 1700 1685 −0.9%

Test plan

  • cargo test --all-features — 90 passing
  • cargo hack check --feature-powerset (7 feature combos incl.
    --no-default-features)
  • cargo hack clippy --each-feature -- -D warnings
  • Cross builds: wasm32, x86_64-windows, i686-linux,
    aarch64-linux, aarch64-darwin
  • cargo fmt --check
  • cargo doc --all-features --no-deps — no unresolved links

Next

Per the updated docs/color-conversion-functions.md § 8, the next
shipment is either yuvj420p (a doc-only clarification) or
yuv420p10 (the u16 kernel template that unblocks HDR). yuv420p10
is the load-bearing next step.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Implements NV21 (4:2:0 semi-planar with VU-ordered chroma) end-to-end support across frame validation, row conversion (scalar + SIMD), and the MixedSinker pipeline.

Changes:

  • Add Nv21Frame (+ validation errors) and a YUV walker nv21_to with Nv21Row/Nv21Sink.
  • Add nv21_to_rgb_row (dispatcher) and NV21 support across scalar + SIMD backends via a shared NV12/NV21 implementation.
  • Extend MixedSinker to consume NV21 and add benches/tests for equivalence and output correctness.

Reviewed changes

Copilot reviewed 13 out of 13 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
src/yuv/nv21.rs New NV21 row walker + row/sink types mirroring NV12 but with VU chroma.
src/yuv/mod.rs Registers/exposes the new NV21 module and public API exports.
src/sinker/mixed.rs Adds PixelSink impl for MixedSinker<Nv21> and NV21-focused tests.
src/row/scalar.rs Adds scalar NV21 path via shared NV12/NV21 impl with compile-time UV swap.
src/row/mod.rs Public dispatcher nv21_to_rgb_row with SIMD selection matching NV12 pattern.
src/row/arch/x86_sse41.rs Adds NV21 SIMD wrapper + shared NV12/NV21 impl + equivalence tests.
src/row/arch/x86_avx2.rs Adds NV21 SIMD wrapper + shared NV12/NV21 impl + equivalence tests.
src/row/arch/x86_avx512.rs Adds NV21 SIMD wrapper + shared NV12/NV21 impl + equivalence tests.
src/row/arch/wasm_simd128.rs Adds NV21 SIMD wrapper + shared NV12/NV21 impl + equivalence tests.
src/row/arch/neon.rs Adds NV21 SIMD wrapper + shared NV12/NV21 impl + equivalence tests.
src/frame.rs Adds Nv21Frame and Nv21FrameError plus validation tests.
benches/nv21_to_rgb.rs New Criterion bench for per-row NV21→RGB conversion.
Cargo.toml Registers the new nv21_to_rgb benchmark target.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/sinker/mixed.rs
Comment on lines +715 to +718
fn begin_frame(&mut self, width: u32, height: u32) -> Result<(), Self::Error> {
if self.width & 1 != 0 {
return Err(MixedSinkerError::OddWidth { width: self.width });
}
Copy link

Copilot AI Apr 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MixedSinkerError::OddWidth is now returned from the NV21 sink as well, but the error’s Display text and doc comment still mention only “YUV420p / NV12 require even width” (see MixedSinkerError::OddWidth). This makes the error misleading for NV21 callers; consider updating the message/docs to include NV21 or make it format-agnostic (e.g., “4:2:0 formats require even width”).

Copilot uses AI. Check for mistakes.
Comment thread src/sinker/mixed.rs
Comment on lines +742 to +753
if row.vu_half().len() != w {
// Nv21 reuses the `UvHalf` variant because the RowSlice enum
// describes "half-width interleaved chroma" structurally — the
// byte order isn't part of the shape contract. If a caller
// needs the format-specific distinction they can match on the
// sink type instead.
return Err(MixedSinkerError::RowShapeMismatch {
which: RowSlice::UvHalf,
row: idx,
expected: w,
actual: row.vu_half().len(),
});
Copy link

Copilot AI Apr 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The NV21 path reports chroma shape mismatches as RowSlice::UvHalf (and RowSlice currently displays this as “UV Half”), which can be confusing when debugging NV21 (VU-ordered) inputs. Since NV21 support is being added, consider adding a RowSlice::VuHalf variant (or a more generic interleaved-chroma variant) and updating the existing RowSlice doc comment that references NV21 as a future addition.

Copilot uses AI. Check for mistakes.
Comment thread src/yuv/mod.rs Outdated
Comment on lines +9 to +10
//! - [`Nv21`](crate::yuv::Nv21) — 4:2:0 semi‑planar with **VU**-
//! ordered chroma (Android MediaCodec default).
Copy link

Copilot AI Apr 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The bullet for NV21 splits “VU-ordered” across a line break as **VU**- / ordered, which renders as “VU- ordered” in rustdoc. Consider keeping “VU-ordered” on one line (or dropping the end-of-line hyphen) to avoid unintended hyphenation/spacing in the generated docs.

Suggested change
//! - [`Nv21`](crate::yuv::Nv21) — 4:2:0 semi‑planar with **VU**-
//! ordered chroma (Android MediaCodec default).
//! - [`Nv21`](crate::yuv::Nv21) — 4:2:0 semi‑planar with **VU**-ordered
//! chroma (Android MediaCodec default).

Copilot uses AI. Check for mistakes.
Comment thread src/sinker/mixed.rs
Comment on lines +703 to +707
// ---- Nv21 impl ----------------------------------------------------------
//
// Structurally identical to the Nv12 impl — the row primitives hide
// the U/V byte-order difference. Only the trait `Input<'r>` and the
// primitive name change.
Copy link

Copilot AI Apr 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The file-level docs near the top still say “v0.1 ships the Yuv420p and Nv12 impls”, but this PR adds an NV21 PixelSink impl as well. Please update the MixedSinker module documentation to reflect NV21 support so public docs remain accurate.

Copilot uses AI. Check for mistakes.
@codecov
Copy link
Copy Markdown

codecov bot commented Apr 19, 2026

Codecov Report

❌ Patch coverage is 77.69608% with 91 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/row/arch/x86_avx512.rs 0.00% 48 Missing ⚠️
src/sinker/mixed.rs 73.80% 22 Missing ⚠️
src/frame.rs 84.48% 9 Missing ⚠️
src/row/mod.rs 72.00% 7 Missing ⚠️
src/row/arch/neon.rs 90.90% 5 Missing ⚠️

📢 Thoughts on this report? Let us know!

@github-actions
Copy link
Copy Markdown

Benchmark Results

Benchmark Results Summary

Date: 2026-04-19 04:15:28 UTC

Benchmark Results for macos-aarch64-neon

System Information

  • OS: macos-latest
  • Arch: aarch64
  • SIMD tier: neon
  • Runner: GitHub Actions 1000008389
  • Runner arch (GH): ARM64
  • RUSTFLAGS: ``
  • Date: 2026-04-19 04:13:43 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       2,726 ns/iter (+/- 21)
test nv12_to_rgb_row/simd/1280 ... bench:         510 ns/iter (+/- 30)
test nv12_to_rgb_row/scalar/1920 ... bench:       4,090 ns/iter (+/- 90)
test nv12_to_rgb_row/simd/1920 ... bench:         760 ns/iter (+/- 21)
test nv12_to_rgb_row/scalar/3840 ... bench:       8,173 ns/iter (+/- 100)
test nv12_to_rgb_row/simd/3840 ... bench:       1,515 ns/iter (+/- 73)
test nv21_to_rgb_row/scalar/1280 ... bench:       2,728 ns/iter (+/- 39)
test nv21_to_rgb_row/simd/1280 ... bench:         511 ns/iter (+/- 19)
test nv21_to_rgb_row/scalar/1920 ... bench:       4,091 ns/iter (+/- 103)
test nv21_to_rgb_row/simd/1920 ... bench:         759 ns/iter (+/- 19)
test nv21_to_rgb_row/scalar/3840 ... bench:       8,176 ns/iter (+/- 115)
test nv21_to_rgb_row/simd/3840 ... bench:       1,511 ns/iter (+/- 24)
test rgb_to_hsv_row/scalar/1280 ... bench:       3,120 ns/iter (+/- 64)
test rgb_to_hsv_row/simd/1280 ... bench:       1,453 ns/iter (+/- 40)
test rgb_to_hsv_row/scalar/1920 ... bench:       4,678 ns/iter (+/- 25)
test rgb_to_hsv_row/simd/1920 ... bench:       2,179 ns/iter (+/- 43)
test rgb_to_hsv_row/scalar/3840 ... bench:       9,360 ns/iter (+/- 1,767)
test rgb_to_hsv_row/simd/3840 ... bench:       4,355 ns/iter (+/- 16)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       2,693 ns/iter (+/- 16)
test yuv_420_to_rgb_row/simd/1280 ... bench:         490 ns/iter (+/- 14)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       4,037 ns/iter (+/- 22)
test yuv_420_to_rgb_row/simd/1920 ... bench:         731 ns/iter (+/- 11)
test yuv_420_to_rgb_row/scalar/3840 ... bench:       8,278 ns/iter (+/- 212)
test yuv_420_to_rgb_row/simd/3840 ... bench:       1,459 ns/iter (+/- 23)

Benchmark Results for macos-aarch64-scalar

System Information

  • OS: macos-latest
  • Arch: aarch64
  • SIMD tier: scalar
  • Runner: GitHub Actions 1000008388
  • Runner arch (GH): ARM64
  • RUSTFLAGS: --cfg colconv_force_scalar
  • Date: 2026-04-19 04:14:07 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       3,232 ns/iter (+/- 308)
test nv12_to_rgb_row/simd/1280 ... bench:       3,270 ns/iter (+/- 302)
test nv12_to_rgb_row/scalar/1920 ... bench:       4,955 ns/iter (+/- 620)
test nv12_to_rgb_row/simd/1920 ... bench:       4,683 ns/iter (+/- 550)
test nv12_to_rgb_row/scalar/3840 ... bench:       9,303 ns/iter (+/- 892)
test nv12_to_rgb_row/simd/3840 ... bench:       9,637 ns/iter (+/- 815)
test nv21_to_rgb_row/scalar/1280 ... bench:       3,262 ns/iter (+/- 283)
test nv21_to_rgb_row/simd/1280 ... bench:       3,240 ns/iter (+/- 266)
test nv21_to_rgb_row/scalar/1920 ... bench:       4,714 ns/iter (+/- 259)
test nv21_to_rgb_row/simd/1920 ... bench:       4,784 ns/iter (+/- 301)
test nv21_to_rgb_row/scalar/3840 ... bench:       9,470 ns/iter (+/- 1,065)
test nv21_to_rgb_row/simd/3840 ... bench:       9,611 ns/iter (+/- 605)
test rgb_to_hsv_row/scalar/1280 ... bench:       3,484 ns/iter (+/- 444)
test rgb_to_hsv_row/simd/1280 ... bench:       3,664 ns/iter (+/- 239)
test rgb_to_hsv_row/scalar/1920 ... bench:       5,592 ns/iter (+/- 362)
test rgb_to_hsv_row/simd/1920 ... bench:       5,610 ns/iter (+/- 330)
test rgb_to_hsv_row/scalar/3840 ... bench:      10,930 ns/iter (+/- 700)
test rgb_to_hsv_row/simd/3840 ... bench:      11,137 ns/iter (+/- 878)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       3,274 ns/iter (+/- 311)
test yuv_420_to_rgb_row/simd/1280 ... bench:       3,262 ns/iter (+/- 249)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       4,356 ns/iter (+/- 193)
test yuv_420_to_rgb_row/simd/1920 ... bench:       4,372 ns/iter (+/- 62)
test yuv_420_to_rgb_row/scalar/3840 ... bench:       8,948 ns/iter (+/- 137)
test yuv_420_to_rgb_row/simd/3840 ... bench:       8,950 ns/iter (+/- 158)

Benchmark Results for ubuntu-x86_64-avx2-max

System Information

  • OS: ubuntu-latest
  • Arch: x86_64
  • SIMD tier: avx2-max
  • Runner: GitHub Actions 1000008399
  • Runner arch (GH): X64
  • RUSTFLAGS: --cfg colconv_disable_avx512
  • Date: 2026-04-19 04:14:58 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,876 ns/iter (+/- 67)
test nv12_to_rgb_row/simd/1280 ... bench:       1,116 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/1920 ... bench:       7,366 ns/iter (+/- 31)
test nv12_to_rgb_row/simd/1920 ... bench:       1,674 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/3840 ... bench:      14,780 ns/iter (+/- 224)
test nv12_to_rgb_row/simd/3840 ... bench:       3,352 ns/iter (+/- 4)
test nv21_to_rgb_row/scalar/1280 ... bench:       4,931 ns/iter (+/- 122)
test nv21_to_rgb_row/simd/1280 ... bench:       1,118 ns/iter (+/- 1)
test nv21_to_rgb_row/scalar/1920 ... bench:       7,418 ns/iter (+/- 73)
test nv21_to_rgb_row/simd/1920 ... bench:       1,675 ns/iter (+/- 2)
test nv21_to_rgb_row/scalar/3840 ... bench:      14,853 ns/iter (+/- 136)
test nv21_to_rgb_row/simd/3840 ... bench:       3,351 ns/iter (+/- 3)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,904 ns/iter (+/- 133)
test rgb_to_hsv_row/simd/1280 ... bench:       2,596 ns/iter (+/- 9)
test rgb_to_hsv_row/scalar/1920 ... bench:       7,360 ns/iter (+/- 143)
test rgb_to_hsv_row/simd/1920 ... bench:       3,888 ns/iter (+/- 7)
test rgb_to_hsv_row/scalar/3840 ... bench:      14,844 ns/iter (+/- 469)
test rgb_to_hsv_row/simd/3840 ... bench:       7,760 ns/iter (+/- 12)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,582 ns/iter (+/- 41)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,004 ns/iter (+/- 15)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,948 ns/iter (+/- 86)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,505 ns/iter (+/- 17)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      14,014 ns/iter (+/- 1,364)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,013 ns/iter (+/- 15)

Benchmark Results for ubuntu-x86_64-default

System Information

  • OS: ubuntu-latest
  • Arch: x86_64
  • SIMD tier: default
  • Runner: GitHub Actions 1000008384
  • Runner arch (GH): X64
  • RUSTFLAGS: ``
  • Date: 2026-04-19 04:14:10 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,449 ns/iter (+/- 72)
test nv12_to_rgb_row/simd/1280 ... bench:       1,117 ns/iter (+/- 2)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,699 ns/iter (+/- 37)
test nv12_to_rgb_row/simd/1920 ... bench:       1,674 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,430 ns/iter (+/- 360)
test nv12_to_rgb_row/simd/3840 ... bench:       3,355 ns/iter (+/- 2)
test nv21_to_rgb_row/scalar/1280 ... bench:       4,639 ns/iter (+/- 10)
test nv21_to_rgb_row/simd/1280 ... bench:       1,117 ns/iter (+/- 1)
test nv21_to_rgb_row/scalar/1920 ... bench:       6,695 ns/iter (+/- 24)
test nv21_to_rgb_row/simd/1920 ... bench:       1,674 ns/iter (+/- 26)
test nv21_to_rgb_row/scalar/3840 ... bench:      13,945 ns/iter (+/- 65)
test nv21_to_rgb_row/simd/3840 ... bench:       3,355 ns/iter (+/- 4)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,669 ns/iter (+/- 35)
test rgb_to_hsv_row/simd/1280 ... bench:       2,586 ns/iter (+/- 3)
test rgb_to_hsv_row/scalar/1920 ... bench:       7,016 ns/iter (+/- 167)
test rgb_to_hsv_row/simd/1920 ... bench:       3,916 ns/iter (+/- 53)
test rgb_to_hsv_row/scalar/3840 ... bench:      14,063 ns/iter (+/- 46)
test rgb_to_hsv_row/simd/3840 ... bench:       7,767 ns/iter (+/- 14)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,565 ns/iter (+/- 30)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,004 ns/iter (+/- 1)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,907 ns/iter (+/- 33)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,505 ns/iter (+/- 2)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,807 ns/iter (+/- 157)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,013 ns/iter (+/- 3)

Benchmark Results for ubuntu-x86_64-native

System Information

  • OS: ubuntu-latest
  • Arch: x86_64
  • SIMD tier: native
  • Runner: GitHub Actions 1000008395
  • Runner arch (GH): X64
  • RUSTFLAGS: ``
  • CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS: -C target-cpu=native
  • Date: 2026-04-19 04:15:06 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,453 ns/iter (+/- 43)
test nv12_to_rgb_row/simd/1280 ... bench:       1,125 ns/iter (+/- 2)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,691 ns/iter (+/- 53)
test nv12_to_rgb_row/simd/1920 ... bench:       1,681 ns/iter (+/- 12)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,424 ns/iter (+/- 134)
test nv12_to_rgb_row/simd/3840 ... bench:       3,358 ns/iter (+/- 7)
test nv21_to_rgb_row/scalar/1280 ... bench:       4,639 ns/iter (+/- 62)
test nv21_to_rgb_row/simd/1280 ... bench:       1,116 ns/iter (+/- 23)
test nv21_to_rgb_row/scalar/1920 ... bench:       6,681 ns/iter (+/- 66)
test nv21_to_rgb_row/simd/1920 ... bench:       1,673 ns/iter (+/- 22)
test nv21_to_rgb_row/scalar/3840 ... bench:      13,418 ns/iter (+/- 115)
test nv21_to_rgb_row/simd/3840 ... bench:       3,352 ns/iter (+/- 17)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,657 ns/iter (+/- 22)
test rgb_to_hsv_row/simd/1280 ... bench:       2,587 ns/iter (+/- 35)
test rgb_to_hsv_row/scalar/1920 ... bench:       7,005 ns/iter (+/- 349)
test rgb_to_hsv_row/simd/1920 ... bench:       3,880 ns/iter (+/- 24)
test rgb_to_hsv_row/scalar/3840 ... bench:      14,096 ns/iter (+/- 63)
test rgb_to_hsv_row/simd/3840 ... bench:       7,765 ns/iter (+/- 12)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,545 ns/iter (+/- 40)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,004 ns/iter (+/- 1)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,895 ns/iter (+/- 36)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,505 ns/iter (+/- 3)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,766 ns/iter (+/- 33)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,012 ns/iter (+/- 4)

Benchmark Results for ubuntu-x86_64-scalar

System Information

  • OS: ubuntu-latest
  • Arch: x86_64
  • SIMD tier: scalar
  • Runner: GitHub Actions 1000008398
  • Runner arch (GH): X64
  • RUSTFLAGS: --cfg colconv_force_scalar
  • Date: 2026-04-19 04:14:59 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,610 ns/iter (+/- 49)
test nv12_to_rgb_row/simd/1280 ... bench:       4,442 ns/iter (+/- 87)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,671 ns/iter (+/- 51)
test nv12_to_rgb_row/simd/1920 ... bench:       6,753 ns/iter (+/- 45)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,376 ns/iter (+/- 70)
test nv12_to_rgb_row/simd/3840 ... bench:      13,452 ns/iter (+/- 34)
test nv21_to_rgb_row/scalar/1280 ... bench:       4,592 ns/iter (+/- 85)
test nv21_to_rgb_row/simd/1280 ... bench:       4,375 ns/iter (+/- 90)
test nv21_to_rgb_row/scalar/1920 ... bench:       6,570 ns/iter (+/- 142)
test nv21_to_rgb_row/simd/1920 ... bench:       6,725 ns/iter (+/- 16)
test nv21_to_rgb_row/scalar/3840 ... bench:      13,168 ns/iter (+/- 264)
test nv21_to_rgb_row/simd/3840 ... bench:      13,353 ns/iter (+/- 27)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,619 ns/iter (+/- 39)
test rgb_to_hsv_row/simd/1280 ... bench:       4,622 ns/iter (+/- 168)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,927 ns/iter (+/- 11)
test rgb_to_hsv_row/simd/1920 ... bench:       6,927 ns/iter (+/- 25)
test rgb_to_hsv_row/scalar/3840 ... bench:      13,897 ns/iter (+/- 460)
test rgb_to_hsv_row/simd/3840 ... bench:      13,889 ns/iter (+/- 594)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,779 ns/iter (+/- 18)
test yuv_420_to_rgb_row/simd/1280 ... bench:       4,757 ns/iter (+/- 8)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       7,224 ns/iter (+/- 12)
test yuv_420_to_rgb_row/simd/1920 ... bench:       7,225 ns/iter (+/- 16)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      14,307 ns/iter (+/- 51)
test yuv_420_to_rgb_row/simd/3840 ... bench:      14,502 ns/iter (+/- 129)

Benchmark Results for ubuntu-x86_64-sse41-max

System Information

  • OS: ubuntu-latest
  • Arch: x86_64
  • SIMD tier: sse41-max
  • Runner: GitHub Actions 1000008383
  • Runner arch (GH): X64
  • RUSTFLAGS: --cfg colconv_disable_avx512 --cfg colconv_disable_avx2
  • Date: 2026-04-19 04:14:00 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,643 ns/iter (+/- 34)
test nv12_to_rgb_row/simd/1280 ... bench:         885 ns/iter (+/- 4)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,997 ns/iter (+/- 249)
test nv12_to_rgb_row/simd/1920 ... bench:       1,331 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,976 ns/iter (+/- 97)
test nv12_to_rgb_row/simd/3840 ... bench:       2,659 ns/iter (+/- 2)
test nv21_to_rgb_row/scalar/1280 ... bench:       4,565 ns/iter (+/- 74)
test nv21_to_rgb_row/simd/1280 ... bench:         880 ns/iter (+/- 2)
test nv21_to_rgb_row/scalar/1920 ... bench:       6,909 ns/iter (+/- 21)
test nv21_to_rgb_row/simd/1920 ... bench:       1,325 ns/iter (+/- 3)
test nv21_to_rgb_row/scalar/3840 ... bench:      13,817 ns/iter (+/- 77)
test nv21_to_rgb_row/simd/3840 ... bench:       2,646 ns/iter (+/- 3)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,626 ns/iter (+/- 8)
test rgb_to_hsv_row/simd/1280 ... bench:       2,564 ns/iter (+/- 42)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,938 ns/iter (+/- 30)
test rgb_to_hsv_row/simd/1920 ... bench:       3,850 ns/iter (+/- 10)
test rgb_to_hsv_row/scalar/3840 ... bench:      13,934 ns/iter (+/- 119)
test rgb_to_hsv_row/simd/3840 ... bench:       7,693 ns/iter (+/- 275)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,583 ns/iter (+/- 8)
test yuv_420_to_rgb_row/simd/1280 ... bench:         904 ns/iter (+/- 1)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,933 ns/iter (+/- 38)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,361 ns/iter (+/- 31)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,831 ns/iter (+/- 809)
test yuv_420_to_rgb_row/simd/3840 ... bench:       2,713 ns/iter (+/- 2)

Benchmark Results for windows-x86_64-default

System Information

  • OS: windows-latest
  • Arch: x86_64
  • SIMD tier: default
  • Runner: GitHub Actions 1000008366
  • Runner arch (GH): X64
  • RUSTFLAGS: ``
  • Date: 2026-04-19 04:15:08 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,397 ns/iter (+/- 73)
test nv12_to_rgb_row/simd/1280 ... bench:       1,126 ns/iter (+/- 9)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,603 ns/iter (+/- 50)
test nv12_to_rgb_row/simd/1920 ... bench:       1,700 ns/iter (+/- 31)
test nv12_to_rgb_row/scalar/3840 ... bench:      14,012 ns/iter (+/- 6,100)
test nv12_to_rgb_row/simd/3840 ... bench:       3,374 ns/iter (+/- 11)
test nv21_to_rgb_row/scalar/1280 ... bench:       4,543 ns/iter (+/- 152)
test nv21_to_rgb_row/simd/1280 ... bench:       1,126 ns/iter (+/- 19)
test nv21_to_rgb_row/scalar/1920 ... bench:       6,816 ns/iter (+/- 101)
test nv21_to_rgb_row/simd/1920 ... bench:       1,685 ns/iter (+/- 30)
test nv21_to_rgb_row/scalar/3840 ... bench:      13,985 ns/iter (+/- 1,319)
test nv21_to_rgb_row/simd/3840 ... bench:       3,375 ns/iter (+/- 71)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,682 ns/iter (+/- 51)
test rgb_to_hsv_row/simd/1280 ... bench:       2,602 ns/iter (+/- 35)
test rgb_to_hsv_row/scalar/1920 ... bench:       7,036 ns/iter (+/- 774)
test rgb_to_hsv_row/simd/1920 ... bench:       3,900 ns/iter (+/- 103)
test rgb_to_hsv_row/scalar/3840 ... bench:      14,188 ns/iter (+/- 221)
test rgb_to_hsv_row/simd/3840 ... bench:       7,836 ns/iter (+/- 176)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,769 ns/iter (+/- 514)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,193 ns/iter (+/- 84)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       8,645 ns/iter (+/- 686)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,747 ns/iter (+/- 146)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      14,009 ns/iter (+/- 530)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,036 ns/iter (+/- 64)

View detailed results

Detailed Criterion results have been uploaded as artifacts. Download them from the workflow run to view charts and detailed statistics.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 13 out of 13 changed files in this pull request and generated no new comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@github-actions
Copy link
Copy Markdown

Benchmark Results

Benchmark Results Summary

Date: 2026-04-19 04:33:10 UTC

Benchmark Results for macos-aarch64-neon

System Information

  • OS: macos-latest
  • Arch: aarch64
  • SIMD tier: neon
  • Runner: GitHub Actions 1000008454
  • Runner arch (GH): ARM64
  • RUSTFLAGS: ``
  • Date: 2026-04-19 04:31:59 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       3,029 ns/iter (+/- 396)
test nv12_to_rgb_row/simd/1280 ... bench:         560 ns/iter (+/- 39)
test nv12_to_rgb_row/scalar/1920 ... bench:       4,496 ns/iter (+/- 130)
test nv12_to_rgb_row/simd/1920 ... bench:         852 ns/iter (+/- 131)
test nv12_to_rgb_row/scalar/3840 ... bench:       8,972 ns/iter (+/- 961)
test nv12_to_rgb_row/simd/3840 ... bench:       1,655 ns/iter (+/- 245)
test nv21_to_rgb_row/scalar/1280 ... bench:       3,007 ns/iter (+/- 380)
test nv21_to_rgb_row/simd/1280 ... bench:         555 ns/iter (+/- 80)
test nv21_to_rgb_row/scalar/1920 ... bench:       4,499 ns/iter (+/- 192)
test nv21_to_rgb_row/simd/1920 ... bench:         833 ns/iter (+/- 73)
test nv21_to_rgb_row/scalar/3840 ... bench:       9,233 ns/iter (+/- 1,724)
test nv21_to_rgb_row/simd/3840 ... bench:       1,651 ns/iter (+/- 211)
test rgb_to_hsv_row/scalar/1280 ... bench:       3,432 ns/iter (+/- 313)
test rgb_to_hsv_row/simd/1280 ... bench:       1,584 ns/iter (+/- 233)
test rgb_to_hsv_row/scalar/1920 ... bench:       5,088 ns/iter (+/- 239)
test rgb_to_hsv_row/simd/1920 ... bench:       2,379 ns/iter (+/- 238)
test rgb_to_hsv_row/scalar/3840 ... bench:      10,484 ns/iter (+/- 936)
test rgb_to_hsv_row/simd/3840 ... bench:       4,754 ns/iter (+/- 329)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       2,950 ns/iter (+/- 151)
test yuv_420_to_rgb_row/simd/1280 ... bench:         534 ns/iter (+/- 44)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       4,427 ns/iter (+/- 165)
test yuv_420_to_rgb_row/simd/1920 ... bench:         802 ns/iter (+/- 130)
test yuv_420_to_rgb_row/scalar/3840 ... bench:       8,971 ns/iter (+/- 1,464)
test yuv_420_to_rgb_row/simd/3840 ... bench:       1,575 ns/iter (+/- 466)

Benchmark Results for macos-aarch64-scalar

System Information

  • OS: macos-latest
  • Arch: aarch64
  • SIMD tier: scalar
  • Runner: GitHub Actions 1000008447
  • Runner arch (GH): ARM64
  • RUSTFLAGS: --cfg colconv_force_scalar
  • Date: 2026-04-19 04:31:01 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       2,748 ns/iter (+/- 98)
test nv12_to_rgb_row/simd/1280 ... bench:       2,769 ns/iter (+/- 98)
test nv12_to_rgb_row/scalar/1920 ... bench:       4,125 ns/iter (+/- 208)
test nv12_to_rgb_row/simd/1920 ... bench:       4,327 ns/iter (+/- 1,156)
test nv12_to_rgb_row/scalar/3840 ... bench:       8,701 ns/iter (+/- 1,078)
test nv12_to_rgb_row/simd/3840 ... bench:       9,005 ns/iter (+/- 292)
test nv21_to_rgb_row/scalar/1280 ... bench:       3,025 ns/iter (+/- 177)
test nv21_to_rgb_row/simd/1280 ... bench:       2,993 ns/iter (+/- 867)
test nv21_to_rgb_row/scalar/1920 ... bench:       4,485 ns/iter (+/- 517)
test nv21_to_rgb_row/simd/1920 ... bench:       4,492 ns/iter (+/- 291)
test nv21_to_rgb_row/scalar/3840 ... bench:       8,974 ns/iter (+/- 1,663)
test nv21_to_rgb_row/simd/3840 ... bench:       8,954 ns/iter (+/- 611)
test rgb_to_hsv_row/scalar/1280 ... bench:       3,437 ns/iter (+/- 202)
test rgb_to_hsv_row/simd/1280 ... bench:       3,420 ns/iter (+/- 814)
test rgb_to_hsv_row/scalar/1920 ... bench:       5,131 ns/iter (+/- 399)
test rgb_to_hsv_row/simd/1920 ... bench:       5,164 ns/iter (+/- 775)
test rgb_to_hsv_row/scalar/3840 ... bench:      10,502 ns/iter (+/- 1,373)
test rgb_to_hsv_row/simd/3840 ... bench:      10,531 ns/iter (+/- 1,357)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       2,950 ns/iter (+/- 230)
test yuv_420_to_rgb_row/simd/1280 ... bench:       2,954 ns/iter (+/- 391)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       4,434 ns/iter (+/- 578)
test yuv_420_to_rgb_row/simd/1920 ... bench:       4,402 ns/iter (+/- 772)
test yuv_420_to_rgb_row/scalar/3840 ... bench:       9,061 ns/iter (+/- 380)
test yuv_420_to_rgb_row/simd/3840 ... bench:       9,081 ns/iter (+/- 413)

Benchmark Results for ubuntu-x86_64-avx2-max

System Information

  • OS: ubuntu-latest
  • Arch: x86_64
  • SIMD tier: avx2-max
  • Runner: GitHub Actions 1000008459
  • Runner arch (GH): X64
  • RUSTFLAGS: --cfg colconv_disable_avx512
  • Date: 2026-04-19 04:32:44 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,879 ns/iter (+/- 42)
test nv12_to_rgb_row/simd/1280 ... bench:       1,116 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/1920 ... bench:       7,360 ns/iter (+/- 44)
test nv12_to_rgb_row/simd/1920 ... bench:       1,673 ns/iter (+/- 2)
test nv12_to_rgb_row/scalar/3840 ... bench:      14,714 ns/iter (+/- 175)
test nv12_to_rgb_row/simd/3840 ... bench:       3,350 ns/iter (+/- 3)
test nv21_to_rgb_row/scalar/1280 ... bench:       5,067 ns/iter (+/- 14)
test nv21_to_rgb_row/simd/1280 ... bench:       1,116 ns/iter (+/- 8)
test nv21_to_rgb_row/scalar/1920 ... bench:       7,335 ns/iter (+/- 19)
test nv21_to_rgb_row/simd/1920 ... bench:       1,674 ns/iter (+/- 26)
test nv21_to_rgb_row/scalar/3840 ... bench:      14,683 ns/iter (+/- 31)
test nv21_to_rgb_row/simd/3840 ... bench:       3,351 ns/iter (+/- 36)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,712 ns/iter (+/- 23)
test rgb_to_hsv_row/simd/1280 ... bench:       2,585 ns/iter (+/- 3)
test rgb_to_hsv_row/scalar/1920 ... bench:       7,078 ns/iter (+/- 45)
test rgb_to_hsv_row/simd/1920 ... bench:       3,875 ns/iter (+/- 5)
test rgb_to_hsv_row/scalar/3840 ... bench:      14,328 ns/iter (+/- 116)
test rgb_to_hsv_row/simd/3840 ... bench:       7,756 ns/iter (+/- 11)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,577 ns/iter (+/- 35)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,006 ns/iter (+/- 2)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,942 ns/iter (+/- 89)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,507 ns/iter (+/- 4)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,828 ns/iter (+/- 415)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,012 ns/iter (+/- 3)

Benchmark Results for ubuntu-x86_64-default

System Information

  • OS: ubuntu-latest
  • Arch: x86_64
  • SIMD tier: default
  • Runner: GitHub Actions 1000008451
  • Runner arch (GH): X64
  • RUSTFLAGS: ``
  • Date: 2026-04-19 04:31:37 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,449 ns/iter (+/- 103)
test nv12_to_rgb_row/simd/1280 ... bench:       1,116 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,707 ns/iter (+/- 63)
test nv12_to_rgb_row/simd/1920 ... bench:       1,675 ns/iter (+/- 19)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,381 ns/iter (+/- 38)
test nv12_to_rgb_row/simd/3840 ... bench:       3,353 ns/iter (+/- 4)
test nv21_to_rgb_row/scalar/1280 ... bench:       4,445 ns/iter (+/- 97)
test nv21_to_rgb_row/simd/1280 ... bench:       1,116 ns/iter (+/- 20)
test nv21_to_rgb_row/scalar/1920 ... bench:       6,700 ns/iter (+/- 42)
test nv21_to_rgb_row/simd/1920 ... bench:       1,674 ns/iter (+/- 2)
test nv21_to_rgb_row/scalar/3840 ... bench:      13,409 ns/iter (+/- 52)
test nv21_to_rgb_row/simd/3840 ... bench:       3,353 ns/iter (+/- 4)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,659 ns/iter (+/- 9)
test rgb_to_hsv_row/simd/1280 ... bench:       2,587 ns/iter (+/- 4)
test rgb_to_hsv_row/scalar/1920 ... bench:       7,001 ns/iter (+/- 45)
test rgb_to_hsv_row/simd/1920 ... bench:       3,879 ns/iter (+/- 11)
test rgb_to_hsv_row/scalar/3840 ... bench:      14,058 ns/iter (+/- 121)
test rgb_to_hsv_row/simd/3840 ... bench:       7,764 ns/iter (+/- 6)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,549 ns/iter (+/- 34)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,004 ns/iter (+/- 1)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,875 ns/iter (+/- 38)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,505 ns/iter (+/- 2)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,782 ns/iter (+/- 315)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,012 ns/iter (+/- 3)

Benchmark Results for ubuntu-x86_64-native

System Information

  • OS: ubuntu-latest
  • Arch: x86_64
  • SIMD tier: native
  • Runner: GitHub Actions 1000008456
  • Runner arch (GH): X64
  • RUSTFLAGS: ``
  • CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS: -C target-cpu=native
  • Date: 2026-04-19 04:32:58 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,486 ns/iter (+/- 14)
test nv12_to_rgb_row/simd/1280 ... bench:       1,011 ns/iter (+/- 2)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,438 ns/iter (+/- 187)
test nv12_to_rgb_row/simd/1920 ... bench:       1,516 ns/iter (+/- 13)
test nv12_to_rgb_row/scalar/3840 ... bench:      12,750 ns/iter (+/- 91)
test nv12_to_rgb_row/simd/3840 ... bench:       3,041 ns/iter (+/- 3)
test nv21_to_rgb_row/scalar/1280 ... bench:       4,241 ns/iter (+/- 21)
test nv21_to_rgb_row/simd/1280 ... bench:       1,011 ns/iter (+/- 0)
test nv21_to_rgb_row/scalar/1920 ... bench:       6,355 ns/iter (+/- 61)
test nv21_to_rgb_row/simd/1920 ... bench:       1,517 ns/iter (+/- 2)
test nv21_to_rgb_row/scalar/3840 ... bench:      12,679 ns/iter (+/- 112)
test nv21_to_rgb_row/simd/3840 ... bench:       3,035 ns/iter (+/- 8)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,597 ns/iter (+/- 29)
test rgb_to_hsv_row/simd/1280 ... bench:       2,788 ns/iter (+/- 4)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,891 ns/iter (+/- 148)
test rgb_to_hsv_row/simd/1920 ... bench:       4,182 ns/iter (+/- 5)
test rgb_to_hsv_row/scalar/3840 ... bench:      13,813 ns/iter (+/- 42)
test rgb_to_hsv_row/simd/3840 ... bench:       8,367 ns/iter (+/- 62)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,514 ns/iter (+/- 98)
test yuv_420_to_rgb_row/simd/1280 ... bench:         940 ns/iter (+/- 11)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,878 ns/iter (+/- 20)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,409 ns/iter (+/- 2)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,785 ns/iter (+/- 26)
test yuv_420_to_rgb_row/simd/3840 ... bench:       2,821 ns/iter (+/- 8)

Benchmark Results for ubuntu-x86_64-scalar

System Information

  • OS: ubuntu-latest
  • Arch: x86_64
  • SIMD tier: scalar
  • Runner: GitHub Actions 1000008445
  • Runner arch (GH): X64
  • RUSTFLAGS: --cfg colconv_force_scalar
  • Date: 2026-04-19 04:30:39 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,515 ns/iter (+/- 21)
test nv12_to_rgb_row/simd/1280 ... bench:       4,519 ns/iter (+/- 31)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,857 ns/iter (+/- 50)
test nv12_to_rgb_row/simd/1920 ... bench:       6,847 ns/iter (+/- 18)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,620 ns/iter (+/- 61)
test nv12_to_rgb_row/simd/3840 ... bench:      13,623 ns/iter (+/- 243)
test nv21_to_rgb_row/scalar/1280 ... bench:       4,696 ns/iter (+/- 117)
test nv21_to_rgb_row/simd/1280 ... bench:       4,491 ns/iter (+/- 48)
test nv21_to_rgb_row/scalar/1920 ... bench:       6,781 ns/iter (+/- 21)
test nv21_to_rgb_row/simd/1920 ... bench:       6,778 ns/iter (+/- 20)
test nv21_to_rgb_row/scalar/3840 ... bench:      13,590 ns/iter (+/- 47)
test nv21_to_rgb_row/simd/3840 ... bench:      13,573 ns/iter (+/- 42)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,573 ns/iter (+/- 26)
test rgb_to_hsv_row/simd/1280 ... bench:       4,573 ns/iter (+/- 15)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,859 ns/iter (+/- 12)
test rgb_to_hsv_row/simd/1920 ... bench:       6,860 ns/iter (+/- 37)
test rgb_to_hsv_row/scalar/3840 ... bench:      13,819 ns/iter (+/- 152)
test rgb_to_hsv_row/simd/3840 ... bench:      13,753 ns/iter (+/- 68)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,819 ns/iter (+/- 89)
test yuv_420_to_rgb_row/simd/1280 ... bench:       4,817 ns/iter (+/- 22)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       7,272 ns/iter (+/- 372)
test yuv_420_to_rgb_row/simd/1920 ... bench:       7,273 ns/iter (+/- 38)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      14,555 ns/iter (+/- 47)
test yuv_420_to_rgb_row/simd/3840 ... bench:      14,563 ns/iter (+/- 33)

Benchmark Results for ubuntu-x86_64-sse41-max

System Information

  • OS: ubuntu-latest
  • Arch: x86_64
  • SIMD tier: sse41-max
  • Runner: GitHub Actions 1000008450
  • Runner arch (GH): X64
  • RUSTFLAGS: --cfg colconv_disable_avx512 --cfg colconv_disable_avx2
  • Date: 2026-04-19 04:31:35 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,624 ns/iter (+/- 23)
test nv12_to_rgb_row/simd/1280 ... bench:         885 ns/iter (+/- 0)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,929 ns/iter (+/- 34)
test nv12_to_rgb_row/simd/1920 ... bench:       1,332 ns/iter (+/- 2)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,979 ns/iter (+/- 796)
test nv12_to_rgb_row/simd/3840 ... bench:       2,663 ns/iter (+/- 7)
test nv21_to_rgb_row/scalar/1280 ... bench:       4,605 ns/iter (+/- 202)
test nv21_to_rgb_row/simd/1280 ... bench:         880 ns/iter (+/- 3)
test nv21_to_rgb_row/scalar/1920 ... bench:       6,910 ns/iter (+/- 38)
test nv21_to_rgb_row/simd/1920 ... bench:       1,326 ns/iter (+/- 3)
test nv21_to_rgb_row/scalar/3840 ... bench:      13,830 ns/iter (+/- 25)
test nv21_to_rgb_row/simd/3840 ... bench:       2,646 ns/iter (+/- 13)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,643 ns/iter (+/- 14)
test rgb_to_hsv_row/simd/1280 ... bench:       2,577 ns/iter (+/- 3)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,947 ns/iter (+/- 19)
test rgb_to_hsv_row/simd/1920 ... bench:       3,853 ns/iter (+/- 5)
test rgb_to_hsv_row/scalar/3840 ... bench:      14,972 ns/iter (+/- 316)
test rgb_to_hsv_row/simd/3840 ... bench:       7,696 ns/iter (+/- 20)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,587 ns/iter (+/- 12)
test yuv_420_to_rgb_row/simd/1280 ... bench:         904 ns/iter (+/- 0)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,943 ns/iter (+/- 17)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,361 ns/iter (+/- 1)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,850 ns/iter (+/- 34)
test yuv_420_to_rgb_row/simd/3840 ... bench:       2,713 ns/iter (+/- 3)

Benchmark Results for windows-x86_64-default

System Information

  • OS: windows-latest
  • Arch: x86_64
  • SIMD tier: default
  • Runner: GitHub Actions 1000008438
  • Runner arch (GH): X64
  • RUSTFLAGS: ``
  • Date: 2026-04-19 04:31:52 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,393 ns/iter (+/- 43)
test nv12_to_rgb_row/simd/1280 ... bench:       1,124 ns/iter (+/- 5)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,608 ns/iter (+/- 35)
test nv12_to_rgb_row/simd/1920 ... bench:       1,682 ns/iter (+/- 6)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,197 ns/iter (+/- 164)
test nv12_to_rgb_row/simd/3840 ... bench:       3,365 ns/iter (+/- 12)
test nv21_to_rgb_row/scalar/1280 ... bench:       4,531 ns/iter (+/- 70)
test nv21_to_rgb_row/simd/1280 ... bench:       1,124 ns/iter (+/- 7)
test nv21_to_rgb_row/scalar/1920 ... bench:       6,827 ns/iter (+/- 48)
test nv21_to_rgb_row/simd/1920 ... bench:       1,680 ns/iter (+/- 7)
test nv21_to_rgb_row/scalar/3840 ... bench:      13,726 ns/iter (+/- 203)
test nv21_to_rgb_row/simd/3840 ... bench:       3,364 ns/iter (+/- 16)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,682 ns/iter (+/- 106)
test rgb_to_hsv_row/simd/1280 ... bench:       2,623 ns/iter (+/- 12)
test rgb_to_hsv_row/scalar/1920 ... bench:       7,022 ns/iter (+/- 102)
test rgb_to_hsv_row/simd/1920 ... bench:       3,920 ns/iter (+/- 26)
test rgb_to_hsv_row/scalar/3840 ... bench:      14,245 ns/iter (+/- 178)
test rgb_to_hsv_row/simd/3840 ... bench:       7,803 ns/iter (+/- 50)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,623 ns/iter (+/- 44)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,015 ns/iter (+/- 16)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,995 ns/iter (+/- 79)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,517 ns/iter (+/- 23)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      14,096 ns/iter (+/- 5,908)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,031 ns/iter (+/- 120)

View detailed results

Detailed Criterion results have been uploaded as artifacts. Download them from the workflow run to view charts and detailed statistics.

@al8n al8n changed the title feat(NV21): impl NV21 format feat(nv21): NV21 (semi-planar 4:2:0, VU-ordered) via const-generic kernel share with NV12 Apr 19, 2026
@uqio uqio merged commit f732a74 into main Apr 19, 2026
58 of 70 checks passed
@uqio uqio deleted the feat/nv21 branch April 19, 2026 04:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants