DM8168 DM816x Dual Video 1080P60 Streaming

From RidgeRun Developer Wiki


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

Introduction

Using the TI DM8168 EVM, you can demonstrate dual capture 1080p@60fps + audio AAC + dual RTSP where the audio comes from a single source and is streamed with both videos. We used the flexible GStreamer streaming media framework for this demo.

For this demo, we used:

  • RidgeRun professional DM8168 Linux SDK
  • Dual streaming SDK add-on
  • GStreamer Multistream RTSP SDK add-on

Hardware setup

Two playstation 3 were used to feed the DM816x-EVM with 1080p@60 through the component inputs present in the EVM. At the same time, the component cables available for PlayStation 3 has two audio outputs (RCA cables) and since the EVM has just one audio input line a cable was used to convert the two RCA audio cables to the one needed by the DM8168 EVM in the input line.

Finally, the streaming were received by computers using VLC.

Software setup

The simplified GStreamer pipeline

gst-launch  v4l2src device=/dev/video5  ! omx_h264enc ! rr_h264parser singleNalu=true ! rtspsink name=sinkB \
            alsasrc ! tee name=t ! omx_aacenc ! aacparse ! .sinkB \
                                                                  \
            v4l2src device=/dev/video0  ! omx_h264enc ! rr_h264parser singleNalu=true ! rtspsink name=sinkA \
           .t ! omx_aacenc ! aacparse ! .sinkA

Which basically says we have two independent A/V pipelines, both getting encoded and passed to the multistream RTSP sink element. We cheat in that we reuse ALSA source since the hardware only has one audio input. With hardware that that two independent audio inputs, we would just tell ALSA source which audio source to use. With GStreamer you can easily use UDPsink, FILEsink, APPsink, or many, many other standard GStreamer elements. If you didn't know, every Ubuntu ships using GStreamer as it streaming media framework.

The real GStreamer has all the encoding and buffer details described, making it a bit of an unweildly beast to get your hand around if you are new to GStreamer

gst-launch rtspsink name=sinkB service=3005 v4l2src device=/dev/video5 always-copy=false queue-size=8 ! 'video/x-raw-yuv,format=(fourcc)NV12,width=1920,height=1080,framerate=(fraction)60/1' ! omxbufferalloc numBuffers=8 ! \ 
omx_h264enc force-idr-period=60 i-period=60 output-buffers=10 input-buffers=10 profile=8 bitrate=10000000 ! gstperf name=vB ! rr_h264parser singleNalu=true ! video/x-h264, mapping=/streamB ! sinkB. alsasrc latency-time=20000 buffer-time=800000 ! \ 
'audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)48000, channels=(int)2' ! tee name=t t. ! queue ! omx_aacenc output-format=4 ! queue ! aacparse ! audio/mpeg, mapping=/streamB ! \ 
sinkB. rtspsink name=sinkA service=3000 v4l2src device=/dev/video0 always-copy=false queue-size=8 ! 'video/x-raw-yuv,format=(fourcc)NV12,width=1920,height=1080,framerate=(fraction)60/1' ! omxbufferalloc numBuffers=8 ! \ 
omx_h264enc force-idr-period=60 i-period=60 output-buffers=10 input-buffers=10 profile=8 bitrate=10000000 ! gstperf name=vA ! rr_h264parser singleNalu=true ! video/x-h264, mapping=/streamA ! sinkA. t. ! queue ! omx_aacenc output-format=4 ! \
queue ! aacparse ! audio/mpeg, mapping=/streamA ! sinkA.

Example performance results

We included the gstperf element in both video streams so we could display some performance information. In one video stram gstperf output is labeld vA and in the other stream it is labeled vB.

vA: frames: 12472 current: 59.76 average: 59.59 arm-load: 47
vB: frames: 12582 current: 59.71 average: 59.94 arm-load: 42
vA: frames: 12533 current: 60.21 average: 59.60 arm-load: 48
vB: frames: 12643 current: 60.25 average: 59.95 arm-load: 52
vA: frames: 12594 current: 59.72 average: 59.60 arm-load: 46
vB: frames: 12703 current: 59.78 average: 59.95 arm-load: 46
vA: frames: 12655 current: 60.25 average: 59.60 arm-load: 46
vB: frames: 12764 current: 60.26 average: 59.95 arm-load: 48
vA: frames: 12716 current: 59.79 average: 59.60 arm-load: 48
vB: frames: 12824 current: 59.88 average: 59.95 arm-load: 40
vA: frames: 12777 current: 60.22 average: 59.60 arm-load: 43
vB: frames: 12884 current: 59.65 average: 59.94 arm-load: 45
vA: frames: 12838 current: 60.24 average: 59.61 arm-load: 43
vB: frames: 12945 current: 60.30 average: 59.95 arm-load: 46
vA: frames: 12898 current: 59.65 average: 59.61 arm-load: 45
vB: frames: 13005 current: 59.55 average: 59.94 arm-load: 38
vA: frames: 12959 current: 60.32 average: 59.61 arm-load: 46

You can see the ARM load is under 50% with two audio and two video streams being encoded and streamed over the network interface at 1080p@60fps.


RidgeRun Resources

Quick Start Client Engagement Process RidgeRun Blog Homepage
Technical and Sales Support RidgeRun Online Store RidgeRun Videos Contact Us
RidgeRun.ai: Artificial Intelligence | Generative AI | Machine Learning

Contact Us

Visit our Main Website for the RidgeRun Products and Online Store. RidgeRun Engineering informations are available in RidgeRun Professional Services, RidgeRun Subscription Model and Client Engagement Process wiki pages. Please email to support@ridgerun.com for technical questions and contactus@ridgerun.com for other queries. Contact details for sponsoring the RidgeRun GStreamer projects are available in Sponsor Projects page.