npx skills add ...
npx skills add nvidia/skills --skill jetson-video-benchmark
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 documented clock-scaled or clock-and-resolution-scaled planning estimate when representative content is unavailable. Also use for Jetson video requests asking only for PSNR or SSIM results, to apply this performance skill's scope-only response.
npx skills add nvidia/skills --skill jetson-video-benchmark
Measure codec-stage FPS and megapixels/second on the current Jetson. Use this skill for encode or decode throughput, P4/P5 comparisons, native-versus-Python comparisons, and increasing-worker capacity tests. When content is unavailable, it can instead produce a clearly labeled SDK-documentation estimate for an exact supported 1080p table row and target maximum video clock. For another requested resolution, it may additionally apply the bounded pixel-area heuristic defined in the estimate reference. Never present either estimate as a target measurement.
nvcodec-environment identity from jetson-video-setup is optional; when
supplied, it is authoritative and any invalid or stale identity fails
without local fallback. The agent may obtain that identity from setup's
public read-only probe; it need not be present in the customer's prompt.nvidia-video-codec-sdk APT package and its package-owned official sample
sources. PyNvVideoCodec routes require an authenticated setup environment
or the caller's exact absolute pynvc_interpreter; never scan for a venv.
Before asking the customer for that path, invoke setup's public probe when
that skill is installed and inspect its typed result. These read-only
checks install, repair, register, and smoke-test nothing. Only when neither
authority is usable does an explicit pynvc or both request return
input_required; local auto records PyNvVideoCodec as not_evaluated
and may continue an eligible native branch.pynvc-smoke environment. A Python encode or compare route uses official
samples that import Torch and therefore requires a separately provisioned
full-samples venv; never upgrade the smoke venv in place.jetson-video-recipe and an exact portable identity for one of its
validated schema-2 recipes. If its public validator is absent, preserve
dependency_required and its install-and-retry action. Decode routes do
not require the recipe skill.target_clock_unavailable, not a platform-scaled
estimate.Documentation-only estimates and recipe-free live decode do not require a
sibling skill. Live encode, compare, and encode-capacity routes require
jetson-video-recipe; SDK installation, repair, a new full-samples Python
environment, or one read-only handoff when registered Python authority is
required belongs to jetson-video-setup. Check the agent's installed skill catalog
before either stage. If the sibling is present, read its SKILL.md and invoke
its documented public entry point; pass artifacts as data and never import
sibling code. If it is absent, preserve completed input and measurement
evidence and say, using the actual names: I can run <stage>, but it requires <skill>, which is not installed. Install <skill> and retry this stage. Never
require setup when the caller already supplied authenticated setup evidence or
an exact interpreter that passes local authentication, or a recipe for a
decode-only or documentation-only request.
Apply the scope boundary first. For a request solely for objective quality metrics, including PSNR or SSIM, state only that this performance skill does not provide them and that a separately authorized quality workflow is required, then stop. Do not name or recommend an external tool, and do not offer to configure or run the comparison; do not request media, probe, install anything, or launch an operation.
Classify an in-scope request as a live encode, decode, compare, or
camera_capacity measurement, or as a documented_estimate answer.
Resolve camera data direction before selecting an encode or decode row.
Quality, preset, bitrate, rate-control, recording, or requested codec-output
wording is an encode cue; lead with NVENC and mention decode only as the
conditional case where cameras already emit the named compressed codec.
IP/RTSP input, already-encoded input, ingest, playback, or explicit decode
wording is a decode cue. Explicit transcoding or decode-then-encode uses
separate NVDEC and NVENC budgets. When no direction cue exists, present the
encode and decode interpretations conditionally and ask which applies; never
silently choose one.
When media is absent:
input_required gate and stop before probing, retrieval, authentication,
workspace creation, dry run, or launch.
Ask only for the missing media identity at this gate; do not also request
an interpreter, environment, recipe, or other later-stage field.When local media is supplied, validate and hash that exact selected input. For URL input, preserve the exact user-supplied URL and retrieve it only after the target, authorization, and runtime-authority gates; then validate and hash the retrieved bytes. Preserve source URL (or null for local media), license, and attribution. Use the live measurement path, not a documentation estimate.
Preserve the requested surface for live measurements. Treat “whichever”,
“best available”,
“choose for me”, and other unspecified-surface wording as auto, never as
both. Reserve both for an explicit dual-surface comparison. For auto,
zero eligible surfaces block, one runs, and two return
selection_required; never inspect prior results, invent a preferred SDK,
or launch a benchmark to make the missing user choice. With two eligible
surfaces, ask for exactly native, pynvc, or both.
After the media gate, use valid supplied setup evidence or an exact
interpreter first. If PyNvVideoCodec may participate and neither is
supplied, invoke installed jetson-video-setup through its public read-only
probe_nvcodec.py: use --runtime pynvc for explicit Python or --runtime both for both/auto, a fresh --output, and never
--setup-candidate. Inspect the fresh artifact; only a live artifact whose
selected Py surface is installed and whose pynvc.identity.status is
verified is usable authority. Snapshot that exact artifact as the
controller's portable environment identity with exactly
schema_version, kind, canonical absolute path, size_bytes, and
lowercase sha256. If setup is absent or reports any not-ready, unreadable,
stale, binding, or launch failure, request the exact interpreter for
explicit pynvc/both; for local auto, report Python as not_evaluated
and continue only an eligible native surface. Never pass a blocked probe as
authority, scan for a venv, or hide an unevaluated peer.
Run a dry_run first, review every planned argument, then run execute in
a fresh private workspace. Invoke this skill's controller directly:
For native encode, authenticate AppEncPerf, inspect both -h and -A,
and use only advertised options. Never pass -loop. Native decode uses
authenticated AppDecPerf; PyNvVideoCodec uses the wheel-owned performance
samples under either the setup-evidenced interpreter or the exact absolute
pynvc_interpreter selected by the caller.
Retain one whole-process warmup and at least three separate measured
processes per variant and surface. Every measured command phase is
measure.
For a live measurement, list every repetition's FPS and MP/s, then the
mean, minimum, and maximum of both metrics. PyNvVideoCodec decode omits MP/s
because its authenticated performance sample does not report dimensions;
report that reason instead of deriving MP/s from caller metadata. For a
native/Python comparison, disclose exact projection differences and whether
they changed the requested intent. For a live preset comparison, report
only measured throughput differences; do not state or imply a quality,
compression-efficiency, or storage ordering from preset names or
throughput. State that quality was not measured when that distinction
matters. For a documented estimate, report
the source row, clock provenance, requested resolution, formula,
assumptions, and every inference label required by the estimate reference,
plus measurement_performed: false; never invent repetitions or measured
statistics.
Label measured concurrency results as codec-stage capacity bounds. For a
no-media planning question, a resolution-scaled estimate may additionally
produce a documented_theoretical_capacity_estimate when per-stream FPS and
an explicit or clearly defaulted safety margin are available. Keep encode
and decode budgets separate; for mixed workloads, sum each stream's
fractional load against one shared budget instead of granting every
resolution the complete budget. Call the result a theoretical codec-stream
bound, never a verified camera count: it excludes capture, ISP, transport,
AI, display, memory contention, and end-to-end latency. Disclosed 30-fps and
60-fps scenarios may stand in for an unstated frame rate, but they do not
replace the question: the final response must still explicitly ask for every
omitted input it assumed or enumerated, naming the codec direction (encode
captured frames, decode already-compressed streams, or both), exact preset,
per-stream FPS, and stream mix or count. End by asking for exact
representative content and a measured, strictly increasing worker sweep to
verify capacity. Use a read-only calculator for every documented FPS and
stream-count calculation, preserve full precision until the final floor or
display rounding, and apply the reference's two-sided maximum-count check;
never rely on mental arithmetic for a reported capacity.
| Script | Purpose | Arguments |
|---|---|---|
scripts/benchmark_controller.py | Dry-run or execute authenticated encode/decode, comparison, and worker-capacity benchmarks. | --request, --workspace, and --output. |
Inspect the controller's public CLI directly:
input_required, selection_required, blocked, partial, and
failed instead of promoting them to completion.