Skip to content

feat(NV12): NV12(semi-planar 4:2:0) + fallible PixelSink contract#2

Merged
uqio merged 6 commits intomainfrom
feat/nv12
Apr 19, 2026
Merged

feat(NV12): NV12(semi-planar 4:2:0) + fallible PixelSink contract#2
uqio merged 6 commits intomainfrom
feat/nv12

Conversation

@uqio
Copy link
Copy Markdown
Collaborator

@uqio uqio commented Apr 19, 2026

Summary

Adds NV12 support and reshapes the PixelSink contract to be fully
fallible — no panics under normal contract violations, safe for
no_std + panic = "abort" targets.

New: NV12 (semi-planar 4:2:0)

  • frame::Nv12Frame — validated frame type (Y plane + interleaved UV
    plane, stride-aware, odd heights allowed per 4:2:0 math), plus the
    matching Nv12FrameError enum (ZeroDimension, OddWidth,
    YStrideTooSmall, UvStrideTooSmall, YPlaneTooShort,
    UvPlaneTooShort, GeometryOverflow).
  • yuv::{Nv12, Nv12Row, Nv12Sink} + yuv::nv12_to walker — mirrors
    the Yuv420p shape, with UV as interleaved half-width payload.
  • row::nv12_to_rgb_row dispatcher with use_simd toggle.
  • 6 backends, each byte-identical to scalar (pure Q15 integer
    math, no f32):
    • scalar::nv12_to_rgb_row (reference)
    • NEON — single vld2_u8 fuses UV deinterleave into one op
    • SSE4.1_mm_loadu_si128 + two _mm_shuffle_epi8 deinterleave
    • AVX2 — 32 UV bytes, per-lane shuffle + permute4x64_epi64::<0xD8>
    • AVX-512 — 64 UV bytes, broadcast mask + permutexvar_epi64
    • wasm simd128 — two compile-time i8x16_shuffle calls
  • Cross-format equivalence tests (nv12_matches_yuv420p_*) guard
    against deinterleave regressions.
  • benches/nv12_to_rgb.rs — Criterion bench mirroring yuv_420_to_rgb.

Breaking: PixelSink is fallible

Previously:

pub trait PixelSink {
    type Input<'a>;
    fn process(&mut self, input: Self::Input<'_>);
}

Now:

pub trait PixelSink {
    type Input<'a>;
    type Error;
    fn begin_frame(&mut self, width: u32, height: u32) -> Result<(), Self::Error> { Ok(()) }
    fn process(&mut self, input: Self::Input<'_>) -> Result<(), Self::Error>;
}

Walkers (yuv420p_to, nv12_to) now return Result<(), S::Error> and
short-circuit on the first sink error.

