Generated banner for Jetson Video Benchmark
Generated logo for Jetson Video Benchmark

Jetson Video Benchmark

NVIDIAOfficialCreated by Vinit BansalDistributed by NVIDIA

  • Skill
  • Workflow
  • Software development
  • Apache-2.0
  • Medium risk

From the author

Use when measuring Jetson Video Codec SDK or PyNvVideoCodec encode/decode throughput, comparing presets or surfaces, testing codec-worker capacity with authenticated samples and user media, or producing a clearly labeled documentation-derived planning estimate when representative media is absent. Also use for a video request limited to PSNR or SSIM, to apply the terminal scope response.
— the description by Vinit Bansal

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

The jetson-video-benchmark skill provides a structured workflow for measuring the encode and decode throughput of the Jetson Video Codec SDK and PyNvVideoCodec. It supports live performance measurements using authenticated samples, preset comparisons, and codec-worker capacity sweeps. For scenarios where representative media is unavailable, the skill generates clearly labeled planning estimates based on official documentation. It enforces strict validation of inputs, environment readiness, and output reporting to ensure results are reproducible and verifiable.

What it does

  • Measures encode and decode FPS and megapixels per second for specific workloads.
  • Compares performance across different presets and surfaces.
  • Tests codec-worker capacity through systematic sweeps.
  • Generates performance estimates based on documented SDK references when media is absent.
  • Validates benchmark results against strict output contracts and sample markers.
  • Reports detailed metrics including mean, minimum, and maximum performance values.

When to use it

  • When you need to measure actual encode or decode throughput on a Jetson device.
  • When comparing the performance impact of different codec presets or surfaces.
  • When determining the capacity of codec workers for a specific workload.
  • When you require a performance estimate based on official documentation for planning purposes.
  • When you need to verify performance metrics using authenticated SDK samples.

Advantages

  • Ensures consistent and verifiable benchmark results through strict output contracts.
  • Provides clear separation between live measurements and documentation-based estimates.
  • Automates the preflight checks for environment and dependency readiness.
  • Supports both native C++ SDK samples and Python-based PyNvVideoCodec workflows.
  • Prevents invalid comparisons by enforcing strict input and configuration validation.

Usage examples

“Measure the decode throughput for this H.264 elementary stream file: /data/input.h264”
The agent validates the input file, checks the environment, runs the AppDecPerf sample, and reports the measured FPS and MP/s.
“What is the expected encode performance for 1080p60 H.265 on Jetson Orin?”
The agent provides a documented performance estimate based on the SDK reference, clearly labeling it as a non-measured planning value.
“Compare P4 and P5 preset performance for this raw video file: /data/raw_frames.yuv”
The agent runs the encode benchmark for both presets using the provided raw input and reports the throughput difference.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/nvidia/jetson-video-benchmark/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip jetson-video-benchmark.zip -d .agents/skills

Documentation by Vinit Bansal

Jetson Video Benchmark

Purpose

Measure codec-stage FPS and megapixels/second for an evidenced target and exact workload. Supported live routes are encode, decode, P4/P5 comparison, and a strictly increasing worker-capacity sweep. A separate no-media path calculates clearly labeled SDK-documentation estimates; it never claims a measurement.

Terminal gates

  1. For a request solely for PSNR or SSIM, state that objective quality is outside this skill and needs a separately authorized workflow, then stop. Return only that scope response. Do not append an alternative benchmark or next step, name another tool, request media, probe, or install anything.

  2. Resolve codec direction before probing or calculating. Explicit encode or decode wording wins. Otherwise, quality, preset, bitrate, rate control, recording, or compressed-output wording implies encode; explicitly compressed input, ingest, playback, or IP/RTSP input implies decode. Treat generic camera-count wording such as "connect" or "handle", and a codec name on a camera or device, as direction-neutral. Set neutral wording aside and resolve direction on the remaining cues; a neutral cue never creates a conflict. For an encode-led camera estimate, state that NVDEC applies only when cameras already emit the named compressed codec, keep encode primary, and ask the user to confirm direction after giving the planning scenarios. If non-neutral cues conflict or are absent, present both interpretations, state that a unique encode estimate also needs an exact preset and measured validation needs representative input, then ask which direction applies and stop at that gate. Transcoding consumes separate decode and encode budgets: measure it as the supported decode and encode routes and report each budget separately, never as one combined FPS.

  3. An explicit live/run/real/actual measurement requires representative input for every requested direction: raw frames with format, geometry, and frame count for encode; a compressed elementary stream or container for decode. Each input must be one exact target-local path or user-supplied HTTP(S) URL. If any is absent, return only input_required and ask for the missing item(s), including a separate exact path or URL for every requested direction, before reading workflow references or sibling skills, probing, authentication, recipe work, or workspace creation. Never benchmark the setup smoke fixture or substitute catalog media.

  4. A no-media planning/expected/indicative question follows documented-performance-estimates.md. It requires the exact documented row and, for a scaled estimate, clock provenance; it sets measurement_performed: false. Preserve that reference byte-for-byte. Omitted preset, per-stream FPS, or stream mix does not block planning: enumerate the reference's bounded documented candidates and scenarios, disclose every assumption, and ask for the omitted values.

