client: expose connection
[platform/upstream/gstreamer.git] / docs / README
index 76d4ab9..943382e 100644 (file)
@@ -1,7 +1,7 @@
 README 
 ------
 
-(Last updated on Fri 30 jan 2009, version 0.10.1.1)
+(Last updated on Fri 26 oct 2012, version 0.11.89.1)
 
 This HOWTO describes the basic usage of the GStreamer RTSP libraries and how you
 can build simple server applications with it.
@@ -10,11 +10,11 @@ can build simple server applications with it.
 
  The server relies heavily on the RTSP infrastructure of GStreamer. This includes
  all of the media acquisition, decoding, encoding, payloading and UDP/TCP
- streaming. We use the gstrtpbin element for all the session management. Most of
+ streaming. We use the rtpbin element for all the session management. Most of
  the RTSP message parsing and construction in the server is done using the RTSP
  library that comes with gst-plugins-base. 
 
- The result is that the server is rather small (a few 1000 lines of code) and easy
+ The result is that the server is rather small (a few 6000 lines of code) and easy
  to understand and extend. In its current state of development, things change
  fast, API and ABI are unstable. We encourage people to use it for their various
  use cases and participate by suggesting changes/features.
@@ -23,9 +23,11 @@ can build simple server applications with it.
  that provide reasonable default functionality but has a fair amount of hooks
  to override the default behaviour.
 
- The server currently integrates with the glib mainloop nicely. It is also a
- heavy user of multiple threads. It's currently not meant to be used in
- high-load scenarios and you should probably not put it on a public IP address.
+ The server currently integrates with the glib mainloop nicely. The network part
+ is currently single threaded but the GStreamer bits are a heavy user of multiple
+ threads. It's currently not meant to be used in high-load scenarios and because
+ no security audit has been done, you should probably not put it on a public
+ IP address.
 
 * Initialisation
 
@@ -58,7 +60,7 @@ can build simple server applications with it.
    server = gst_rtsp_server_new ();
 
  The server will by default listen on port 8554 for new connections. This can be
- changed by calling gst_rtsp_server_set_port() or with the 'port' GObject
+ changed by calling gst_rtsp_server_set_service() or with the 'service' GObject
  property. This makes it possible to run multiple server instances listening on
  multiple ports on one machine.
 
@@ -92,7 +94,7 @@ can build simple server applications with it.
    }
 
  The server manages two other objects: GstRTSPSessionPool and
- GstRTSPMediaMapping
+ GstRTSPMountPoints
 
  The GstRTSPSessionPool is an object that keeps track of all the active sessions
  in the server. A session will usually be kept for each client that performed a
@@ -102,13 +104,13 @@ can build simple server applications with it.
  The default implementation of the session pool is usually sufficient but
  alternative implementation can be used by the server.
 
- The GstRTSPMediaMapping object is more interesting and needs more configuration
- before the server object is useful. This object manages to mapping from a
+ The GstRTSPMountPoints object is more interesting and needs more configuration
+ before the server object is useful. This object manages the mapping from a
  request URL to a specific stream and its configuration. We explain in the next
  topic how to configure this object.
 
 
-* Making url mappings
+* Making url mount points
 
  Next we need to define what media is attached to a particular URL. What we want
  to achieve is that when the user asks our server for a specific URL, say /test,
@@ -117,7 +119,7 @@ can build simple server applications with it.
  
  The object that can create such pipeline is called a GstRTSPMediaFactory object. 
  The default implementation of GstRTSPMediaFactory allows you to easily create
- GStreamer pipelines using the gst-launch syntax. It possible to create a
+ GStreamer pipelines using the gst-launch syntax. It is possible to create a
  GstRTSPMediaFactory subclass that uses different methods for constructing
  pipelines.
 
@@ -139,19 +141,19 @@ can build simple server applications with it.
                 "( videotestsrc ! x264enc ! rtph264pay pt=96 name=pay0 )");
 
  Now that we have the media factory, we can attach it to a specific url. To do
- this we get the default GstRTSPMediaMapping from our server and add the url to
- factory mapping to it like this:
+ this we get the default GstRTSPMountPoints from our server and add the url to
+ factory mount points to it like this:
 