  • Pure-compute sinks declare type Error = core::convert::Infallible
    — LLVM strips the Result wrapping entirely, so there's zero
    hot-path cost versus ().
  • begin_frame is a new per-frame preflight hook. Default Ok(());
    buffer-backed sinks override to validate frame-vs-config dimensions
    before any row is handed to them. Catches the stale-state failure
    modes that per-row idx < height can't: shorter frames leaving
    bottom rows unwritten, taller frames partial-writing before erroring.

Breaking: MixedSinker builder/process are fallible

MixedSinker::new(width, height) — now takes height; with_rgb /
with_luma / with_hsv / set_* all return
Result<Self, MixedSinkerError>. Buffer-size validation happens at
attachment, not part-way through a frame.

New MixedSinkerError variants (#[non_exhaustive]):

  • DimensionMismatch { configured_w, configured_h, frame_w, frame_h }
  • RgbBufferTooShort { expected, actual }
  • LumaBufferTooShort { expected, actual }
  • HsvPlaneTooShort { which: HsvPlane, expected, actual }
  • GeometryOverflow { width, height, channels } — 32-bit usize wrap
  • RowShapeMismatch { which: RowSlice, row, expected, actual }
    direct process callers that bypass the walker
  • RowIndexOutOfRange { row, configured_height }
  • OddWidth { width } — configured width must be even for 4:2:0

Supporting types: HsvPlane and RowSlice (both
#[non_exhaustive], with Display impls for readable error messages).

Other fixes

  • Odd heights now accepted by Yuv420pFrame / Nv12Frame — only
    odd width is rejected (4:2:0 subsamples 2:1 in width, height uses
    div_ceil(2)). 640×481 HW-decoded frames are representable.
  • AVX-512 feature gate corrected
    _mm512_extracti32x8_epi32::<1> is an AVX-512DQ intrinsic, but our
    kernel declared only avx512f,avx512bw. Replaced with
    _mm512_extracti64x4_epi64::<1> (AVX-512F only, same __m256i
    result) so the contract is genuine.
  • Geometry overflow checks at every public dispatcher boundary
    (width × 3), frame constructor (stride × rows), and
    MixedSinker's per-row RGB arithmetic. Real bug class on 32-bit
    (wasm32, i686); regression tests gated on target_pointer_width = "32".
  • CI benchmark fix: -C target-cpu=native under RUSTFLAGS
    globally was compiling thiserror_impl and other proc macros with
    host-CPU-specific instructions, then SIGILL'ing when rustc loaded
    them. Fixed by scoping to CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS
    so only target-build crates get the flag.

Docs

  • src/lib.rs trait-level PixelSink docs explain why the trait is
    fallible, with Infallible / io::Error examples.
  • docs/color-conversion-functions.md marks NV12 (#8) as shipped
    v0.1.

Test plan

  • cargo test --all-features — 76 passing (18 new NV12 + 9 new
    fallible/preflight/overflow regressions + cross-format equivalence).
  • cargo hack check --feature-powerset (7 feature combos incl.
    --no-default-features).
  • cargo hack clippy --each-feature -- -D warnings.
  • Cross builds: wasm32-unknown-unknown, aarch64-unknown-linux-gnu,
    i686-unknown-linux-gnu, x86_64-pc-windows-msvc.
  • cargo fmt --check.
  • Benchmarks run end-to-end on all 8 tiers — 4–6× SIMD speedup
    for YUV/NV12→RGB, 1.6–1.8× for RGB→HSV. See
    feat(NV12): NV12(semi-planar 4:2:0) + fallible PixelSink contract #2 (comment).

Next

  • NV21 (VU-swapped NV12) — small follow-up given all the shape
    infrastructure is in place.
  • P010 / P016 (10/16-bit semi-planar) — VideoToolbox / HDR path.

@github-actions
Copy link
Copy Markdown

Benchmark Results

Benchmark Results Summary

Date: 2026-04-19 02:35:24 UTC

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

This PR adds first-class NV12 (semi-planar 4:2:0) support across the frame model, row primitives (scalar + SIMD backends), and the sinker pipeline, while also making the sink API fallible to allow per-frame preflight validation and early error propagation.

Changes:

  • Add NV12 source format: Nv12Frame, Nv12Row, and nv12_to row-walker kernel.
  • Add NV12→RGB row primitive (nv12_to_rgb_row) with scalar + SIMD implementations (NEON, SSE4.1, AVX2, AVX-512, wasm simd128).
  • Make the sink/walker pipeline fallible (PixelSink::{begin_frame, process} returning Result) and update MixedSinker to validate buffer sizes up front and reject per-frame dimension mismatches before writing.

Reviewed changes

Copilot reviewed 15 out of 15 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
src/yuv/yuv420p.rs Makes the YUV420p walker fallible and adds per-frame begin_frame preflight.
src/yuv/nv12.rs New NV12 walker, row type, and sink trait.
src/yuv/mod.rs Wires NV12 module and public re-exports.
src/sinker/mixed.rs Adds NV12 support, fallible buffer-attachment API, per-frame dimension validation, and new error types/tests.
src/row/scalar.rs Adds scalar NV12→RGB reference implementation.
src/row/mod.rs Adds NV12 dispatcher + shared overflow-checked RGB row sizing helper.
src/row/arch/x86_sse41.rs Adds SSE4.1 NV12→RGB backend + equivalence tests.
src/row/arch/x86_avx2.rs Adds AVX2 NV12→RGB backend + equivalence tests.
src/row/arch/x86_avx512.rs Adds AVX-512 NV12→RGB backend + equivalence tests.
src/row/arch/wasm_simd128.rs Adds wasm simd128 NV12→RGB backend + equivalence tests.
src/row/arch/neon.rs Adds NEON NV12→RGB backend + equivalence tests.
src/lib.rs Updates PixelSink to support fallible processing + per-frame preflight and expands docs accordingly.
src/frame.rs Allows odd heights for 4:2:0, adds Nv12Frame + errors, and adds 32-bit geometry overflow checks.
benches/nv12_to_rgb.rs Adds Criterion benchmark for NV12 row conversion throughput.
Cargo.toml Registers the new NV12 benchmark target.

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

Comment thread src/frame.rs Outdated
Comment thread src/sinker/mixed.rs Outdated
Comment thread src/sinker/mixed.rs Outdated
Comment on lines +370 to +374
let one_plane_start = idx * w;
let one_plane_end = one_plane_start + w;
let rgb_plane_start = one_plane_start * 3;
let rgb_plane_end = one_plane_end * 3;
let rgb_row_bytes = w * 3;
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.

idx is used to compute row slice ranges (e.g., idx * w) without validating idx < self.height. If process is called directly (or a custom walker passes a bad index), this will panic on slice indexing, which contradicts the stated goal of returning recoverable errors instead of panicking. Add an explicit bounds check for idx (and return an error) before computing/slicing into the output buffers.

Copilot uses AI. Check for mistakes.
Comment thread src/sinker/mixed.rs Outdated
Comment thread src/sinker/mixed.rs Outdated
Comment on lines +467 to +471
let one_plane_start = idx * w;
let one_plane_end = one_plane_start + w;
let rgb_plane_start = one_plane_start * 3;
let rgb_plane_end = one_plane_end * 3;
let rgb_row_bytes = w * 3;
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.

idx is assumed to be in-range (“idx < h holds ...”), but there is no explicit check before using it to slice output buffers. A direct process call (or buggy walker) with idx >= self.height will panic here. Add an idx < self.height validation and return a recoverable error before computing row offsets.

Copilot uses AI. Check for mistakes.
@github-actions
Copy link
Copy Markdown

Benchmark Results

Benchmark Results Summary

Date: 2026-04-19 02:47:02 UTC

Benchmark Results for macos-aarch64-neon

System Information

  • OS: macos-latest
  • Arch: aarch64
  • SIMD tier: neon
  • Runner: GitHub Actions 1000007997
  • Runner arch (GH): ARM64
  • RUSTFLAGS: ``
  • Date: 2026-04-19 02:44:34 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       3,091 ns/iter (+/- 661)
test nv12_to_rgb_row/simd/1280 ... bench:         606 ns/iter (+/- 160)
test nv12_to_rgb_row/scalar/1920 ... bench:       4,852 ns/iter (+/- 1,402)
test nv12_to_rgb_row/simd/1920 ... bench:         857 ns/iter (+/- 180)
test nv12_to_rgb_row/scalar/3840 ... bench:      10,935 ns/iter (+/- 1,820)
test nv12_to_rgb_row/simd/3840 ... bench:       1,967 ns/iter (+/- 398)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,220 ns/iter (+/- 1,321)
test rgb_to_hsv_row/simd/1280 ... bench:       1,918 ns/iter (+/- 391)
test rgb_to_hsv_row/scalar/1920 ... bench:       5,270 ns/iter (+/- 776)
test rgb_to_hsv_row/simd/1920 ... bench:       2,876 ns/iter (+/- 745)
test rgb_to_hsv_row/scalar/3840 ... bench:      12,091 ns/iter (+/- 3,850)
test rgb_to_hsv_row/simd/3840 ... bench:       5,553 ns/iter (+/- 1,381)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       3,215 ns/iter (+/- 627)
test yuv_420_to_rgb_row/simd/1280 ... bench:         607 ns/iter (+/- 117)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       4,679 ns/iter (+/- 880)
test yuv_420_to_rgb_row/simd/1920 ... bench:         915 ns/iter (+/- 147)
test yuv_420_to_rgb_row/scalar/3840 ... bench:       9,204 ns/iter (+/- 1,225)
test yuv_420_to_rgb_row/simd/3840 ... bench:       1,681 ns/iter (+/- 601)

Benchmark Results for macos-aarch64-scalar

System Information

  • OS: macos-latest
  • Arch: aarch64
  • SIMD tier: scalar
  • Runner: GitHub Actions 1000007996
  • Runner arch (GH): ARM64
  • RUSTFLAGS: --cfg colconv_force_scalar
  • Date: 2026-04-19 02:44:18 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       2,948 ns/iter (+/- 52)
test nv12_to_rgb_row/simd/1280 ... bench:       2,948 ns/iter (+/- 56)
test nv12_to_rgb_row/scalar/1920 ... bench:       4,422 ns/iter (+/- 68)
test nv12_to_rgb_row/simd/1920 ... bench:       4,420 ns/iter (+/- 74)
test nv12_to_rgb_row/scalar/3840 ... bench:       8,840 ns/iter (+/- 133)
test nv12_to_rgb_row/simd/3840 ... bench:       8,838 ns/iter (+/- 138)
test rgb_to_hsv_row/scalar/1280 ... bench:       3,376 ns/iter (+/- 46)
test rgb_to_hsv_row/simd/1280 ... bench:       3,377 ns/iter (+/- 66)
test rgb_to_hsv_row/scalar/1920 ... bench:       5,062 ns/iter (+/- 84)
test rgb_to_hsv_row/simd/1920 ... bench:       5,060 ns/iter (+/- 99)
test rgb_to_hsv_row/scalar/3840 ... bench:      10,211 ns/iter (+/- 412)
test rgb_to_hsv_row/simd/3840 ... bench:      10,136 ns/iter (+/- 541)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       2,918 ns/iter (+/- 46)
test yuv_420_to_rgb_row/simd/1280 ... bench:       2,914 ns/iter (+/- 61)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       4,373 ns/iter (+/- 78)
test yuv_420_to_rgb_row/simd/1920 ... bench:       4,374 ns/iter (+/- 69)
test yuv_420_to_rgb_row/scalar/3840 ... bench:       8,958 ns/iter (+/- 169)
test yuv_420_to_rgb_row/simd/3840 ... bench:       8,951 ns/iter (+/- 204)

Benchmark Results for ubuntu-x86_64-avx2-max

System Information

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

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,891 ns/iter (+/- 12)
test nv12_to_rgb_row/simd/1280 ... bench:       1,117 ns/iter (+/- 25)
test nv12_to_rgb_row/scalar/1920 ... bench:       7,362 ns/iter (+/- 130)
test nv12_to_rgb_row/simd/1920 ... bench:       1,674 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/3840 ... bench:      14,743 ns/iter (+/- 71)
test nv12_to_rgb_row/simd/3840 ... bench:       3,353 ns/iter (+/- 42)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,721 ns/iter (+/- 32)
test rgb_to_hsv_row/simd/1280 ... bench:       2,589 ns/iter (+/- 49)
test rgb_to_hsv_row/scalar/1920 ... bench:       7,077 ns/iter (+/- 47)
test rgb_to_hsv_row/simd/1920 ... bench:       3,881 ns/iter (+/- 28)
test rgb_to_hsv_row/scalar/3840 ... bench:      14,285 ns/iter (+/- 734)
test rgb_to_hsv_row/simd/3840 ... bench:       7,773 ns/iter (+/- 153)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,592 ns/iter (+/- 15)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,008 ns/iter (+/- 33)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,937 ns/iter (+/- 12)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,507 ns/iter (+/- 49)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,842 ns/iter (+/- 815)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,014 ns/iter (+/- 103)

Benchmark Results for ubuntu-x86_64-default

System Information

  • OS: ubuntu-latest
  • Arch: x86_64
  • SIMD tier: default
  • Runner: GitHub Actions 1000007992
  • Runner arch (GH): X64
  • RUSTFLAGS: ``
  • Date: 2026-04-19 02:44:34 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       3,740 ns/iter (+/- 134)
test nv12_to_rgb_row/simd/1280 ... bench:         755 ns/iter (+/- 0)
test nv12_to_rgb_row/scalar/1920 ... bench:       5,567 ns/iter (+/- 10)
test nv12_to_rgb_row/simd/1920 ... bench:       1,128 ns/iter (+/- 0)
test nv12_to_rgb_row/scalar/3840 ... bench:      11,149 ns/iter (+/- 249)
test nv12_to_rgb_row/simd/3840 ... bench:       2,255 ns/iter (+/- 1)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,105 ns/iter (+/- 85)
test rgb_to_hsv_row/simd/1280 ... bench:       3,551 ns/iter (+/- 5)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,167 ns/iter (+/- 27)
test rgb_to_hsv_row/simd/1920 ... bench:       5,328 ns/iter (+/- 9)
test rgb_to_hsv_row/scalar/3840 ... bench:      12,331 ns/iter (+/- 20)
test rgb_to_hsv_row/simd/3840 ... bench:      10,651 ns/iter (+/- 43)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       3,751 ns/iter (+/- 109)
test yuv_420_to_rgb_row/simd/1280 ... bench:         685 ns/iter (+/- 0)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       5,739 ns/iter (+/- 8)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,026 ns/iter (+/- 0)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      11,374 ns/iter (+/- 90)
test yuv_420_to_rgb_row/simd/3840 ... bench:       2,054 ns/iter (+/- 1)

Benchmark Results for ubuntu-x86_64-native

System Information

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

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,451 ns/iter (+/- 23)
test nv12_to_rgb_row/simd/1280 ... bench:       1,118 ns/iter (+/- 7)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,697 ns/iter (+/- 17)
test nv12_to_rgb_row/simd/1920 ... bench:       1,676 ns/iter (+/- 11)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,372 ns/iter (+/- 34)
test nv12_to_rgb_row/simd/3840 ... bench:       3,353 ns/iter (+/- 96)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,656 ns/iter (+/- 91)
test rgb_to_hsv_row/simd/1280 ... bench:       2,588 ns/iter (+/- 476)
test rgb_to_hsv_row/scalar/1920 ... bench:       7,029 ns/iter (+/- 29)
test rgb_to_hsv_row/simd/1920 ... bench:       3,879 ns/iter (+/- 6)
test rgb_to_hsv_row/scalar/3840 ... bench:      14,066 ns/iter (+/- 242)
test rgb_to_hsv_row/simd/3840 ... bench:       7,763 ns/iter (+/- 29)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,556 ns/iter (+/- 64)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,004 ns/iter (+/- 2)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,872 ns/iter (+/- 23)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,505 ns/iter (+/- 2)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,746 ns/iter (+/- 36)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,014 ns/iter (+/- 81)

Benchmark Results for ubuntu-x86_64-scalar

System Information

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

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,451 ns/iter (+/- 285)
test nv12_to_rgb_row/simd/1280 ... bench:       4,454 ns/iter (+/- 14)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,678 ns/iter (+/- 36)
test nv12_to_rgb_row/simd/1920 ... bench:       6,754 ns/iter (+/- 45)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,377 ns/iter (+/- 165)
test nv12_to_rgb_row/simd/3840 ... bench:      13,488 ns/iter (+/- 90)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,618 ns/iter (+/- 19)
test rgb_to_hsv_row/simd/1280 ... bench:       4,617 ns/iter (+/- 114)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,929 ns/iter (+/- 157)
test rgb_to_hsv_row/simd/1920 ... bench:       6,927 ns/iter (+/- 154)
test rgb_to_hsv_row/scalar/3840 ... bench:      13,883 ns/iter (+/- 31)
test rgb_to_hsv_row/simd/3840 ... bench:      13,890 ns/iter (+/- 147)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,743 ns/iter (+/- 47)
test yuv_420_to_rgb_row/simd/1280 ... bench:       4,721 ns/iter (+/- 95)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       7,225 ns/iter (+/- 29)
test yuv_420_to_rgb_row/simd/1920 ... bench:       7,227 ns/iter (+/- 61)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      14,314 ns/iter (+/- 100)
test yuv_420_to_rgb_row/simd/3840 ... bench:      14,389 ns/iter (+/- 110)

Benchmark Results for ubuntu-x86_64-sse41-max

System Information

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

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,784 ns/iter (+/- 827)
test nv12_to_rgb_row/simd/1280 ... bench:         989 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/1920 ... bench:       7,204 ns/iter (+/- 48)
test nv12_to_rgb_row/simd/1920 ... bench:       1,482 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/3840 ... bench:      14,412 ns/iter (+/- 97)
test nv12_to_rgb_row/simd/3840 ... bench:       2,966 ns/iter (+/- 8)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,472 ns/iter (+/- 12)
test rgb_to_hsv_row/simd/1280 ... bench:       2,754 ns/iter (+/- 4)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,703 ns/iter (+/- 226)
test rgb_to_hsv_row/simd/1920 ... bench:       4,125 ns/iter (+/- 8)
test rgb_to_hsv_row/scalar/3840 ... bench:      13,425 ns/iter (+/- 65)
test rgb_to_hsv_row/simd/3840 ... bench:       8,255 ns/iter (+/- 11)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,571 ns/iter (+/- 10)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,009 ns/iter (+/- 2)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,881 ns/iter (+/- 21)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,514 ns/iter (+/- 1)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,794 ns/iter (+/- 120)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,024 ns/iter (+/- 2)

Benchmark Results for windows-x86_64-default

System Information

  • OS: windows-latest
  • Arch: x86_64
  • SIMD tier: default
  • Runner: GitHub Actions 1000007993
  • Runner arch (GH): X64
  • RUSTFLAGS: ``
  • Date: 2026-04-19 02:45:41 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,401 ns/iter (+/- 25)
test nv12_to_rgb_row/simd/1280 ... bench:       1,020 ns/iter (+/- 18)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,619 ns/iter (+/- 128)
test nv12_to_rgb_row/simd/1920 ... bench:       1,526 ns/iter (+/- 8)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,271 ns/iter (+/- 287)
test nv12_to_rgb_row/simd/3840 ... bench:       3,045 ns/iter (+/- 31)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,465 ns/iter (+/- 71)
test rgb_to_hsv_row/simd/1280 ... bench:       2,802 ns/iter (+/- 26)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,720 ns/iter (+/- 1,339)
test rgb_to_hsv_row/simd/1920 ... bench:       4,201 ns/iter (+/- 65)
test rgb_to_hsv_row/scalar/3840 ... bench:      13,421 ns/iter (+/- 97)
test rgb_to_hsv_row/simd/3840 ... bench:       8,400 ns/iter (+/- 31)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,609 ns/iter (+/- 73)
test yuv_420_to_rgb_row/simd/1280 ... bench:         947 ns/iter (+/- 2)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,934 ns/iter (+/- 52)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,418 ns/iter (+/- 6)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,989 ns/iter (+/- 246)
test yuv_420_to_rgb_row/simd/3840 ... bench:       2,856 ns/iter (+/- 15)

View detailed results

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

@codecov
Copy link
Copy Markdown

codecov bot commented Apr 19, 2026

Codecov Report

❌ Patch coverage is 90.27963% with 73 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/sinker/mixed.rs 86.50% 27 Missing ⚠️
src/frame.rs 74.35% 20 Missing ⚠️
src/row/mod.rs 69.44% 11 Missing ⚠️
src/row/arch/x86_avx512.rs 94.17% 6 Missing ⚠️
src/row/arch/neon.rs 94.50% 5 Missing ⚠️
src/row/arch/x86_sse41.rs 95.69% 4 Missing ⚠️

📢 Thoughts on this report? Let us know!

@al8n al8n requested a review from Copilot April 19, 2026 02:49
@github-actions
Copy link
Copy Markdown

Benchmark Results

Benchmark Results Summary

Date: 2026-04-19 02:56:49 UTC

Benchmark Results for macos-aarch64-neon

System Information

  • OS: macos-latest
  • Arch: aarch64
  • SIMD tier: neon
  • Runner: GitHub Actions 1000008073
  • Runner arch (GH): ARM64
  • RUSTFLAGS: ``
  • Date: 2026-04-19 02:55:27 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,301 ns/iter (+/- 1,624)
test nv12_to_rgb_row/simd/1280 ... bench:         817 ns/iter (+/- 406)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,032 ns/iter (+/- 1,163)
test nv12_to_rgb_row/simd/1920 ... bench:       1,247 ns/iter (+/- 284)
test nv12_to_rgb_row/scalar/3840 ... bench:      12,205 ns/iter (+/- 2,844)
test nv12_to_rgb_row/simd/3840 ... bench:       2,299 ns/iter (+/- 453)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,961 ns/iter (+/- 951)
test rgb_to_hsv_row/simd/1280 ... bench:       2,349 ns/iter (+/- 802)
test rgb_to_hsv_row/scalar/1920 ... bench:       8,058 ns/iter (+/- 1,856)
test rgb_to_hsv_row/simd/1920 ... bench:       3,546 ns/iter (+/- 1,023)
test rgb_to_hsv_row/scalar/3840 ... bench:      17,508 ns/iter (+/- 2,834)
test rgb_to_hsv_row/simd/3840 ... bench:       7,031 ns/iter (+/- 1,021)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,255 ns/iter (+/- 816)
test yuv_420_to_rgb_row/simd/1280 ... bench:         776 ns/iter (+/- 223)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,684 ns/iter (+/- 1,914)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,190 ns/iter (+/- 431)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      12,436 ns/iter (+/- 2,611)
test yuv_420_to_rgb_row/simd/3840 ... bench:       2,109 ns/iter (+/- 378)

Benchmark Results for macos-aarch64-scalar

System Information

  • OS: macos-latest
  • Arch: aarch64
  • SIMD tier: scalar
  • Runner: GitHub Actions 1000008071
  • Runner arch (GH): ARM64
  • RUSTFLAGS: --cfg colconv_force_scalar
  • Date: 2026-04-19 02:54:55 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       3,027 ns/iter (+/- 213)
test nv12_to_rgb_row/simd/1280 ... bench:       3,015 ns/iter (+/- 617)
test nv12_to_rgb_row/scalar/1920 ... bench:       4,460 ns/iter (+/- 463)
test nv12_to_rgb_row/simd/1920 ... bench:       4,561 ns/iter (+/- 570)
test nv12_to_rgb_row/scalar/3840 ... bench:       8,985 ns/iter (+/- 929)
test nv12_to_rgb_row/simd/3840 ... bench:       9,114 ns/iter (+/- 2,730)
test rgb_to_hsv_row/scalar/1280 ... bench:       3,472 ns/iter (+/- 470)
test rgb_to_hsv_row/simd/1280 ... bench:       3,444 ns/iter (+/- 498)
test rgb_to_hsv_row/scalar/1920 ... bench:       5,534 ns/iter (+/- 1,163)
test rgb_to_hsv_row/simd/1920 ... bench:       6,744 ns/iter (+/- 1,970)
test rgb_to_hsv_row/scalar/3840 ... bench:      18,227 ns/iter (+/- 16,724)
test rgb_to_hsv_row/simd/3840 ... bench:      15,456 ns/iter (+/- 4,237)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       3,052 ns/iter (+/- 475)
test yuv_420_to_rgb_row/simd/1280 ... bench:       2,966 ns/iter (+/- 792)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       4,454 ns/iter (+/- 390)
test yuv_420_to_rgb_row/simd/1920 ... bench:       4,448 ns/iter (+/- 319)
test yuv_420_to_rgb_row/scalar/3840 ... bench:       9,413 ns/iter (+/- 2,954)
test yuv_420_to_rgb_row/simd/3840 ... bench:      10,864 ns/iter (+/- 2,906)

Benchmark Results for ubuntu-x86_64-avx2-max

System Information

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

all

test nv12_to_rgb_row/scalar/1280 ... bench:       5,069 ns/iter (+/- 63)
test nv12_to_rgb_row/simd/1280 ... bench:       1,117 ns/iter (+/- 12)
test nv12_to_rgb_row/scalar/1920 ... bench:       7,365 ns/iter (+/- 25)
test nv12_to_rgb_row/simd/1920 ... bench:       1,675 ns/iter (+/- 5)
test nv12_to_rgb_row/scalar/3840 ... bench:      14,731 ns/iter (+/- 108)
test nv12_to_rgb_row/simd/3840 ... bench:       3,354 ns/iter (+/- 10)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,712 ns/iter (+/- 10)
test rgb_to_hsv_row/simd/1280 ... bench:       2,587 ns/iter (+/- 5)
test rgb_to_hsv_row/scalar/1920 ... bench:       7,083 ns/iter (+/- 25)
test rgb_to_hsv_row/simd/1920 ... bench:       3,883 ns/iter (+/- 10)
test rgb_to_hsv_row/scalar/3840 ... bench:      14,251 ns/iter (+/- 50)
test rgb_to_hsv_row/simd/3840 ... bench:       7,761 ns/iter (+/- 17)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,577 ns/iter (+/- 17)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,004 ns/iter (+/- 34)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,934 ns/iter (+/- 46)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,505 ns/iter (+/- 2)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,829 ns/iter (+/- 85)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,014 ns/iter (+/- 15)

Benchmark Results for ubuntu-x86_64-default

System Information

  • OS: ubuntu-latest
  • Arch: x86_64
  • SIMD tier: default
  • Runner: GitHub Actions 1000008068
  • Runner arch (GH): X64
  • RUSTFLAGS: ``
  • Date: 2026-04-19 02:54:30 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,451 ns/iter (+/- 50)
test nv12_to_rgb_row/simd/1280 ... bench:       1,118 ns/iter (+/- 4)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,709 ns/iter (+/- 45)
test nv12_to_rgb_row/simd/1920 ... bench:       1,674 ns/iter (+/- 3)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,443 ns/iter (+/- 188)
test nv12_to_rgb_row/simd/3840 ... bench:       3,352 ns/iter (+/- 60)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,661 ns/iter (+/- 15)
test rgb_to_hsv_row/simd/1280 ... bench:       2,587 ns/iter (+/- 6)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,994 ns/iter (+/- 37)
test rgb_to_hsv_row/simd/1920 ... bench:       3,878 ns/iter (+/- 5)
test rgb_to_hsv_row/scalar/3840 ... bench:      14,070 ns/iter (+/- 40)
test rgb_to_hsv_row/simd/3840 ... bench:       7,764 ns/iter (+/- 16)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,552 ns/iter (+/- 14)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,004 ns/iter (+/- 1)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,876 ns/iter (+/- 45)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,505 ns/iter (+/- 2)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,781 ns/iter (+/- 96)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,014 ns/iter (+/- 3)

Benchmark Results for ubuntu-x86_64-native

System Information

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

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,451 ns/iter (+/- 16)
test nv12_to_rgb_row/simd/1280 ... bench:       1,117 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,699 ns/iter (+/- 21)
test nv12_to_rgb_row/simd/1920 ... bench:       1,674 ns/iter (+/- 8)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,376 ns/iter (+/- 82)
test nv12_to_rgb_row/simd/3840 ... bench:       3,355 ns/iter (+/- 3)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,664 ns/iter (+/- 272)
test rgb_to_hsv_row/simd/1280 ... bench:       2,587 ns/iter (+/- 3)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,995 ns/iter (+/- 45)
test rgb_to_hsv_row/simd/1920 ... bench:       3,879 ns/iter (+/- 60)
test rgb_to_hsv_row/scalar/3840 ... bench:      14,079 ns/iter (+/- 193)
test rgb_to_hsv_row/simd/3840 ... bench:       7,765 ns/iter (+/- 26)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,562 ns/iter (+/- 17)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,004 ns/iter (+/- 1)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,874 ns/iter (+/- 20)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,505 ns/iter (+/- 4)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,786 ns/iter (+/- 225)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,012 ns/iter (+/- 3)

Benchmark Results for ubuntu-x86_64-scalar

System Information

  • OS: ubuntu-latest
  • Arch: x86_64
  • SIMD tier: scalar
  • Runner: GitHub Actions 1000008072
  • Runner arch (GH): X64
  • RUSTFLAGS: --cfg colconv_force_scalar
  • Date: 2026-04-19 02:55:01 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,741 ns/iter (+/- 126)
test nv12_to_rgb_row/simd/1280 ... bench:       4,498 ns/iter (+/- 18)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,834 ns/iter (+/- 29)
test nv12_to_rgb_row/simd/1920 ... bench:       6,824 ns/iter (+/- 54)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,605 ns/iter (+/- 59)
test nv12_to_rgb_row/simd/3840 ... bench:      13,577 ns/iter (+/- 83)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,574 ns/iter (+/- 7)
test rgb_to_hsv_row/simd/1280 ... bench:       4,570 ns/iter (+/- 17)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,865 ns/iter (+/- 55)
test rgb_to_hsv_row/simd/1920 ... bench:       6,865 ns/iter (+/- 49)
test rgb_to_hsv_row/scalar/3840 ... bench:      13,739 ns/iter (+/- 263)
test rgb_to_hsv_row/simd/3840 ... bench:      13,830 ns/iter (+/- 38)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,819 ns/iter (+/- 69)
test yuv_420_to_rgb_row/simd/1280 ... bench:       4,821 ns/iter (+/- 14)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       7,274 ns/iter (+/- 13)
test yuv_420_to_rgb_row/simd/1920 ... bench:       7,274 ns/iter (+/- 17)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      14,551 ns/iter (+/- 48)
test yuv_420_to_rgb_row/simd/3840 ... bench:      14,563 ns/iter (+/- 42)

Benchmark Results for ubuntu-x86_64-sse41-max

System Information

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

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,650 ns/iter (+/- 30)
test nv12_to_rgb_row/simd/1280 ... bench:         885 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,934 ns/iter (+/- 20)
test nv12_to_rgb_row/simd/1920 ... bench:       1,332 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,876 ns/iter (+/- 118)
test nv12_to_rgb_row/simd/3840 ... bench:       2,661 ns/iter (+/- 6)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,630 ns/iter (+/- 44)
test rgb_to_hsv_row/simd/1280 ... bench:       2,569 ns/iter (+/- 69)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,934 ns/iter (+/- 49)
test rgb_to_hsv_row/simd/1920 ... bench:       3,856 ns/iter (+/- 10)
test rgb_to_hsv_row/scalar/3840 ... bench:      13,906 ns/iter (+/- 415)
test rgb_to_hsv_row/simd/3840 ... bench:       7,710 ns/iter (+/- 36)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,583 ns/iter (+/- 133)
test yuv_420_to_rgb_row/simd/1280 ... bench:         904 ns/iter (+/- 2)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,940 ns/iter (+/- 14)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,360 ns/iter (+/- 2)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,860 ns/iter (+/- 374)
test yuv_420_to_rgb_row/simd/3840 ... bench:       2,712 ns/iter (+/- 3)

Benchmark Results for windows-x86_64-default

System Information

  • OS: windows-latest
  • Arch: x86_64
  • SIMD tier: default
  • Runner: GitHub Actions 1000008074
  • Runner arch (GH): X64
  • RUSTFLAGS: ``
  • Date: 2026-04-19 02:56:16 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,389 ns/iter (+/- 52)
test nv12_to_rgb_row/simd/1280 ... bench:       1,122 ns/iter (+/- 6)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,599 ns/iter (+/- 44)
test nv12_to_rgb_row/simd/1920 ... bench:       1,685 ns/iter (+/- 9)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,194 ns/iter (+/- 72)
test nv12_to_rgb_row/simd/3840 ... bench:       3,362 ns/iter (+/- 23)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,659 ns/iter (+/- 87)
test rgb_to_hsv_row/simd/1280 ... bench:       2,601 ns/iter (+/- 19)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,997 ns/iter (+/- 374)
test rgb_to_hsv_row/simd/1920 ... bench:       3,897 ns/iter (+/- 83)
test rgb_to_hsv_row/scalar/3840 ... bench:      14,301 ns/iter (+/- 187)
test rgb_to_hsv_row/simd/3840 ... bench:       7,798 ns/iter (+/- 36)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,642 ns/iter (+/- 132)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,013 ns/iter (+/- 4)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,985 ns/iter (+/- 39)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,518 ns/iter (+/- 87)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      14,496 ns/iter (+/- 2,314)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,027 ns/iter (+/- 32)

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 16 out of 16 changed files in this pull request and generated 3 comments.


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

Comment thread src/sinker/mixed.rs
Comment on lines +528 to +536
fn process(&mut self, row: Nv12Row<'_>) -> Result<(), Self::Error> {
let w = self.width;
let idx = row.row();
let use_simd = self.simd;

// Defense-in-depth shape check (see Yuv420p impl above). An NV12
// UV row is `width` bytes of interleaved U / V payload — same
// length as Y — so both slices must equal `self.width`.
if row.y().len() != w {
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.

MixedSinker<Nv12>::process can panic if self.width is odd when called directly (bypassing the walker). The function checks slice lengths and row index, but then calls nv12_to_rgb_row, which asserts width & 1 == 0 and will panic for odd widths. To keep process non-panicking under direct calls, add an explicit even-width guard here (or prevent constructing MixedSinker<Nv12> with odd widths) and return a MixedSinkerError variant instead.

Copilot uses AI. Check for mistakes.
Comment thread src/frame.rs
Comment on lines +255 to +260
/// Returns [`Nv12FrameError`] if any of:
/// - `width` or `height` is zero or odd,
/// - `y_stride < width`,
/// - `uv_stride < width` (the UV row holds `width / 2` interleaved
/// pairs = `width` bytes of payload),
/// - either plane is too short to cover its declared rows.
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 Nv12Frame::try_new docs say it returns an error when width or height is "zero or odd", but the implementation only rejects odd width (odd heights are explicitly supported via height.div_ceil(2)). Please update this bullet list to match the actual validation behavior so callers don’t incorrectly assume odd heights are rejected.

Copilot uses AI. Check for mistakes.
Comment thread src/sinker/mixed.rs
Comment on lines +401 to 405
fn process(&mut self, row: Yuv420pRow<'_>) -> Result<(), Self::Error> {
let w = self.width;
let idx = row.row();
let use_simd = self.simd;

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.

MixedSinker<Yuv420p>::process can still panic if self.width is odd (e.g., a direct process caller bypassing the walker). The method validates slice lengths and row index, but it later calls yuv_420_to_rgb_row, which asserts width & 1 == 0 and will panic for odd widths. Consider adding an explicit even-width check here (or rejecting odd widths at construction for YUV formats) and returning a MixedSinkerError variant instead to preserve the no-panic contract for direct process calls.

Copilot uses AI. Check for mistakes.
@github-actions
Copy link
Copy Markdown

Benchmark Results

Benchmark Results Summary

Date: 2026-04-19 03:01:05 UTC

Benchmark Results for macos-aarch64-neon

System Information

  • OS: macos-latest
  • Arch: aarch64
  • SIMD tier: neon
  • Runner: GitHub Actions 1000008107
  • Runner arch (GH): ARM64
  • RUSTFLAGS: ``
  • Date: 2026-04-19 02:58:52 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       2,743 ns/iter (+/- 118)
test nv12_to_rgb_row/simd/1280 ... bench:         519 ns/iter (+/- 33)
test nv12_to_rgb_row/scalar/1920 ... bench:       4,109 ns/iter (+/- 170)
test nv12_to_rgb_row/simd/1920 ... bench:         761 ns/iter (+/- 25)
test nv12_to_rgb_row/scalar/3840 ... bench:       8,234 ns/iter (+/- 364)
test nv12_to_rgb_row/simd/3840 ... bench:       1,530 ns/iter (+/- 97)
test rgb_to_hsv_row/scalar/1280 ... bench:       3,297 ns/iter (+/- 303)
test rgb_to_hsv_row/simd/1280 ... bench:       1,527 ns/iter (+/- 104)
test rgb_to_hsv_row/scalar/1920 ... bench:       4,706 ns/iter (+/- 172)
test rgb_to_hsv_row/simd/1920 ... bench:       2,311 ns/iter (+/- 202)
test rgb_to_hsv_row/scalar/3840 ... bench:      10,456 ns/iter (+/- 946)
test rgb_to_hsv_row/simd/3840 ... bench:       4,775 ns/iter (+/- 335)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       2,972 ns/iter (+/- 173)
test yuv_420_to_rgb_row/simd/1280 ... bench:         532 ns/iter (+/- 20)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       4,363 ns/iter (+/- 162)
test yuv_420_to_rgb_row/simd/1920 ... bench:         801 ns/iter (+/- 33)
test yuv_420_to_rgb_row/scalar/3840 ... bench:       9,174 ns/iter (+/- 643)
test yuv_420_to_rgb_row/simd/3840 ... bench:       1,606 ns/iter (+/- 78)

Benchmark Results for macos-aarch64-scalar

System Information

  • OS: macos-latest
  • Arch: aarch64
  • SIMD tier: scalar
  • Runner: GitHub Actions 1000008128
  • Runner arch (GH): ARM64
  • RUSTFLAGS: --cfg colconv_force_scalar
  • Date: 2026-04-19 03:00:49 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       2,968 ns/iter (+/- 80)
test nv12_to_rgb_row/simd/1280 ... bench:       2,953 ns/iter (+/- 174)
test nv12_to_rgb_row/scalar/1920 ... bench:       4,399 ns/iter (+/- 96)
test nv12_to_rgb_row/simd/1920 ... bench:       4,375 ns/iter (+/- 77)
test nv12_to_rgb_row/scalar/3840 ... bench:       8,765 ns/iter (+/- 108)
test nv12_to_rgb_row/simd/3840 ... bench:       8,770 ns/iter (+/- 285)
test rgb_to_hsv_row/scalar/1280 ... bench:       3,422 ns/iter (+/- 186)
test rgb_to_hsv_row/simd/1280 ... bench:       3,383 ns/iter (+/- 166)
test rgb_to_hsv_row/scalar/1920 ... bench:       4,980 ns/iter (+/- 267)
test rgb_to_hsv_row/simd/1920 ... bench:       5,018 ns/iter (+/- 1,240)
test rgb_to_hsv_row/scalar/3840 ... bench:       9,774 ns/iter (+/- 764)
test rgb_to_hsv_row/simd/3840 ... bench:       9,810 ns/iter (+/- 691)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       2,819 ns/iter (+/- 64)
test yuv_420_to_rgb_row/simd/1280 ... bench:       2,802 ns/iter (+/- 68)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       4,365 ns/iter (+/- 62)
test yuv_420_to_rgb_row/simd/1920 ... bench:       4,243 ns/iter (+/- 96)
test yuv_420_to_rgb_row/scalar/3840 ... bench:       8,786 ns/iter (+/- 507)
test yuv_420_to_rgb_row/simd/3840 ... bench:       8,661 ns/iter (+/- 175)

Benchmark Results for ubuntu-x86_64-avx2-max

System Information

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

all

test nv12_to_rgb_row/scalar/1280 ... bench:       3,909 ns/iter (+/- 59)
test nv12_to_rgb_row/simd/1280 ... bench:       1,102 ns/iter (+/- 2)
test nv12_to_rgb_row/scalar/1920 ... bench:       5,875 ns/iter (+/- 19)
test nv12_to_rgb_row/simd/1920 ... bench:       1,645 ns/iter (+/- 4)
test nv12_to_rgb_row/scalar/3840 ... bench:      11,785 ns/iter (+/- 75)
test nv12_to_rgb_row/simd/3840 ... bench:       3,269 ns/iter (+/- 9)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,196 ns/iter (+/- 33)
test rgb_to_hsv_row/simd/1280 ... bench:       2,762 ns/iter (+/- 18)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,331 ns/iter (+/- 37)
test rgb_to_hsv_row/simd/1920 ... bench:       4,141 ns/iter (+/- 11)
test rgb_to_hsv_row/scalar/3840 ... bench:      12,840 ns/iter (+/- 122)
test rgb_to_hsv_row/simd/3840 ... bench:       8,285 ns/iter (+/- 82)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,089 ns/iter (+/- 43)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,083 ns/iter (+/- 2)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       5,882 ns/iter (+/- 20)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,613 ns/iter (+/- 4)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      11,521 ns/iter (+/- 51)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,221 ns/iter (+/- 18)

Benchmark Results for ubuntu-x86_64-default

System Information

  • OS: ubuntu-latest
  • Arch: x86_64
  • SIMD tier: default
  • Runner: GitHub Actions 1000008102
  • Runner arch (GH): X64
  • RUSTFLAGS: ``
  • Date: 2026-04-19 02:58:01 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,456 ns/iter (+/- 275)
test nv12_to_rgb_row/simd/1280 ... bench:       1,117 ns/iter (+/- 6)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,695 ns/iter (+/- 23)
test nv12_to_rgb_row/simd/1920 ... bench:       1,675 ns/iter (+/- 110)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,375 ns/iter (+/- 835)
test nv12_to_rgb_row/simd/3840 ... bench:       3,355 ns/iter (+/- 116)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,662 ns/iter (+/- 54)
test rgb_to_hsv_row/simd/1280 ... bench:       2,587 ns/iter (+/- 29)
test rgb_to_hsv_row/scalar/1920 ... bench:       7,020 ns/iter (+/- 320)
test rgb_to_hsv_row/simd/1920 ... bench:       3,883 ns/iter (+/- 73)
test rgb_to_hsv_row/scalar/3840 ... bench:      14,082 ns/iter (+/- 179)
test rgb_to_hsv_row/simd/3840 ... bench:       7,767 ns/iter (+/- 11)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,555 ns/iter (+/- 145)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,004 ns/iter (+/- 10)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,913 ns/iter (+/- 33)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,505 ns/iter (+/- 1)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,800 ns/iter (+/- 141)
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 1000008106
  • Runner arch (GH): X64
  • RUSTFLAGS: ``
  • CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS: -C target-cpu=native
  • Date: 2026-04-19 02:59:29 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,450 ns/iter (+/- 27)
test nv12_to_rgb_row/simd/1280 ... bench:       1,116 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,699 ns/iter (+/- 36)
test nv12_to_rgb_row/simd/1920 ... bench:       1,673 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,351 ns/iter (+/- 97)
test nv12_to_rgb_row/simd/3840 ... bench:       3,351 ns/iter (+/- 3)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,656 ns/iter (+/- 56)
test rgb_to_hsv_row/simd/1280 ... bench:       2,585 ns/iter (+/- 5)
test rgb_to_hsv_row/scalar/1920 ... bench:       7,002 ns/iter (+/- 25)
test rgb_to_hsv_row/simd/1920 ... bench:       3,877 ns/iter (+/- 3)
test rgb_to_hsv_row/scalar/3840 ... bench:      14,092 ns/iter (+/- 66)
test rgb_to_hsv_row/simd/3840 ... bench:       7,763 ns/iter (+/- 31)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,553 ns/iter (+/- 58)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,007 ns/iter (+/- 2)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,883 ns/iter (+/- 33)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,506 ns/iter (+/- 7)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,768 ns/iter (+/- 129)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,011 ns/iter (+/- 108)

Benchmark Results for ubuntu-x86_64-scalar

System Information

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

all

test nv12_to_rgb_row/scalar/1280 ... bench:       3,507 ns/iter (+/- 39)
test nv12_to_rgb_row/simd/1280 ... bench:       3,500 ns/iter (+/- 12)
test nv12_to_rgb_row/scalar/1920 ... bench:       5,250 ns/iter (+/- 62)
test nv12_to_rgb_row/simd/1920 ... bench:       5,247 ns/iter (+/- 24)
test nv12_to_rgb_row/scalar/3840 ... bench:      10,535 ns/iter (+/- 171)
test nv12_to_rgb_row/simd/3840 ... bench:      10,594 ns/iter (+/- 418)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,376 ns/iter (+/- 36)
test rgb_to_hsv_row/simd/1280 ... bench:       4,374 ns/iter (+/- 15)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,567 ns/iter (+/- 20)
test rgb_to_hsv_row/simd/1920 ... bench:       6,566 ns/iter (+/- 22)
test rgb_to_hsv_row/scalar/3840 ... bench:      13,151 ns/iter (+/- 27)
test rgb_to_hsv_row/simd/3840 ... bench:      13,136 ns/iter (+/- 25)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       3,869 ns/iter (+/- 15)
test yuv_420_to_rgb_row/simd/1280 ... bench:       3,878 ns/iter (+/- 13)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       5,832 ns/iter (+/- 17)
test yuv_420_to_rgb_row/simd/1920 ... bench:       5,832 ns/iter (+/- 36)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      11,606 ns/iter (+/- 49)
test yuv_420_to_rgb_row/simd/3840 ... bench:      11,626 ns/iter (+/- 526)

Benchmark Results for ubuntu-x86_64-sse41-max

System Information

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

all

test nv12_to_rgb_row/scalar/1280 ... bench:       5,032 ns/iter (+/- 92)
test nv12_to_rgb_row/simd/1280 ... bench:         988 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/1920 ... bench:       7,570 ns/iter (+/- 43)
test nv12_to_rgb_row/simd/1920 ... bench:       1,483 ns/iter (+/- 7)
test nv12_to_rgb_row/scalar/3840 ... bench:      15,202 ns/iter (+/- 227)
test nv12_to_rgb_row/simd/3840 ... bench:       2,963 ns/iter (+/- 5)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,469 ns/iter (+/- 57)
test rgb_to_hsv_row/simd/1280 ... bench:       2,751 ns/iter (+/- 20)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,858 ns/iter (+/- 16)
test rgb_to_hsv_row/simd/1920 ... bench:       4,125 ns/iter (+/- 22)
test rgb_to_hsv_row/scalar/3840 ... bench:      13,426 ns/iter (+/- 37)
test rgb_to_hsv_row/simd/3840 ... bench:       8,248 ns/iter (+/- 132)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,542 ns/iter (+/- 15)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,010 ns/iter (+/- 10)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,851 ns/iter (+/- 446)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,513 ns/iter (+/- 11)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,762 ns/iter (+/- 36)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,023 ns/iter (+/- 14)

Benchmark Results for windows-x86_64-default

System Information

  • OS: windows-latest
  • Arch: x86_64
  • SIMD tier: default
  • Runner: GitHub Actions 1000008100
  • Runner arch (GH): X64
  • RUSTFLAGS: ``
  • Date: 2026-04-19 02:58:37 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,396 ns/iter (+/- 74)
test nv12_to_rgb_row/simd/1280 ... bench:       1,132 ns/iter (+/- 3)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,603 ns/iter (+/- 50)
test nv12_to_rgb_row/simd/1920 ... bench:       1,679 ns/iter (+/- 11)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,181 ns/iter (+/- 136)
test nv12_to_rgb_row/simd/3840 ... bench:       3,361 ns/iter (+/- 10)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,661 ns/iter (+/- 32)
test rgb_to_hsv_row/simd/1280 ... bench:       2,616 ns/iter (+/- 30)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,995 ns/iter (+/- 103)
test rgb_to_hsv_row/simd/1920 ... bench:       3,908 ns/iter (+/- 51)
test rgb_to_hsv_row/scalar/3840 ... bench:      14,130 ns/iter (+/- 230)
test rgb_to_hsv_row/simd/3840 ... bench:       7,817 ns/iter (+/- 91)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,617 ns/iter (+/- 22)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,013 ns/iter (+/- 4)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,989 ns/iter (+/- 63)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,514 ns/iter (+/- 17)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,961 ns/iter (+/- 119)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,022 ns/iter (+/- 24)

View detailed results

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

@github-actions
Copy link
Copy Markdown

Benchmark Results

Benchmark Results Summary

Date: 2026-04-19 03:17:11 UTC

Benchmark Results for macos-aarch64-neon

System Information

  • OS: macos-latest
  • Arch: aarch64
  • SIMD tier: neon
  • Runner: GitHub Actions 1000008196
  • Runner arch (GH): ARM64
  • RUSTFLAGS: ``
  • Date: 2026-04-19 03:16:48 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       2,942 ns/iter (+/- 22)
test nv12_to_rgb_row/simd/1280 ... bench:         547 ns/iter (+/- 24)
test nv12_to_rgb_row/scalar/1920 ... bench:       4,410 ns/iter (+/- 38)
test nv12_to_rgb_row/simd/1920 ... bench:         820 ns/iter (+/- 24)
test nv12_to_rgb_row/scalar/3840 ... bench:       8,823 ns/iter (+/- 537)
test nv12_to_rgb_row/simd/3840 ... bench:       1,635 ns/iter (+/- 51)
test rgb_to_hsv_row/scalar/1280 ... bench:       3,377 ns/iter (+/- 48)
test rgb_to_hsv_row/simd/1280 ... bench:       1,569 ns/iter (+/- 27)
test rgb_to_hsv_row/scalar/1920 ... bench:       5,060 ns/iter (+/- 82)
test rgb_to_hsv_row/simd/1920 ... bench:       2,357 ns/iter (+/- 45)
test rgb_to_hsv_row/scalar/3840 ... bench:      10,153 ns/iter (+/- 514)
test rgb_to_hsv_row/simd/3840 ... bench:       4,708 ns/iter (+/- 69)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       2,915 ns/iter (+/- 86)
test yuv_420_to_rgb_row/simd/1280 ... bench:         529 ns/iter (+/- 8)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       4,369 ns/iter (+/- 69)
test yuv_420_to_rgb_row/simd/1920 ... bench:         790 ns/iter (+/- 11)
test yuv_420_to_rgb_row/scalar/3840 ... bench:       8,942 ns/iter (+/- 135)
test yuv_420_to_rgb_row/simd/3840 ... bench:       1,577 ns/iter (+/- 23)

Benchmark Results for macos-aarch64-scalar

System Information

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

all

test nv12_to_rgb_row/scalar/1280 ... bench:       2,943 ns/iter (+/- 379)
test nv12_to_rgb_row/simd/1280 ... bench:       2,870 ns/iter (+/- 376)
test nv12_to_rgb_row/scalar/1920 ... bench:       4,454 ns/iter (+/- 492)
test nv12_to_rgb_row/simd/1920 ... bench:       4,376 ns/iter (+/- 485)
test nv12_to_rgb_row/scalar/3840 ... bench:       8,684 ns/iter (+/- 765)
test nv12_to_rgb_row/simd/3840 ... bench:       8,999 ns/iter (+/- 1,728)
test rgb_to_hsv_row/scalar/1280 ... bench:       3,301 ns/iter (+/- 361)
test rgb_to_hsv_row/simd/1280 ... bench:       3,322 ns/iter (+/- 182)
test rgb_to_hsv_row/scalar/1920 ... bench:       4,862 ns/iter (+/- 943)
test rgb_to_hsv_row/simd/1920 ... bench:       5,060 ns/iter (+/- 379)
test rgb_to_hsv_row/scalar/3840 ... bench:      10,322 ns/iter (+/- 1,950)
test rgb_to_hsv_row/simd/3840 ... bench:      10,496 ns/iter (+/- 1,842)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       2,882 ns/iter (+/- 721)
test yuv_420_to_rgb_row/simd/1280 ... bench:       2,986 ns/iter (+/- 606)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       5,267 ns/iter (+/- 1,035)
test yuv_420_to_rgb_row/simd/1920 ... bench:       4,920 ns/iter (+/- 1,010)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      10,717 ns/iter (+/- 3,019)
test yuv_420_to_rgb_row/simd/3840 ... bench:      10,731 ns/iter (+/- 2,890)

Benchmark Results for ubuntu-x86_64-avx2-max

System Information

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

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,891 ns/iter (+/- 26)
test nv12_to_rgb_row/simd/1280 ... bench:       1,117 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/1920 ... bench:       7,362 ns/iter (+/- 20)
test nv12_to_rgb_row/simd/1920 ... bench:       1,674 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/3840 ... bench:      14,751 ns/iter (+/- 52)
test nv12_to_rgb_row/simd/3840 ... bench:       3,351 ns/iter (+/- 4)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,722 ns/iter (+/- 88)
test rgb_to_hsv_row/simd/1280 ... bench:       2,585 ns/iter (+/- 5)
test rgb_to_hsv_row/scalar/1920 ... bench:       7,084 ns/iter (+/- 39)
test rgb_to_hsv_row/simd/1920 ... bench:       3,875 ns/iter (+/- 9)
test rgb_to_hsv_row/scalar/3840 ... bench:      14,269 ns/iter (+/- 32)
test rgb_to_hsv_row/simd/3840 ... bench:       7,759 ns/iter (+/- 32)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,575 ns/iter (+/- 217)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,004 ns/iter (+/- 1)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,944 ns/iter (+/- 130)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,505 ns/iter (+/- 2)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,840 ns/iter (+/- 44)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,013 ns/iter (+/- 9)

Benchmark Results for ubuntu-x86_64-default

System Information

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

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,444 ns/iter (+/- 47)
test nv12_to_rgb_row/simd/1280 ... bench:       1,116 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,703 ns/iter (+/- 23)
test nv12_to_rgb_row/simd/1920 ... bench:       1,674 ns/iter (+/- 2)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,361 ns/iter (+/- 74)
test nv12_to_rgb_row/simd/3840 ... bench:       3,355 ns/iter (+/- 61)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,667 ns/iter (+/- 17)
test rgb_to_hsv_row/simd/1280 ... bench:       2,587 ns/iter (+/- 10)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,995 ns/iter (+/- 131)
test rgb_to_hsv_row/simd/1920 ... bench:       3,880 ns/iter (+/- 97)
test rgb_to_hsv_row/scalar/3840 ... bench:      14,050 ns/iter (+/- 93)
test rgb_to_hsv_row/simd/3840 ... bench:       7,762 ns/iter (+/- 19)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,550 ns/iter (+/- 70)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,004 ns/iter (+/- 1)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,911 ns/iter (+/- 361)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,506 ns/iter (+/- 4)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,785 ns/iter (+/- 78)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,013 ns/iter (+/- 5)

Benchmark Results for ubuntu-x86_64-native

System Information

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

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,445 ns/iter (+/- 25)
test nv12_to_rgb_row/simd/1280 ... bench:       1,117 ns/iter (+/- 30)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,703 ns/iter (+/- 342)
test nv12_to_rgb_row/simd/1920 ... bench:       1,674 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,378 ns/iter (+/- 41)
test nv12_to_rgb_row/simd/3840 ... bench:       3,352 ns/iter (+/- 2)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,667 ns/iter (+/- 13)
test rgb_to_hsv_row/simd/1280 ... bench:       2,586 ns/iter (+/- 2)
test rgb_to_hsv_row/scalar/1920 ... bench:       7,018 ns/iter (+/- 143)
test rgb_to_hsv_row/simd/1920 ... bench:       3,879 ns/iter (+/- 4)
test rgb_to_hsv_row/scalar/3840 ... bench:      14,064 ns/iter (+/- 30)
test rgb_to_hsv_row/simd/3840 ... bench:       7,763 ns/iter (+/- 6)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,560 ns/iter (+/- 13)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,004 ns/iter (+/- 1)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,904 ns/iter (+/- 21)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,505 ns/iter (+/- 2)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,917 ns/iter (+/- 27)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,012 ns/iter (+/- 7)

Benchmark Results for ubuntu-x86_64-scalar

System Information

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

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,746 ns/iter (+/- 113)
test nv12_to_rgb_row/simd/1280 ... bench:       4,739 ns/iter (+/- 107)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,847 ns/iter (+/- 36)
test nv12_to_rgb_row/simd/1920 ... bench:       6,851 ns/iter (+/- 160)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,563 ns/iter (+/- 58)
test nv12_to_rgb_row/simd/3840 ... bench:      13,575 ns/iter (+/- 456)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,578 ns/iter (+/- 67)
test rgb_to_hsv_row/simd/1280 ... bench:       4,576 ns/iter (+/- 34)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,863 ns/iter (+/- 36)
test rgb_to_hsv_row/simd/1920 ... bench:       6,855 ns/iter (+/- 29)
test rgb_to_hsv_row/scalar/3840 ... bench:      13,875 ns/iter (+/- 165)
test rgb_to_hsv_row/simd/3840 ... bench:      13,818 ns/iter (+/- 119)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,822 ns/iter (+/- 234)
test yuv_420_to_rgb_row/simd/1280 ... bench:       4,818 ns/iter (+/- 37)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       7,262 ns/iter (+/- 16)
test yuv_420_to_rgb_row/simd/1920 ... bench:       7,265 ns/iter (+/- 20)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      14,558 ns/iter (+/- 67)
test yuv_420_to_rgb_row/simd/3840 ... bench:      14,555 ns/iter (+/- 78)

Benchmark Results for ubuntu-x86_64-sse41-max

System Information

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

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,632 ns/iter (+/- 145)
test nv12_to_rgb_row/simd/1280 ... bench:         885 ns/iter (+/- 0)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,940 ns/iter (+/- 60)
test nv12_to_rgb_row/simd/1920 ... bench:       1,333 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,935 ns/iter (+/- 92)
test nv12_to_rgb_row/simd/3840 ... bench:       2,663 ns/iter (+/- 42)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,627 ns/iter (+/- 46)
test rgb_to_hsv_row/simd/1280 ... bench:       2,563 ns/iter (+/- 6)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,941 ns/iter (+/- 20)
test rgb_to_hsv_row/simd/1920 ... bench:       3,848 ns/iter (+/- 60)
test rgb_to_hsv_row/scalar/3840 ... bench:      13,896 ns/iter (+/- 96)
test rgb_to_hsv_row/simd/3840 ... bench:       7,777 ns/iter (+/- 138)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,585 ns/iter (+/- 48)
test yuv_420_to_rgb_row/simd/1280 ... bench:         904 ns/iter (+/- 0)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,933 ns/iter (+/- 113)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,360 ns/iter (+/- 2)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,807 ns/iter (+/- 52)
test yuv_420_to_rgb_row/simd/3840 ... bench:       2,712 ns/iter (+/- 2)

Benchmark Results for windows-x86_64-default

System Information

  • OS: windows-latest
  • Arch: x86_64
  • SIMD tier: default
  • Runner: GitHub Actions 1000008192
  • Runner arch (GH): X64
  • RUSTFLAGS: ``
  • Date: 2026-04-19 03:16:56 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       3,566 ns/iter (+/- 115)
test nv12_to_rgb_row/simd/1280 ... bench:         762 ns/iter (+/- 6)
test nv12_to_rgb_row/scalar/1920 ... bench:       5,326 ns/iter (+/- 95)
test nv12_to_rgb_row/simd/1920 ... bench:       1,139 ns/iter (+/- 4)
test nv12_to_rgb_row/scalar/3840 ... bench:      10,774 ns/iter (+/- 283)
test nv12_to_rgb_row/simd/3840 ... bench:       2,286 ns/iter (+/- 20)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,458 ns/iter (+/- 68)
test rgb_to_hsv_row/simd/1280 ... bench:       3,585 ns/iter (+/- 18)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,690 ns/iter (+/- 75)
test rgb_to_hsv_row/simd/1920 ... bench:       5,373 ns/iter (+/- 19)
test rgb_to_hsv_row/scalar/3840 ... bench:      13,717 ns/iter (+/- 227)
test rgb_to_hsv_row/simd/3840 ... bench:      10,746 ns/iter (+/- 30)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       3,798 ns/iter (+/- 85)
test yuv_420_to_rgb_row/simd/1280 ... bench:         695 ns/iter (+/- 12)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       5,718 ns/iter (+/- 136)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,040 ns/iter (+/- 27)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      11,502 ns/iter (+/- 409)
test yuv_420_to_rgb_row/simd/3840 ... bench:       2,085 ns/iter (+/- 8)

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 16 out of 16 changed files in this pull request and generated 5 comments.


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

Comment thread src/yuv/nv12.rs Outdated
Comment thread src/row/mod.rs Outdated
Comment thread src/sinker/mixed.rs Outdated
Comment thread src/sinker/mixed.rs
Comment on lines +610 to +615
let one_plane_start = idx * w;
let one_plane_end = one_plane_start + w;
let rgb_plane_start = one_plane_start * 3;
let rgb_plane_end = one_plane_end * 3;
let rgb_row_bytes = w * 3;

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.

Same overflow issue as the Yuv420p impl: let rgb_row_bytes = w * 3; is unchecked and can wrap on 32-bit even when HSV buffers were successfully attached (which only validates width * height). Use checked_mul(3) here as well and return a fallible error before resizing rgb_scratch/invoking nv12_to_rgb_row.

Copilot uses AI. Check for mistakes.
Comment thread .github/workflows/benchmark.yml Outdated
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 16 out of 16 changed files in this pull request and generated 1 comment.


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

Comment thread src/lib.rs
Comment on lines 136 to +144
pub trait PixelSink {
/// The shape of one input unit chosen by the per-format subtrait —
/// e.g. [`yuv::Yuv420pRow`] for YUV 4:2:0, one row at a time.
type Input<'a>;

/// The error type surfaced by this sink. Use
/// [`core::convert::Infallible`] for sinks that can't fail — the
/// compiler eliminates the `Result` branching at the call sites.
type Error;
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 PR title indicates NV12 support, but this change also makes PixelSink fallible (adds associated Error, changes process signature, and adds begin_frame) and updates existing kernels like yuv420p_to to return Result. That’s a significant API/breaking change and should be explicitly called out in the PR title/description and (if this crate is versioned for external use) the changelog/versioning strategy, so downstream users aren’t surprised.

Copilot uses AI. Check for mistakes.
@github-actions
Copy link
Copy Markdown

Benchmark Results

Benchmark Results Summary

Date: 2026-04-19 03:40:32 UTC

Benchmark Results for macos-aarch64-neon

System Information

  • OS: macos-latest
  • Arch: aarch64
  • SIMD tier: neon
  • Runner: GitHub Actions 1000008272
  • Runner arch (GH): ARM64
  • RUSTFLAGS: ``
  • Date: 2026-04-19 03:38:55 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       2,954 ns/iter (+/- 222)
test nv12_to_rgb_row/simd/1280 ... bench:         554 ns/iter (+/- 22)
test nv12_to_rgb_row/scalar/1920 ... bench:       4,425 ns/iter (+/- 147)
test nv12_to_rgb_row/simd/1920 ... bench:         822 ns/iter (+/- 20)
test nv12_to_rgb_row/scalar/3840 ... bench:       8,862 ns/iter (+/- 2,413)
test nv12_to_rgb_row/simd/3840 ... bench:       1,642 ns/iter (+/- 279)
test rgb_to_hsv_row/scalar/1280 ... bench:       3,381 ns/iter (+/- 316)
test rgb_to_hsv_row/simd/1280 ... bench:       1,570 ns/iter (+/- 19)
test rgb_to_hsv_row/scalar/1920 ... bench:       5,064 ns/iter (+/- 768)
test rgb_to_hsv_row/simd/1920 ... bench:       2,385 ns/iter (+/- 97)
test rgb_to_hsv_row/scalar/3840 ... bench:      10,731 ns/iter (+/- 1,697)
test rgb_to_hsv_row/simd/3840 ... bench:       4,763 ns/iter (+/- 1,313)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       2,954 ns/iter (+/- 143)
test yuv_420_to_rgb_row/simd/1280 ... bench:         538 ns/iter (+/- 55)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       4,480 ns/iter (+/- 341)
test yuv_420_to_rgb_row/simd/1920 ... bench:         797 ns/iter (+/- 141)
test yuv_420_to_rgb_row/scalar/3840 ... bench:       9,123 ns/iter (+/- 1,360)
test yuv_420_to_rgb_row/simd/3840 ... bench:       1,597 ns/iter (+/- 104)

Benchmark Results for macos-aarch64-scalar

System Information

  • OS: macos-latest
  • Arch: aarch64
  • SIMD tier: scalar
  • Runner: GitHub Actions 1000008266
  • Runner arch (GH): ARM64
  • RUSTFLAGS: --cfg colconv_force_scalar
  • Date: 2026-04-19 03:38:15 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       2,984 ns/iter (+/- 250)
test nv12_to_rgb_row/simd/1280 ... bench:       2,982 ns/iter (+/- 206)
test nv12_to_rgb_row/scalar/1920 ... bench:       4,444 ns/iter (+/- 349)
test nv12_to_rgb_row/simd/1920 ... bench:       4,457 ns/iter (+/- 307)
test nv12_to_rgb_row/scalar/3840 ... bench:       8,843 ns/iter (+/- 231)
test nv12_to_rgb_row/simd/3840 ... bench:       8,944 ns/iter (+/- 575)
test rgb_to_hsv_row/scalar/1280 ... bench:       3,390 ns/iter (+/- 171)
test rgb_to_hsv_row/simd/1280 ... bench:       3,388 ns/iter (+/- 314)
test rgb_to_hsv_row/scalar/1920 ... bench:       5,086 ns/iter (+/- 240)
test rgb_to_hsv_row/simd/1920 ... bench:       5,268 ns/iter (+/- 682)
test rgb_to_hsv_row/scalar/3840 ... bench:      10,334 ns/iter (+/- 573)
test rgb_to_hsv_row/simd/3840 ... bench:      10,353 ns/iter (+/- 920)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       2,919 ns/iter (+/- 135)
test yuv_420_to_rgb_row/simd/1280 ... bench:       2,923 ns/iter (+/- 169)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       4,396 ns/iter (+/- 117)
test yuv_420_to_rgb_row/simd/1920 ... bench:       4,369 ns/iter (+/- 179)
test yuv_420_to_rgb_row/scalar/3840 ... bench:       9,005 ns/iter (+/- 400)
test yuv_420_to_rgb_row/simd/3840 ... bench:       8,976 ns/iter (+/- 425)

Benchmark Results for ubuntu-x86_64-avx2-max

System Information

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

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,878 ns/iter (+/- 334)
test nv12_to_rgb_row/simd/1280 ... bench:       1,118 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/1920 ... bench:       7,363 ns/iter (+/- 33)
test nv12_to_rgb_row/simd/1920 ... bench:       1,674 ns/iter (+/- 4)
test nv12_to_rgb_row/scalar/3840 ... bench:      14,723 ns/iter (+/- 96)
test nv12_to_rgb_row/simd/3840 ... bench:       3,352 ns/iter (+/- 3)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,710 ns/iter (+/- 13)
test rgb_to_hsv_row/simd/1280 ... bench:       2,585 ns/iter (+/- 2)
test rgb_to_hsv_row/scalar/1920 ... bench:       7,080 ns/iter (+/- 30)
test rgb_to_hsv_row/simd/1920 ... bench:       3,877 ns/iter (+/- 87)
test rgb_to_hsv_row/scalar/3840 ... bench:      15,085 ns/iter (+/- 87)
test rgb_to_hsv_row/simd/3840 ... bench:       7,760 ns/iter (+/- 13)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,567 ns/iter (+/- 9)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,004 ns/iter (+/- 1)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,946 ns/iter (+/- 40)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,505 ns/iter (+/- 4)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,860 ns/iter (+/- 57)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,012 ns/iter (+/- 8)

Benchmark Results for ubuntu-x86_64-default

System Information

  • OS: ubuntu-latest
  • Arch: x86_64
  • SIMD tier: default
  • Runner: GitHub Actions 1000008261
  • Runner arch (GH): X64
  • RUSTFLAGS: ``
  • Date: 2026-04-19 03:38:02 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       3,400 ns/iter (+/- 60)
test nv12_to_rgb_row/simd/1280 ... bench:         595 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/1920 ... bench:       4,995 ns/iter (+/- 37)
test nv12_to_rgb_row/simd/1920 ... bench:         892 ns/iter (+/- 9)
test nv12_to_rgb_row/scalar/3840 ... bench:       9,938 ns/iter (+/- 131)
test nv12_to_rgb_row/simd/3840 ... bench:       1,788 ns/iter (+/- 9)
test rgb_to_hsv_row/scalar/1280 ... bench:       3,565 ns/iter (+/- 392)
test rgb_to_hsv_row/simd/1280 ... bench:       2,595 ns/iter (+/- 87)
test rgb_to_hsv_row/scalar/1920 ... bench:       5,343 ns/iter (+/- 12)
test rgb_to_hsv_row/simd/1920 ... bench:       3,901 ns/iter (+/- 118)
test rgb_to_hsv_row/scalar/3840 ... bench:      10,700 ns/iter (+/- 25)
test rgb_to_hsv_row/simd/3840 ... bench:       7,803 ns/iter (+/- 312)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       3,518 ns/iter (+/- 21)
test yuv_420_to_rgb_row/simd/1280 ... bench:         562 ns/iter (+/- 0)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       5,338 ns/iter (+/- 9)
test yuv_420_to_rgb_row/simd/1920 ... bench:         842 ns/iter (+/- 0)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      10,705 ns/iter (+/- 167)
test yuv_420_to_rgb_row/simd/3840 ... bench:       1,682 ns/iter (+/- 2)

Benchmark Results for ubuntu-x86_64-native

System Information

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

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,451 ns/iter (+/- 28)
test nv12_to_rgb_row/simd/1280 ... bench:       1,116 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,700 ns/iter (+/- 417)
test nv12_to_rgb_row/simd/1920 ... bench:       1,674 ns/iter (+/- 2)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,378 ns/iter (+/- 134)
test nv12_to_rgb_row/simd/3840 ... bench:       3,354 ns/iter (+/- 53)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,658 ns/iter (+/- 30)
test rgb_to_hsv_row/simd/1280 ... bench:       2,586 ns/iter (+/- 4)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,997 ns/iter (+/- 65)
test rgb_to_hsv_row/simd/1920 ... bench:       3,879 ns/iter (+/- 7)
test rgb_to_hsv_row/scalar/3840 ... bench:      14,076 ns/iter (+/- 42)
test rgb_to_hsv_row/simd/3840 ... bench:       7,766 ns/iter (+/- 27)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,549 ns/iter (+/- 9)
test yuv_420_to_rgb_row/simd/1280 ... bench:       1,005 ns/iter (+/- 1)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,896 ns/iter (+/- 349)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,506 ns/iter (+/- 3)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,791 ns/iter (+/- 42)
test yuv_420_to_rgb_row/simd/3840 ... bench:       3,012 ns/iter (+/- 3)

Benchmark Results for ubuntu-x86_64-scalar

System Information

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

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,496 ns/iter (+/- 12)
test nv12_to_rgb_row/simd/1280 ... bench:       4,507 ns/iter (+/- 93)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,815 ns/iter (+/- 20)
test nv12_to_rgb_row/simd/1920 ... bench:       6,813 ns/iter (+/- 36)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,564 ns/iter (+/- 121)
test nv12_to_rgb_row/simd/3840 ... bench:      13,558 ns/iter (+/- 46)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,573 ns/iter (+/- 12)
test rgb_to_hsv_row/simd/1280 ... bench:       4,578 ns/iter (+/- 12)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,863 ns/iter (+/- 58)
test rgb_to_hsv_row/simd/1920 ... bench:       6,858 ns/iter (+/- 38)
test rgb_to_hsv_row/scalar/3840 ... bench:      13,830 ns/iter (+/- 31)
test rgb_to_hsv_row/simd/3840 ... bench:      13,739 ns/iter (+/- 42)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,812 ns/iter (+/- 128)
test yuv_420_to_rgb_row/simd/1280 ... bench:       4,821 ns/iter (+/- 13)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       7,252 ns/iter (+/- 21)
test yuv_420_to_rgb_row/simd/1920 ... bench:       7,281 ns/iter (+/- 17)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      14,556 ns/iter (+/- 51)
test yuv_420_to_rgb_row/simd/3840 ... bench:      14,579 ns/iter (+/- 188)

Benchmark Results for ubuntu-x86_64-sse41-max

System Information

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

all

test nv12_to_rgb_row/scalar/1280 ... bench:       4,845 ns/iter (+/- 19)
test nv12_to_rgb_row/simd/1280 ... bench:         886 ns/iter (+/- 7)
test nv12_to_rgb_row/scalar/1920 ... bench:       6,930 ns/iter (+/- 19)
test nv12_to_rgb_row/simd/1920 ... bench:       1,330 ns/iter (+/- 1)
test nv12_to_rgb_row/scalar/3840 ... bench:      13,993 ns/iter (+/- 47)
test nv12_to_rgb_row/simd/3840 ... bench:       2,661 ns/iter (+/- 6)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,626 ns/iter (+/- 38)
test rgb_to_hsv_row/simd/1280 ... bench:       2,564 ns/iter (+/- 3)
test rgb_to_hsv_row/scalar/1920 ... bench:       7,087 ns/iter (+/- 13)
test rgb_to_hsv_row/simd/1920 ... bench:       3,849 ns/iter (+/- 34)
test rgb_to_hsv_row/scalar/3840 ... bench:      14,265 ns/iter (+/- 550)
test rgb_to_hsv_row/simd/3840 ... bench:       7,693 ns/iter (+/- 18)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       4,584 ns/iter (+/- 29)
test yuv_420_to_rgb_row/simd/1280 ... bench:         904 ns/iter (+/- 1)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       6,934 ns/iter (+/- 15)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,361 ns/iter (+/- 1)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      13,819 ns/iter (+/- 64)
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 1000008253
  • Runner arch (GH): X64
  • RUSTFLAGS: ``
  • Date: 2026-04-19 03:40:11 UTC

all

test nv12_to_rgb_row/scalar/1280 ... bench:       3,577 ns/iter (+/- 81)
test nv12_to_rgb_row/simd/1280 ... bench:         761 ns/iter (+/- 4)
test nv12_to_rgb_row/scalar/1920 ... bench:       5,347 ns/iter (+/- 183)
test nv12_to_rgb_row/simd/1920 ... bench:       1,137 ns/iter (+/- 23)
test nv12_to_rgb_row/scalar/3840 ... bench:      10,876 ns/iter (+/- 1,482)
test nv12_to_rgb_row/simd/3840 ... bench:       2,283 ns/iter (+/- 13)
test rgb_to_hsv_row/scalar/1280 ... bench:       4,463 ns/iter (+/- 61)
test rgb_to_hsv_row/simd/1280 ... bench:       3,586 ns/iter (+/- 39)
test rgb_to_hsv_row/scalar/1920 ... bench:       6,688 ns/iter (+/- 68)
test rgb_to_hsv_row/simd/1920 ... bench:       5,382 ns/iter (+/- 31)
test rgb_to_hsv_row/scalar/3840 ... bench:      13,627 ns/iter (+/- 131)
test rgb_to_hsv_row/simd/3840 ... bench:      10,783 ns/iter (+/- 80)
test yuv_420_to_rgb_row/scalar/1280 ... bench:       3,798 ns/iter (+/- 168)
test yuv_420_to_rgb_row/simd/1280 ... bench:         694 ns/iter (+/- 4)
test yuv_420_to_rgb_row/scalar/1920 ... bench:       5,721 ns/iter (+/- 126)
test yuv_420_to_rgb_row/simd/1920 ... bench:       1,036 ns/iter (+/- 6)
test yuv_420_to_rgb_row/scalar/3840 ... bench:      11,432 ns/iter (+/- 227)
test yuv_420_to_rgb_row/simd/3840 ... bench:       2,074 ns/iter (+/- 23)

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(nv12): support NV12 pixel format feat(0.1.0): NV12 (semi-planar 4:2:0) + fallible PixelSink contract Apr 19, 2026
@uqio uqio changed the title feat(0.1.0): NV12 (semi-planar 4:2:0) + fallible PixelSink contract feat(NV12): NV12(semi-planar 4:2:0) + fallible PixelSink contract Apr 19, 2026
@uqio uqio merged commit fbb5fc9 into main Apr 19, 2026
57 of 70 checks passed
@uqio uqio deleted the feat/nv12 branch April 19, 2026 03:45
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