Jetson TX2 - GStreamer - H265

From RidgeRun Developer Wiki


Previous: GStreamer/H264 Index Next: GStreamer/VP8





Problems running the pipelines shown on this page? Please see our GStreamer Debugging guide for help.

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


Previous: GStreamer/H264 Index Next: GStreamer/VP8