2005-07-14 10:29:30 +00:00
|
|
|
The RTP libraries
|
|
|
|
---------------------
|
|
|
|
|
2006-05-18 23:00:02 +00:00
|
|
|
RTP Buffers
|
|
|
|
-----------
|
|
|
|
The real time protocol as described in RFC 3550 requires the use of special
|
|
|
|
packets containing an additional RTP header of at least 12 bytes. GStreamer
|
|
|
|
provides some helper functions for creating and parsing these RTP headers.
|
|
|
|
The result is a normal #GstBuffer with an additional RTP header.
|
|
|
|
|
|
|
|
RTP buffers are usually created with gst_rtp_buffer_new_allocate() or
|
|
|
|
gst_rtp_buffer_new_allocate_len(). These functions create buffers with a
|
|
|
|
preallocated space of memory. It will also ensure that enough memory
|
|
|
|
is allocated for the RTP header. The first function is used when the payload
|
|
|
|
size is known. gst_rtp_buffer_new_allocate_len() should be used when the size
|
|
|
|
of the whole RTP buffer (RTP header + payload) is known.
|
|
|
|
|
|
|
|
When receiving RTP buffers from a network, gst_rtp_buffer_new_take_data()
|
|
|
|
should be used when the user would like to parse that RTP packet. (TODO Ask
|
|
|
|
Wim what the real purpose of this function is as it seems to simply create a
|
|
|
|
duplicate GstBuffer with the same data as the previous one). The
|
|
|
|
function will create a new RTP buffer with the given data as the whole RTP
|
|
|
|
packet. Alternatively, gst_rtp_buffer_new_copy_data() can be used if the user
|
|
|
|
wishes to make a copy of the data before using it in the new RTP buffer. An
|
|
|
|
important function is gst_rtp_buffer_validate() that is used to verify that
|
|
|
|
the buffer a well formed RTP buffer.
|
|
|
|
|
|
|
|
It is now possible to use all the gst_rtp_buffer_get_*() or
|
|
|
|
gst_rtp_buffer_set_*() functions to read or write the different parts of the
|
|
|
|
RTP header such as the payload type, the sequence number or the RTP
|
|
|
|
timestamp. The use can also retreive a pointer to the actual RTP payload data
|
|
|
|
using the gst_rtp_buffer_get_payload() function.
|
2005-07-14 10:29:30 +00:00
|
|
|
|
2006-05-18 23:00:02 +00:00
|
|
|
RTP Base Payloader Class (GstBaseRTPPayload)
|
|
|
|
--------------------------------------------
|
|
|
|
|
|
|
|
All RTP payloader elements (audio or video) should derive from this class.
|
|
|
|
|
|
|
|
RTP Base Audio Payloader Class (GstBaseRTPAudioPayload)
|
|
|
|
-------------------------------------------------------
|
|
|
|
|
|
|
|
This class derives from GstBaseRTPPayload.
|
|
|
|
It can be used for payloading audio codecs. It will only work with constant
|
|
|
|
bitrate codecs. It supports both frame based and sample based codecs. It takes
|
|
|
|
care of packing up the audio data into RTP packets and filling up the headers
|
|
|
|
accordingly. The payloading is done based on the maximum MTU (mtu) and the
|
|
|
|
maximum time per packet (max-ptime). The general idea is to divide large data
|
|
|
|
buffers into smaller RTP packets. The RTP packet size is the minimum of either
|
|
|
|
the MTU, max-ptime (if set) or available data. Any residual data is always
|
|
|
|
sent in a last RTP packet (no minimum RTP packet size). The idea is that since
|
|
|
|
this is a real time protocol, data should never be delayed. In the case of
|
|
|
|
frame based codecs, the resulting RTP packets always contain full frames.
|
|
|
|
|
|
|
|
To use this base class, your child element needs to call either
|
|
|
|
gst_basertpaudiopayload_set_frame_based() or
|
|
|
|
gst_basertpaudiopayload_set_sample_based(). This is usually done in the
|
|
|
|
element's _init() function. Then, the child element must call either
|
|
|
|
gst_basertpaudiopayload_set_frame_options() or
|
|
|
|
gst_basertpaudiopayload_set_sample_options(). Since GstBaseRTPAudioPayload
|
|
|
|
derives from GstBaseRTPPayload, the child element must set any variables or
|
|
|
|
call/override any functions required by that base class. The child element
|
|
|
|
does not need to override any other functions specific to
|
|
|
|
GstBaseRTPAudioPayload.
|
|
|
|
|
|
|
|
This base class can be tested through it's children classes. Here is an
|
|
|
|
example using the iLBC payloader (frame based).
|
|
|
|
|
|
|
|
For 20ms mode :
|
|
|
|
|
|
|
|
GST_DEBUG="basertpaudiopayload:5" gst-launch-0.10 fakesrc sizetype=2
|
|
|
|
sizemax=114 datarate=1900 ! audio/x-iLBC, mode=20 ! rtpilbcpay
|
|
|
|
max-ptime="40000000" ! fakesink
|
|
|
|
|
|
|
|
For 30ms mode :
|
|
|
|
|
|
|
|
GST_DEBUG="basertpaudiopayload:5" gst-launch-0.10 fakesrc sizetype=2
|
|
|
|
sizemax=150 datarate=1662 ! audio/x-iLBC, mode=30 ! rtpilbcpay
|
|
|
|
max-ptime="60000000" ! fakesink
|
|
|
|
|
|
|
|
Here is an example using the uLaw payloader (sample based).
|
|
|
|
|
|
|
|
GST_DEBUG="basertpaudiopayload:5" gst-launch-0.10 fakesrc sizetype=2
|
|
|
|
sizemax=150 datarate=8000 ! audio/x-mulaw ! rtppcmupay max-ptime="6000000" !
|
|
|
|
fakesink
|
|
|
|
|
|
|
|
RTP Base Depayloader Class (GstBaseRTPDepayload)
|
|
|
|
------------------------------------------------
|
|
|
|
|
|
|
|
All RTP depayloader elements (audio or video) should derive from this class.
|