-   GstRTSPMediaMapping *mapping;
+   GstRTSPMountPoints *mounts;
 
    ...create server..create factory..
 
-   /* get the default mapping from the server */
-   mapping = gst_rtsp_server_get_media_mapping (server);
+   /* get the default mount points from the server */
+   mounts = gst_rtsp_server_get_mount_points (server);
 
    /* attach the video test signal to the "/test" URL */
-   gst_rtsp_media_mapping_add_factory (mapping, "/test", factory);
-   g_object_unref (mapping);
+   gst_rtsp_mount_points_add_factory (mounts, "/test", factory);
+   g_object_unref (mounts);
 
  When starting the server now and directing an RTP client to the URL (like with 
  vlc, mplayer or gstreamer):
@@ -161,15 +163,19 @@ can build simple server applications with it.
  a test signal will be streamed to the client. The full example code can be
  found in the examples/test-readme.c file.
 
+ Note that by default the factory will create a new pipeline for each client. If
+ you want to share a pipeline between clients, use
+ gst_rtsp_media_factory_set_shared().
+
 
 * more on GstRTSPMediaFactory
 
  The GstRTSPMediaFactory is responsible for creating and caching GstRTSPMedia
  objects. 
 
- A freshly created GstRTSPMedia object from the factory initialy only contains a
+ A freshly created GstRTSPMedia object from the factory initially only contains a
  GstElement containing the elements to produce the RTP streams for the media and
- a GArray of GstRTSPMediaStream objects describing the payloader and its source
+ a GPtrArray of GstRTSPStream objects describing the payloader and its source
  pad. The media is unprepared in this state.
 
  Usually the url will determine what kind of pipeline should be created. You can
@@ -190,7 +196,7 @@ can build simple server applications with it.
  After creating the GstRTSPMedia object from the factory, it can be prepared
  with gst_rtsp_media_prepare(). This method will put those objects in a
  GstPipeline and will construct and link the streaming elements and the
gstrtpbin session manager object.
+ rtpbin session manager object.
 
  The _prepare() method will then preroll the pipeline in order to figure out the
  caps on the payloaders. After the GstRTSPMedia prerolled it will be in the
@@ -201,8 +207,8 @@ can build simple server applications with it.
  used for sending and receiving RTP/RTCP from clients. These port numbers will
  have to be negotiated with the client in the SETUP requests.
 
- When preparing a GstRTSPMedia, a multifdsink is also constructed for streaming
the stream over TCP^when requested.
+ When preparing a GstRTSPMedia, an appsink and asppsrc is also constructed
for streaming the stream over TCP when requested.
 
 
 * the GstRTSPClient object
@@ -212,61 +218,212 @@ can build simple server applications with it.
  a new GstRTCPClient object, will configure the session pool and media mapper
  objects in it and will then call the accept function of the client.
 
- The default GstRTSPClient will accept the connection and will start a new
- GThread to handle the connection. In RTSP it is usual to keep the connection
- open between multiple RTSP requests. The client thread will simply block for a
- new GstRTSPMessage, will dispatch it and will send a response.
+ The default GstRTSPClient will accept the connection and will attach a watch to
+ the server mainloop. In RTSP it is usual to keep the connection
+ open between multiple RTSP requests. The client watch will be dispatched by the
+ server mainloop when a new GstRTSPMessage is received, which will then be
+ handled and a response will be sent.
+
+ The GstRTSPClient object remains alive for as long as a client has a TCP
+ connection open with the server. Since is possible for a client to open and close
+ the TCP connection between requests, we cannot store the state related
+ to the configured RTSP session in the GstRTSPClient object. This server state
+ is instead stored in the GstRTSPSession object, identified with the session
+ id.
+
+
+* GstRTSPSession
+
+ This object contains state about a specific RTSP session identified with a
+ session id. This state contains the configured streams and their associated
+ transports.
  
