rtsp-media: don't collect media stats when going to NULL
[platform/upstream/gstreamer.git] / docs / README
1 README 
2 ------
3
4 (Last updated on Fri 30 jan 2009, version 0.10.1.1)
5
6 This HOWTO describes the basic usage of the GStreamer RTSP libraries and how you
7 can build simple server applications with it.
8
9 * General
10
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. 
16
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.
21
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.
25
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.
29
30 * Initialisation
31
32  You need to initialize GStreamer before using any of the RTSP server functions.
33
34    #include <gst/gst.h>
35
36    int
37    main (int argc, char *argv[])
38    {
39      gst_init (&argc, &argv);
40
41      ...
42    }
43  
44  The server itself currently does not have any specific initialisation function
45  but that might change in the future.
46
47
48 * Creating the server
49
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:
53
54    #include <gst/rtsp-server/rtsp-server.h>
55
56    GstRTSPServer *server;
57
58    server = gst_rtsp_server_new ();
59
60  The server will by default listen on port 8554 for new connections. This can be
61  changed by calling gst_rtsp_server_set_service() or with the 'service' GObject
62  property. This makes it possible to run multiple server instances listening on
63  multiple ports on one machine.
64
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
69  useful.
70
71    #include <gst/gst.h>
72    #include <gst/rtsp-server/rtsp-server.h>
73
74    int
75    main (int argc, char *argv[])
76    {
77      GstRTSPServer *server;
78      GMainLoop *loop;
79
80      gst_init (&argc, &argv);
81
82      server = gst_rtsp_server_new ();
83
84      /* make a mainloop for the default context */
85      loop = g_main_loop_new (NULL, FALSE);
86
87      /* attach the server to the default maincontext */
88      gst_rtsp_server_attach (server, NULL);
89
90      /* start serving */
91      g_main_loop_run (loop);
92    }
93
94  The server manages two other objects: GstRTSPSessionPool and
95  GstRTSPMediaMapping. 
96
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.
104
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.
109
110
111 * Making url mappings
112
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
116  streams. 
117  
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 is possible to create a
121  GstRTSPMediaFactory subclass that uses different methods for constructing
122  pipelines.
123
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.
130
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.
133
134    GstRTSPMediaFactory *factory;
135
136    factory = gst_rtsp_media_factory_new ();
137
138    gst_rtsp_media_factory_set_launch (factory, 
139                 "( videotestsrc ! x264enc ! rtph264pay pt=96 name=pay0 )");
140
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:
144
145    GstRTSPMediaMapping *mapping;
146
147    ...create server..create factory..
148
149    /* get the default mapping from the server */
150    mapping = gst_rtsp_server_get_media_mapping (server);
151
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);
155
156  When starting the server now and directing an RTP client to the URL (like with 
157  vlc, mplayer or gstreamer):
158
159    rtsp://localhost:8554/test 
160
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.
163
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().
167
168
169 * more on GstRTSPMediaFactory
170
171  The GstRTSPMediaFactory is responsible for creating and caching GstRTSPMedia
172  objects. 
173
174  A freshly created GstRTSPMedia object from the factory initially 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.
178
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.
182
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.
188
189  When all objects created from a factory can be shared, you can set the shared
190  property directly on the factory.
191
192 * more on GstRTSPMedia
193
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.
198
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
202  clients.
203
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.
207
208  When preparing a GstRTSPMedia, a multifdsink is also constructed for streaming
209  the stream over TCP when requested.
210
211
212 * the GstRTSPClient object
213
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.
218
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.
224
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.
230
231
232 * GstRTSPSession
233
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
236  transports.
237  
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
243  further requests.
244
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. 
248
249
250 * GstRTSPSessionMedia and GstRTSPSessionStream
251
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.
257
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.
263
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.
268
269
270 * media control
271
272  After a client has configured the transports for a GstRTSPMedia and its
273  GstRTSPMediaStreams, the client can play/pause/stop the stream.
274
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
278  media to clients.
279
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
284  destination.
285
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.
290
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.
294
295
296 * seeking
297
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.
300
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.
304
305
306 * session management
307
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.
312
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.
316  
317  Various ways exist to detect activity from a client:
318
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.
322
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.
326
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.
330
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
334     kept alive.
335
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.
341
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.
345
346
347 * TEARDOWN
348
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
353  into the pool.
354
355  When there are no more references to the GstRTSPMedia, the media pipeline is
356  shut down and destroyed.
357
358