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/documented-performance-estimates.md

Documented performance estimates

Use this answer path only when representative content is unavailable and the user asks for expected, indicative, achievable, planning, specification, or theoretical FPS or codec-stream capacity. It is not a benchmark execution and does not satisfy an explicit request to run or measure real content.

Authoritative SDK 13.0 rows

The source is the NVIDIA Video Codec SDK 13.0 NVENC application note and NVDEC application note. The values are indicative, per-engine FPS for Jetson Thor at the documented highest video clock.

Record the source software conditions with the row. The encode note identifies Video Codec SDK 13.0 and NVIDIA Jetson Linux for Thor without naming an exact Jetson Linux revision. The decode note identifies Video Codec SDK 13.0 and Jetson Linux 38.2. If the planned target uses another release, disclose that software-version difference rather than treating the calculation as a target measurement.

Match these rows only when the planned platform is Jetson Thor and the codec, chroma, bit depth, preset, rate control, and tuning are exact. A different positive resolution may use only the bounded pixel-area heuristic below. For any other mismatch, return documentation_estimate_unavailable; do not interpolate or substitute.

An omitted field is not a mismatch. Reserve documentation_estimate_unavailable for an explicitly conflicting request, such as an undocumented P2, P4, or P6 preset. When the user omits a field, keep the answer open: map "high quality" to the exact VBR / high quality rows and enumerate that small documented preset set instead of silently choosing one, and read "4K" as 3840x2160 only as a disclosed planning interpretation, noting that DCI 4096x2160 changes the pixel ratio. Show the resulting scenario math for the enumerated candidates without claiming one unique answer, then ask for the exact preset, per-stream FPS, stream mix, and representative content.

A qualitative encode control that is not an exact table value, including "medium quality", must not be mapped to one preset, rate-control mode, or tuning. Preserve the encode direction, enumerate a compact set of exact documented encode candidates without calling any candidate "medium", and ask for the exact controls and direction. Never switch to a decode row merely because decode has fewer required controls. State decode only as the conditional interpretation for cameras that already emit the compressed codec; use separate encode and decode budgets when both stages are requested.

Encode rows apply exactly to 1920x1080, YUV 4:2:0, 8-bit input:

CodecPresetRate controlTuningFPS
H.264P1CBRlow latency724
H.264P1VBRhigh quality713
H.264P3CBRlow latency529
H.264P3VBRhigh quality527
H.264P5CBRlow latency236
H.264P5VBRhigh quality230
H.264P7CBRlow latency219
H.264P7VBRhigh quality202
HEVCP1CBRlow latency860
HEVCP1VBRhigh quality850
HEVCP3CBRlow latency402
HEVCP3VBRhigh quality579
HEVCP5CBRlow latency279
HEVCP5VBRhigh quality336
HEVCP7CBRlow latency279
HEVCP7VBRhigh quality148

The SDK 13.0 table has no Jetson Thor AV1 encode performance row. It also has no P2, P4, or P6 row. Never interpolate or substitute a neighboring preset.

Decode rows apply exactly to 1920x1080 YUV 4:2:0:

Codec/profileFPS
H.2641434
VP9 8-bit1019
VP9 10-bit1016
HEVC Main 8-bit1293
HEVC Main101130
AV1794

Do not scale a row across chroma, bit depth, codec, preset, rate control, or tuning. Scale resolution only with the separately labeled pixel-area heuristic below. Keep the published rows per engine; the aggregate-planning rule below governs any all-engines total. The table does not measure native-versus-PyNvVideoCodec wrapper overhead or prove simultaneous-stream capacity.

Select the target clock

Use a positive configured maximum video clock, not an instantaneous idle clock:

  1. Prefer a finite Max Video value from the target's authenticated nvidia-smi -q -d CLOCK output. Bind it to the selected GPU identity.

  2. If that field is unavailable on Jetson, accept an exact user- or CI-supplied configured maximum clock and label it user_supplied, or use nvpmodel -q --verbose only when its current power-mode output explicitly labels PARAM VIDEO, its MAX_FREQ path, and the configured value. Record the command, power mode, path, value, and Hz-to-MHz conversion. Run that exact read-only query as a standalone command; do not embed nvpmodel in a command substitution or a compound device-summary command, and never pass a non-query option.

  3. If no configured maximum is available, report only the unscaled documented row and formula with target_clock_unavailable. Do not guess.

Keep a current Video clock only as a volatile diagnostic. Never use an idle reading or an instantaneous NVENC*_FREQ/NVDEC*_FREQ sample as the numerator for an achievable-FPS estimate.

Calculate clock scaling

The SDK 13.0 NVDEC note states that the Jetson Thor rows were measured at a 1691 MHz highest video clock and that performance scales almost linearly with video clock. For an exact row:

clock_ratio = target_configured_max_video_clock_mhz / 1691
scaled_fps = documented_fps * clock_ratio

Require a positive target clock. Treat a configured maximum reported within 1 MHz of 1691 MHz as the same reference operating point because integer-MHz reporting can round it to 1690, 1691, or 1692 MHz. Preserve the raw reported clock, normalize the calculation to 1691 MHz (clock_ratio = 1.0), and label the normalization. If the target clock is above 1692 MHz, report the reference row and decline extrapolation beyond the documented point. Preserve full precision for the calculation and round only the displayed FPS.

