How the Camera Stream Capacity engine decides what breaks first.
Method version 1.8.0 · Decode dataset 2026-09-07 · Last updated: September 2026
The engine answers one question: for a given Jetson module, camera count, resolution, frame rate, codec and detection model, which pipeline stage runs out first, and how far from the limit is it? This page states every formula, every data table and every source the engine uses, and the rule it applies to label confidence. If a number on a result page cannot be traced back to something on this page, that is a bug.
Contents
- What it computes, and what it does not
- Constraint objects and status thresholds
- Decode stage
- Encode stage
- Inference stage
- Preprocessing stage
- Memory stage
- Network stage
- Host-side budget (accelerator cards and SBC NPUs)
- Camera link budget (IP, MIPI CSI-2, USB, GMSL2)
- Primary bottleneck and headroom ladder
- Evidence classes and the confidence rule
- Data tables and sources
- What invalidates a result
- Method changelog
1. What it computes, and what it does not
The engine evaluates a camera pipeline stage by stage: hardware decode, hardware encode (only when recording re-encodes or restreams), inference, preprocessing, memory and network ingress. Each stage becomes a constraint: a required amount and an available amount in the same unit, a utilization, a status, an evidence class and the sources the available amount came from. The output is the list of constraints, a ranked bottleneck list, stream-capacity landmarks from an integer pipeline sweep (comfortable, maximum modeled fit, first failing count) and per-stage source confidence.
It does not predict throttle temperatures, model accuracy,
end-to-end latency, or anything about the camera itself (lens, sensor, RTSP
stack). It does not model MJPEG decode (NVJPEG) yet. Hailo-8/8L/10H, Google
Coral and RK3588 platforms get a modelled host budget (§9) for decode,
pre/post-processing and the card's interface; every other non-Jetson platform
still falls back to a labelled modelled decode ceiling only. Inference and
memory are estimates from benchmark tables and a memory model, not measurements
of your build. Where the engine has no data it returns UNKNOWN or
UNSUPPORTED rather than a guess.
Inputs (WP-01). A field that is not stated takes its documented default and is listed in provenance.defaulted; a field that is stated but invalid — a count of 0, a negative, a fraction or a non-number, true in place of a count, an unknown value of an enumerated input, or an empty string — is rejected with VALIDATION_ERROR naming the field, never replaced by a default.
Input keys (WP-02). The engine accepts one list of input keys — the inputs documented here and their declared backward-compatible aliases. Unknown input keys are rejected with VALIDATION_ERROR naming the key: an invented or misspelt key is never silently ignored, a __ test hook never reaches the engine, and an alias sent together with the key it stands for is rejected too (the engine would read only one of them). export_json.inputs echoes every input the engine honoured, so replaying it reproduces the result.
Detection above the source rate. A stated detection_fps above source_fps is capped to the source frame rate and the cap is disclosed: an assumption names both figures and requested_workload.detection_fps_cap carries the requested and applied rates. Detection cannot run on more frames than the camera delivers.
2. Constraint objects and status thresholds
Every stage returns the same shape. Utilization is required over available, rounded to four decimals. Each quantitative stage is evaluated by the shared constraint kernel. A stage remains PASS up to and including its capacity limit. Robustness is reported separately as COMFORTABLE, TIGHT or AT_LIMIT according to the shared policy. Above the limit, the stage is FAIL. filling a limit exactly is still a fit with zero headroom, not a failure.
A stage over its limit is a FAIL only when its evidence can prove the miss
(elimination authority): decode and encode against a vendor pixel
rate, a measured inference figure or one scaled down for a larger input, memory whose weights alone exceed the module.
A stage over its limit on planning-only evidence — inference through the multi-stream efficiency curve or a
power-mode factor, the host CPU and preprocessing budgets, a modelled decode ceiling with no source record, the
estimated camera bitrates behind the network stage, the memory overhead estimate — is REQUIRES_VALIDATION with the modelled
shortfall stated, and the result reads INSUFFICIENT EVIDENCE (NEEDS VALIDATION), never NO FIT. VERSION_RISK
is not emitted.
3. Decode stage
Decode starts from the vendor's published codec capacity. Decode is measured in megapixels per second (MP/s) so that any resolution and frame rate can be compared against the vendor's rated throughput. The required side is arithmetic on your inputs; the available side comes from the NVIDIA datasheet row for the module and codec. Exact published operating points keep class A with the vendor source attached; unpublished profiles are modelled (class D) against the published throughput.
Class A path. When your profile is one NVIDIA prints (for example 18 × 1080p30 H.265 on Orin NX), the engine uses that stream count verbatim and converts it to MP/s only so the required and available sides share a unit. Nothing is scaled. The source line under the row names the datasheet, revision and table.
Class D path. For any other profile (1440p, 20 fps, 25 fps, 2688×1520 and so on) the engine compares your pixel rate against the MP/s figure NVIDIA rates the decoder at for that codec. The number is therefore ours, not NVIDIA's, and the row is labelled class D with the assumption spelled out. The pixel-rate path assumes NVDEC throughput is roughly linear in pixel rate between published points, which holds within the published range and is not asserted outside it.
Adjustments. YUV 4:4:4 halves the available figure (datasheet note).
10-bit Main10 uses the same row as 8-bit Main, as the datasheets list them together.
Thor tables are per NVDEC instance; the engine multiplies by the instance count
exactly as the datasheet's "Total Mpix/sec (2x)" column does. Orin tables are
already per module. If the module publishes no row for the codec (for example
hardware AV1 on a module without it) the status is UNSUPPORTED.
Power mode. On the Orin family the NVDEC maximum clock is the same
in every nvpmodel preset, so the power mode does not change decode capacity. This
is a class A statement from NVIDIA staff (forum thread 380328, 17 Aug 2026). On
Thor the NVDEC clock follows the power mode (1.56 GHz at 120 W and 70 W, 1.69 GHz
at MAXN) and the datasheet publishes separate tables per mode, which the engine
selects from the power_mode input.
Non-Jetson platforms. Hailo-8/8L/10H, Coral and RK3588 use the host's own decoder instead of this ceiling — hardware when the host has one for the codec, else software on the host CPU (see §9). Any other non-Jetson platform falls back to EdgeAIStack's modelled host-decode ceilings (class D, LOW confidence): per resolution at 30 fps, derived in the stream-capacity research series.
4. Encode stage
The encode constraint appears only when recording is set to re-encode or restream is enabled. Passthrough recording writes the camera's own bitstream and needs no encoder. The arithmetic mirrors decode: a published NVENC point is class A, a pixel-rate comparison against the rated encoder MP/s is class D. Modules without a hardware encoder for the requested codec fall back to the codec they do publish (H.265, then H.264) and say so.
Jetson Orin Nano has no NVENC. The datasheet states "1080p30 Supported via CPU Cores with Software"; the engine treats that as a total software encode budget of one 1080p30 stream (62.2 MP/s), class A, and warns that re-encoding competes with inference for CPU cores.
5. Inference stage
Required throughput is cameras × detection frame rate, in frames per second. Available throughput starts from a single-stream benchmark for the platform, model family, variant, precision, runtime and detection resolution, found through a fixed lookup hierarchy, then scaled for multi-stream efficiency and the power mode.
The chain the lookup walked is reported in the constraint detail. A class C benchmark that had to be resolution-scaled or power-mode-scaled is downgraded to class D, because the resulting number is no longer the published one. The multi-stream efficiency table and the power-mode multipliers are EdgeAIStack calibrations carried over from the stream-capacity research series; tracking overhead is listed as an assumption and not yet deducted.
Power mode. The inference is computed at the preset the result prints in
resolved_configuration.power_mode: the one requested, else the module's
registry default — the same mode Hardware Match plans at, so this engine called directly and
through Hardware Match gives one figure for one configuration. A requested mode is a ceiling:
the highest supported preset at or below it is used and the substitution is published in
resolved_configuration.power_mode_request; when every preset draws more than the
ceiling, a power_mode_ceiling row FAILs and the verdict is NO FIT. A value that
names no preset, no wattage and not MAXN is a validation error. The calibration factor is
relative to the mode the benchmark row was measured at, so more allowed power never lowers the
modelled throughput of the same row.
Task and detection size. The benchmark row's task is compared with the
workload's task (default detection), so a classifier row answering a classification
workload is not a cross-task transform; a task with no model named uses that task's default
model. With no precision named, the inference is computed at the task’s planning default —
FP16 for segmentation and pose (the task stated, else the task the model registry files the named model under), INT8
for every other task — listed in defaulted and marked on
requested_workload.precision_default as a DERIVED planning default (method 1.5.0). On a platform that
runs only INT8 (Coral, Hailo) the FP16 task default falls back to INT8, the platform’s supported precision, and
the record says why. With no detection_resolution the model's native input size is used (the
model registry's, else the size its benchmark rows were measured at) and nothing is scaled. When a size is given and no row was
measured at it, a detection, segmentation or pose network's figure for a larger size is scaled
down by the pixel ratio, and for a smaller size keeps the measured figure — a smaller input is not
credited with more throughput than was measured (fixed per-frame costs). The step publishes the
pixel_ratio and the applied_ratio, and the assumption states which (class D);
transformer models and classifiers are not scaled, so the inference is UNKNOWN with the reason.
Platform scaling. When the platform has no row for the model, the figure is
anchored on the same model's rows on other platforms of the same family, ordered by the catalog
capability figure (TOPS): between the nearest weaker and the nearest stronger anchor it is
interpolated in log-fps over log-TOPS, and outside the anchored range it is scaled from the
nearest anchor by the square root of the TOPS ratio. A stronger platform is therefore never
given a lower scaled figure than a weaker platform's anchor, which the metamorphic suite checks
for every model and precision whose measured anchors are themselves in capability order. The
figure is class D and a modeled_estimate: it is planning evidence and cannot
eliminate a platform. A catalog row that is itself derived — one task's measured figure
multiplied by a published overhead ratio, as the segmentation and pose rows for some modules
are — is a cross-task transform: class D, modeled_estimate, with a
cross_task_ratio step in the transform chain, never a measured benchmark.
6. Preprocessing stage
Resize and colour conversion before the detector are budgeted as a fixed number of
detection frames per second per node: 480 frames/s on the hardware path (VIC or
GPU), 120 frames/s on the CPU path. These are engineering heuristics (class E,
LOW confidence) and the result page says so. Measure with tegrastats
before relying on this row; a measured host-side budget module replaces it in
a later package.
7. Memory stage
Jetson modules share one memory pool between CPU and GPU, so the budget is a single sum compared against the module's installed memory. Every part is listed in the assumptions on the result page.
Model-side parts match Model Memory Fit and
Model Match (the same vision_memory module).
The stage is class D with MEDIUM confidence: published splits are class C where measured,
but your runtime, plugins and container overhead can still move the total by hundreds of megabytes.
8. Network stage
Required ingress is the summed peak bitrate of all cameras from the shared camera bitrate table (resolution × codec × frame rate, moderate scene complexity), compared against a 1 GbE ingress port of 1000 Mbit/s. AV1 uses the H.265 row and is flagged, since AV1 typically lands 20 to 30 % lower. This is class D, MEDIUM confidence, and it says nothing about switch backplanes, PoE budgets or Wi-Fi; those live in the Network Bandwidth and Power Budget engines.
9. Host-side budget (accelerator cards and SBC NPUs)
Hailo-8, Hailo-8L, Hailo-10H, Google Coral and RK3588 (hailo_8,
hailo_8l, hailo_10h, coral_tpu,
rk3588_npu) run the detector on a card or NPU, but the host still
decodes the stream, resizes and normalises every detection frame, copies it
across the card's interface, and runs post-processing. For these platforms the
engine adds three constraints — cpu, interface
and preprocessing — built from an explicit or defaulted
host (raspberry_pi_5 · x86_mini_pc ·
rk3588_integrated) and interface (pcie_gen2_x1 ·
pcie_gen3_x1 · pcie_gen3_x4 · usb3 ·
usb2 · integrated). Jetson and server-GPU platforms run
their own pipeline and reject a host input. Decode for these
platforms is described here, not in §3: the decode row uses the host's own
hardware decoder when it has one for the codec, else software decode on the
host's cores.
The CPU and preprocessing constraints share the same 80% utilisation budget — the CPU row is the ms/s ceiling, the preprocessing row is the frames/s equivalent of the pre-processing half of it — so on a bottleneck run they move together. The interface required side charges 256 KB per detection frame beyond the raw pixel tensor for results and metadata (class E).
Hosts
| Host | Cores | CPU | Hardware decode | Software decode | Default interface | Source |
|---|---|---|---|---|---|---|
| Raspberry Pi 5 | 4 | 4 × Arm Cortex-A76 @ 2.4 GHz | H.265: 4Kp60 (497.7 MP/s, class A) | 16 ms/MP/core (class E) | Hailo → PCIe 2.0 x1 · Coral → USB 3 | Raspberry Pi · raspberrypi:products/raspberry-pi-5 · verified 2026-09-08 |
| x86 mini-PC (4-core class, e.g. N100 / Core i3) | 4 | 4 × x86 cores with iGPU video decode | H.264/H.265: 8 × 1080p30 iGPU (497.7 MP/s, class E) | 6 ms/MP/core (class E) | Hailo → PCIe 3.0 x4 · Coral → USB 3 | No vendor page cited — generic mini-PC class, class E |
| RK3588 (integrated host) | 8 | 4 × Cortex-A76 + 4 × Cortex-A55 | H.264/H.265/AV1: 8K@60fps all decoders (1990.7 MP/s, class A) | 16 ms/MP/core, VP9/MJPEG only (class E) | Rockchip → integrated | Rockchip · rockchip:products/RK3588 · verified 2026-09-08 |
The x86 mini-PC row is a deliberately generic 4-core class (an Intel N100 or similar Core i3) with no single vendor datasheet — its CPU class, hardware-decode figure and preprocessing scale (×0.6, faster than the Pi 5) are engineering estimates, class E throughout.
Interfaces
| Interface | Budgeted | Raw | Class | Note | Source |
|---|---|---|---|---|---|
| PCIe 2.0 x1 | 500 MB/s | 500 MB/s | A | Raspberry Pi 5 default; M.2 HAT+ page states 500 MB/s peak. | Raspberry Pi · raspberrypi:docs/accessories/m2-hat-plus · verified 2026-09-08 |
| PCIe 3.0 x1 | 985 MB/s | 985 MB/s | D | 8 GT/s × 128b/130b ≈ 985 MB/s per lane (derived); on Raspberry Pi 5 needs dtparam=pciex1_gen=3 and is not certified. | Raspberry Pi · raspberrypi:docs/accessories/m2-hat-plus · verified 2026-09-08 |
| PCIe 3.0 x4 | 3940 MB/s | 3940 MB/s | E | 4 × 985 MB/s (derived, no vendor page cited); typical mini-PC M.2 Key M slot. | none — derived figure, class E |
| USB 3.0 (5 Gbit/s) | 400 MB/s | 625 MB/s | A | 5 Gbit/s signalling ≈ 625 MB/s; ~400 MB/s sustained for bulk transfers on an SBC host (class E factor). | Raspberry Pi · raspberrypi:products/raspberry-pi-5 · verified 2026-09-08 |
| USB 2.0 (480 Mbit/s) | 35 MB/s | 60 MB/s | A | 480 Mbit/s signalling ≈ 60 MB/s; ~35 MB/s sustained (class E factor). Coral works but "inferencing speed is slower". | Google Coral · coral:products/accelerator · verified 2026-09-08 |
| Integrated (on-die, shared memory) | — (no copy) | — | A | NPU shares LPDDR with the CPU/VPU; the constraint returns PASS with no available figure. | Rockchip · rockchip:products/RK3588 · verified 2026-09-08 |
Per-frame host processing (ms), by detection input size
Class D — EdgeAIStack corpus timings (Raspberry Pi 5 + Hailo-8 / Coral USB3, RK3588), split 60/40 pre/post (class E). The x86 mini-PC row scales the Hailo/Coral tier by ×0.6 (class E, faster CPU class).
| Detection size | Hailo host (Pi 5) | Coral host (Pi 5) | RK3588 (integrated) |
|---|---|---|---|
| 320×320 | 7.0 ms | 12.0 ms | 5.5 ms |
| 640×640 | 13.0 ms | 21.0 ms | 8.0 ms |
| 1280×720 | 16.5 ms | 27.0 ms | 10.5 ms |
| 1920×1080 | 22.0 ms | 35.0 ms | 14.0 ms |
| 2560×1440 | 27.5 ms | 39.0 ms | 17.0 ms |
| 3840×2160 | 38.0 ms | 46.0 ms | 20.5 ms |
On the x86 mini-PC these figures are multiplied by 0.6 before the 60/40 split. The nearest tier by pixel count is used when the detection size falls between published points.
Evidence classes used here
- A — vendor figures: Raspberry Pi 5 core count and CPU, PCIe 2.0 x1 and USB 3.0/2.0 ports, the HEVC 4Kp60 decoder, the AI HAT+ connecting over PCIe; RK3588 core count, decoder ceiling and 2D acceleration; the M.2 HAT+ 500 MB/s peak figure.
- D — EdgeAIStack corpus per-frame timings; the PCIe 3.0 x1 985 MB/s figure derived from the published lane rate.
- E — the pre/post 60/40 split; the 80% CPU utilisation budget; the entire x86 mini-PC host class (CPU class, hardware-decode figure, no cited source); the derived PCIe 3.0 x4 figure (4 × the x1 rate, no vendor page); USB "sustained" practical throughput factors versus signalling rate; the 256 KB per-frame interface overhead.
What invalidates a host-budget result
- A different mini-PC. The x86 host is a generic 4-core class with no vendor datasheet; a specific SKU's CPU, iGPU decode ceiling or M.2 slot generation can differ materially from the modelled row.
- An uncertified PCIe link. Raspberry Pi 5 at PCIe 3.0 x1 needs a device-tree override and is, in the Pi 5 documentation's own words, not certified — expect instability the engine does not model.
- A different card or firmware. The per-frame timings are corpus measurements for a Hailo-8 / Coral USB3 pairing at the tested detection sizes; a Hailo-10H, a different SDK version, or a different pipeline (e.g. a different NMS implementation) can move the frame_ms figure.
- Shared-bus contention. The host CPU budget and the interface budget are modelled independently; simultaneous decode, other camera streams, or other processes on the same host reduce both below the modelled ceiling.
- Non-default preprocessing path. The
preprocessinginput (hw/cpu) does not change the host-budget preprocessing rate in this version; it only affects the class-E heuristic used for platforms without a host budget.
9A. Camera link budget (IP, MIPI CSI-2, USB, GMSL2)
Since dataset 2026-09-08 the engine also budgets the link the cameras arrive on. The camera_interface input
selects it (default ip); an optional carrier id from the
production-carrier registry supplies the Ethernet ports, CSI connectors and lanes and
USB ports of the board actually in the enclosure, and an optional sensor id sets the bit depth from the
sensor's published output format.
| Link | Required | Available | Count limit | Class |
|---|---|---|---|---|
| ip | Peak bitrate of all streams from the camera bitrate table (the existing network stage) | Carrier Ethernet ports × speed (1 / 2.5 / 10 GbE), else the module's MAC × speed, else 1 GbE assumed | — | A with a carrier or module statement; E for the 1 GbE assumption |
| csi | cameras × width × height × fps × bits per pixel (RAW10 unless a pixel format or sensor says otherwise) | Module CSI-2 lanes × Gbit/s per lane as the datasheet states them; capped by the carrier's connectors × lanes | Module direct camera count (warning above it when virtual channels allow more), module virtual-channel maximum, carrier CSI connectors, sensor lanes | A (module / carrier datasheet); UNKNOWN when no lane rate is published |
| usb | Raw payload (uncompressed), payload ÷ 10 (MJPEG, class E ratio) or the bitrate-table peak (H.264 / H.265) | USB 2.0 480 Mbit/s or USB 3 Gen 1 / Gen 2 link × 80 % isochronous payload (class E ceiling); one link shared by every camera on a hub | Carrier USB 3 ports | D (published link rate × engineering share) |
| gmsl | As csi (the deserializer feeds CSI-2) | As csi; each camera additionally checked against the 6 Gbit/s GMSL2 forward link | Deserializers × 4 cameras (deserializer count given or derived from the camera count); module virtual-channel maximum | A (module datasheet, deserializer datasheet) |
The result is one interface constraint tagged stage: camera_link (distinct from the accelerator host link of §9).
For ip nothing is added: the network stage's ingress is replaced in place by the carrier's or module's figure.
When a camera count exceeds a hard limit the constraint is re-expressed on the camera axis — required = cameras, available = the
limit — so utilization and status follow the normal thresholds, and the bandwidth figures move to detail.bandwidth.
MIPI packet overhead is not subtracted from the published lane rate; the comparison is therefore optimistic by a few percent.
Uncompressed UVC is not a stream codec of this engine; the module models it for the
interface only.
Data: datasets/camera-interfaces.json — per-module CSI-2 lanes, camera counts and PHY rates from the NVIDIA Jetson Orin / Thor datasheets, the Raspberry Pi 5 documentation, the Rockchip RK3588 datasheet and the Coral Dev Board datasheet; USB and Ethernet rates from the same datasheets; GMSL2 6 Gbit/s and four inputs per deserializer from the Analog Devices MAX96724 datasheet; sensor output formats from Raspberry Pi, OmniVision and Arducam pages (Arducam is class C). Every figure carries its source record; a field the document does not state is null and the engine reports UNKNOWN rather than guessing.
10. Primary bottleneck and stream capacity sweep
The current primary bottleneck is the eligible independent quantitative constraint with the highest utilisation at the requested workload. Evidence strength does not change bottleneck ranking. The capacity ceiling at the first failing stream count is separate: it is the highest-utilisation FAIL among kernel-eligible constraints at that count, with any co-failures listed alongside.
Stream capacity landmarks come from an integer sweep that re-evaluates the complete pipeline at each stream count 1 … 64 until the first required miss (or the sweep cap) — a FAIL, or an overload demoted to REQUIRES_VALIDATION because its evidence cannot eliminate: the ceiling is where the model runs out, a landmark, not an elimination. Comfortable is the largest count where every material quantitative constraint is COMFORTABLE. Near limit is the largest count with no FAIL where at least one stage is TIGHT or AT_LIMIT. Modeled ceiling is the largest count with no required FAIL (filling a limit exactly is still a fit with zero headroom). Fails at is modeled ceiling plus one when a failure exists. Maximum confirmed fit requires no FAIL and no required INDETERMINATE. Validation-limited from is the first count at or below the modeled maximum where a required INDETERMINATE appears, when applicable.
11. Evidence classes and the confidence rule
Every available figure carries one of five evidence classes. Class A and class E are never rendered with the same visual weight.
| Class | Meaning | Used here for |
|---|---|---|
| A | Vendor specification | Decode and encode stream counts at published datasheet points; Orin NVDEC clock statement; Orin Nano software-encode note; Raspberry Pi 5 / RK3588 core counts, hardware decoders, PCIe and USB ports (§9) |
| B | EdgeAIStack measurement | Inference benchmarks measured by EdgeAIStack with documented conditions |
| C | External measured benchmark | Vendor or community inference benchmarks used unscaled |
| D | EdgeAIStack model | Pixel-rate decode and encode interpolation; scaled inference benchmarks; memory budget; network bitrate table; non-Jetson decode ceilings; host per-frame processing corpus timings and the derived PCIe 3.0 x1 rate (§9) |
| E | Engineering heuristic | Preprocessing budget on platforms without a host budget; MJPEG placeholder; stages with no data; the host CPU budget fraction, pre/post split, x86 host class and derived PCIe 3.0 x4 rate (§9) |
The confidence label per stage follows one rule in three steps:
For the decode stage the rule is applied to the underlying class A table: an exact published point is HIGH; a pixel-rate point inside the published range counts as interpolation distance 0.5 and lands at MEDIUM; a point beyond the largest published per-stream rate is treated as extrapolated and lands at LOW. Any row from a module NVIDIA marks preliminary (Thor T4000) is forced to LOW regardless. The overall label is the weakest stage.
12. Data tables and sources
The decode dataset contains only rows copied verbatim from NVIDIA datasheets, one
source record per row with document id, revision, table, retrieval date and a short
quote. Rows NVIDIA does not publish are absent; the engine never fills a gap.
Static per-module, per-codec tables with the full rows are at
/decode/. Dataset version 2026-09-07.
Documents
| Document | Source line | Covers |
|---|---|---|
| Jetson Orin Nano Series Modules Data Sheet | NVIDIA · DS-11105-001 v1.1 · verified 2026-09-07 | §1.9.1 Table 5 (decode); Functional Overview video encode note. One table for the 8 GB and 4 GB modules. |
| Jetson Orin NX Series Modules Data Sheet | NVIDIA · DS-10712-001 v0.5 · verified 2026-09-07 | §1.10.1 Table 7 (decode), §1.10.2 Table 8 (encode). One table for the 16 GB and 8 GB modules. Front matter reads "preliminary"; v0.5 is the current published revision. |
| Jetson AGX Orin Series Modules Data Sheet | NVIDIA · DS-10662-001 v1.8 · verified 2026-09-07 | §4.4 Tables 4-1 to 4-3 (decode) and §4.5 Tables 4-4 to 4-6 (encode), separate per SKU: Industrial, 64 GB, 32 GB. |
| Jetson Thor Series Modules Data Sheet | NVIDIA · DS-11945-001 v1.5 · verified 2026-09-07 | §2.2 Tables 2-2 and 2-3 (decode), §2.3 Tables 2-4 and 2-5 (encode), per NVDEC/NVENC instance and per power mode. T4000 rows marked preliminary by NVIDIA. |
| NVIDIA Developer Forums, thread 380328 | NVIDIA · forums.developer.nvidia.com/t/380328 2026-08-17 · reply by NVIDIA staff (DaneLLL) · verified 2026-09-07 | "Maximum frequency of NVDEC is same in different power modes." The Orin power-mode statement. |
Modules in the dataset (H.265 / H.264 / AV1 at 1080p30, module totals)
| Module | NVDEC | Modes | H.265 | H.264 | AV1 | Encoder | Table |
|---|---|---|---|---|---|---|---|
| Jetson Orin Nano (8 GB / 4 GB) | 1 | all presets | 11 · 690 MP/s | 7 · 450 MP/s | 10 · 625 MP/s | software only | DS-11105-001 §1.9.1 T5 |
| Jetson Orin NX (16 GB / 8 GB) | 1 | all presets | 18 · 1100 MP/s | 11 · 720 MP/s | 20 · 1000 MP/s | NVENC | DS-10712-001 §1.10.1 T7 |
| Jetson AGX Orin 32 GB | 2 | all presets | 18 · 1100 MP/s | 11 · 720 MP/s | 15 · 1000 MP/s | NVENC | DS-10662-001 §4.5 T4-3 |
| Jetson AGX Orin 64 GB | 2 | all presets | 22 · 1300 MP/s | 13 · 850 MP/s | 18 · 1200 MP/s | NVENC | DS-10662-001 §4.5 T4-2 |
| Jetson AGX Orin Industrial | 2 | all presets | 23 · 1365 MP/s | 13 · 890 MP/s | 19 · 1260 MP/s | NVENC | DS-10662-001 §4.5 T4-1 |
| Jetson Thor T5000 | 2 | 120 W (default) · MAXN | 156 · 4920 MP/s | 160 · 5040 MP/s | 96 · 3120 MP/s | NVENC | DS-11945-001 §2.2 T2-2 (120 W) |
| Jetson Thor T4000 (preliminary) | 1 | 70 W (default) · MAXN | 39 · 2460 MP/s | 40 · 2520 MP/s | 24 · 1560 MP/s | NVENC | DS-11945-001 §2.2 T2-3 (70 W) |
Thor counts are module totals (two NVDEC instances on T5000, one on T4000). VP9 rows exist for every module and are used when requested. The T4000 AV1 MAXN row is printed inconsistently in the datasheet (a 1080p30 count lower than twice the 1080p60 count); it is kept verbatim and flagged on any result that uses it.
Other tables the engine reads
- Platform catalog for installed memory per module (vendor specification).
- Inference benchmark library and the multi-stream efficiency and power-mode multiplier tables from the stream-capacity research series.
- Memory-budget registry part sizes: per-stream decode buffers, tracker memory, OS baseline.
- Camera bitrate table (resolution × codec × frame rate) shared with the Network Bandwidth and Storage Endurance engines.
- Host budget registry (hosts, interfaces, per-frame corpus timings) for Hailo, Coral and RK3588 platforms — full tables and sources in §9.
Those tables are described on the site-wide methodology page.
13. What invalidates a result
- A new datasheet revision. Every result URL carries
mv(method version) anddv(dataset version). When either differs from the current values the result page says the data has changed since the link was made. - A codec profile the row does not cover. The counts are for 8-bit 4:2:0 main profiles. High-bit-depth 4:2:2, 4:4:4, or exotic profiles are outside the published row; the engine halves for 4:4:4 and otherwise reports what it assumed.
- Software stream limits. Datasheet counts are hardware limits. JetPack, DeepStream, GStreamer or Frigate may cap the number of concurrent decoder sessions below them; the engine does not model these caps in version 1.0.
- Contention. Simultaneous decode and encode on one module share memory bandwidth; the datasheet tables are measured for each in isolation. Expect real totals to land below the sum of the two rows.
- Inference inputs. A different runtime, TensorRT version, batch size or detection resolution than the benchmark row changes the inference figure; the assumptions list states exactly what was used.
- Preliminary rows. Anything from Jetson Thor T4000 is LOW confidence until NVIDIA finalises the datasheet.
- Non-Jetson platforms. The modelled ceilings are planning figures only.
- Host-side budget (Hailo, Coral, RK3588). A different mini-PC, an uncertified PCIe link, a different card firmware, or bus contention can move the host CPU, interface or preprocessing figures — see §9 for the full list.
14. Method changelog
| Method | Dataset | Date | Change |
|---|---|---|---|
| 1.8.0 | 2026-09-07 | 2026-09-30 | Server-GPU decode ceilings for the A2, A10, L4 and L40S rows now carry a NVIDIA source (#278) instead of no source record: the vendor's published NVDEC engine count times its measured per-engine decode rate (NVIDIA Video Codec SDK NVDEC Application Note, Table 2), NVIDIA's own aggregation method — class D, bounded_model (an upper bound; a requirement above it is a proven miss, per elimination authority), where the row was previously class D planning_only with no source. AV1 decode is confirmed on both Ampere (A2, A10) and Ada (L4, L40S); the A10 row gains an AV1 cell it did not have before. Every other non-Jetson platform's decode ceiling is unchanged. |
| 1.7.0 | 2026-09-07 | 2026-09-29 | A stated runtime is judged as stated, the extension of Compute Fit's #276 fix to this engine: a caller-stated runtime the sourced registry documents unsupported (e.g. TensorRT on Hailo-8/8L/10H, class A: TensorRT's own support matrix names NVIDIA-only hardware) now carries a dedicated runtime row — UNSUPPORTED, class A, authoritative, sourced, driving NO FIT — instead of silently resolving the inference row to the platform's native runtime. A stated runtime no vendor document settles (class E) carries no runtime row; the inference row was already UNKNOWN in that case and stays so. A runtime not stated, or a stated native runtime, is unchanged. |
| 1.6.0 | 2026-09-07 | 2026-09-29 | elimination authority (#263, owner ruling 2026-09-29). A stage over its limit FAILs only on authoritative or bounded evidence (datasheet pixel-rate decode and encode, measured or down-scaled inference, the weights floor on memory); inference through the multi-stream curve or a power-mode factor, the host CPU and preprocessing budgets, a modelled decode ceiling with no source record, the estimated network bitrates and the memory overhead estimate are planning-only, so a miss there is REQUIRES VALIDATION (INSUFFICIENT EVIDENCE, was NO FIT). The capacity sweep still marks the modelled ceiling at a demoted overload. Every row publishes elimination_authority. |
| 1.5.0 | 2026-09-07 | 2026-09-29 | Segmentation and pose default to FP16 (owner ruling of 2026-09-29): with no precision named, a segmentation or pose workload — the stated task, else the model registry’s task of the named model — is computed at FP16, the precision of every measured YOLO11-seg / -pose row on Jetson Orin; every other task keeps INT8. The default is listed in defaulted, marked requested_workload.precision_default (DERIVED) and stated in an assumption; on an INT8-only accelerator it falls back to INT8, the platform’s supported precision, with the reason; a named precision is used as named. |
| 1.4.4 | 2026-09-07 | 2026-09-28 | An absent power_mode is listed in provenance.defaulted on a module with power-mode presets (bug #248): the inference was already computed at the registry default preset that the resolved configuration prints, but the default was not recorded with the other defaults. A named mode is never listed. No figure changes. |
| 1.4.3 | 2026-09-07 | 2026-09-28 | Platform-scaled inference follows the capability order. A platform with no row for the model was scaled from the first same-family row on record by the square root of the TOPS ratio, so an AGX Orin scaled down from a Jetson Thor row (142 fps single-stream, YOLO11s-seg INT8) sat below an Orin Nano Super's own row (157 fps). The figure is now interpolated between the nearest weaker and stronger anchors in log-fps over log-TOPS, and sqrt-scaled from the nearest anchor only outside that range. A derived catalog row (segmentation or pose computed from a detection row by an overhead ratio) is class D and a cross-task modeled_estimate; it was treated as a measured class C benchmark, which made that platform recommendation-eligible while its stronger neighbours were planning-only. |
| 1.4.2 | 2026-09-07 | 2026-09-28 | Input rules (WP-01 remainder, WP-02): codec, recording, host, interface, camera_interface, pixel_format, usb_link, bit_depth (8 or 10), chroma, task, storage_topology, gmsl_deserializers (an integer 1–16, no longer clamped) and recording_egress_mbps are checked; an unknown pool_host_id is rejected instead of ignored; an empty string is a stated value. pixel_format and usb_link defaults are listed where they apply (a raw non-IP link, a USB link), with runtime and detection_resolution. Unknown input keys are rejected. No formula changed. |
| 1.4.1 | 2026-09-07 | 2026-09-28 | Present-invalid inputs are rejected; absent inputs default and are recorded (WP-01): a value that is stated but malformed — cameras 0 / −5 / "abc" / true / 3.5 / "", a frame rate of 0 or "fast", an unknown precision (fp32 / fp16 / int8, advanced bf16 / fp8 / int4 / fp4), tracking / restream that are not true or false, an unknown os or preprocessing — returns VALIDATION_ERROR naming the field instead of being replaced by a default; a field that is not stated takes its documented default and is listed in provenance.defaulted. No formula changed. A fractional frame rate is used as stated, not truncated. A detection rate stated above the source frame rate is capped to it and the cap is disclosed (assumption and workload block), never silent. |
| 1.4.0 | 2026-09-07 | 2026-09-27 | The inference is computed at the printed power mode: with none requested, the registry default preset (the mode Hardware Match plans at), so the direct and composed results agree. A requested mode is a ceiling (highest preset at or below it, published in resolved_configuration.power_mode_request; none → power_mode_ceiling FAIL, NO FIT; unrecognised → validation error). The calibration factor is relative to the row's own measured mode, so more watts never lower a row. A detection size with no row is scaled down by the published pixel ratio when larger and never scaled up when smaller (class D) for detection, segmentation and pose models and is UNKNOWN for others; no size given → the row's own size, nothing claimed. The page no longer sends a fixed TensorRT runtime, so accelerators are judged on the runtime they run. A task input (default detection) is compared with the benchmark row's task, and with no detection size the model's native input is used — a 224×224 classifier is no longer cross-task and cross-resolution against a fixed 640×640 detector. |
| 1.3.2 | 2026-09-07 | 2026-09-20 | A model token (yolo11s, yolo11|s) is parsed into family + variant so a standalone call matches the Hardware Match-composed request. Modelled inference (no V2 row) and decode no_data publish a class-E methodology citation instead of sources: []. Composed Hardware Match and standalone Camera Stream Capacity use the same Rockchip RKNN identity when they name the same model; different model strings are different workloads (rknn-toolkit2 vs rknn_model_zoo rows are not mixed for one claim). |
| 1.0 | 2026-09-07 | 2026-09-07 | First release. Decode and encode from NVIDIA datasheets (Orin Nano, Orin NX, AGX Orin 32 GB / 64 GB / Industrial, Thor T5000, Thor T4000 preliminary), per-mode Thor tables, pixel-rate interpolation labelled class D, Orin power-mode statement from NVIDIA staff. Inference, memory, network and preprocessing stages on the shared constraint framework. |
| 1.0 | 2026-09-08 | 2026-09-08 | Host-side budget (§9) added for accelerator cards and SBC NPUs (Hailo-8/8L/10H, Coral, RK3588): cpu, interface and preprocessing constraints from a per-platform host (Raspberry Pi 5, x86 mini-PC, RK3588 integrated) and interface (PCIe, USB, integrated), decode for these platforms now sourced from the host, per-frame timings from the pipeline-overhead corpus. Dataset/host budget added; method version unchanged. |
| 1.0 | 2026-09-08 | 2026-09-08 | Camera link budget (§9A) added: camera_interface ip / csi / usb / gmsl with optional carrier, sensor, pixel_format, usb_link and gmsl_deserializers inputs; Ethernet ingress from the carrier or module replaces the fixed 1 GbE assumption; CSI-2 lane, camera-count, USB link and GMSL2 ceilings from the camera-interfaces dataset. Method version unchanged; dataset camera-interfaces 2026-09-08. |
| 1.0 | 2026-09-14 | 2026-09-14 | Memory stage (§7) aligned with Model Memory Fit on the shared budget: model weights, activations, builder workspace and I/O from vision_memory (replacing the flat 1024/512 MB workspace heuristic where a published split exists); decode buffers still 16 MB per 1080p stream; preprocess 32 MB per stream; OS and 10% reserve unchanged. Method version unchanged. |
Method changes bump the method version; datasheet or benchmark updates bump the
dataset version. Both appear in the citation block under every result and in the
provenance object of every API response.
Run it on your workload.
Every result carries its constraints, source lines and a permanent link.
If a number disagrees with your datasheet or your tegrastats, use the feedback link in the footer with the source.