Performance - Latency and Throughput
Compiler Performance Comparison
The following measurements compare PVA ISP processing times using kernels compiled with the Synopsys ASIP Programmer and NVIDIA NVVPU compiler. The comparison covers standalone algorithms, joined-kernel stages, and a complete ISP pipeline. These measurements are separate from the GStreamer pipeline results presented later on this page.
All measurements use 1920 × 1080 input images. Lower processing times indicate faster execution. The latency ratio (NVVPU / Synopsys) compares the NVVPU execution time with the Synopsys execution time. A value above 1.00× indicates higher latency with NVVPU, while a value below 1.00× indicates lower latency.
| Algorithm | Orin | Thor | ||
|---|---|---|---|---|
| Synopsys (µs) | NVVPU (µs) | Latency Ratio (NVVPU / Synopsys) | NVVPU (µs) | |
| Standalone algorithms | ||||
| Decompand | 292.406 | 292.136 | 1.00× | 298.283 |
| Black Level Correction | 352.935 | 315.982 | 0.90× | 313.854 |
| Histogram | 237.774 | 236.692 | 1.00× | 248.495 |
| White Balance | 290.607 | 291.384 | 1.00× | 156.179 |
| Demosaic | 1,655.110 | 2,287.890 | 1.38× | 2,511.010 |
| Convolution1 | 1,097.560 | 2,719.460 | 2.48× | 3,092.540 |
| Color Correction Matrix | 844.084 | 845.747 | 1.00× | 852.053 |
| Global Tone Mapping | 1,312.170 | 1,462.170 | 1.11× | 1,685.430 |
| DLUT Global Tone Mapping | 666.179 | 774.060 | 1.16× | 987.716 |
| Gamma Tone Mapping | 447.388 | 447.290 | 1.00× | 398.180 |
| NV12 Conversion | 437.965 | 577.020 | 1.32× | 653.095 |
| Joined-kernel stages | ||||
| Joined Decompand + BLC | 675.461 | 505.424 | 0.75× | 666.609 |
| Joined White Balance + Demosaic | 1,828.040 | 3,195.950 | 1.75× | 3,533.180 |
| Joined Convolution + CCM1 | 1,644.140 | 3,364.500 | 2.05× | 3,815.530 |
| Joined GTM + Gamma + NV12 | 1,728.390 | 2,227.360 | 1.29× | 2,490.290 |
| Joined GTM DLUT + Gamma + NV12 | 1,127.020 | 1,703.960 | 1.51× | 1,872.440 |
| Complete pipeline | ||||
| Total ISP pipeline2 | 4,442.000 | 6,366.000 | 1.43× | 8,293.000 |
- 1 Scene-key computation is included in these Convolution kernel measurements.
- 2 The full-pipeline measurement uses a joined-kernel pipeline excluding optional stages.
For the joined-kernel ISP pipeline with optional stages excluded, the measured processing time was 4.442 ms with Synopsys and 6.366 ms with NVVPU, corresponding to a latency ratio of 1.43×. This is a separately measured pipeline result and should not be calculated by summing the individual kernel times.
File-fed GStreamer Performance Measurements
These measurements use a repeated Bayer RAW frame as input to the PVA ISP GStreamer element, with optional conversion of the NV12 output to NVMM memory. The live-camera measurements later on this page use a different setup and report processing time and FPS rather than the source-to-sink interlatency measured here.
Benchmark Setup
| Component | Configuration |
|---|---|
| Board | NVIDIA Jetson AGX Orin Developer Kit. |
| Software | Jetson Linux R36.5.0, Linux 5.15.185-tegra, GStreamer 1.20.3, and GstShark 0.9.1. |
| ISP integration | pvaisp and pvacudaupload GStreamer elements, version 1.0.0. The tested libpva_isp.so has SHA-256 9cdf9cc38e305f6bfbe93ac5eb076c67b1e954de0c72570437ce826356d072b7.
|
| ISP parameters | params-reference.yaml supplied with the GStreamer element. The Bayer pattern is BGGR with bpp=12 in the input caps. Optional convolution and color correction stages are disabled. V4L2 auto-exposure control writes are disabled.
|
| Inputs | One 1920 × 1080 Bayer frame in 16-bit words (80.raw), repeated by multifilesrc. The 3840 × 2160 input was made by tiling that frame twice horizontally and vertically.
|
| Sink | fakesink sync=false. The caps declare a 30/1 frame rate, but file reading and output are not paced to 30 FPS.
|
The stock nvpmodel profiles used for these measurements are listed below. Clock figures are maximum rates. For power-mode details, see Performance Tuning on the PVA.
| Power mode | Active CPU cores | PVA VPS maximum (MHz) | PVA AXI maximum (MHz) |
|---|---|---|---|
| MAXN | 12 | 1,369.6 | 985.6 |
| MODE_50W | 12 | 704.0 | 486.4 |
| MODE_30W | 8 | 512.0 | 358.4 |
| MODE_15W | 4 | 307.2 | 217.6 |
Measurement Method
Two runs were recorded for each combination of power mode, resolution, and pipeline. Each 1080p run processed 800 frames and excluded the first 20 frame records from processing-time and interlatency calculations. Each 4K run processed 240 frames and excluded the first 10. GstShark's proctime tracer measured per-frame processing time inside each named element. Its interlatency tracer measured the elapsed time for the same buffer from multifilesrc0_src to fakesink0_sink. This source-to-sink measurement includes time spent waiting in the queue, where present. It does not include file reading before the source pad or display latency.
GstShark's framerate tracer reported output FPS from the final processing element's source pad at approximately one-second intervals; the first and last interval of each run were excluded. FPS, processing time, CPU load, GPU utilization, and power entries are the arithmetic mean of the two run means. Interlatency mean and 95th percentile use the combined steady-state frames from both runs.
tegrastats sampled every 250 ms. The first and last sample of each run were excluded. CPU load is the sum of per-core percentages divided by 100, expressed as fully utilized core equivalents. GPU is the GR3D_FREQ utilization reported by tegrastats. Power is the VIN_SYS_5V0 system rail reading; it includes CPU, memory transfers, and other active components, so it does not isolate PVA consumption.
ISP Output to fakesink
This pipeline measures Bayer upload and ISP processing without a display or encoder:
GST_TRACERS='framerate;proctime;interlatency' GST_DEBUG='GST_TRACER:7' GST_DEBUG_NO_COLOR=1 \
gst-launch-1.0 -q \
multifilesrc location=80.raw loop=true stop-index=0 num-buffers=800 ! \
'video/x-bayer,format=bggr,bpp=12,width=1920,height=1080,framerate=30/1' ! \
pvacudaupload ! pvaisp params=params-reference.yaml ! \
'video/x-raw,format=NV12,width=1920,height=1080' ! \
fakesink sync=false
The output FPS is reported from pvaisp0_src. Proc Avg values come from GstShark's proctime records for the named elements.
| Power mode | Resolution | FPS Avg | pvaisp Proc Avg (ms)
|
pvacudaupload Proc Avg (ms)
|
CPU load (cores) | GPU Avg (%) | VIN_SYS_5V0 (W)
|
|---|---|---|---|---|---|---|---|
| MAXN | 1920 × 1080 (FHD) | 133.67 | 5.51 | 0.77 | 0.52 | 0.1 | 5.57 |
| MAXN | 3840 × 2160 (4K) | 39.83 | 18.83 | 2.50 | 0.37 | 0.0 | 5.71 |
| MODE_50W | 1920 × 1080 (FHD) | 88.25 | 9.37 | 0.79 | 0.35 | 0.6 | 5.35 |
| MODE_50W | 3840 × 2160 (4K) | 24.77 | 34.01 | 2.46 | 0.23 | 0.0 | 5.44 |
| MODE_30W | 1920 × 1080 (FHD) | 70.28 | 12.33 | 0.70 | 0.32 | 0.0 | 5.30 |
| MODE_30W | 3840 × 2160 (4K) | 19.79 | 45.55 | 2.13 | 0.17 | 0.0 | 5.46 |
| MODE_15W | 1920 × 1080 (FHD) | 44.80 | 19.98 | 0.74 | 0.27 | 0.0 | 5.08 |
| MODE_15W | 3840 × 2160 (4K) | 12.21 | 74.94 | 2.89 | 0.16 | 0.0 | 5.03 |
ISP Output Converted to NVMM
This pipeline adds queue and nvvidconv to produce video/x-raw(memory:NVMM),format=NV12. The queue allows ISP and conversion work to overlap, so individual element processing times must not be added to infer output rate or end-to-end latency.
GST_TRACERS='framerate;proctime;interlatency' GST_DEBUG='GST_TRACER:7' GST_DEBUG_NO_COLOR=1 \
gst-launch-1.0 -q \
multifilesrc location=80.raw loop=true stop-index=0 num-buffers=800 ! \
'video/x-bayer,format=bggr,bpp=12,width=1920,height=1080,framerate=30/1' ! \
pvacudaupload ! pvaisp params=params-reference.yaml ! \
'video/x-raw,format=NV12,width=1920,height=1080' ! \
queue ! nvvidconv ! 'video/x-raw(memory:NVMM),format=NV12' ! \
fakesink sync=false
The output FPS is reported from the conversion element's source pad, nvvconv0_src. For 4K runs, use num-buffers=240, the 3840 × 2160 input frame, and width=3840,height=2160 in both caps filters.
| Power mode | Resolution | FPS Avg | pvaisp Proc Avg (ms)
|
pvacudaupload Proc Avg (ms)
|
nvvidconv Proc Avg (ms)
|
CPU load (cores) | GPU Avg (%) | VIN_SYS_5V0 (W)
|
|---|---|---|---|---|---|---|---|---|
| MAXN | 1920 × 1080 (FHD) | 133.33 | 5.54 | 0.75 | 5.43 | 1.23 | 0.0 | 5.78 |
| MAXN | 3840 × 2160 (4K) | 39.33 | 19.00 | 2.44 | 17.52 | 1.03 | 0.0 | 5.98 |
| MODE_50W | 1920 × 1080 (FHD) | 88.29 | 9.42 | 0.74 | 6.92 | 0.96 | 0.0 | 5.52 |
| MODE_50W | 3840 × 2160 (4K) | 24.86 | 34.06 | 2.41 | 24.24 | 0.83 | 0.0 | 5.63 |
| MODE_30W | 1920 × 1080 (FHD) | 69.72 | 12.37 | 0.69 | 6.98 | 0.77 | 0.0 | 5.43 |
| MODE_30W | 3840 × 2160 (4K) | 19.16 | 45.73 | 2.50 | 22.59 | 0.63 | 0.0 | 5.53 |
| MODE_15W | 1920 × 1080 (FHD) | 44.10 | 20.15 | 0.74 | 6.78 | 0.56 | 0.0 | 5.05 |
| MODE_15W | 3840 × 2160 (4K) | 12.12 | 75.36 | 3.01 | 25.23 | 0.46 | 0.0 | 5.10 |
Source-to-Sink Interlatency
This is the measured time for a buffer to travel from the file source's output pad to the fakesink input pad. It is a pipeline buffer latency, not camera-to-display or glass-to-glass latency. Both paths include pvacudaupload and pvaisp; the NVMM path also includes the queue and nvvidconv. P95 means that 95% of the measured steady-state frames had latency at or below the listed value.
| Power mode | Resolution | ISP output mean (ms) | ISP output P95 (ms) | NVMM output mean (ms) | NVMM output P95 (ms) |
|---|---|---|---|---|---|
| MAXN | 1920 × 1080 (FHD) | 6.43 | 6.59 | 12.07 | 12.37 |
| MAXN | 3840 × 2160 (4K) | 21.50 | 21.76 | 39.36 | 40.16 |
| MODE_50W | 1920 × 1080 (FHD) | 10.32 | 10.42 | 17.45 | 17.68 |
| MODE_50W | 3840 × 2160 (4K) | 36.66 | 36.82 | 61.09 | 62.95 |
| MODE_30W | 1920 × 1080 (FHD) | 13.18 | 13.43 | 20.40 | 20.75 |
| MODE_30W | 3840 × 2160 (4K) | 47.80 | 48.33 | 71.24 | 75.30 |
| MODE_15W | 1920 × 1080 (FHD) | 20.90 | 21.12 | 28.05 | 28.63 |
| MODE_15W | 3840 × 2160 (4K) | 78.01 | 78.36 | 104.03 | 105.13 |
At MAXN, the ISP-output pipeline produced 133.67 FPS at 1080p and 39.83 FPS at 4K. Its mean source-to-sink latencies were 6.43 ms and 21.50 ms, respectively. These file-fed rates and latencies do not predict live-camera or glass-to-glass performance.
Idle Power
Idle VIN_SYS_5V0 power was sampled for five seconds in each mode without a benchmark pipeline. Subtracting idle from loaded power does not isolate PVA consumption.
| Power mode | Idle VIN_SYS_5V0 (W)
|
|---|---|
| MAXN | 4.45 |
| MODE_50W | 4.45 |
| MODE_30W | 4.45 |
| MODE_15W | 4.25 |
ISP Latency Measurements
Latency measurements were performed using RidgeRun's PVA ISP GStreamer element on NVIDIA Jetson platforms to characterize the behavior of the complete ISP pipeline under different operating conditions and power configurations. Measurements focus on two complementary metrics:
- Glass-to-Glass Latency, representing the latency perceived by the end user from image acquisition to image presentation (live camera capture to display).
- GStreamer Pipeline Latency, representing the latency introduced by the complete
pvaispelement inside a multimedia pipeline.
Together, these measurements provide visibility into:
- Real-world camera-to-display latency.
- The impact of Jetson power profiles.
- The effect of PVA clock frequency on image processing performance.
- Resolution scaling behavior.
- Multimedia pipeline integration performance.
Evaluated Power Modes
The number of active CPU cores and PVA frequencies depend on the selected power mode.
| Power Mode | Active CPU Cores | PVA VPU Frequency (MHz) | PVA AXI Frequency (MHz) |
|---|---|---|---|
| MAXN | 12 | 1369.9 | 985.6 |
| MODE_50W | 12 | 307.2 | 217.6 |
| MODE_30W | 8 | 512 | 358.4 |
| MODE_15W | 4 | 307.2 | 217.6 |
| MODE_15W_PVA_MAX | 4 | 1369.9 | 985.6 |
The number of active cores influences the overall SoM consumption.
The MODE_15W_PVA_MAX power mode is explained below.
Custom PVA-Oriented Power Profiles
One of the evaluated profiles is a custom profile and is not part of the default Jetson AGX Orin power configuration.
This profile was created because the default 15W nvpmodel preset does not provide direct control over the PVA frequency ranges needed for this evaluation, particularly when minimising the power consumption of the SoM while maximising the PVA usage.
- MODE_15W_PVA_MAX
To reproduce the experiments, add the following power profiles to:
/etc/nvpmodel.conf
MODE_15W_PVA_MAX
< POWER_MODEL ID=4 NAME=MODE_15W_PVA_MAX > CPU_ONLINE CORE_0 1 CPU_ONLINE CORE_1 1 CPU_ONLINE CORE_2 1 CPU_ONLINE CORE_3 1 CPU_ONLINE CORE_4 0 CPU_ONLINE CORE_5 0 CPU_ONLINE CORE_6 0 CPU_ONLINE CORE_7 0 CPU_ONLINE CORE_8 0 CPU_ONLINE CORE_9 0 CPU_ONLINE CORE_10 0 CPU_ONLINE CORE_11 0 TPC_POWER_GATING TPC_PG_MASK 248 GPU_POWER_CONTROL_ENABLE GPU_PWR_CNTL_EN on CPU_A78_0 MIN_FREQ 729600 CPU_A78_0 MAX_FREQ 1113600 GPU MIN_FREQ 0 GPU MAX_FREQ 408000000 GPU_POWER_CONTROL_DISABLE GPU_PWR_CNTL_DIS auto EMC MAX_FREQ 2133000000 DLA0_CORE MAX_FREQ 614400000 DLA1_CORE MAX_FREQ 614400000 DLA0_FALCON MAX_FREQ 294400000 DLA1_FALCON MAX_FREQ 294400000 PVA0_VPS MAX_FREQ 1369600000 PVA0_AXI MAX_FREQ 985600000
Activate the profile:
#Change ID for the one that you want sudo nvpmodel -m 4
Verify the active profile:
sudo nvpmodel -q
The custom profiles used in this evaluation prioritize PVA performance while operating under reduced system power budgets.
Glass-to-Glass Latency
GStreamer Pipeline Latency
This section evaluates the processing performance of GStreamer pipelines using PVA ISP on NVIDIA Jetson Orin and NVIDIA Jetson Thor.
The benchmarks measure frame rate, processing time, CPU utilization, GPU utilization, and system power consumption under different pipeline configurations.
Two input methodologies are evaluated:
- NVIDIA Jetson Orin: Live camera capture using
rrv4l2src, evaluated at 1920×1080 (FHD) and 3840×2160 (4K) across multiple power modes. - NVIDIA Jetson Thor: A static RAW image (
imx274.raw) repeatedly supplied usingimagefreezeormultifilesrc, evaluated at 1920×1080 with target frame rates of 30 and 60 FPS.
Both platforms are evaluated with and without display output to examine the processing overhead introduced by additional pipeline elements.
Note: The Orin and Thor benchmarks use different input sources, RAW formats, pipeline elements, and hardware configurations. Their results represent platform-specific measurements rather than directly comparable hardware performance benchmarks.
Benchmark Metrics
The following metrics are collected during benchmark execution:
| Metric | Description |
|---|---|
| Resolution | Input image resolution processed by the pipeline. |
| Power Mode | Jetson power profile used during the benchmark. |
| Target FPS | Requested frame rate configured for the benchmark. |
| FPS Avg | Average number of frames processed per second. |
| Proc Avg (ms) | Average processing time per frame reported by the benchmark instrumentation. |
| CPU Load Avg (cores) | Average aggregate CPU utilization, expressed as equivalent active CPU cores. |
| GPU Avg (%) | Average GPU utilization reported during the benchmark. |
| Avg Power (W) | Average system power consumption reported during the benchmark. |
The reported processing times represent the measurements obtained from the corresponding benchmark instrumentation. They should not be interpreted as complete capture-to-display latency unless the measurement interval explicitly covers the entire pipeline.
NVIDIA Jetson Orin
The Orin benchmarks use live camera capture through rrv4l2src.
Three scenarios are evaluated:
- Live capture without PVA ISP, using
fakesink. - Live capture with PVA ISP, using
fakesink. - Live capture with PVA ISP, using display output.
The benchmarks are performed at two resolutions:
- 4K: 3840×2160.
- FHD: 1920×1080.
The following power modes are evaluated:
- MAXN
- MODE_50W
- MODE_30W
- MODE_15W_PVA_MAX
- MODE_15W
The display manager is stopped before running the benchmarks:
sudo systemctl stop display-manager
The following pipelines are used:
WIDTH=3840
HEIGHT=2160
# Case 1 (baseline): v4l2src without pvaisp directly to fakesink
GST_TRACERS='framerate;proctime' \
GST_DEBUG='GST_TRACER:7' \
gst-launch-1.0 -v rrv4l2src device=/dev/video0 io-mode=mmap ! "video/x-bayer,format=rggb,bpp=10,width=${WIDTH},height=${HEIGHT}" ! queue ! fakesink
# Case 2: v4l2src and pva isp without display using fakesink instead
GST_TRACERS='framerate;proctime' \
GST_DEBUG='GST_TRACER:7' \
gst-launch-1.0 -v rrv4l2src device=/dev/video0 io-mode=userptr ! "video/x-bayer,format=rggb,bpp=10,width=${WIDTH},height=${HEIGHT}" ! pvaisp params=pva_isp_params.yaml ! 'video/x-raw,format=NV12' ! queue ! fakesink
# Case 3: v4l2src and pva isp to display output
GST_TRACERS='framerate;proctime' \
GST_DEBUG='GST_TRACER:7' \
gst-launch-1.0 -v rrv4l2src device=/dev/video0 io-mode=userptr ! "video/x-bayer,format=rggb,bpp=10,width=${WIDTH},height=${HEIGHT}" ! pvaisp params=pva_isp_params.yaml ! 'video/x-raw,format=NV12' ! queue ! nvvidconv ! autovideosink sync=0
Case 1: Live Capture without PVA ISP
This case establishes the baseline performance of live camera capture without PVA ISP processing.
The captured Bayer frames are sent directly to fakesink.
Pipeline:
WIDTH=3840
HEIGHT=2160
#Case 1: v4l2src without pva isp directly to fakesink
GST_TRACERS='framerate;proctime' \
GST_DEBUG='GST_TRACER:7' \
gst-launch-1.0 -v \
rrv4l2src device=/dev/video0 io-mode=mmap ! \
"video/x-bayer,format=rggb,bpp=10,width=${WIDTH},height=${HEIGHT}" ! \
queue ! \
fakesink
Results:
| Power Mode | Resolution | FPS Avg | Proc Avg (ms) | CPU Load Avg (cores) | GPU Avg (%) | Avg Power (W) |
|---|---|---|---|---|---|---|
| MAXN | 3840×2160 (4K) | 61.48 | 0.00 | 0.0139/12 | 0.00 | 4.69 |
| 1920×1080 (FHD) | 59.60 | 0.00 | 0.0167/12 | 0.00 | 4.52 | |
| MODE_50W | 3840×2160 (4K) | 59.70 | 0.00 | 0.0264/12 | 0.00 | 4.70 |
| 1920×1080 (FHD) | 60.72 | 0.00 | 0.288/12 | 0.00 | 4.53 | |
| MODE_30W | 3840×2160 (4K) | 61.41 | 0.00 | 0.0282/8 | 0.00 | 4.70 |
| 1920×1080 (FHD) | 59.79 | 0.00 | 0.0264/8 | 0.00 | 4.52 | |
| MODE_15W_PVA_MAX | 3840×2160 (4K) | 61.38 | 0.00 | 0.02/4 | 0.00 | 4.50 |
| 1920×1080 (FHD) | 59.66 | 0.00 | 0.0209/4 | 0.00 | 4.32 | |
| MODE_15W | 3840×2160 (4K) | 60.97 | 0.00 | 0.0194/4 | 0.00 | 4.50 |
| 1920×1080 (FHD) | 60.83 | 0.00 | 2.24/4 | 0.00 | 4.32 |
The figures in bold represent points of comparison of the maximum performance mode vs the minimum + maximum PVA clocks.
Case 2: PVA ISP without Display Output
This case measures live camera capture with PVA ISP processing while excluding display rendering.
The input Bayer frames are processed by pvaisp, converted to NV12, and sent to fakesink.
Pipeline:
WIDTH=3840
HEIGHT=2160
# Case 2: v4l2src and pva isp without display using fakesink instead
GST_TRACERS='framerate;proctime' \
GST_DEBUG='GST_TRACER:7' \
gst-launch-1.0 -v \
rrv4l2src device=/dev/video0 io-mode=userptr ! \
"video/x-bayer,format=rggb,bpp=10,width=${WIDTH},height=${HEIGHT}" ! \
pvaisp params=pva_isp_params.yaml ! \
'video/x-raw,format=NV12' ! \
queue ! \
fakesink
Results:
| Power Mode | Resolution | FPS Avg | Proc Avg (ms) | CPU Load Avg (cores) | GPU Avg (%) | Avg Power (W) |
|---|---|---|---|---|---|---|
| MAXN | 3840×2160 (4K) | 34.24 | 26.797 | 0.2297/12 | 0.00 | 5.85 |
| 1920×1080 (FHD) | 61.57 | 7.890 | 0.2058/12 | 0.00 | 5.24 | |
| MODE_50W | 3840×2160 (4K) | 9.75 | 101.695 | 0.0833/12 | 0.00 | 5.08 |
| 1920×1080 (FHD) | 35.00 | 27.638 | 0.1724/12 | 0.00 | 5.07 | |
| MODE_30W | 3840×2160 (4K) | 13.79 | 71.084 | 0.1012/8 | 0.00 | 5.24 |
| 1920×1080 (FHD) | 48.24 | 19.641 | 0.2191/8 | 0.00 | 5.16 | |
| MODE_15W_PVA_MAX | 3840×2160 (4K) | 28.04 | 33.927 | 5.29/4 | 0.00 | 5.52 |
| 1920×1080 (FHD) | 61.50 | 10.224 | 6.61/4 | 0.00 | 5.07 | |
| MODE_15W | 3840×2160 (4K) | 8.52 | 116.790 | 1.83/4 | 0.00 | 4.86 |
| 1920×1080 (FHD) | 31.24 | 31.092 | 4.61/4 | 0.00 | 4.81 |
The figures in bold represent points of comparison of the maximum performance mode vs the minimum + maximum PVA clocks.
Case 3: PVA ISP with Display Output
This case evaluates the live camera pipeline with PVA ISP processing and display output.
The pipeline includes nvvidconv and autovideosink to display the processed frames.
Pipeline:
WIDTH=3840
HEIGHT=2160
#Case 3: v4l2src and pva isp to display output
GST_TRACERS='framerate;proctime' \
GST_DEBUG='GST_TRACER:7' \
gst-launch-1.0 -v \
rrv4l2src device=/dev/video0 io-mode=userptr ! \
"video/x-bayer,format=rggb,bpp=10,width=${WIDTH},height=${HEIGHT}" ! \
pvaisp params=pva_isp_params.yaml ! \
'video/x-raw,format=NV12' ! \
queue ! \
nvvidconv ! \
autovideosink sync=0
Results:
| Power Mode | Resolution | FPS Avg | Proc Avg (ms) | CPU Load Avg (cores) | GPU Avg (%) | Avg Power (W) |
|---|---|---|---|---|---|---|
| MAXN | 3840×2160 (4K) | 31.38 | 29.49 | 0.6324/12 | 13.39 | 6.25 |
| 1920×1080 (FHD) | 61.00 | 8.96 | 0.6321/12 | 6.55 | 5.56 | |
| MODE_50W | 3840×2160 (4K) | 8.34 | 116.12 | 0.1842/12 | 3.64 | 5.24 |
| 1920×1080 (FHD) | 31.68 | 31.11 | 0.2888/12 | 3.61 | 5.23 | |
| MODE_30W | 3840×2160 (4K) | 13.59 | 70.51 | 0.2897/8 | 5.21 | 5.50 |
| 1920×1080 (FHD) | 48.83 | 19.51 | 0.4433/8 | 4.88 | 5.43 | |
| MODE_15W_PVA_MAX | 3840×2160 (4K) | 26.45 | 34.71 | 0.6673/4 | 16.33 | 5.95 |
| 1920×1080 (FHD) | 60.32 | 10.28 | 0.6121/4 | 7.36 | 5.39 | |
| MODE_15W | 3840×2160 (4K) | 8.41 | 115.89 | 0.2291/4 | 3.88 | 5.07 |
| 1920×1080 (FHD) | 30.86 | 31.56 | 0.3718/4 | 4.09 | 5.03 |
The figures in bold represent points of comparison of the maximum performance mode vs the minimum + maximum PVA clocks.
Performance Comparison
After comparing case 1 with case 2, it is possible to compute the difference between the CPU load and the power drawn by PVA ISP:
| Power Mode | Resolution | Processing Time (ms) |
Additional Power Consumption (W) |
|---|---|---|---|
| MAXN | 3840x2160 (4K) | 26.797 | 1.16 |
| 1920x1080 (FHD) | 7.89 | 0.72 | |
| MODE 15W PVA MAX | 3840x2160 (4K) | 33.927 | 1.02 |
| 1920x1080 (FHD) | 10.224 | 0.75 |
In 1080p, the power consumption by a single stream is 0.75 W, whereas for 4K is 1.16 W. This includes a full ISP pipeline, as described in Complete Pipeline.
Additionally, all these figures are retrieved for a single stream. Nevertheless, PVA ISP is using the 50% of the PVA, leaving room to introduce another stream while maintaining the performance. After three streams, the PVA shall share VPU amongst two or more streams.
NVIDIA Jetson Thor
The Jetson Thor benchmarks evaluate PVA ISP performance using a static RAW image instead of a live camera.
The input file is imx274.raw, containing a 1920×1080 RAW image with a frame size of 4,147,200 bytes.
Two input approaches are evaluated:
- Test 1 — imagefreeze: A single RAW image is loaded and repeatedly output at a configured frame rate.
- Test 2 — multifilesrc: The same RAW image is continuously read in a loop to simulate a video input.
The benchmarks use MAXN power mode and evaluate target frame rates of 30 and 60 FPS.
The PVA ISP pipelines use the following elements:
rawvideoparseto interpret the input data.capssetterto assign Bayer caps.pvacudauploadto prepare the input for PVA processing.pvaispto execute the ISP pipeline.perfto collect performance measurements.fakesinkorautovideosinkas the output sink.
The PVA ISP input caps specify RGGB Bayer data with 12 bits per pixel, and the output format is NV12.
Benchmark Configuration
The same GStreamer pipelines are used to evaluate PVA ISP performance at 30 and 60 FPS.
The frame rate is configured through the FPS variable. No additional pipeline modifications are required between the two tests.
Configuration for 60 FPS:
WIDTH=1920 HEIGHT=1080 FPS=60
Configuration for 30 FPS:
FPS=30
All pipeline caps that specify a frame rate use framerate=${FPS}/1.
Each benchmark is executed separately for both target frame rates, and the corresponding results are reported in the tables below.
Test 1: Static RAW Image with imagefreeze
This test uses imagefreeze to repeatedly output a single RAW image at the configured frame rate.
Three scenarios are evaluated:
- RAW image without PVA ISP, using
fakesink. - RAW image processed by PVA ISP, using
fakesink. - RAW image processed by PVA ISP, using display output.
Case 1: RAW Image without PVA ISP
The baseline pipeline measures frame delivery without PVA ISP processing.
Pipeline:
WIDTH=1920
HEIGHT=1080
FPS=60
gst-launch-1.0 -v \
filesrc location=imx274.raw blocksize=4147200 ! \
rawvideoparse format=gray16-le \
width=${WIDTH} height=${HEIGHT} framerate=1/1 ! \
imagefreeze is-live=true ! \
"video/x-raw,format=GRAY16_LE,width=${WIDTH},height=${HEIGHT},framerate=${FPS}/1" ! \
perf ! \
fakesink sync=true
To run the 30 FPS benchmark, set FPS=30 before executing the same pipeline.
Results:
| Resolution | Power Mode | Target FPS | FPS Avg | Proc Avg (ms) | CPU Load Avg (cores) | GPU Avg (%) | Avg Power (W) |
|---|---|---|---|---|---|---|---|
| 1920×1080 | MAXN | 60 | 59.99 | 0.00 | 0.170 | 0 | 19.30 |
| 1920×1080 | MAXN | 30 | 0.00 | 0 |
Note: The 30 FPS baseline row contains incomplete measurements in the original benchmark record.
The baseline pipeline achieves approximately 60 FPS without PVA ISP processing.
Case 2: PVA ISP without Display Output
This pipeline processes the repeated RAW image using PVA ISP and sends the NV12 output to fakesink.
Pipeline:
WIDTH=1920
HEIGHT=1080
FPS=60
gst-launch-1.0 -v \
filesrc location=imx274.raw blocksize=4147200 ! \
rawvideoparse format=gray16-le \
width=${WIDTH} height=${HEIGHT} framerate=1/1 ! \
imagefreeze is-live=true ! \
"video/x-raw,format=GRAY16_LE,width=${WIDTH},height=${HEIGHT},framerate=${FPS}/1" ! \
capssetter replace=true join=false \
caps="video/x-bayer,format=rggb,bpp=12,width=${WIDTH},height=${HEIGHT},framerate=${FPS}/1" ! \
queue max-size-buffers=4 max-size-bytes=0 max-size-time=0 ! \
pvacudaupload ! \
pvaisp params=examples/params.yaml ! \
'video/x-raw,format=NV12' ! \
queue max-size-buffers=4 max-size-bytes=0 max-size-time=0 ! \
perf ! \
fakesink sync=true
To run the 30 FPS benchmark, set FPS=30 before executing the same pipeline.
Results:
| Resolution | Power Mode | Target FPS | FPS Avg | Proc Avg (ms) | CPU Load Avg (cores) | GPU Avg (%) | Avg Power (W) |
|---|---|---|---|---|---|---|---|
| 1920×1080 | MAXN | 60 | 60.34 | 7.40 | 2.700 | 0 | 21.40 |
| 1920×1080 | MAXN | 30 | 30.56 | 7.51 | 0.156 | 0 | 20.14 |
The PVA ISP pipeline achieves approximately 60 FPS with an average processing time of 7.40 ms.
The measured processing time remains close to 7.5 ms for the 30 FPS test.
Case 3: PVA ISP with Display Output
This test uses the same PVA ISP pipeline but replaces fakesink with autovideosink.
Pipeline:
WIDTH=1920
HEIGHT=1080
FPS=60
gst-launch-1.0 -v \
filesrc location=imx274.raw blocksize=4147200 ! \
rawvideoparse format=gray16-le \
width=${WIDTH} height=${HEIGHT} framerate=1/1 ! \
imagefreeze is-live=true ! \
"video/x-raw,format=GRAY16_LE,width=${WIDTH},height=${HEIGHT},framerate=${FPS}/1" ! \
capssetter replace=true join=false \
caps="video/x-bayer,format=rggb,bpp=12,width=${WIDTH},height=${HEIGHT},framerate=${FPS}/1" ! \
queue max-size-buffers=4 max-size-bytes=0 max-size-time=0 ! \
pvacudaupload ! \
pvaisp params=examples/params.yaml ! \
'video/x-raw,format=NV12' ! \
queue max-size-buffers=4 max-size-bytes=0 max-size-time=0 ! \
perf ! \
autovideosink sync=true
To run the 30 FPS benchmark, set FPS=30 before executing the same pipeline.
Results:
| Resolution | Power Mode | Target FPS | FPS Avg | Proc Avg (ms) | CPU Load Avg (cores) | GPU Avg (%) | Avg Power (W) |
|---|---|---|---|---|---|---|---|
| 1920×1080 | MAXN | 60 | 60.53 | 7.40 | 2.310 | 0 | 21.20 |
| 1920×1080 | MAXN | 30 | 30.91 | 7.65 | 0.180 | 0 | 21.09 |
The display pipeline achieves approximately 60 FPS with an average processing time of 7.40 ms.
The reported processing time is similar to the fakesink configuration.
Test 2: Repeated RAW Image with multifilesrc
This test uses multifilesrc with loop=true to repeatedly read the same RAW image and simulate a continuous video input.
Unlike imagefreeze, which repeats an already loaded frame, multifilesrc continuously supplies the RAW image as input buffers.
Three scenarios are evaluated:
- RAW image without PVA ISP, using
fakesink. - RAW image processed by PVA ISP, using
fakesink. - RAW image processed by PVA ISP, using display output.
All benchmarks use the MAXN power mode at 1920×1080 resolution.
The same pipelines are used for 30 and 60 FPS by changing the FPS variable.
Benchmark configuration:
WIDTH=1920 HEIGHT=1080 FPS=60 # For 30 FPS: # FPS=30
Case 1: RAW Image without PVA ISP
This case establishes the baseline performance of the multifilesrc pipeline without PVA ISP processing.
The RAW image is repeatedly read, assigned Bayer caps, and sent directly to fakesink.
Pipeline:
gst-launch-1.0 -v \
multifilesrc location=imx274.raw loop=true blocksize=4147200 ! \
rawvideoparse format=gray16-le \
width=${WIDTH} height=${HEIGHT} framerate=${FPS}/1 ! \
"video/x-raw,format=GRAY16_LE,width=${WIDTH},height=${HEIGHT},framerate=${FPS}/1" ! \
capssetter replace=true join=false \
caps="video/x-bayer,format=rggb,bpp=12,width=${WIDTH},height=${HEIGHT},framerate=${FPS}/1" ! \
queue max-size-buffers=4 max-size-bytes=0 max-size-time=0 ! \
perf ! \
fakesink sync=true
Results:
| Resolution | Power Mode | Target FPS | FPS Avg | Proc Avg (ms) | CPU Load Avg (cores) | GPU Avg (%) | Avg Power (W) |
|---|---|---|---|---|---|---|---|
| 1920×1080 | MAXN | 60 | 60.11 | 0.00 | 0.055 | 0 | 17.59 |
| 1920×1080 | MAXN | 30 | 30.247 | 0.00 | 0.085 | 0 | 15.30 |
The baseline pipeline maintains the configured frame rates without PVA ISP processing.
The reported processing time is 0.00 ms because the pipeline does not execute the PVA ISP processing stage. This value should not be interpreted as zero end-to-end pipeline latency.
Case 2: PVA ISP without Display Output
This case evaluates PVA ISP processing using the repeated RAW image as input.
The input is processed by pvaisp, converted to NV12, and sent to fakesink.
Pipeline:
gst-launch-1.0 -v \
multifilesrc location=imx274.raw loop=true blocksize=4147200 ! \
rawvideoparse format=gray16-le \
width=${WIDTH} height=${HEIGHT} framerate=${FPS}/1 ! \
"video/x-raw,format=GRAY16_LE,width=${WIDTH},height=${HEIGHT},framerate=${FPS}/1" ! \
capssetter replace=true join=false \
caps="video/x-bayer,format=rggb,bpp=12,width=${WIDTH},height=${HEIGHT},framerate=${FPS}/1" ! \
queue max-size-buffers=4 max-size-bytes=0 max-size-time=0 ! \
pvacudaupload ! \
pvaisp params=examples/params.yaml ! \
'video/x-raw,format=NV12' ! \
queue max-size-buffers=4 max-size-bytes=0 max-size-time=0 ! \
perf ! \
fakesink sync=true
Results:
| Resolution | Power Mode | Target FPS | FPS Avg | Proc Avg (ms) | CPU Load Avg (cores) | GPU Avg (%) | Avg Power (W) |
|---|---|---|---|---|---|---|---|
| 1920×1080 | MAXN | 60 | 60.16 | 7.33 | 0.311 | 0 | 21.33 |
| 1920×1080 | MAXN | 30 | 30.11 | 7.39 | 0.058 | 0 | 20.20 |
The PVA ISP pipeline maintains the configured frame rates with an average processing time of:
- 60 FPS: 7.33 ms.
- 30 FPS: 7.39 ms.
The measured processing time remains similar at both frame rates.
Case 3: PVA ISP with Display Output
This case evaluates the same PVA ISP pipeline with display output.
The processed NV12 frames are sent to autovideosink instead of fakesink.
Pipeline:
gst-launch-1.0 -v \
multifilesrc location=imx274.raw loop=true blocksize=4147200 ! \
rawvideoparse format=gray16-le \
width=${WIDTH} height=${HEIGHT} framerate=${FPS}/1 ! \
"video/x-raw,format=GRAY16_LE,width=${WIDTH},height=${HEIGHT},framerate=${FPS}/1" ! \
capssetter replace=true join=false \
caps="video/x-bayer,format=rggb,bpp=12,width=${WIDTH},height=${HEIGHT},framerate=${FPS}/1" ! \
queue max-size-buffers=4 max-size-bytes=0 max-size-time=0 ! \
pvacudaupload ! \
pvaisp params=examples/params.yaml ! \
'video/x-raw,format=NV12' ! \
queue max-size-buffers=4 max-size-bytes=0 max-size-time=0 ! \
perf ! \
autovideosink sync=true
Results:
| Resolution | Power Mode | Target FPS | FPS Avg | Proc Avg (ms) | CPU Load Avg (cores) | GPU Avg (%) | Avg Power (W) |
|---|---|---|---|---|---|---|---|
| 1920×1080 | MAXN | 60 | 60.06 | 7.38 | 0.311 | 0 | 21.37 |
| 1920×1080 | MAXN | 30 | 30.082 | 7.64 | 0.201 | 0 | 20.27 |
The pipeline maintains the configured frame rates with an average processing time of:
- 60 FPS: 7.38 ms.
- 30 FPS: 7.64 ms.
The processing time remains close to the results obtained without display output.