Live preflight

Read benchmark-workflow.md completely once, then apply its preflight section. Preserve explicit native, pynvc, and both; map delegated selection to auto. Obtain fresh read-only readiness from jetson-video-setup, passing any exact interpreter already supplied or established in this conversation. Setup otherwise checks the conventional profile path. For auto, zero eligible surfaces blocks, one runs, and two returns selection_required. Python encode and comparison need a full-samples environment; decode performance may use pynvc-smoke.

Encode, compare, and encode-capacity also require a validated schema-2 recipe from jetson-video-recipe. A missing dependency stops that branch with dependency_required; an eligible peer may continue as partial.

Measure

  1. Follow that same reference for sample allowlists, builds, direct argument lists, frame accounting, option checks, marker grammar, comparisons, and worker sweeps.

  2. Show the dry-run plan, then use a fresh mode-0700 workspace. Authenticate each launcher immediately before use and launch its literal argument list.

  3. Run one excluded whole-process warmup and at least three new measured processes per variant and surface, each with a finite timeout and without -loop.

  4. Accept the sample-reported FPS only when its positive marker and processed frame count match. Apply every identity, workload, marker, and statistics check in benchmark-output-contract.md.

Report

Retain each launch's unedited output and write the compact result described by benchmark-output-contract.md. Report every repetition, recomputed mean/minimum/maximum, MP/s only when dimensions are sample-bound, partial branches, limitations, and retry reason. Label worker sweeps as codec-stage capacity bounds and preset comparisons as throughput-only.

Limitations

  • Results apply only to the evidenced target, release, clocks, sample, content, frame range, and controls; they are not a portable product ceiling.

  • Do not interpolate undocumented presets or scale across format, bit depth, chroma, codec, rate control, or tuning. Resolution scaling is allowed only as the estimate reference's explicitly labeled pixel-area heuristic.

  • Keep documented estimates per engine; use an all-engine multiplier only under the explicit aggregate-planning rule in the estimate reference.

  • The PyNvVideoCodec 2.1 encode-performance helper caps each worker at 1,000 frames; follow the common-frame rule in the workflow.

  • Preserve input_required, selection_required, dependency_required, blocked, partial, and failed; do not promote a peer's success.

Files

references/benchmark-workflow.md

Benchmark workflow

Live measurements invoke authenticated released samples directly. The documentation-only estimate remains a separate calculation path in documented-performance-estimates.md.

Live preflight

  1. Canonicalize the input and preserve URL or null, license, attribution, bytes, SHA-256, codec, format, width, height, FPS, and frame count. For a URL, disable redirects; bound connection time, total time, and accepted bytes using an explicit user ceiling or trusted local metadata. Resolve the host first and accept only HTTP(S) addresses outside loopback, private, link-local, multicast, and reserved ranges. Recheck the connected peer address on every connection and preserve hostname-based TLS validation.

  2. Carry the surface-selection result from SKILL.md and obtain a fresh read-only readiness result from setup for every selected branch.

  3. Native uses the installed package and allowlisted samples. Python uses the exact interpreter, loaded extension, wheel RECORD, and wheel-owned sample. Decode performance may use pynvc-smoke; Python encode or comparison needs a separate full-samples environment.

  4. Encode, compare, and encode-capacity require a validated schema-2 recipe; decode routes do not. Hold every non-preset fact equal for P4/P5.

Return dependency_required for an ineligible selected branch before a measurement launch. An independently eligible peer may continue, producing a partial aggregate.

Exact benchmark allowlist

Native paths are relative to the authenticated SDK build/source roots.

