| This directory contains some RTP payloaders/depayloaders for different payload |
| types. Use one payloader/depayloder pair per payload. If several payloads can be |
| payloaded/depayloaded by the same element, make different copies of it, one for |
| each payload. |
| |
| The application/x-rtp mime type |
| ------------------------------- |
| |
| For valid RTP packets encapsulated in GstBuffers, we use the caps with |
| mime type application/x-rtp. |
| |
| The following fields can or must (*) be specified in the structure: |
| |
| * media: (String) [ "audio", "video", "application", "data", "control" ] |
| Defined in RFC 2327 in the SDP media announcement field. |
| Converted to lower case. |
| |
| * payload: (int) [0, 127] |
| For audio and video, these will normally be a media payload type as |
| defined in the RTP Audio/Video Profile. For dynamicaly allocated |
| payload types, this value will be >= 96 and the encoding-name must be |
| set. |
| |
| * clock-rate: (int) [0 - MAXINT] |
| The RTP clock rate. |
| |
| encoding-name: (String) ANY |
| typically second part of the mime type. ex. MP4V-ES. only required if |
| payload type >= 96. Converted to upper case. |
| |
| encoding-params: (String) ANY |
| extra encoding parameters (as in the SDP a=rtpmap: field). only required |
| if different from the default of the encoding-name. |
| Converted to lower-case. |
| |
| ssrc: (uint) [0 - MAXINT] |
| The ssrc value currently in use. (default = the SSRC of the first RTP |
| packet) |
| |
| timestamp-offset: (uint) [0 - MAXINT] |
| The RTP time representing time npt-start. (default = rtptime of first RTP |
| packet). |
| |
| seqnum-offset: (uint) [0 - MAXINT] |
| The RTP sequence number representing the first rtp packet. When this |
| parameter is given, all sequence numbers below this seqnum should be |
| ignored. (default = seqnum of first RTP packet). |
| |
| npt-start: (uint64) [0 - MAXINT] |
| The Normal Play Time for clock-base. This is the position in the stream and |
| is between 0 and the duration of the stream. This value is expressed in |
| nanoseconds GstClockTime. (default = 0) |
| |
| npt-stop: (uint64) [0 - MAXINT] |
| The last position in the stream. This value is expressed in nanoseconds |
| GstClockTime. (default = -1, stop unknown) |
| |
| play-speed: (gdouble) [-MIN - MAX] |
| The intended playback speed of the stream. The client is delivered data at |
| the adjusted speed. The client should adjust its playback speed with this |
| value and thus corresponds to the GStreamer rate field in the NEWSEGMENT |
| event. (default = 1.0) |
| |
| play-scale: (gdouble) [-MIN - MAX] |
| The rate already applied to the stream. The client is delivered a stream |
| that is scaled by this amount. This value is used to adjust position |
| reporting and corresponds to the GStream applied-rate field in the |
| NEWSEGMENT event. (default = 1.0) |
| |
| maxptime: (uint) [0, MAX] |
| The maxptime as defined in RFC 4566, this defines the maximum size of a |
| packet. It overrides the max-ptime property of payloaders. |
| |
| Optional parameters as key/value pairs, media type specific. The value type |
| should be of type G_TYPE_STRING. The key is converted to lower-case. The |
| value is left in its original case. |
| A parameter with no value is converted to <param>=1. |
| |
| Example: |
| |
| "application/x-rtp", |
| "media", G_TYPE_STRING, "audio", -. |
| "payload", G_TYPE_INT, 96, | - required |
| "clock-rate", G_TYPE_INT, 8000, -' |
| "encoding-name", G_TYPE_STRING, "AMR", -. - required since payload >= 96 |
| "encoding-params", G_TYPE_STRING, "1", -' - optional param for AMR |
| "octet-align", G_TYPE_STRING, "1", -. |
| "crc", G_TYPE_STRING, "0", | |
| "robust-sorting", G_TYPE_STRING, "0", | AMR specific params. |
| "interleaving", G_TYPE_STRING, "0", -' |
| |
| Mapping of caps to and from SDP fields: |
| |
| m=<media> <udp port> RTP/AVP <payload> -] media and payload from caps |
| a=rtpmap:<payload> <encoding-name>/<clock-rate>[/<encoding-params>] |
| -> when <payload> >= 96 |
| a=fmtp:<payload> <param>=<value>;... |
| |
| For above caps: |
| |
| m=audio <udp port> RTP/AVP 96 |
| a=rtpmap:96 AMR/8000/1 |
| a=fmtp:96 octet-align=1;crc=0;robust-sorting=0;interleaving=0 |
| |
| Attributes are converted as follows: |
| |
| IANA registered attribute names are prepended with 'a-' before putting them in |
| the caps. Unregistered keys (starting with 'x-') are copied directly into the |
| caps. |
| |
| in RTSP, the SSRC is also sent. |
| |
| The optional parameters in the SDP fields are case insensitive. In the caps we |
| always use the lowercase names so that the SDP -> caps mapping remains |
| possible. |
| |
| Mapping of caps to NEWSEGMENT: |
| |
| rate: <play-speed> |
| applied-rate: <play-scale> |
| format: GST_FORMAT_TIME |
| start: <clock-base> * GST_SECOND / <clock-rate> |
| stop: if <ntp-stop> != -1 |
| <npt-stop> - <npt-start> + start |
| else |
| -1 |
| time: <npt-start> |
| |
| |
| Timestamping |
| ------------ |
| |
| RTP in GStreamer uses a combination of the RTP timestamps and GStreamer buffer |
| timestamps to ensure proper synchronisation at the sender and the receiver end. |
| |
| In RTP applications, the synchronisation is most complex at the receiver side. |
| |
| At the sender side, the RTP timestamps are generated in the payloaders based on |
| GStreamer timestamps. At the receiver, GStreamer timestamps are reconstructed |
| from the RTP timestamps and the GStreamer timestamps in the jitterbuffer. This |
| process is explained in more detail below. |
| |
| = synchronisation at the sender |
| |
| Individual streams at the sender are synchronised using GStreamer timestamps. |
| The payloader at the sender will convert the GStreamer timestamp into an RTP |
| timestamp using the following formula: |
| |
| RTP = ((RT - RT-base) * clock-rate / GST_SECOND) + RTP-offset |
| |
| RTP: the RTP timestamp for the stream. This value is truncated to |
| 32 bits. |
| RT: the GStreamer running time corresponding to the timestamp of the |
| packet to payload |
| RT-base: the GStreamer running time of the first packet encoded |
| clock-rate: the clock-rate of the stream |
| RTP-offset: a random RTP offset |
| |
| The RTP timestamp corresponding to RT-base is the clock-base (see caps above). |
| |
| In addition to setting an RTP timestamp in the RTP packet, the payloader is also |
| responsible for putting the GStreamer timestamp on the resulting output buffer. |
| This timestamp is used for further synchronisation at the sender pipeline, such |
| as for sending out the packet on the network. |
| |
| Notice that the absolute timing information is lost; if the sender is sending |
| multiple streams, the RTP timestamps in the packets do not contain enough |
| information to synchronize them in the receiver. The receiver can however use |
| the RTP timestamps to reconstruct the timing of the stream as it was created by |
| the sender according to the sender's clock. |
| |
| Because the payloaded packet contains both an RTP timestamp and a GStreamer |
| timestamp, it is possible for an RTP session manager to derive the relation |
| between the RTP and GST timestamps. This information is used by a session |
| manager to create SR reports. The NTP time in the report will contain the |
| running time converted to NTP time and the corresponding RTP timestamp. |
| |
| Note that at the sender side, the RTP and GStreamer timestamp both increment at |
| the same rate, the sender rate. This rate depends on the global pipeline clock |
| of the sender. |
| |
| Some pipelines to illustrate the process: |
| |
| gst-launch-1.0 v4l2src ! videoconvert ! avenc_h263p ! rtph263ppay ! udpsink |
| |
| v4l2src puts a GStreamer timestamp on the video frames base on the current |
| running_time. The encoder encodes and passed the timestamp on. The payloader |
| generates an RTP timestamp using the above formula and puts it in the RTP |
| packet. It also copies the incomming GStreamer timestamp on the output RTP |
| packet. udpsink synchronizes on the gstreamer timestamp before pushing out the |
| packet. |
| |
| |
| = synchronisation at the receiver |
| |
| The receiver is responsible for timestamping the received RTP packet with the |
| running_time of the clock at the time the packet was received. This GStreamer |
| timestamp reflects the receiver rate and depends on the global pipeline clock of |
| the receiver. The gstreamer timestamp of the received RTP packet contains a |
| certain amount of jitter introduced by the network. |
| |
| The most simple option for the receiver is to depayload the RTP packet and play |
| it back as soon as possible, this is with the timestamp when it was received |
| from the network. For the above sender pipeline this would be done with the |
| following pipeline: |
| |
| gst-launch-1.0 udpsrc caps="application/x-rtp, media=(string)video, |
| clock-rate=(int)90000, encoding-name=(string)H263-1998" ! rtph263pdepay ! |
| avdec_h263 ! autovideosink |
| |
| It is important that the depayloader copies the incomming GStreamer timestamp |
| directly to the depayloaded output buffer. It should never attempt to perform |
| any logic with the RTP timestamp, this task is for the jitterbuffer as we will |
| see next. |
| |
| The above pipeline does not attempt to deal with reordered packets or network |
| jitter, which could result in jerky playback in the case of high jitter or |
| corrupted video in the case of packet loss or reordering. This functionality is |
| performed by the gstrtpjitterbuffer in GStreamer. |
| |
| The task of the gstrtpjitterbuffer element is to: |
| |
| - deal with reordered packets based on the seqnum |
| - calculate the drift between the sender and receiver clocks using the |
| GStreamer timestamps (receiver clock rate) and RTP timestamps (sender clock |
| rate). |
| |
| To deal with reordered packet, the jitterbuffer holds on to the received RTP |
| packets in a queue for a configurable amount of time, called the latency. |
| |
| The jitterbuffer also eliminates network jitter and then tracks the drift |
| between the local clock (as expressed in the GStreamer timestamps) and the |
| remote clock (as expressed in the RTP timestamps). It will remove the jitter |
| and will apply the drift correction to the GStreamer timestamp before pushing |
| the buffer downstream. The result is that the depayloader receives a smoothed |
| GStreamer timestamp on the RTP packet, which is copied to the depayloaded data. |
| |
| The following pipeline illustrates a receiver with a jitterbuffer. |
| |
| gst-launch-1.0 udpsrc caps="application/x-rtp, media=(string)video, |
| clock-rate=(int)90000, encoding-name=(string)H263-1998" ! |
| rtpjitterbuffer latency=100 ! rtph263pdepay ! avdec_h263 ! autovideosink |
| |
| The latency property on the jitterbuffer controls the amount of delay (in |
| milliseconds) to apply to the outgoing packets. A higher latency will produce |
| smoother playback in networks with high jitter but cause a higher latency. |
| Choosing a good value for the latency is a tradeoff between the quality and |
| latency. The better the network, the lower the latency can be set. |
| |
| |
| usage with UDP |
| -------------- |
| |
| To correctly and completely use the RTP payloaders on the sender and the |
| receiver you need to write an application. It is not possible to write a full |
| blown RTP server with a single gst-launch-1.0 line. |
| |
| That said, it is possible to do something functional with a few gst-launch |
| lines. The biggest problem when constructing a correct gst-launch-1.0 line lies on |
| the receiver end. |
| |
| The receiver needs to know about the type of the RTP data along with a set of |
| RTP configuration parameters. This information is usually transmitted to the |
| client using some sort of session description language (SDP) over some reliable |
| channel (HTTP/RTSP/...). |
| |
| All of the required parameters to connect and use the RTP session on the |
| server can be found in the caps on the server end. The client receives this |
| information in some way (caps are converted to and from SDP, as explained above, |
| for example). |
| |
| Some gst-launch-1.0 lines: |
| |
| gst-launch-1.0 -v videotestsrc ! videoconvert ! avenc_h263p ! rtph263ppay ! udpsink |
| |
| Setting pipeline to PAUSED ... |
| /pipeline0/videotestsrc0.src: caps = video/x-raw, format=(string)I420, |
| width=(int)320, height=(int)240, framerate=(fraction)30/1 |
| Pipeline is PREROLLING ... |
| .... |
| /pipeline0/udpsink0.sink: caps = application/x-rtp, media=(string)video, |
| payload=(int)96, clock-rate=(int)90000, encoding-name=(string)H263-1998, |
| ssrc=(guint)527842345, clock-base=(guint)1150776941, seqnum-base=(guint)30982 |
| .... |
| Pipeline is PREROLLED ... |
| Setting pipeline to PLAYING ... |
| New clock: GstSystemClock |
| |
| Write down the caps on the udpsink and set them as the caps of the UDP |
| receiver: |
| |
| gst-launch-1.0 -v udpsrc caps="application/x-rtp, media=(string)video, |
| payload=(int)96, clock-rate=(int)90000, encoding-name=(string)H263-1998, |
| ssrc=(guint)527842345, clock-base=(guint)1150776941, seqnum-base=(guint)30982" |
| ! rtph263pdepay ! avdec_h263 ! autovideosink |
| |
| The receiver now displays an h263 image. Since there is no jitterbuffer in the |
| pipeline, frames will be displayed at the time when they are received. This can |
| result in jerky playback in the case of high network jitter or currupted video |
| when packets are dropped or reordered. |
| |
| Stream a quicktime file with mpeg4 video and AAC audio on port 5000 and port |
| 5002. |
| |
| gst-launch-1.0 -v filesrc location=~/data/sincity.mp4 ! qtdemux name=d ! queue ! rtpmp4vpay ! udpsink port=5000 |
| d. ! queue ! rtpmp4gpay ! udpsink port=5002 |
| .... |
| /pipeline0/udpsink0.sink: caps = application/x-rtp, media=(string)video, |
| payload=(int)96, clock-rate=(int)90000, encoding-name=(string)MP4V-ES, |
| ssrc=(guint)1162703703, clock-base=(guint)816135835, seqnum-base=(guint)9294, |
| profile-level-id=(string)3, config=(string)000001b003000001b50900000100000001200086c5d4c307d314043c1463000001b25876694430303334 |
| /pipeline0/udpsink1.sink: caps = application/x-rtp, media=(string)audio, |
| payload=(int)96, clock-rate=(int)44100, encoding-name=(string)MPEG4-GENERIC, |
| ssrc=(guint)3246149898, clock-base=(guint)4134514058, seqnum-base=(guint)57633, |
| encoding-params=(string)2, streamtype=(string)5, profile-level-id=(string)1, |
| mode=(string)aac-hbr, config=(string)1210, sizelength=(string)13, |
| indexlength=(string)3, indexdeltalength=(string)3 |
| .... |
| |
| Again copy the caps on both sinks to the receiver launch line |
| |
| gst-launch-1.0 |
| udpsrc port=5000 caps="application/x-rtp, media=(string)video, payload=(int)96, |
| clock-rate=(int)90000, encoding-name=(string)MP4V-ES, ssrc=(guint)1162703703, |
| clock-base=(guint)816135835, seqnum-base=(guint)9294, profile-level-id=(string)3, |
| config=(string)000001b003000001b50900000100000001200086c5d4c307d314043c1463000001b25876694430303334" |
| ! rtpmp4vdepay ! ffdec_mpeg4 ! autovideosink sync=false |
| udpsrc port=5002 caps="application/x-rtp, media=(string)audio, payload=(int)96, |
| clock-rate=(int)44100, encoding-name=(string)MPEG4-GENERIC, ssrc=(guint)3246149898, |
| clock-base=(guint)4134514058, seqnum-base=(guint)57633, encoding-params=(string)2, |
| streamtype=(string)5, profile-level-id=(string)1, mode=(string)aac-hbr, |
| config=(string)1210, sizelength=(string)13, indexlength=(string)3, |
| indexdeltalength=(string)3" |
| ! rtpmp4gdepay ! faad ! alsasink sync=false |
| |
| The caps on the udpsinks can be retrieved when the server pipeline prerolled to |
| PAUSED. |
| |
| The above pipeline sets sync=false on the audio and video sink which means that |
| no synchronisation will be performed in the sinks, they play the data when it |
| arrives. If you want to enable synchronisation in the sinks it is highly |
| recommended to use a gstrtpjitterbuffer after the udpsrc elements. |
| |
| Even when sync is enabled, the two different streams will not play synchronised |
| against eachother because the receiver does not have enough information to |
| perform this task. For this you need to add the rtpbin element in both the |
| sender and receiver pipeline and use additional sources and sinks to transmit |
| RTCP packets used for inter-stream synchronisation. |
| |
| The caps on the receiver side can be set on the UDP source elements when the |
| pipeline went to PAUSED. In that state no data is received from the UDP sources |
| as they are live sources and only produce data in PLAYING. |
| |
| |
| Relevant RFCs |
| ------------- |
| |
| 3550 RTP: A Transport Protocol for Real-Time Applications. ( 1889 Obsolete ) |
| |
| 2198 RTP Payload for Redundant Audio Data. |
| 3119 A More Loss-Tolerant RTP Payload Format for MP3 Audio. |
| |
| 2793 RTP Payload for Text Conversation. |
| |
| 2032 RTP Payload Format for H.261 Video Streams. |
| 2190 RTP Payload Format for H.263 Video Streams. |
| 2250 RTP Payload Format for MPEG1/MPEG2 Video. |
| 2343 RTP Payload Format for Bundled MPEG. |
| 2429 RTP Payload Format for the 1998 Version of ITU-T Rec. H.263 Video |
| 2431 RTP Payload Format for BT.656 Video Encoding. |
| 2435 RTP Payload Format for JPEG-compressed Video. |
| 3016 RTP Payload Format for MPEG-4 Audio/Visual Streams. |
| 3047 RTP Payload Format for ITU-T Recommendation G.722.1. |
| 3189 RTP Payload Format for DV (IEC 61834) Video. |
| 3190 RTP Payload Format for 12-bit DAT Audio and 20- and 24-bit Linear Sampled Audio. |
| 3389 Real-time Transport Protocol (RTP) Payload for Comfort Noise (CN) |
| 2733 An RTP Payload Format for Generic Forward Error Correction. |
| 2833 RTP Payload for DTMF Digits, Telephony Tones and Telephony |
| Signals. |
| 2862 RTP Payload Format for Real-Time Pointers. |
| 3351 RTP Profile for Audio and Video Conferences with Minimal Control. ( 1890 Obsolete ) |
| 3555 MIME Type Registration of RTP Payload Formats. |
| |
| 2508 Compressing IP/UDP/RTP Headers for Low-Speed Serial Links. |
| 1305 Network Time Protocol (Version 3) Specification, Implementation and Analysis. |
| 3339 Date and Time on the Internet: Timestamps. |
| 2246 The TLS Protocol Version 1.0 |
| 3546 Transport Layer Security (TLS) Extensions. ( Updates 2246 ) |
| |
| do we care? |
| ----------- |
| |
| 2029 RTP Payload Format of Sun's CellB Video Encoding. |
| |
| useful |
| ------ |
| |
| http://www.iana.org/assignments/rtp-parameters |