jetson-video-capability · diff
git:20260817.d36ff70 to git:20260925.9bb5a39
112 added, 293 removed. Audit A to A.
---
name: jetson-video-capability
license: "Apache-2.0"
description: >-
- Use when Jetson codec, profile, chroma, bit-depth, dimension, engine-count, or
- operational support must be reconciled using live SDK APIs, authenticated
- NVIDIA samples, and NVIDIA documentation. Also use for Jetson questions about
- Netflix, Widevine, or other DRM-protected streaming-service playback to apply
- the codec-scope boundary.
+ Use when Jetson codec, profile, chroma, bit-depth, dimension, engine-count,
+ or operational support must be reconciled from live APIs, authenticated
+ NVIDIA samples, and NVIDIA documentation; also applies the content-DRM scope.
metadata:
author: "Vinit Bansal <vinitkumarb@nvidia.com>"
tags: [jetson, video-codec-sdk, pynvvideocodec, nvenc, nvdec, capability]
- languages: [python]
+ languages: [markdown]
data-classification: public
---
# Jetson Video Capability
- ## Purpose
-
- Answer Video Codec SDK and PyNvVideoCodec support questions without confusing an
- API response, a successful operation, and product documentation. Query the live
- target first, retain exact operation evidence separately, and publish the final
- product-support verdict from applicable NVIDIA documentation.
-
- ## Prerequisites
-
- - Fresh evidence from `jetson-video-setup` is an optional authority, not a
- prerequisite. When it is supplied, authenticate and use it exactly. When it
- is absent, this skill authenticates only the selected installed surface:
- package-owned native sources and requested report targets, or the exact
- invoking PyNvVideoCodec interpreter and wheel. It never installs, repairs,
- scans for a venv, or imports setup code. A fresh environment artifact that
- the agent obtains from setup's public read-only probe counts as supplied
- evidence; it need not originate in the customer's prompt.
- - Run live queries on the target Jetson with direct GPU access. Do not claim
- current availability from an x86 host or a result copied from another target.
- - If selected-surface prerequisites are missing, stop without mutation and
- route that surface to `jetson-video-setup`. If that skill is not installed,
- tell the user to install it. Never infer codec or product support from a
- missing Python import or native build prerequisite.
- - Keep the installed native and Python surfaces independent. Query only the
- requested surface unless the user explicitly selects `both`.
- - Query execution requires this capability skill plus either valid supplied
- setup evidence or the selected local prerequisites described below. An exact
- operation check also requires
- `jetson-video-recipe`, which owns recipe resolution, and
- `jetson-video-pipeline`, which owns authenticated
- encode-to-independent-decode execution.
- - Before a bounded operation check, when setup is installed read its shared
- [video content policy](../jetson-video-setup/references/video-content.md).
- Query-only work is media-free; only the documented setup fixture is allowed
- for the capability-smoke exception. Setup is not required solely for this
- policy: without it, require one exact user-selected path or URL for any other
- operation, never substitute catalog or synthetic media, and preserve source
- URL, license, attribution, path, size, and SHA-256.
-
- Resolve this skill from the installed skills root and set `CAPABILITY_SKILL` to
- its canonical absolute path. Invoke each owning script directly under isolated
- Python:
-
- ```bash
- python3 -I "$CAPABILITY_SKILL/scripts/query_native_sample_reports.py" --help
- python3 -I "$CAPABILITY_SKILL/scripts/query_encoder_caps.py" --help
- python3 -I "$CAPABILITY_SKILL/scripts/query_decoder_caps.py" --help
- python3 -I "$CAPABILITY_SKILL/scripts/validate_appenc_av1_ivf.py" --help
- ```
-
- If an owning script is missing, stop with `dependency_required`. A setup
- artifact is optional; a supplied one is never optional to validate. Do not copy
- modules from another skill or add a fallback import path.
-
- ## Compose requested sibling stages
-
- Capability queries and documentation reconciliation require no sibling when
- the selected SDK prerequisites already exist. Use `jetson-video-setup` for
- installation, repair, or one read-only readiness handoff when registered
- PyNvVideoCodec authority is required; use `jetson-video-recipe` plus
- `jetson-video-pipeline` for an exact requested operation, and
- `jetson-video-benchmark` for requested throughput. Check the agent's installed
- skill catalog before each such 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 every completed query result 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 a sibling for an unrequested or
- optional refinement.
-
- ## Instructions
-
- 1. **Classify the request first, before any target probe, capability query, or
- other workflow step.** For a request solely for objective quality
- metrics, including PSNR or SSIM, state only that this 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.
- For a request solely about Netflix, Widevine, or other DRM-protected
- streaming-service playback, state only that this skill covers hardware
- encode/decode of user-supplied non-DRM bitstreams and does not cover,
- enable, or verify streaming-service or content-DRM playback. Do not claim
- whether the service will work; do not describe Jetson content-DRM
- certification; do not recommend or offer to install a browser, a content-DRM
- module (Widevine, PlayReady), a playback tool, a workaround, or a bypass; do
- not probe the target or launch an operation. NVDEC decode of supported
- user-supplied non-DRM bitstreams stays fully in scope for this skill and is
- never discouraged by this boundary, so you may say so. Then stop. A mixed
- request that also asks an in-scope codec question is not refused wholesale:
- answer the in-scope part normally and apply this boundary only to the
- streaming-service part.
- An unqualified “DRM” does not by itself mean content protection: on Jetson it
- commonly means the Linux Direct Rendering Manager (DRM/KMS, `/dev/dri`,
- modesetting, display connectors), which this boundary does not cover. Apply
- this boundary only when the request identifies Netflix, Widevine, PlayReady,
- streaming-service protection, or otherwise clearly means content Digital
- Rights Management; if the request says only “DRM” and the context does not
- resolve which is meant, ask the user which before answering. A local
- DRM-free MP4 shown on a display is likewise not a content-DRM request, and
- its codec portion stays in scope.
- Otherwise handle capability discovery, exact support questions, and
- interpretation of saved capability evidence. Route package installation to
- `jetson-video-setup`, recipe construction to `jetson-video-recipe`,
- throughput measurement to `jetson-video-benchmark`, and multi-stage media
- work to `jetson-video-pipeline`. Within a capability request, a genuinely
- bare “video SDK” phrase with no product qualifier is ambiguous: ask whether
- the customer means native Video Codec SDK, PyNvVideoCodec, or both, then
- stop before probing either surface. Report-only intent or “probe the target”
- does not authorize `--runtime both`.
- A capability support/catalog request that names no SDK surface or product
- phrase uses native-preferred fallback selection, whether it is broad, exact,
- or a bounded subset. Select native when its route is eligible. Only when
- native is ineligible, evaluate the PyNvVideoCodec candidate in the authority
- order defined in step 3; select Py when that candidate is eligible. Do not
- ask the user to choose merely because this fallback was used. When native is
- selected, do not evaluate Py; if the response displays that unselected peer,
- report it as `not_evaluated` with reason `surface_not_selected`. If neither
- route is eligible, preserve both typed reasons and provide the applicable
- setup remediation. Serialize a successful fallback as an explicit `native`
- or `pynvc` request before applying the shared routing truth table. Carry that
- resolved surface explicitly into any authorized downstream operation so the
- operation controller does not reclassify it as `auto`. This capability-only
- unnamed policy is not `auto`: only
- explicit “auto”, “whichever”, “best available”, “choose for me”, or
- equivalent wording that expressly delegates the SDK choice is genuine
- `auto`; it is never `both`. Naming Python or PyNvVideoCodec is explicit
- `pynvc`. Naming Video Codec SDK, `native`, `AppEncCuda`, or `AppDec` is
- explicit `native` and never falls back.
- 2. **Apply the authorization gate.** A discovery or report-only request is
- query-only. Query and reconcile documentation before deciding whether an
- operation is useful. A directly applicable documentation `No` is the final
- product verdict and ends the normal support/availability check without a
- codec operation; a request to “check live availability” or “operational
- support” does not by itself require an experiment that cannot change that
- verdict. Preserve conflicting raw inventory as diagnostic evidence. Run a
- bounded matching official operation only when documentation is supported or
- unknown and live availability is requested, or when the user separately
- and explicitly requests a diagnostic experiment despite the unsupported
- product verdict. Such an experiment never promotes product support. No
- package, repository, signing-key, or credential change is authorized. If an
- otherwise required operation controller is unavailable, report `not_tested`
- and the required next action rather than inventing live availability.
- 3. **Authenticate only the selected surface.** Use matching fresh setup
- evidence when the caller or the agent supplied it. A malformed, stale, or
- mismatched supplied artifact fails closed and never falls back. For an
- explicit `pynvc` or `both` request, a genuine `auto` candidate gate, or the
- unnamed fallback after native is ineligible, with neither setup evidence nor
- an exact interpreter, check the installed skill catalog. When
- `jetson-video-setup` is present, invoke its public read-only
- `probe_nvcodec.py` with `--runtime pynvc` for explicit `pynvc` or the unnamed
- fallback, or `--runtime both` for `both`/`auto`, and a fresh `--output`;
- never pass `--setup-candidate`. Inspect the fresh output before using it. A Py
- candidate is eligible only when the artifact has `mode=live`, the requested
- GPU, `pynvc.installed=true`, and `pynvc.identity.status=verified`. If
- routing selects Py, invoke this skill's Py query only under the artifact's
- lexical `pynvc.identity.interpreter` with `-I` and pass the raw artifact
- path through `--environment`.
- If setup is absent, use reason `setup_probe_unavailable`; if it reports an
- absent, stale, unreadable, invalid-binding, or launch-failure result,
- preserve that exact typed reason.
- For explicit `pynvc`/`both`, ask for the exact canonical absolute
- interpreter. For `auto`, report PyNvVideoCodec as `not_evaluated` with that
- reason and continue only an eligible native branch. For the unnamed
- fallback, preserve the typed Py reason beside the ineligible native reason
- and provide setup remediation; never silently return a native-only
- unavailable result while a healthy registered Py candidate exists. Never
- scan or guess.
- Otherwise use this skill's local query path: a fresh explicit native build
- workspace, or the exact PyNvVideoCodec interpreter invoking the query under
- `-I`.
- Missing prerequisites are `unknown`/`not_ready`; route them to setup and, if
- setup is absent, instruct its installation.
- 4. **Run the selected capability route.** Before invoking it, read the matching
- command and authentication contract in
- [native official-sample reports](references/capability-queries.md#native-official-sample-reports),
- [encoder API query](references/capability-queries.md#encoder-api-query), or
- [decoder API query](references/capability-queries.md#decoder-api-query).
- Native uses a supplied verification or a fresh explicit report workspace;
- Py uses the validated lexical interpreter and includes `--environment` when
- setup evidence was supplied. Default encoder scope is H.264, HEVC, and AV1.
- An unconstrained explicit Py decoder-catalog request, or a broad unnamed
- decoder-catalog request whose fallback selects Py, uses the complete
- 120-tuple matrix. A bounded subset queries only the named codec families.
- Keep an unnamed fallback answer at the requested family-summary scope; do
- not dump tuple-level claims unless the user requested them. For `both`, run
- the branches independently. Preserve every result as raw report/API
- evidence; never promote it to product support or operation proof. A failed
- or unavailable live branch never suppresses the documentation answer.
- 5. **Cross-check NVIDIA documentation before deciding whether to run an
- operation.** Follow the complete
- [documentation cross-check](references/capability-queries.md#documentation-cross-check)
- and read the
- [versioned R39.2/SDK 13.0 Thor baseline](references/capability-queries.md#versioned-r392sdk-130-thor-baseline)
- before transcribing a dynamic table. Record URLs, retrieval date, literal
- live identity, exact field label, and the exact row or complete candidate
- set. Never infer a cell from flattened or ordinal table text. Use only the
- version-matched SDK 13.0 note for this release; a field it does not establish
- remains `unknown`.
- 6. **Run the smallest matching official operation only when steps 2 and 5
- require it.** Resolve and validate one exact minimal recipe with
- `jetson-video-recipe`, then hand its sealed recipe, environment, and input
- identities to the pipeline-owned controller. Set `PIPELINE_SKILL` to that
- installed skill's canonical path:
-
- ```bash
- python3 -I "$PIPELINE_SKILL/scripts/encode_controller.py" \
- --request "$OPERATION_REQUEST" --workspace "$FRESH_WORKSPACE" \
- --output "$OPERATION_RESULT"
- ```
-
- A bounded capability smoke operation may use the setup workflow's documented
- deterministic one-frame raw fixture; it is never representative media and
- cannot support performance, quality, or pipeline claims. For encode,
- operation proof requires the independent authenticated decoder to consume
- the exact output path and SHA-256 and produce the exact decoded frame count.
- An API response, exit zero, encode marker, or output file alone is
- insufficient. If `jetson-video-recipe` or `jetson-video-pipeline` is absent,
- report `not_tested` and name every missing dependency as the next action.
- AV1 IVF structure may be checked with:
-
- ```bash
- python3 -I "$CAPABILITY_SKILL/scripts/validate_appenc_av1_ivf.py" \
- --input "$BITSTREAM" --width "$WIDTH" --height "$HEIGHT" \
- --expected-frames "$FRAMES" --output "$IVF_REPORT"
- ```
+ Keep three authorities separate:
- `structure_verified` proves container structure only; it never establishes
- `operation_verified`.
- 7. **Publish the reconciled result.** Keep these signals separate:
+ - API query: raw fields, never operation or product-support proof.
+ - Authenticated NVIDIA sample: report or exact operation evidence.
+ - Applicable NVIDIA documentation: product-support verdict.
- - `caps_query`: raw Py API fields and status;
- - `official_sample_report`: raw native `-ec`/`-dc` inventory, never an API
- or operation verdict;
- - `operation_evidence`: `operation_verified`, `operation_failed`, or
- `not_tested`;
- - `documentation_crosscheck`: the product-support authority.
+ ## Scope gates
- Publish customer-facing support from `documentation_crosscheck`, and report
- live availability only from a successful exact operation. A directly
- applicable documentation `No`, including unanimous authenticated candidate
- rows when exact row identity is unresolved, is the final `unsupported`
- verdict even if the API advertises fields or an operation succeeds.
- 8. **Enumerate ambiguous product rows completely.** When one live identity maps
- to several authenticated documentation candidates, list every authenticated
- candidate row by its documentation label and exact queried value and state
- the candidate count. A subset cannot establish consensus. If candidate
- values disagree, keep the documentation verdict `unknown`; never choose a
- nearby product row. Never shrink the candidate set using live API fields
- such as engine count, dimensions, or format flags; GUID enumeration; an
- operation outcome; performance; or similarity to a marketing specification.
- Those are evidence being reconciled, not independent product identity. For
- a generic `NVIDIA Jetson Thor Developer Kit` / `NVIDIA Thor` identity, the
- word `Jetson` alone is not an authenticated row discriminator: unless an
- NVIDIA one-to-one product mapping narrows it, include every Thor row in the
- combined Jetson/IGX table. Apply this rule to any queried field, not only one
- codec.
+ - For a request solely for PSNR, SSIM, or other objective quality metrics, say
+ this skill does not provide them and a separately authorized quality workflow
+ is required; do nothing else.
+ - For Netflix, Widevine, PlayReady, or clearly content-protected streaming,
+ state only that this skill covers hardware encode/decode of user-supplied
+ non-DRM bitstreams, not content-DRM playback. Do not claim whether the
+ service works, describe Jetson certification, CDM, or secure-playback
+ requirements, or recommend a browser, DRM module, workaround, or bypass;
+ then stop. An unqualified “DRM” may mean Linux DRM/KMS; ask which meaning if
+ context does not resolve it.
+ - A bare “video SDK” is ambiguous: ask native Video Codec SDK,
+ PyNvVideoCodec, or both before probing. An otherwise unqualified capability
+ request uses the native-preferred fallback in
+ [surface-selection-contract.md](references/surface-selection-contract.md).
- Read [capability-queries.md](references/capability-queries.md) for exact evidence
- semantics and [surface-selection-contract.md](references/surface-selection-contract.md)
- for `native`, `pynvc`, `auto`, and `both` behavior.
+ ## Read-only discovery
- ## Available Scripts
+ Capability work depends on `jetson-video-setup` for a fresh, read-only
+ installation check. Invoke that skill through public dispatch and consume its
+ reported exact native package/Samples root or exact PyNvVideoCodec interpreter,
+ version, and loaded module path. Do not locate or import setup's files. A
+ missing or mismatched surface is `unknown`/`not_ready`, never codec unsupported;
+ route repair to setup without mutating anything here.
- The four owning scripts are listed in the prerequisite help commands above.
- Invoke them directly, and read
- [capability-queries.md](references/capability-queries.md) for route-specific
- purposes, arguments, and contracts.
+ Engine capability queries belong here, not in setup. For PyNvVideoCodec, use
+ the exact selected interpreter to call the public `GetEncoderCaps` and
+ `GetDecoderCaps` APIs as described in
+ [capability-queries.md](references/capability-queries.md). A broad encoder
+ catalog covers H.264, HEVC, and AV1; a broad decoder catalog covers all ten
+ families across four chroma formats and three bit depths (120 exact tuples).
+ A bounded request queries only named members of the applicable catalog set.
+ Preserve every scoped record, error, and GPU ordinal. Nonzero-GPU helper results
+ remain unknown when the public helper selects only GPU 0.
- ## Published artifacts
+ For native reports, reuse authenticated package-owned binaries or build only
+ the required report target in a fresh user-owned tree, then run
+ `AppEncCuda -ec` and/or `AppDec -dc` using the build, identity, and grammar
+ rules in the capability reference. A query-only request does not authorize
+ package installation or an encode/decode operation. If the package, source,
+ tool, interpreter, or runtime-library identity cannot be established, report
+ the result `unknown` and name the missing setup prerequisite.
- Capability artifacts are optional refinements; authenticated schema-1.2
- `nvcodec-environment` capabilities remain sufficient for sibling workflows.
- Read [capability-queries.md](references/capability-queries.md) for their exact
- contracts. Never promote sample/API evidence to support or operation proof.
+ ## Decision flow
- ## Troubleshooting
+ 1. Classify scope and selected surface before any probe.
+ 2. Query only the selected surface. Preserve raw records, errors, exact GPU,
+ release, interpreter/binary identities, argv, and evidence classification.
+ 3. Resolve the most exact live product identity using the device-tree paths and
+ NUL handling in
+ [capability-queries.md](references/capability-queries.md#documentation-reconciliation),
+ then cross-check it against NVIDIA's current
+ [Video Encode and Decode Support Matrix](https://developer.nvidia.com/video-encode-decode-support-matrix)
+ and the release-matched SDK 13.0
+ [NVENC](https://docs.nvidia.com/video-technologies/video-codec-sdk/13.0/nvenc-application-note/index.html)
+ or [NVDEC](https://docs.nvidia.com/video-technologies/video-codec-sdk/13.0/nvdec-application-note/index.html)
+ application note. Never infer SKU from memory, engine count, capability
+ fields, or operation behavior. Preserve source URL, retrieval date, table
+ title, exact row/column labels, and cell value, using that reference's manual
+ capture record.
+ Generic family identity stays non-exact; use candidate-row consensus only
+ when every authenticated candidate agrees.
+ 4. Report documentation `No` as the final unsupported product verdict even if
+ an API or diagnostic operation is positive; this ends the normal
+ availability check. Documentation `Yes` establishes documented support;
+ live availability additionally needs the matching authenticated operation.
+ Missing, unretrievable, or conflicting documentation remains unknown.
+ When documentation is unknown, do not present positive capability fields as
+ available options: label each affected codec `unknown` beside them and state
+ the retrieval failure with the verdict.
+ 5. For a PyNvVideoCodec encode-availability operation, request setup's
+ `full-samples` profile and carry its exact interpreter into the recipe and
+ pipeline stages. Do not select the smaller decode-performance/smoke profile.
+ 6. Run an exact operation only when the user requests live availability and
+ documentation is positive or unknown, or explicitly requests a diagnostic
+ despite a negative verdict. A diagnostic under documentation `No` reports
+ only `operation_verified` or `operation_failed` for that exact tuple and
+ never changes the unsupported product verdict. A tuple is the exact surface,
+ GPU, codec, profile, chroma, bit depth, dimensions, input format, and control
+ set tested. Resolve one recipe with `jetson-video-recipe`, then use
+ `jetson-video-pipeline` for encode followed by independent decode of the
+ exact output identity. A failed tuple never generalizes to the product.
- - Preserve `capability_reported`, `operation_verified`, `operation_failed`,
- raw API `unsupported`, and `unknown` as distinct internal states.
- - Treat missing query authority, failed registry authentication, absent API
- fields, nonzero-GPU PyNv queries, and unavailable exact operations as
- `unknown` or `not_tested` with a concrete next action.
- - Report a launched exact operation failure as `operation_failed`, not global
- product unsupported. A native `-ec`/`-dc` report failure remains raw
- `unknown`.
- - Retry at most once and only after an evidenced condition changes. Use a fresh
- work directory and output path for the retry.
+ ## Evidence rules
- ## Limitations
+ - `GetEncoderCaps` success is `capability_reported`, `supported=null`,
+ `operation_status=not_tested`.
+ - `GetDecoderCaps` `bIsSupported=1/0` records raw API true/false and whether
+ returned limits apply; neither value is the documentation verdict.
+ - Missing enums, calls, fields, prerequisites, or nonzero-GPU authority are
+ unknown, not unsupported.
+ - Native `-ec/-dc` text is `official_sample_report`; preserve raw values and
+ never rewrite them as API or product claims.
+ - When reporting Main10 support, note that NVENC can convert verified 8-bit
+ input internally and that P010 is the exact no-input-bit-depth-conversion
+ path; a live claim still requires an authenticated 10-bit operation.
+ - AV1 output is operation evidence only after the pipeline's package-owned
+ decoder consumes the exact artifact and reports the expected frame count.
+ - For a VP9 encode question, report only that VP9 remains a decoder family and
+ no released NVENC route exists. Do not add a generic list of other encoders
+ or offer a diagnostic encode operation.
+ - Presets, tuning, package presence, throughput, and successful concurrent
+ streams do not establish codec support or NVENC/NVDEC engine count.
+ - Codec/API capability, NVENC/NVDEC availability, and successful bounded
+ operations do not establish DMA-BUF, NvSciBuf, CUDA-memory sharing, zero
+ copy, or cross-stage synchronization compatibility.
- - PyNvVideoCodec 2.1 encoder and decoder capability helpers select GPU 0;
- nonzero-GPU results remain unknown.
- - Capability fields do not measure throughput, quality, latency, camera count,
- or successful concurrent sessions.
- - Objective quality measurement, including PSNR and SSIM, is outside this
- skill.
- - Results apply to the exact target, software versions, GPU, codec tuple, and
- operation that produced the evidence.
+ For a Python API query, create a short task-local program from this Markdown
+ and the installed public SDK, run it with the exact selected interpreter, and
+ keep its raw output with the result. Installation belongs to setup and
+ operation validation belongs to pipeline. This skill owns engine queries,
+ classification, documentation reconciliation, and the compact direct report
+ above.