SampleExecutableSourceCMake fileRequired runtime libraries
AppEncPerfAppEncode/AppEncPerf/AppEncPerfSamples/AppEncode/AppEncPerf/AppEncPerf.cppSamples/AppEncode/AppEncPerf/CMakeLists.txtlibcuda.so.1, libnvidia-encode.so.1
AppDecPerfAppDecode/AppDecPerf/AppDecPerfSamples/AppDecode/AppDecPerf/AppDecPerf.cppSamples/AppDecode/AppDecPerf/CMakeLists.txtlibcuda.so.1, libnvcuvid.so.1

PyNvVideoCodec wheel members:

SampleAdditional required RECORD members
samples/advanced/encode_perf.pysamples/utils/__init__.py, samples/utils/Utils.py, samples/utils/encode_parser.py, samples/utils/frame_utils.py, samples/utils/encode_parallel_utils.py
samples/advanced/decode_perf.pysamples/utils/__init__.py, samples/utils/decode_parser.py

The reference owns this allowlist. The fresh setup readiness result supplies the package root or exact interpreter and package location. Resolve required tools directly, and authenticate the selected entries immediately before use. The allowlist does not prove readiness, support, or operation success.

Build native benchmark samples

Build the selected target directly. Authenticate one installed public nvidia-video-codec-sdk 13.0.x package and one package-owned, unmodified, non-symlinked Samples tree with /usr/bin/dpkg-query -W, /usr/bin/dpkg-query -L, and silent successful /usr/bin/dpkg --verify. Resolve cmake, the C++ compiler, nvcc, pkg-config, and the selected generator with standard system commands; record their canonical paths and versions. Create a fresh mode-0700 BUILD_ROOT outside the SDK. With TARGET restricted to AppEncPerf or AppDecPerf, invoke:

If the exact package is absent or its 13.0.x ownership resolves to zero or multiple complete Samples roots, return dependency_required and route repair to setup; never infer another package name or choose one root by path order. A nonzero configure, build, or native option-validation exit fails that branch: return failed with the exact command and captured output, and never launch or substitute another binary.

"$CMAKE" -S "$SDK_ROOT/Samples" -B "$BUILD_ROOT" \
  -G "$GENERATOR_NAME" \
  "-DCMAKE_MAKE_PROGRAM=$GENERATOR" \
  -DCMAKE_BUILD_TYPE=Release \
  "-DCMAKE_CXX_COMPILER=$CXX" \
  "-DCUDAToolkit_ROOT=$CUDA_ROOT" \
  "-DCUDAToolkit_NVCC_EXECUTABLE=$NVCC" \
  "-DCMAKE_CUDA_COMPILER=$NVCC" \
  "-DPKG_CONFIG_EXECUTABLE=$PKG_CONFIG"
"$CMAKE" --build "$BUILD_ROOT" --target "$TARGET" --parallel 2

The only accepted outputs under BUILD_ROOT are AppEncode/AppEncPerf/AppEncPerf and AppDecode/AppDecPerf/AppDecPerf. Require confinement to the fresh build root, hash the binary, and prove its table-row libraries resolve with ldd to real non-stub files. Recheck package, source, tools, binary, and libraries after every warmup/measurement series.

Direct argument arrays

Build one list of arguments and retain it verbatim with every warmup and measurement. Never pass -loop.

native decode:
  APPDECPERF -i INPUT -gpu GPU -thread WORKERS [-single] [-host]

native encode:
  APPENCPERF -i INPUT -s WIDTHxHEIGHT -if NATIVE_FORMAT -gpu GPU
    -frame FRAMES -thread WORKERS -codec CODEC [RECIPE_CONTROLS...]

Python decode:
  PYTHON -I DECODE_PERF -i INPUT -n WORKERS -m PROCESS_MODEL
    -g GPU -f FRAMES

Python encode:
  PYTHON -I ENCODE_PERF -m PROCESS_MODEL -i INPUT -s WIDTHxHEIGHT
    -if FORMAT -n WORKERS -f FRAMES -g GPU -c CODEC -json CONFIG

Native format mapping is exact: NV12→nv12, YUV420→iyuv, P010→p010, NV16→nv16, P210→p210, YUV444→yuv444, YUV444_16BIT→yuv444p16, ARGB→bgra, and ABGR→abgr.

Native encode recipe controls are the exact native projection excluding the base options -s, -if, -gpu, and -codec; these are supplied once from the evidenced workload. Python CONFIG is the canonical JSON projection for that recipe and the sole -json operand.

