Jetson Video Benchmark
NVIDIAOfficialCreated by Vinit BansalDistributed by NVIDIA
- Skill
- Workflow
- Software development
- Apache-2.0
- Medium risk
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
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/nvidia/jetson-video-benchmark/downloadUnzip 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
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.
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.
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_requiredand 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.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
Follow that same reference for sample allowlists, builds, direct argument lists, frame accounting, option checks, marker grammar, comparisons, and worker sweeps.
Show the dry-run plan, then use a fresh mode-0700 workspace. Authenticate each launcher immediately before use and launch its literal argument list.
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.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, andfailed; do not promote a peer's success.
Files
- ATTRIBUTION.mdAdded by AutoGineer930 B
- BENCHMARK.md7.8 KiB
- LICENSELicence file added by AutoGineer11.2 KiB
- SKILL.md6.4 KiB
- evals/evals.json6.2 KiB
- references/benchmark-output-contract.md3.6 KiB
- references/benchmark-workflow.md10.1 KiB
- references/documented-performance-estimates.md12.3 KiB
- skill-card.md4.9 KiB
- skill.oms.sig5.2 KiB
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:
| Codec | Preset | Rate control | Tuning | FPS |
|---|---|---|---|---|
| H.264 | P1 | CBR | low latency | 724 |
| H.264 | P1 | VBR | high quality | 713 |
| H.264 | P3 | CBR | low latency | 529 |
| H.264 | P3 | VBR | high quality | 527 |
| H.264 | P5 | CBR | low latency | 236 |
| H.264 | P5 | VBR | high quality | 230 |
| H.264 | P7 | CBR | low latency | 219 |
| H.264 | P7 | VBR | high quality | 202 |
| HEVC | P1 | CBR | low latency | 860 |
| HEVC | P1 | VBR | high quality | 850 |
| HEVC | P3 | CBR | low latency | 402 |
| HEVC | P3 | VBR | high quality | 579 |
| HEVC | P5 | CBR | low latency | 279 |
| HEVC | P5 | VBR | high quality | 336 |
| HEVC | P7 | CBR | low latency | 279 |
| HEVC | P7 | VBR | high quality | 148 |
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/profile | FPS |
|---|---|
| H.264 | 1434 |
| VP9 8-bit | 1019 |
| VP9 10-bit | 1016 |
| HEVC Main 8-bit | 1293 |
| HEVC Main10 | 1130 |
| AV1 | 794 |
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:
Prefer a finite
Max Videovalue from the target's authenticatednvidia-smi -q -d CLOCKoutput. Bind it to the selected GPU identity.If that field is unavailable on Jetson, accept an exact user- or CI-supplied configured maximum clock and label it
user_supplied, or usenvpmodel -q --verboseonly when its current power-mode output explicitly labelsPARAM VIDEO, itsMAX_FREQpath, 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 embednvpmodelin a command substitution or a compound device-summary command, and never pass a non-query option.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_ratioRequire 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_ratioFor 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 FPSThis 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_fpsFor 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_estimatefor an exact 1080p result, ordocumented_clock_resolution_scaled_estimatewhen 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_inferencewhen 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