Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
9de5608
feat(nodes): add HW video codec backends (Vulkan Video H.264, VA-API …
streamkit-devin Apr 9, 2026
5bba936
ci: run nvcodec tests on GPU runner
streamkit-devin Apr 9, 2026
ea842e6
ci: install CUDA headers on GPU runner for nvcodec tests
streamkit-devin Apr 9, 2026
90090fb
ci: set CUDA_INCLUDE_PATH for nvcodec build on GPU runner
streamkit-devin Apr 9, 2026
1c59240
ci: fix nvcodec build on GPU runner (BINDGEN_EXTRA_CLANG_ARGS)
streamkit-devin Apr 9, 2026
61ed289
ci: reorder GPU tests so nvcodec runs before engine
streamkit-devin Apr 9, 2026
3dffae7
fix(nodes): add missing framerate field in nvcodec test
streamkit-devin Apr 9, 2026
182e010
fix(nodes): register HW codec nodes, fix i420_to_nv12 truncation, rem…
streamkit-devin Apr 9, 2026
98c4c4e
fix(nodes): add encoder flush comment, validate cuda_device, use GBM …
streamkit-devin Apr 9, 2026
25828bf
fix(skit): forward HW codec feature flags from streamkit-server to st…
streamkit-devin Apr 9, 2026
fa140ac
docs(samples): add HW video codec sample pipelines
streamkit-devin Apr 9, 2026
7f8120a
fix(nodes): revert get_plane_offset to computed fallback
streamkit-devin Apr 9, 2026
49d7dae
style: format vaapi_av1.rs
streamkit-devin Apr 9, 2026
1dab145
feat(nodes): add VA-API H.264 encoder and decoder nodes
streamkit-devin Apr 9, 2026
c946f52
feat(nodes): add VA-API H.264 encoder and decoder nodes
streamkit-devin Apr 9, 2026
611f493
fix(nodes): auto-detect VA-API H.264 encoder entrypoint
streamkit-devin Apr 9, 2026
23cf24e
fix(nodes): bypass GBM for VA-API encoders, use direct VA surfaces
streamkit-devin Apr 9, 2026
bcfd007
fix(nodes): use ceiling division for chroma dimensions in VA surface …
streamkit-devin Apr 9, 2026
6442c75
fix(nodes): remove incorrect .min(w) clamp on NV12 UV row copy
streamkit-devin Apr 9, 2026
a6583e8
style(nodes): fix rustfmt for VA surface UV copy
streamkit-devin Apr 9, 2026
70347b9
feat(e2e): add headless pipeline validation tests (#285)
staging-devin-ai-integration[bot] Apr 11, 2026
5bb1936
fix(e2e): improve pipeline test diagnostics and GPU CI reliability
streamkit-devin Apr 11, 2026
921ca8d
fix(nodes): eagerly init Vulkan device to prevent empty output on fas…
streamkit-devin Apr 11, 2026
26ba11d
fix(nodes): eagerly init Vulkan device to prevent empty output on fas…
streamkit-devin Apr 11, 2026
b2e4a70
fix(nodes): add panic detection and lifecycle tracing to codec forwar…
streamkit-devin Apr 11, 2026
bc74ab6
fix(nodes): add panic detection and lifecycle tracing to codec forwar…
streamkit-devin Apr 11, 2026
ef994ec
fix(nodes): force first Vulkan Video H.264 frame as IDR keyframe
streamkit-devin Apr 11, 2026
fbacbbb
fix(nodes): add diagnostic tracing for pipeline shutdown race condition
streamkit-devin Apr 11, 2026
6b9b100
fix(nodes): await codec task before draining to prevent shutdown race
streamkit-devin Apr 11, 2026
e4aa91c
style: format codec_utils.rs
streamkit-devin Apr 11, 2026
0ef7854
fix(nodes): resolve clippy cognitive_complexity in codec_utils and mp4
streamkit-devin Apr 11, 2026
83c0ecb
refactor(nodes): extract accumulate_video_sample to fix mp4 cognitive…
streamkit-devin Apr 11, 2026
f99fbdb
refactor(nodes): extract accumulate_audio_sample to further reduce mp…
streamkit-devin Apr 11, 2026
edeba3d
fix(nodes): abort codec task before awaiting in non-drain path
streamkit-devin Apr 11, 2026
4c119a8
refactor(nodes): extract check_video_keyframe_gate to further reduce …
streamkit-devin Apr 11, 2026
434d7f0
fix(nodes): populate avcC chroma fields for High profile H.264
streamkit-devin Apr 11, 2026
992a05f
fix(nodes): drain results concurrently with codec task to prevent dea…
streamkit-devin Apr 11, 2026
94c0272
refactor(nodes): extract drain_codec_results to reduce cognitive comp…
streamkit-devin Apr 11, 2026
4a73ed8
fix(nodes): detect keyframe from VA-API encoder bitstream output
streamkit-devin Apr 12, 2026
2e9f735
fix(nodes): construct VA-API encoder backend directly to satisfy trai…
streamkit-devin Apr 12, 2026
5ffdc82
fix(nodes): restore required imports removed in previous commit
streamkit-devin Apr 12, 2026
d3f84ba
fix(nodes): use GbmVideoFrame for VA-API encoders with runtime GBM fa…
streamkit-devin Apr 12, 2026
46938e7
fix(nodes): return error on NV12 bounds-check failure
streamkit-devin Apr 12, 2026
6f4bc24
test(ci): add VA-API test coverage to GPU runner
streamkit-devin Apr 12, 2026
4434236
fix(ci): add libgbm-dev to GPU runner dependencies
streamkit-devin Apr 12, 2026
8ea9e00
fix(nodes): skip VA-API encode tests on decode-only drivers
streamkit-devin Apr 12, 2026
4c49959
fix(deps): vendor cros-codecs with GbmUsage::Linear support
streamkit-devin Apr 12, 2026
be19e0c
fix(nodes): add GBM_BO_USE_LINEAR fallback for Tiger Lake VA-API
streamkit-devin Apr 12, 2026
fa45297
chore(reuse): add SPDX annotation for vendored cros-codecs
streamkit-devin Apr 12, 2026
fb7fa52
chore(reuse): add BSD-3-Clause license text for vendored cros-codecs
streamkit-devin Apr 12, 2026
01ec75e
fix(deps): add GbmUsage::Separated for per-plane R8 VA-API export
streamkit-devin Apr 13, 2026
add801d
fix(deps): use single flat R8 BO for GbmUsage::Separated
streamkit-devin Apr 13, 2026
a469a46
Merge branch 'main' into devin/1775739794-hw-video-final
streamer45 Apr 13, 2026
243541e
fix(nodes): pass display resolution to VA-API encoders (fixes #292)
streamkit-devin Apr 13, 2026
50f740d
refactor(nodes): use VA-API Image API for encoders, drop GBM encoder …
streamkit-devin Apr 13, 2026
0187691
fix(nodes): restore CrosFourcc and WriteMapping imports for vaapi tests
streamkit-devin Apr 13, 2026
8051305
fix(nodes): use direct backend construction for VA-API encoders
streamkit-devin Apr 13, 2026
000db0a
fix(deps): make new_av1/new_h264 public in vendored cros-codecs
streamkit-devin Apr 13, 2026
660ca3d
refactor(nodes): minimize cros-codecs vendor to pub fn new_h264 only
streamkit-devin Apr 14, 2026
b7932d1
feat(nodes): replace cros-codecs H.264 encoder with custom VA-API shim
streamkit-devin Apr 14, 2026
9e16dc6
chore(reuse): remove unused BSD-3-Clause license file
streamkit-devin Apr 14, 2026
38da40a
style: apply rustfmt to vaapi_h264 encoder shim
streamkit-devin Apr 14, 2026
d064693
fix(nodes): fix H264EncFrameCropOffsets clone and remove unused imports
streamkit-devin Apr 14, 2026
8939371
fix(nodes): restore VideoFrame and ReadMapping trait imports for decoder
streamkit-devin Apr 14, 2026
1a2bc0c
fix(nodes): generate SPS/PPS NALUs for custom H.264 VA-API encoder
streamkit-devin Apr 14, 2026
f950f20
fix(nodes): address code review findings for VA-API H.264 encoder
streamkit-devin Apr 14, 2026
7618edd
fix(nodes): use crate::video path for i420_frame_to_nv12_buffer in te…
streamkit-devin Apr 14, 2026
e825639
refactor(nodes): consolidate VA-API decode loop + Vulkan Video encode…
streamkit-devin Apr 14, 2026
1c2fba3
fix(nodes): restore libva import removed during decode loop consolida…
streamkit-devin Apr 14, 2026
a3e3306
ci(e2e): drop PIPELINE_REQUIRE_NODES from non-GPU pipeline validation
streamkit-devin Apr 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
181 changes: 181 additions & 0 deletions .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,187 @@ env:
RUSTC_WRAPPER: sccache

jobs:
pipeline-validation:
name: Pipeline Validation
runs-on: ubuntu-22.04
steps:
- name: Free disk space
uses: jlumbroso/free-disk-space@main
with:
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: false
docker-images: true
swap-storage: false

- uses: actions/checkout@v5

- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: "1.3.5"

- name: Build UI
working-directory: ./ui
run: |
bun install --frozen-lockfile
bun run build

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.92.0"

- uses: mozilla-actions/sccache-action@v0.0.9

- uses: Swatinem/rust-cache@v2

- name: Install system dependencies
run: sudo apt-get update && sudo apt-get install -y libvpx-dev nasm cmake ninja-build yasm meson ffmpeg

- name: Build and install SVT-AV1 from source (v4.1.0)
run: |
cd /tmp
git clone --depth 1 --branch v4.1.0 https://gitlab.com/AOMediaCodec/SVT-AV1.git
cd SVT-AV1
cmake -S . -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local
cmake --build build -j"$(nproc)"
sudo cmake --install build
sudo ldconfig

- name: Build skit
run: cargo build -p streamkit-server --bin skit --features "svt_av1 dav1d_static"

- name: Start skit server
run: |
SK_SERVER__ADDRESS=127.0.0.1:4545 ./target/debug/skit &
# Wait for the server to be healthy
HEALTHY=0
for i in $(seq 1 30); do
if curl -sf http://127.0.0.1:4545/healthz > /dev/null 2>&1; then
echo "skit is healthy"
HEALTHY=1
break
fi
sleep 1
done
if [ "$HEALTHY" -ne 1 ]; then
echo "ERROR: skit did not become healthy within 30s"
exit 1
fi

- name: Run pipeline validation tests (SW codecs only)
run: |
cd tests/pipeline-validation
PIPELINE_TEST_URL=http://127.0.0.1:4545 cargo test --test validate

pipeline-validation-gpu:
name: Pipeline Validation (GPU)
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository
runs-on: self-hosted
steps:
- uses: actions/checkout@v5

- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: "1.3.5"

- name: Build UI
working-directory: ./ui
run: |
bun install --frozen-lockfile
bun run build

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.92.0"

- uses: mozilla-actions/sccache-action@v0.0.9

- uses: Swatinem/rust-cache@v2

- name: Install system dependencies
run: sudo apt-get update && sudo apt-get install -y libvpx-dev nasm cmake ninja-build yasm meson ffmpeg libopus-dev pkg-config libssl-dev

- name: Build and install SVT-AV1 from source (v4.1.0)
run: |
cd /tmp
if pkg-config --atleast-version=2.0.0 SvtAv1Enc 2>/dev/null; then
echo "SVT-AV1 already installed, skipping build"
else
rm -rf SVT-AV1
git clone --depth 1 --branch v4.1.0 https://gitlab.com/AOMediaCodec/SVT-AV1.git
cd SVT-AV1
cmake -S . -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local
cmake --build build -j"$(nproc)"
sudo cmake --install build
sudo ldconfig
fi

- name: Build skit (with GPU + HW codecs + SVT-AV1 + dav1d)
env:
VPX_LIB_DIR: /usr/lib/x86_64-linux-gnu
VPX_INCLUDE_DIR: /usr/include
VPX_VERSION: "1.13.0"
CUDA_INCLUDE_PATH: /usr/include
# bindgen (used by shiguredo_nvcodec) needs the clang builtin include
# path so it can find stddef.h and other compiler-provided headers.
BINDGEN_EXTRA_CLANG_ARGS: "-I/usr/lib/llvm-18/lib/clang/18/include"
run: |
cargo build -p streamkit-server --bin skit --features "gpu nvcodec vulkan_video svt_av1 dav1d_static"

- name: Start skit server
run: |
# Use a non-default port to avoid conflicts with any persistent skit
# instance that may be running on the self-hosted runner.
SKIT_PORT=4546
RUST_LOG=info,streamkit_nodes::codec_utils=debug,streamkit_nodes::video::vulkan_video=debug,streamkit_nodes::core::bytes_output=debug SK_SERVER__ADDRESS=127.0.0.1:${SKIT_PORT} ./target/debug/skit > /tmp/skit-gpu.log 2>&1 &
echo $! > /tmp/skit-gpu.pid
# Wait for the server to be healthy
HEALTHY=0
for i in $(seq 1 30); do
if curl -sf http://127.0.0.1:${SKIT_PORT}/healthz > /dev/null 2>&1; then
echo "skit is healthy on port ${SKIT_PORT}"
HEALTHY=1
break
fi
sleep 1
done
if [ "$HEALTHY" -ne 1 ]; then
echo "ERROR: skit did not become healthy within 30s"
exit 1
fi

- name: Run pipeline validation tests (all codecs including GPU)
run: |
cd tests/pipeline-validation
PIPELINE_REQUIRE_NODES=1 PIPELINE_TEST_URL=http://127.0.0.1:4546 cargo test --test validate -- --test-threads=1

- name: Show skit server logs
if: always()
run: |
if [ -f /tmp/skit-gpu.log ]; then
echo "=== skit server logs (last 500 lines) ==="
tail -500 /tmp/skit-gpu.log
fi

- name: Stop skit server
if: always()
run: |
if [ -f /tmp/skit-gpu.pid ]; then
kill "$(cat /tmp/skit-gpu.pid)" 2>/dev/null || true
rm -f /tmp/skit-gpu.pid
fi
rm -f /tmp/skit-gpu.log

e2e:
name: Playwright E2E
runs-on: ubuntu-22.04
Expand Down
12 changes: 11 additions & 1 deletion .github/workflows/skit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,9 @@ jobs:
- uses: actions/checkout@v5

- name: Install system dependencies
run: sudo apt-get update && sudo apt-get install -y libvpx-dev nasm cmake pkg-config libopus-dev
run: |
sudo apt-get update
sudo apt-get install -y libvpx-dev nasm cmake pkg-config libopus-dev libva-dev libgbm-dev

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@master
Expand All @@ -140,8 +142,16 @@ jobs:
VPX_LIB_DIR: /usr/lib/x86_64-linux-gnu
VPX_INCLUDE_DIR: /usr/include
VPX_VERSION: "1.13.0"
# Ubuntu's nvidia-cuda-toolkit installs headers to /usr/include, not
# /usr/local/cuda/include. Tell shiguredo_nvcodec where to find them.
CUDA_INCLUDE_PATH: /usr/include
# bindgen (used by shiguredo_nvcodec) needs the clang builtin include
# path so it can find stddef.h and other compiler-provided headers.
BINDGEN_EXTRA_CLANG_ARGS: "-I/usr/lib/llvm-18/lib/clang/18/include"
run: |
cargo test --locked -p streamkit-nodes --features gpu
cargo test --locked -p streamkit-nodes --features nvcodec
cargo test --locked -p streamkit-nodes --features vaapi
cargo test --locked -p streamkit-engine --features gpu

build:
Expand Down
Loading
Loading