Native option validation

Run both authenticated AppEncPerf -h and AppEncPerf -A; both must exit zero. Collect their complete combined stdout/stderr as the advertised-option set.

Before launching, check the planned argument list against this checklist. Any failure blocks the launch; report the failing item verbatim.

  • The launcher path and every argument are nonempty strings containing no NUL.

  • Every emitted option (each argument beginning with -, excluding a bare -) appears in the advertised-option set from the two help texts. Report the full sorted list of options that are not advertised.

  • -loop is never emitted; it is forbidden regardless of advertisement.

Launch exactly the checked list with shell=False. Do not reconstruct, edit, or append to the argument list after checking it -- the checked list and the launched list must be identical. This is a deterministic procedure the agent performs, not an automatically enforced runtime hook.

Frame accounting

The PyNvVideoCodec 2.1 encode_perf.py helper caps each worker at 1,000 frames.

  • If Python encode participates, use min(source_frames, 1000) per worker for every compared surface, including native, so the same leading frames run.

  • Native-only encode retains all requested frames. Decode is never capped.

  • Expected aggregate frames are effective_frames_per_worker * workers.

  • Preserve the original input identity and source frame count; do not trim or rewrite the input or recipe.

  • require_source_frames is true only when the user explicitly requires exact source-frame fidelity; it is false otherwise.

  • If require_source_frames is true and the cap would apply, stop before any launch and require native-only or an input at/below the cap.

For each surface, report source and effective frames per worker, worker count, expected aggregate frames, whether the cap was applied, and its authenticated PyNvVideoCodec 2.1 sample authority. A fixed object schema is not required.

Measured lifecycle

For each variant/surface independently:

  1. Authenticate the sample and helper identities and recheck input, recipe, and config identities.

  2. Run one whole-process warmup. Retain its exact argv and outcome but exclude it from statistics.

  3. Run at least three new whole processes sequentially. Number repetitions from one and label each measure.

  4. Parse the official terminal markers below, require the expected aggregate frame count, and reject non-finite/non-positive or contradictory values.

  5. Compute MP/s only with sample-bound dimensions, then apply the concise acceptance checklist in the output contract before accepting the result.

Official markers:

  • AppEncPerf: nTotal=N, time=S seconds, FPS=F; repeated occurrences must agree and N/S must be consistent with displayed precision.

  • AppDecPerf: Total Frames Decoded=N FPS = F; also require one matching codec, frame-rate, coded-size, display-area, chroma, and bit-depth report per worker before deriving dimensions/MP/s.

  • Python encode: ^Total frames processed: N$, ^Duration: S seconds$, and ^Total FPS: F$, with rate consistency within displayed precision.

  • Python decode: ^Total frames decoded: N$, ^Total FPS: F$, and ^Total wall time: Ss$. Omit MP/s because this sample does not report dimensions.

In every route, reject explicit error/fatal/failed/failure/CUDA/NVENC/FFmpeg failure lines even when the exit code is zero.

Retry a failed branch once at most, after the input, sample/package/interpreter, environment, or unavailable resource has demonstrably changed. Retain both attempts.

Comparisons and capacity

  • P4/P5 comparison accepts exactly two recipes. Reopen and rehash both, compare their encoder_intent objects after removing only preset, and require the remaining objects to be identical; the removed values must be exactly p4 and p5. Keep surface results separate and disclose projection differences. Throughput never proves quality ordering.

  • A capacity sweep uses strictly increasing worker counts beginning at one. Compute safety_margin = 1 - margin_fraction, usable_fps = measured_min_fps * safety_margin, required_fps = workers * nominal_stream_fps, and headroom_fps = usable_fps - required_fps; a 10% margin therefore means safety_margin = 0.9. Record every point with these values and the maximum passing tested count. It is a codec-stage bound, not a camera or end-to-end result.

  • Explicit both runs independent branches and returns partial when only one passes. auto never benchmarks two surfaces to choose between them.

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Security

What our scanner noticed· Medium risk

  • Large base64-encoded blobs

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
Vinit Bansal
Publisher
NVIDIA (Official)
Distributed by
NVIDIA
Source
NVIDIA/skills · skills/jetson-video-benchmark · commit fce3cca
Licence
Apache License 2.0 (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE-APACHE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by Vinit Bansal or NVIDIA.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download jetson-video-benchmark.zip