The NVENC note instructs clock scaling but omits the numeric Thor reference clock. Applying the companion NVDEC note's 1691 MHz value to an encode row is a cross_note_inference, not direct NVENC table metadata. The Jetson Linux R39.2 power guide supports the shared-domain premise by grouping NVDEC, NVENC, OFA, and NVJPG in one maximum-frequency row and listing 1557 MHz for the T5000 120 W mode. That guide's 1692 MHz MAXN entry does not replace the performance table's explicit 1691 MHz reference denominator. Disclose the inference. If the user does not accept it, leave encode FPS unscaled.

Scale to any requested resolution

When an exact 1080p source row and a valid target clock are available, estimate another positive width and height with:

pixel_ratio = (1920 * 1080) / (requested_width * requested_height)
estimated_fps = documented_1080p_fps * clock_ratio * pixel_ratio

For 3840x2160, pixel_ratio is 1/4. For example, the HEVC P3 VBR high-quality row at a 1557 MHz configured maximum video clock gives:

579 * (1557 / 1691) * (1920 * 1080) / (3840 * 2160) = 133.28 FPS

This inverse-pixel-area relationship is a derived_pixel_rate_heuristic; the SDK 13.0 notes document the 1080p rows and clock scaling, not resolution scaling. Treat it as a rough, potentially optimistic planning value. It ignores per-frame fixed cost, memory and copy bandwidth, codec level and reference buffer constraints, surface overhead, multi-stream scheduling, power and thermal throttling, and contention from capture, ISP, CUDA, AI, display, or transport. Preserve full precision until display rounding.

Use evidence_class: documented_clock_resolution_scaled_estimate, measurement_performed: false, and resolution_scaling_documented: false. Record the reference and requested dimensions, pixel ratio, clock ratio, full formula, and both the encode cross_note_inference and derived_pixel_rate_heuristic when applicable. Never call the result measured, verified, guaranteed, or operational capacity.

Convert an estimate to a theoretical stream budget

Only answer a no-media “how many streams” question as a theoretical codec-stage planning bound. For one configuration with a known per-stream frame rate:

usable_fps = estimated_fps * safety_margin
theoretical_stream_count = floor(usable_fps / stream_fps)

Use a read-only calculator, such as Python, for every documented FPS and stream count calculation; do not perform the arithmetic mentally. Preserve full precision through floor. For every reported maximum count, verify both bounds before publishing it:

count * stream_fps <= usable_fps
(count + 1) * stream_fps > usable_fps

For a resolution-scaled row, also recompute the exact reference-to-requested pixel ratio used by that row. Reject or correct any table entry that fails one of these checks.

Require 0 < safety_margin <= 1. If the user does not provide one, use 0.9 only as a disclosed planning default. If per-stream FPS is absent, there is no unique stream count: report the estimated FPS and formula, optionally show clearly labeled 30-fps and 60-fps scenarios, and ask for the intended FPS.

For mixed resolutions or configurations, never assign the full engine budget to every group independently. Calculate each group's estimate from its own exact documented row and use fractional load:

group_load_i = stream_count_i * stream_fps_i / estimated_fps_i
total_encode_load = sum(encode group loads)
total_decode_load = sum(decode group loads)

Each resource pool is feasible only when its total load is no greater than the chosen safety margin. Keep NVENC and NVDEC pools separate. For groups sharing one row, this is equivalent to a shared 1080p-pixel-rate budget. Report the remaining headroom and the complete mix equation rather than independently overcommitting each resolution.

Use evidence_class: documented_theoretical_capacity_estimate, retain the underlying FPS evidence class, and set measurement_performed: false and capacity_verified: false. Call it codec-stream capacity, not physical camera connectivity or end-to-end pipeline capacity. Report capacity per engine, including generic stream or camera questions about how many a device can connect or handle. Multiply across engines only when the user explicitly asks for an all-engines or whole-device total; take that count from a live target interface that enumerates the engines themselves, and label it theoretical_multi_session_engine_budget. A SKU-matched documented specification supplies device identity evidence; keep its capacity row per engine.

Every clock-scaled FPS basis must include:

  • evidence_class: documented_clock_scaled_estimate for an exact 1080p result, or documented_clock_resolution_scaled_estimate when the pixel-area heuristic is applied;

  • measurement_performed: false;

  • source title, SDK version, URL, exact row, and table conditions;

  • source and target software versions when known, including any difference;

  • documented FPS, 1691 MHz reference clock, target clock and provenance, clock ratio, formula, and scaled FPS;

  • the encode cross_note_inference when applicable;

  • no warmup, repetitions, measured minimum/mean/maximum, or achieved-FPS claim;

  • a warning that content, controls, power, thermals, software, and concurrency can change real throughput; and

  • the exact next action: supply representative media and run the authenticated benchmark workflow for a measured result.

A non-1080p or theoretical-capacity answer must additionally include every field and caveat required by the two sections above. Every estimate answer must end by requesting representative user content for a real benchmark; for capacity, also request the intended codec direction, per-stream FPS, and stream mix if any was defaulted or omitted.

When the exact row exists but no configured maximum clock is available, return only evidence_class: documented_reference_value with measurement_performed: false, the source row and conditions, and target_clock_unavailable. Do not emit clock_ratio, scaled_fps, or call it a platform estimate. When no exact row exists, return documentation_estimate_unavailable instead.

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