4 (Last updated on Fri 30 jan 2009, version 0.10.1.1)
6 This HOWTO describes the basic usage of the GStreamer RTSP libraries and how you
7 can build simple server applications with it.
11 The server relies heavily on the RTSP infrastructure of GStreamer. This includes
12 all of the media acquisition, decoding, encoding, payloading and UDP/TCP
13 streaming. We use the gstrtpbin element for all the session management. Most of
14 the RTSP message parsing and construction in the server is done using the RTSP
15 library that comes with gst-plugins-base.
17 The result is that the server is rather small (a few 1000 lines of code) and easy
18 to understand and extend. In its current state of development, things change
19 fast, API and ABI are unstable. We encourage people to use it for their various
20 use cases and participate by suggesting changes/features.
22 Most of the server is built as a library containing a bunch of GObject objects
23 that provide reasonable default functionality but has a fair amount of hooks
24 to override the default behaviour.
26 The server currently integrates with the glib mainloop nicely. It is also a
27 heavy user of multiple threads. It's currently not meant to be used in
28 high-load scenarios and you should probably not put it on a public IP address.
32 You need to initialize GStreamer before using any of the RTSP server functions.
37 main (int argc, char *argv[])
39 gst_init (&argc, &argv);
44 The server itself currently does not have any specific initialisation function
45 but that might change in the future.
50 The first thing you want to do is create a new GstRTSPServer object. This object
51 will handle all the new client connections to your server once it is added to a
52 GMainLoop. You can create a new server object like this:
54 #include <gst/rtsp-server/rtsp-server.h>
56 GstRTSPServer *server;
58 server = gst_rtsp_server_new ();
60 The server will by default listen on port 8554 for new connections. This can be
61 changed by calling gst_rtsp_server_set_port() or with the 'port' GObject
62 property. This makes it possible to run multiple server instances listening on
63 multiple ports on one machine.
65 We can make the server start listening on its default port by attaching it to a
66 mainloop. The following example shows how this is done and will start a server
67 on the default 8554 port. For any request we make, we will get a NOT_FOUND
68 error code because we need to configure more things before the server becomes
72 #include <gst/rtsp-server/rtsp-server.h>
75 main (int argc, char *argv[])
77 GstRTSPServer *server;
80 gst_init (&argc, &argv);
82 server = gst_rtsp_server_new ();
84 /* make a mainloop for the default context */
85 loop = g_main_loop_new (NULL, FALSE);
87 /* attach the server to the default maincontext */
88 gst_rtsp_server_attach (server, NULL);
91 g_main_loop_run (loop);
94 The server manages two other objects: GstRTSPSessionPool and
97 The GstRTSPSessionPool is an object that keeps track of all the active sessions
98 in the server. A session will usually be kept for each client that performed a
99 SETUP request for a certain media stream. It contains the configuration that
100 the client negotiated with the server to receive the particular stream, ie. the
101 transport used and port pairs for UDP along with the state of the streaming.
102 The default implementation of the session pool is usually sufficient but
103 alternative implementation can be used by the server.
105 The GstRTSPMediaMapping object is more interesting and needs more configuration
106 before the server object is useful. This object manages the mapping from a
107 request URL to a specific stream and its configuration. We explain in the next
108 topic how to configure this object.
111 * Making url mappings
113 Next we need to define what media is attached to a particular URL. What we want
114 to achieve is that when the user asks our server for a specific URL, say /test,
115 that we create (or reuse) a GStreamer pipeline that produces one or more RTP
118 The object that can create such pipeline is called a GstRTSPMediaFactory object.
119 The default implementation of GstRTSPMediaFactory allows you to easily create
120 GStreamer pipelines using the gst-launch syntax. It possible to create a
121 GstRTSPMediaFactory subclass that uses different methods for constructing
124 The default GstRTSPMediaFactory can be configured with a gst-launch line that
125 produces a toplevel bin (use '(' and ')' around the pipeline description to
126 force a toplevel GstBin instead of the default GstPipeline toplevel element).
127 The pipeline description should contain elements named payN, one for each
128 stream (ex. pay0, pay1, ...). Also, for increased compatibility each stream
129 should have a different payload type which can be configured on the payloader.
131 The following code snippet illustrates how to create a media factory that
132 creates an RTP feed of an H264 encoded test video signal.
134 GstRTSPMediaFactory *factory;
136 factory = gst_rtsp_media_factory_new ();
138 gst_rtsp_media_factory_set_launch (factory,
139 "( videotestsrc ! x264enc ! rtph264pay pt=96 name=pay0 )");
141 Now that we have the media factory, we can attach it to a specific url. To do
142 this we get the default GstRTSPMediaMapping from our server and add the url to
143 factory mapping to it like this:
145 GstRTSPMediaMapping *mapping;
147 ...create server..create factory..
149 /* get the default mapping from the server */
150 mapping = gst_rtsp_server_get_media_mapping (server);
152 /* attach the video test signal to the "/test" URL */
153 gst_rtsp_media_mapping_add_factory (mapping, "/test", factory);
154 g_object_unref (mapping);
156 When starting the server now and directing an RTP client to the URL (like with
157 vlc, mplayer or gstreamer):
159 rtsp://localhost:8554/test
161 a test signal will be streamed to the client. The full example code can be
162 found in the examples/test-readme.c file.
164 Note that by default the factory will create a new pipeline for each client. If
165 you want to share a pipeline between clients, use
166 gst_rtsp_media_factory_set_shared().
169 * more on GstRTSPMediaFactory
171 The GstRTSPMediaFactory is responsible for creating and caching GstRTSPMedia
174 A freshly created GstRTSPMedia object from the factory initialy only contains a
175 GstElement containing the elements to produce the RTP streams for the media and
176 a GArray of GstRTSPMediaStream objects describing the payloader and its source
177 pad. The media is unprepared in this state.
179 Usually the url will determine what kind of pipeline should be created. You can
180 for example use query parameters to configure certain parts of the pipeline or
181 select encoders and payloaders based on some url pattern.
183 When dealing with a live stream from, for example, a webcam, it can be
184 interesting to share the pipeline with multiple clients. This must be done when
185 only one instance of the video capture element can be used at a time. In this
186 case, the shared property of GstRTSPMedia must be used to instruct the default
187 GstRTSPMediaFactory implementation to cache the media.
189 When all objects created from a factory can be shared, you can set the shared
190 property directly on the factory.
192 * more on GstRTSPMedia
194 After creating the GstRTSPMedia object from the factory, it can be prepared
195 with gst_rtsp_media_prepare(). This method will put those objects in a
196 GstPipeline and will construct and link the streaming elements and the
197 gstrtpbin session manager object.
199 The _prepare() method will then preroll the pipeline in order to figure out the
200 caps on the payloaders. After the GstRTSPMedia prerolled it will be in the
201 prepared state and can be used for creating SDP files or for streaming to
204 The prepare method will also create 2 UDP ports for each stream that can be
205 used for sending and receiving RTP/RTCP from clients. These port numbers will
206 have to be negotiated with the client in the SETUP requests.
208 When preparing a GstRTSPMedia, a multifdsink is also constructed for streaming
209 the stream over TCP when requested.
212 * the GstRTSPClient object
214 When a server detects a new client connection on its port, it will call its
215 accept_client vmethod. The default implementation of this function will create
216 a new GstRTCPClient object, will configure the session pool and media mapper
217 objects in it and will then call the accept function of the client.
219 The default GstRTSPClient will accept the connection and will attach a watch to
220 the server mainloop. In RTSP it is usual to keep the connection
221 open between multiple RTSP requests. The client watch will be dispatched by the
222 server mainloop when a new GstRTSPMessage is received, which will then be
223 handled and a response will be sent.
225 The GstRTSPClient object remains alive for as long as a client has a TCP
226 connection open with the server. Since is possible for a client to open and close
227 the TCP connection between requests, we cannot store the state related
228 to the configured RTSP session in the GstRTSPClient object. This server state
229 is instead stored in the GstRTSPSession object.
234 This object contains state about a specific RTSP session identified with a
235 session id. This state contains the configured streams and their associated
238 When a GstRTSPClient performs a SETUP request, the server will allocate a new
239 GstRTSPSession with a unique session id from the GstRTSPSessionPool. The pool
240 maintains a list of all existing sessions and makes sure that no session id is
241 used multiple times. The session id is sent to the client so that the client
242 can refer to its previously configured state by sending the session id in
245 A client will then use the session id to configure one or more streams,
246 identified by their url. This information is kept in a GstRTSPSessionMedia
247 structure that is refered to from the GstRTSPSession.
250 * GstRTSPSessionMedia and GstRTSPSessionStream
252 A GstRTSPSessionMedia is identified by a URL and is referenced by a
253 GstRTSPSession. It is created as soon as a client performs a SETUP operation on
254 a particular URL. It will contain a link to the GstRTSPMedia object associated
255 with the URL along with the state of the media and the configured transports
256 for each of the streams in the media.
258 Each SETUP request performed by the client will configure a
259 GstRTSPSessionStream object linked to by the GstRTSPSessionMedia structure.
260 It will contain the transport information needed to send this stream to the
261 client. The GstRTSPSessionStream also contains a link to the GstRTSPMediaStream
262 object that generates the actual data to be streamed to the client.
264 Note how GstRTSPMedia and GstRTSPMediaStream (the providers of the data to
265 stream) are decoupled from GstRTSPSessionMedia and GstRTSPSessionStream (the
266 configuration of how to send this stream to a client) in order to be able to
267 send the data of one GstRTSPMedia to multiple clients.
272 After a client has configured the transports for a GstRTSPMedia and its
273 GstRTSPMediaStreams, the client can play/pause/stop the stream.
275 The GstRTSPMedia object was prepared in the DESCRIBE call (or during SETUP when
276 the client skipped the DESCRIBE request). As seen earlier, this configures a
277 couple of multiudpsink and udpsrc elements to respectively send and receive the
280 When a client performs a PLAY request, its configured destination UDP ports are
281 added to the GstRTSPMediaStream target destinations, at which point data will
282 be sent to the client. The corresponding GstRTSPMedia object will be set to the
283 PLAYING state if it was not allready in order to send the data to the
286 The server needs to prepare an RTP-Info header field in the PLAY response,
287 which consists of the sequence number and the RTP timestamp of the next RTP
288 packet. In order to achive this, the server queries the payloaders for this
289 information when it prerolled the pipeline.
291 When a client performs a PAUSE request, the destination UDP ports are removed
292 from the GstRTSPMediaStream object and the GstRTSPMedia object is set to PAUSED
293 if no other destinations are configured anymore.
298 A seek is performed when a client sends a Range header in the PLAY request.
299 This only works when not dealing with shared (live) streams.
301 The server performs a GStreamer flushing seek on the media, waits for the
302 pipeline to preroll again and then responds to the client after collecting the
303 new RTP sequence number and timestamp from the payloaders.
308 The server has to react to clients that suddenly disappear because of network
309 problems or otherwise. It needs to make sure that it can reasonable free the
310 resources that are used by the various objects in use for streaming when the
311 client appears to be gone.
313 Each of the GstRTSPSession objects managed by a GstRTSPSessionPool has
314 therefore a last_access field that contains the timestamp of when activity from
315 a client was last recorded.
317 Various ways exist to detect activity from a client:
319 - RTSP keepalive requests. When a client is receiving RTP data, the RTSP TCP
320 connection is largely unused. It is the client responsability to
321 periodically send keep-alive requests over the TCP channel.
323 Whenever a keep-alive request is received by the server (any request that
324 contains a session id, usually an OPTION or GET_PARAMETER request) the
325 last_access of the session is updated.
327 - Since it is not required for a client to keep the RTSP TCP connection open
328 while streaming, gst-rtsp-server also detects activity from clients by
329 looking at the RTCP messages it receives.
331 When an RTCP message is received from a client, the server looks in its list
332 of active ports if this message originates from a known host/port pair that
333 is currently active in a GstRTSPSession. If this is the case, the session is
336 Since the server does not know anything about the port number that will be
337 used by the client to send RTCP, this method does not always work. Later
338 RTSP RFCs will include support for negotiating this port number with the
339 server. Most clients however use the same port number for sending and
340 receiving RTCP exactly for this reason.
342 If there was no activity in a particular session for a long time (by default 60
343 seconds), the sessionpool will destroy the session along with all related
344 objects and media as if a TEARDOWN happened from the client.
349 A TEARDOWN request will first location the GstRTSPSessionMedia of the URL. It
350 will then remove all transports from the streams, making sure that streaming
351 stops to the client. It will then remove the GstRTSPSessionMedia and
352 GstRTSPSessionStream structures. Finally the GstRTSPSession is released back
355 When there are no more references to the GstRTSPMedia, the media pipeline is
356 shut down and destroyed.