Jetson TX2 - GStreamer - H265
|
H265 encoding
VLC with H265 support
In order to support h265 you need VLC 2.2 in your computer to play the videos
sudo add-apt-repository ppa:mc3man/trusty-media sudo apt-get update sudo apt-get install vlc vlc-plugin-*
videotestsrc
ARM load: 156% but only videotestsrc consumes 100%. According to the NVIDIA forum when using videotestsrc the system is also doing memory copies to feed the encoder with NVMM memory buffers so that loads more the ARM.
gst-launch-1.0 videotestsrc num-buffers=150 ! 'video/x-raw, format=(string)I420,width=(int)640, height=(int)480' ! omxh265enc ! filesink location=test.h265 -e
VLC can play the file correctly at 30fps and reports as codec: MPEG-H Part2/HEVC (H.265)(hevc). The fan on top of the SoC didn't turn on.
nvcamerasrc
gst-launch-1.0 -e nvcamerasrc fpsRange="30.0 30.0" ! 'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, format=(string)I420, framerate=(fraction)30/1' ! \ nvvidconv flip-method=2 ! 'video/x-raw(memory:NVMM), format=(string)I420' ! omxh265enc ! filesink location=test.h265 -e
Codecvisa reports a bitrate of 7.96Mbps when the variable mode is selected on the encoder.
ARM consumption is ~55% of one core (4 cores available 400% - this means something like 13% of total). However, only the capture is 11.25% so the h264 consumes 1.75%
RAM 1487/7853MB (lfb 993x4MB) cpu [0%@1267,off,off,0%@1267,0%@1267,0%@1267] RAM 1487/7853MB (lfb 993x4MB) cpu [12%@345,off,off,12%@345,10%@345,14%@345] RAM 1487/7853MB (lfb 993x4MB) cpu [9%@345,off,off,19%@345,14%@345,9%@345] RAM 1487/7853MB (lfb 993x4MB) cpu [16%@345,off,off,14%@345,12%@345,16%@345] RAM 1487/7853MB (lfb 993x4MB) cpu [16%@345,off,off,11%@345,18%@345,20%@345] RAM 1487/7853MB (lfb 992x4MB) cpu [14%@345,off,off,14%@345,12%@345,22%@345] RAM 1488/7853MB (lfb 992x4MB) cpu [16%@345,off,off,18%@345,15%@345,15%@345] RAM 1487/7853MB (lfb 992x4MB) cpu [22%@345,off,off,16%@345,8%@345,17%@345] RAM 1487/7853MB (lfb 992x4MB) cpu [24%@345,off,off,17%@345,7%@345,14%@345] RAM 1487/7853MB (lfb 992x4MB) cpu [13%@345,off,off,20%@345,20%@345,7%@345] RAM 1487/7853MB (lfb 992x4MB) cpu [17%@345,off,off,19%@345,14%@345,15%@345] RAM 1488/7853MB (lfb 992x4MB) cpu [15%@345,off,off,22%@345,12%@345,14%@345] RAM 1488/7853MB (lfb 992x4MB) cpu [16%@345,off,off,14%@345,21%@345,13%@345] RAM 1488/7853MB (lfb 992x4MB) cpu [15%@345,off,off,19%@345,13%@345,16%@345] RAM 1488/7853MB (lfb 992x4MB) cpu [11%@345,off,off,11%@345,16%@345,16%@345] RAM 1488/7853MB (lfb 991x4MB) cpu [22%@345,off,off,11%@345,15%@345,15%@345] RAM 1488/7853MB (lfb 991x4MB) cpu [18%@345,off,off,14%@345,12%@345,14%@345] RAM 1488/7853MB (lfb 991x4MB) cpu [8%@345,off,off,13%@345,20%@345,10%@345] RAM 1488/7853MB (lfb 991x4MB) cpu [11%@345,off,off,12%@345,11%@345,21%@345]
1574 root 20 0 9.979g 266012 44612 S 47.7 3.3 17:54.85 nvcamera-daemon 13273 nvidia 20 0 694396 12920 9156 S 8.6 0.2 0:01.32 gst-launch-1.0
The encoder exposes the following parameters
control-rate : Bitrate control method flags: readable, writable, changeable only in NULL or READY state Enum "GstOMXVideoEncControlRate" Default: 1, "variable" (0): disable - Disable (1): variable - Variable (2): constant - Constant (3): variable-skip-frames - Variable Skip Frames (4): constant-skip-frames - Constant Skip Frames bitrate : Target bitrate flags: readable, writable, changeable in NULL, READY, PAUSED or PLAYING state Unsigned Integer. Range: 0 - 4294967295 Default: 4000000 quant-i-frames : Quantization parameter for I-frames (0xffffffff=component default) flags: readable, writable, changeable only in NULL or READY state Unsigned Integer. Range: 0 - 4294967295 Default: 4294967295 quant-p-frames : Quantization parameter for P-frames (0xffffffff=component default) flags: readable, writable, changeable only in NULL or READY state Unsigned Integer. Range: 0 - 4294967295 Default: 4294967295 quant-b-frames : Quantization parameter for B-frames (0xffffffff=component default) flags: readable, writable, changeable only in NULL or READY state Unsigned Integer. Range: 0 - 4294967295 Default: 4294967295 iframeinterval : Encoding Intra Frame occurance frequency flags: readable, writable, changeable only in NULL or READY state Unsigned Integer. Range: 0 - 4294967295 Default: 0 SliceIntraRefreshEnable: Enable Slice Intra Refresh while encoding flags: readable, writable, changeable only in NULL or READY state Boolean. Default: false SliceIntraRefreshInterval: Set SliceIntraRefreshInterval flags: readable, writable, changeable only in NULL or READY state Unsigned Integer. Range: 0 - 4294967295 Default: 60 bit-packetization : Whether or not Packet size is based upon Number Of bits flags: readable, writable, changeable only in NULL or READY state Boolean. Default: false vbv-size : virtual buffer size = vbv-size * (bitrate/fps) flags: readable, writable, changeable only in NULL or READY state Unsigned Integer. Range: 0 - 30 Default: 10 temporal-tradeoff : Temporal Tradeoff value for encoder flags: readable, writable, changeable only in NULL or READY state Enum "GstOmxVideoEncTemporalTradeoffType" Default: 0, "Do not drop frames" (0): Do not drop frames - GST_OMX_VIDENC_DROP_NO_FRAMES (1): Drop 1 in 5 frames - GST_OMX_VIDENC_DROP_1_IN_5_FRAMES (2): Drop 1 in 3 frames - GST_OMX_VIDENC_DROP_1_IN_3_FRAMES (3): Drop 1 in 2 frames - GST_OMX_VIDENC_DROP_1_IN_2_FRAMES (4): Drop 2 in 3 frames - GST_OMX_VIDENC_DROP_2_IN_3_FRAMES EnableMVBufferMeta : Enable Motion Vector Meta data for encoding flags: readable, writable, changeable only in NULL or READY state Boolean. Default: false qp-range : Qunatization range for P and I frame, Use string with values of Qunatization Range in MinQpP-MaxQpP:MinQpI-MaxQpP:MinQpB-MaxQpB order, to set the property. flags: readable, writable String. Default: "-1,-1:-1,-1:-1,-1" MeasureEncoderLatency: Enable Measure Encoder latency Per Frame flags: readable, writable, changeable only in NULL or READY state Boolean. Default: false EnableTwopassCBR : Enable two pass CBR while encoding flags: readable, writable, changeable only in NULL or READY state Boolean. Default: false preset-level : HW preset level for encoder flags: readable, writable, changeable only in NULL or READY state Enum "GstOMXVideoEncHwPreset" Default: 0, "UltraFastPreset" (0): UltraFastPreset - UltraFastPreset for high perf (1): FastPreset - FastPreset (2): MediumPreset - MediumPreset (3): SlowPreset - SlowPreset slice-header-spacing: Slice Header Spacing number of macroblocks/bits in one packet flags: readable, writable, changeable only in NULL or READY state Unsigned Long. Range: 0 - 18446744073709551615 Default: 0
Dual H265 encoding
gst-launch-1.0 -e nvcamerasrc fpsRange="30.0 30.0" ! 'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, format=(string)I420, framerate=(fraction)30/1' ! \ nvvidconv flip-method=2 ! 'video/x-raw(memory:NVMM), format=(string)I420' ! tee name=streams \ streams. ! omxh264enc bitrate=8000000 ! 'video/x-h264, stream-format=(string)byte-stream' ! filesink location=testA.h264 \ streams. ! omxh264enc bitrate=8000000 ! 'video/x-h264, stream-format=(string)byte-stream' ! filesink location=testB.h264
gst-launch-1.0 -e nvcamerasrc fpsRange="30.0 30.0" ! 'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, format=(string)I420, framerate=(fraction)30/1' ! \ nvvidconv flip-method=2 ! 'video/x-raw(memory:NVMM), format=(string)I420' ! tee name=streams \ streams. ! omxh265enc bitrate=8000000 ! 'video/x-h265, stream-format=(string)byte-stream' ! filesink location=testA.h265 \ streams. ! omxh265enc bitrate=8000000 ! 'video/x-h265, stream-format=(string)byte-stream' ! filesink location=testB.h265
ARM consumption ~48.7% of one core (4 cores available 400% - this means something like 13.5% of total). However, only the capture is 11.25% so the dual h265 consumes 2.25%
RAM 1503/7853MB (lfb 965x4MB) cpu [0%@1420,off,off,0%@1420,0%@1420,0%@1420] RAM 1503/7853MB (lfb 965x4MB) cpu [19%@345,off,off,10%@345,13%@345,16%@345] RAM 1503/7853MB (lfb 965x4MB) cpu [17%@345,off,off,15%@345,9%@345,12%@345] RAM 1503/7853MB (lfb 964x4MB) cpu [13%@345,off,off,13%@345,14%@345,19%@345] RAM 1503/7853MB (lfb 964x4MB) cpu [18%@345,off,off,13%@345,10%@345,13%@345] RAM 1503/7853MB (lfb 963x4MB) cpu [12%@345,off,off,10%@345,14%@345,18%@345] RAM 1503/7853MB (lfb 962x4MB) cpu [19%@345,off,off,12%@345,19%@345,10%@345] RAM 1504/7853MB (lfb 962x4MB) cpu [10%@345,off,off,14%@345,16%@345,18%@345] RAM 1504/7853MB (lfb 961x4MB) cpu [24%@345,off,off,10%@345,13%@345,15%@345] RAM 1504/7853MB (lfb 961x4MB) cpu [14%@345,off,off,13%@345,12%@345,18%@345] RAM 1504/7853MB (lfb 961x4MB) cpu [16%@345,off,off,15%@345,9%@345,14%@345] RAM 1504/7853MB (lfb 957x4MB) cpu [17%@345,off,off,20%@345,18%@345,15%@345] RAM 1457/7853MB (lfb 957x4MB) cpu [14%@345,off,off,9%@345,10%@345,15%@345] RAM 1456/7853MB (lfb 957x4MB) cpu [0%@345,off,off,1%@345,0%@345,0%@345]
H265 UDP Streaming
In order to start streaming H265 you need the h265 payloader, to do this you need to compile the latest version of GStreamer in your Jetson TX2 module. Please follow the instructions to do it. The same instructions can be run on your PC if you want to update the GStreamer version in your host. (in the case of the host I had to recompile the good plugins to get the rtph265pay).
Currently, it is not possible to receive the stream using the PC because there is not an h265 decoder available on GStreamer. In order to evaluate the performance let's receive the stream on the Jetson module as well.
export PKG_CONFIG_PATH=/home/$USER/gst_$VERSION/out/lib/pkgconfig VERSION=1.8.0 export LD_LIBRARY_PATH=/home/$USER/gst_$VERSION/out/lib/
server:
CLIENT_IP=<IP_ADDRESS> gst-launch-1.0 nvcamerasrc fpsRange="30 30" intent=3 ! nvvidconv flip-method=6 \ ! 'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, format=(string)I420, framerate=(fraction)30/1' ! \ omxh265enc low-latency=1 control-rate=2 bitrate=4000000 ! 'video/x-h265, stream-format=(string)byte-stream' ! \ h265parse ! rtph265pay mtu=1400 ! udpsink host=$CLIENT_IP port=5000 sync=false async=false
client:
gst-launch-1.0 udpsrc port=5000 ! application/x-rtp,encoding-name=H265,payload=96 ! rtph265depay \ ! h265parse ! queue ! omxh265dec ! nvoverlaysink sync=false async=false -e
Latency
- 1080p30
- H265
- Bitrate 4Mbps
- Latency=251ms