- We will briefly describe how it deals with some common requests.
+ When a GstRTSPClient performs a SETUP request, the server will allocate a new
+ GstRTSPSession with a unique session id from the GstRTSPSessionPool. The pool
+ maintains a list of all existing sessions and makes sure that no session id is
+ used multiple times. The session id is sent to the client so that the client
+ can refer to its previously configured state by sending the session id in
+ further requests.
+
+ A client will then use the session id to configure one or more
+ GstRTSPSessionMedia objects, identified by their url. This SessionMedia object
+ contains the configuration of a GstRTSPMedia and its configured
+ GstRTSPStreamTransport.
+
+
+* GstRTSPSessionMedia and GstRTSPStreamTransport
+
+ A GstRTSPSessionMedia is identified by a URL and is referenced by a
+ GstRTSPSession. It is created as soon as a client performs a SETUP operation on
+ a particular URL. It will contain a link to the GstRTSPMedia object associated
+ with the URL along with the state of the media and the configured transports
+ for each of the streams in the media.
+
+ Each SETUP request performed by the client will configure a
+ GstRTSPStreamTransport object linked to by the GstRTSPSessionMedia structure.
+ It will contain the transport information needed to send this stream to the
+ client. The GstRTSPStreamTransport also contains a link to the GstRTSPStream
+ object that generates the actual data to be streamed to the client.
+
+ Note how GstRTSPMedia and GstRTSPStream (the providers of the data to
+ stream) are decoupled from GstRTSPSessionMedia and GstRTSPStreamTransport (the
+ configuration of how to send this stream to a client) in order to be able to
+ send the data of one GstRTSPMedia to multiple clients.
+
+
+* media control
+
+ After a client has configured the transports for a GstRTSPMedia and its
+ GstRTSPStreams, the client can play/pause/stop the stream.
 
- - DESCRIBE:
+ The GstRTSPMedia object was prepared in the DESCRIBE call (or during SETUP when
+ the client skipped the DESCRIBE request). As seen earlier, this configures a
+ couple of udpsink and udpsrc elements to respectively send and receive the
+ media to clients.
 
-    locates the GstRTSPMedia for the url, prepares it and asks the sdp helper
-    function to construct an SDP from the caps of the prepared media pipeline.
-    It will also cache the url+media object so that it can be reused later.
+ When a client performs a PLAY request, its configured destination UDP ports are
+ added to the GstRTSPStream target destinations, at which point data will
+ be sent to the client. The corresponding GstRTSPMedia object will be set to the
+ PLAYING state if it was not allready in order to send the data to the
+ destination.
+
+ The server needs to prepare an RTP-Info header field in the PLAY response,
+ which consists of the sequence number and the RTP timestamp of the next RTP
+ packet. In order to achive this, the server queries the payloaders for this
+ information when it prerolled the pipeline.
+
+ When a client performs a PAUSE request, the destination UDP ports are removed
+ from the GstRTSPStream object and the GstRTSPMedia object is set to PAUSED
+ if no other destinations are configured anymore.
+
+
+* seeking
+
+ A seek is performed when a client sends a Range header in the PLAY request.
+ This only works when not dealing with shared (live) streams.
+
+ The server performs a GStreamer flushing seek on the media, waits for the
+ pipeline to preroll again and then responds to the client after collecting the
+ new RTP sequence number and timestamp from the payloaders.
+
+
+* session management
+
+ The server has to react to clients that suddenly disappear because of network
+ problems or otherwise. It needs to make sure that it can reasonable free the
+ resources that are used by the various objects in use for streaming when the
+ client appears to be gone.
+
+ Each of the GstRTSPSession objects managed by a GstRTSPSessionPool has
+ therefore a last_access field that contains the timestamp of when activity from
+ a client was last recorded.
  
- - SETUP
+ Various ways exist to detect activity from a client:
+
+  - RTSP keepalive requests. When a client is receiving RTP data, the RTSP TCP
+    connection is largely unused. It is the client's responsability to
+    periodically send keep-alive requests over the TCP channel.
+
+    Whenever a keep-alive request is received by the server (any request that
+    contains a session id, usually an OPTION or GET_PARAMETER request) the
+    last_access of the session is updated.
+
+  - Since it is not required for a client to keep the RTSP TCP connection open
+    while streaming, gst-rtsp-server also detects activity from clients by
+    looking at the RTCP messages it receives.
+
+    When an RTCP message is received from a client, the server looks in its list
+    of active ports if this message originates from a known host/port pair that
+    is currently active in a GstRTSPSession. If this is the case, the session is
+    kept alive.
+
+    Since the server does not know anything about the port number that will be
+    used by the client to send RTCP, this method does not always work. Later
+    RTSP RFCs will include support for negotiating this port number with the
+    server. Most clients however use the same port number for sending and
+    receiving RTCP exactly for this reason.
+
+ If there was no activity in a particular session for a long time (by default 60
+ seconds), the application should remove the session from the pool. For this,
+ the application should periodically (say every 2 seconds) check if no sessions
+ expired and call gst_rtsp_session_pool_cleanup() to remove them.
+ When a session is removed from the sessionpool and its last reference is
+ unreffef, all related objects and media are destroyed as if a TEARDOWN happened
+ from the client.
+
+
+* TEARDOWN
 
