I’ve been profiling the Jetson H264 Hardware Encoder on 64GB AGX Orion.
video_encode_main.cpp.zip (17.6 KB)
It’s interesting that encoding latency significantly decreases with higher video input FPS.
Profiling Setting:
- Single 1080P video stream based on high movement wolf documentary
- Codec config: --stats --blocking-mode 1 --sp -br 20000000 -pbr 30000000 --max-perf -hpt 1 -nbf 0 -nrf 1 -ifi 30 -idri 30 -rc cbr -mem_type_oplane 3 -mem_type_cplane 2 --report-metadata
When video frames are immediately available after previous frame is encoded (gstreamer is-live=false, and samples/01_video_encode) encoder can easily achieves 150fps / 7ms-per-frame latency.
However, when video frames are provided to encoder in real-time, per-frame encoding latency becomes significantly higher. For instance, under 30FPS setting, video frames are fed into encoder every 33ms - we observed ~20ms per-frame latency.
----------- Element = enc0 -----------
Total Profiling time = 9.5781
Average FPS = 31.3214
Total units processed = 301
Average latency(usec) = 19972
Minimum latency(usec) = 49
Maximum latency(usec) = 22186
-------------------------------------
To simulate 30 FPS video feed, we modified samples/01_video_encode/video_encode_main.cpp, which is attached in zip folder. The modified code allows simulating different Real-Time video feed FPS, by change TARGET_FPS constant from 30 to 60/120/200.
Very interestingly, per-frame encoding latency keeps dropping when video input FPS increases. Seems like, encoding latency is significantly lower when HW encoder is busier.
60FPS → 16.5ms
----------- Element = enc0 -----------
Total Profiling time = 4.64771
Average FPS = 64.5479
Total units processed = 301
Average latency(usec) = 16537
Minimum latency(usec) = 46
Maximum latency(usec) = 19399
-------------------------------------
120FPS → 10.8ms
----------- Element = enc0 -----------
Total Profiling time = 2.33117
Average FPS = 128.691
Total units processed = 301
Average latency(usec) = 10882
Minimum latency(usec) = 3186
Maximum latency(usec) = 12735
-------------------------------------
200FPS (essentially same as original video_encode_main) → 7.1ms
----------- Element = enc0 -----------
Total Profiling time = 1.45988
Average FPS = 205.496
Total units processed = 301
Average latency(usec) = 7144
Minimum latency(usec) = 2022
Maximum latency(usec) = 12750
-------------------------------------
I made sure maxing out the system clock, but encoding latency is still ~20ms for 30FPS. **Are there anything else I can try in order to have 7ms encoding latency for 30FPS real-time feed?
**
Thank you!
