From b50ce27b14cee327c942c7bf54c335aac81c75cf Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 4 Oct 2010 17:52:22 +0200 Subject: [PATCH] tests: Add python RTP client example Add a python version of the PCMA client app. Ported by Sp4rc on IRC. --- tests/examples/rtp/client-PCMA.py | 115 ++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100755 tests/examples/rtp/client-PCMA.py diff --git a/tests/examples/rtp/client-PCMA.py b/tests/examples/rtp/client-PCMA.py new file mode 100755 index 0000000000..f6230f969f --- /dev/null +++ b/tests/examples/rtp/client-PCMA.py @@ -0,0 +1,115 @@ +#! /usr/bin/env python + +import pygst +pygst.require("0.10") +import gst +import gobject + +# +# A simple RTP receiver +# +# receives alaw encoded RTP audio on port 5002, RTCP is received on port 5003. +# the receiver RTCP reports are sent to port 5007 +# +# .-------. .----------. .---------. .-------. .--------. +# RTP |udpsrc | | rtpbin | |pcmadepay| |alawdec| |alsasink| +# port=5002 | src->recv_rtp recv_rtp->sink src->sink src->sink | +# '-------' | | '---------' '-------' '--------' +# | | +# | | .-------. +# | | |udpsink| RTCP +# | send_rtcp->sink | port=5007 +# .-------. | | '-------' sync=false +# RTCP |udpsrc | | | async=false +# port=5003 | src->recv_rtcp | +# '-------' '----------' + +AUDIO_CAPS = 'application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)PCMA' +AUDIO_DEPAY = 'rtppcmadepay' +AUDIO_DEC = 'alawdec' +AUDIO_SINK = 'autoaudiosink' + +DEST = '127.0.0.1' + +RTP_RECV_PORT = 5002 +RTCP_RECV_PORT = 5003 +RTCP_SEND_PORT = 5007 + +#gst-launch -v gstrtpbin name=rtpbin \ +# udpsrc caps=$AUDIO_CAPS port=$RTP_RECV_PORT ! rtpbin.recv_rtp_sink_0 \ +# rtpbin. ! rtppcmadepay ! alawdec ! audioconvert ! audioresample ! autoaudiosink \ +# udpsrc port=$RTCP_RECV_PORT ! rtpbin.recv_rtcp_sink_0 \ +# rtpbin.send_rtcp_src_0 ! udpsink port=$RTCP_SEND_PORT host=$DEST sync=false async=false + +def pad_added_cb(rtpbin, new_pad, depay): + sinkpad = gst.Element.get_static_pad(depay, 'sink') + lres = gst.Pad.link(new_pad, sinkpad) + +# the pipeline to hold eveything +pipeline = gst.Pipeline('rtp_client') + +# the udp src and source we will use for RTP and RTCP +rtpsrc = gst.element_factory_make('udpsrc', 'rtpsrc') +rtpsrc.set_property('port', RTP_RECV_PORT) + +# we need to set caps on the udpsrc for the RTP data +caps = gst.caps_from_string(AUDIO_CAPS) +rtpsrc.set_property('caps', caps) + +rtcpsrc = gst.element_factory_make('udpsrc', 'rtcpsrc') +rtcpsrc.set_property('port', RTCP_RECV_PORT) + +rtcpsink = gst.element_factory_make('udpsink', 'rtcpsink') +rtcpsink.set_property('port', RTCP_SEND_PORT) +rtcpsink.set_property('host', DEST) + +# no need for synchronisation or preroll on the RTCP sink +rtcpsink.set_property('async', False) +rtcpsink.set_property('sync', False) + +pipeline.add(rtpsrc, rtcpsrc, rtcpsink) + +# the depayloading and decoding +audiodepay = gst.element_factory_make(AUDIO_DEPAY, 'audiodepay') +audiodec = gst.element_factory_make(AUDIO_DEC, 'audiodec') + +# the audio playback and format conversion +audioconv = gst.element_factory_make('audioconvert', 'audioconv') +audiores = gst.element_factory_make('audioresample', 'audiores') +audiosink = gst.element_factory_make(AUDIO_SINK, 'audiosink') + +# add depayloading and playback to the pipeline and link +pipeline.add(audiodepay, audiodec, audioconv, audiores, audiosink) + +res = gst.element_link_many(audiodepay, audiodec, audioconv, audiores, audiosink) + +# the rtpbin element +rtpbin = gst.element_factory_make('gstrtpbin', 'rtpbin') + +pipeline.add(rtpbin) + +# now link all to the rtpbin, start by getting an RTP sinkpad for session 0 +srcpad = gst.Element.get_static_pad(rtpsrc, 'src') +sinkpad = gst.Element.get_request_pad(rtpbin, 'recv_rtp_sink_0') +lres = gst.Pad.link(srcpad, sinkpad) + +# get an RTCP sinkpad in session 0 +srcpad = gst.Element.get_static_pad(rtcpsrc, 'src') +sinkpad = gst.Element.get_request_pad(rtpbin, 'recv_rtcp_sink_0') +lres = gst.Pad.link(srcpad, sinkpad) + +# get an RTCP srcpad for sending RTCP back to the sender +srcpad = gst.Element.get_request_pad(rtpbin, 'send_rtcp_src_0') +sinkpad = gst.Element.get_static_pad(rtcpsink, 'sink') +lres = gst.Pad.link(srcpad, sinkpad) + +rtpbin.connect('pad-added', pad_added_cb, audiodepay) + +gst.Element.set_state(pipeline, gst.STATE_PLAYING) + +mainloop = gobject.MainLoop() +mainloop.run() + +gst.Element.set_state(pipeline, gst.STATE_NULL) + +