-    A new GstRTSPSession object will be created from the GstRTSPSessionPool
-    object configured in the GstRTSPClient. This session will contain the
-    configuration of the client regarding the media it is streaming and the
-    ports/transport it negotiated with the server.
+ A TEARDOWN request will first locate the GstRTSPSessionMedia of the URL. It
+ will then remove all transports from the streams, making sure that streaming
+ stops to the clients. It will then remove the GstRTSPSessionMedia and
+ GstRTSPStreamTransport objects. Finally the GstRTSPSession is released back
+ into the pool.
 
-    The sessionid is set in the response header. The client will add the
-    sessionid to any further SETUP/PLAY/PAUSE/TEARDOWN request so that we can
   always find the session again.
+ When there are no more references to the GstRTSPMedia, the media pipeline is
+ shut down (with _unprepare) and destroyed. This will then also destroy the
GstRTSPStream objects.
 
-    The session configuration for a sessionid will have a link to the prepared
-    GstRTSPMedia object of the stream. The port and transport of the client is
-    stored in the session configuration.
 
- - PLAY
+Objects
+-------
 
-    The session configuration is retrieved with the sessionid and the client
-    ports are configured in the UDP sinks, then the streaming to the client 
-    is started. 
+GstRTSPServer
+ - Toplevel object listening for connections and creating new
+   GstRTSPClient objects
 
- - PAUSE
+GstRTSPClient
+ - Handle RTSP Requests from connected clients. All other objects
+   are called by this object.
 
-    The session configuration is retrieved with the sessionid and the client
-    ports are removed from the UDP sinks, the streaming to the client 
-    pauses. 
+GstRTSPClientState
+ - Helper structure contaning the current state of the request
+   handled by the client.
 
- - TEARDOWN
+GstRTSPAuth
+ - Hooks for checking authorizations, all client activity will call this
+   object with the GstRTSPClientState structure. By default it supports
+   basic authentication.
 
-    The session configuration is released along with its link to the
-    GstRTSPMedia object. When no more clients are refering to the GstRTSPMedia
-    object, it can be released as well.
 
+GstRTSPMountPoints
+ - Maps a url to a GstRTSPMediaFactory implementation. The default
+   implementation uses a simple hashtable to map a url to a factory.
 
+GstRTSPMediaFactory
+ - Creates and caches GstRTSPMedia objects. The default implementation
+   can create GstRTSPMedia objects based on gst-launch syntax.
 
+GstRTSPMediaFactoryURI
+ - Specialized GstRTSPMediaFactory that can stream the content of any
+   URI.
 
+GstRTSPMedia
+ - The object that contains the media pipeline and various GstRTSPStream
+   objects that produce RTP packets
 
+GstRTSPStream
+ - Manages the elements to stream a stream of a GstRTSPMedia to one or
+   more GstRTSPStreamTransports.
 
 
+GstRTSPSessionPool
+ - Creates and manages GstRTSPSession objects identified by an id.
 
+GstRTSPSession
+ - An object containing the various GstRTSPSessionMedia objects managed
+   by this session.
 
+GstRTSPSessionMedia
+ - The state of a GstRTSPMedia and the configuration of a GstRTSPStream
+   objects. The configuration for the GstRTSPStream is stored in
+   GstRTSPStreamTransport objects.
 
+GstRTSPStreamTransport
+ - Configuration of how a GstRTSPStream is send to a particular client. It
+   contains the transport that was negotiated with the client in the SETUP
+   request.