rtsp-server: port some more to 0.11
authorWim Taymans <wim.taymans@collabora.co.uk>
Fri, 9 Dec 2011 09:53:30 +0000 (10:53 +0100)
committerWim Taymans <wim.taymans@collabora.co.uk>
Fri, 9 Dec 2011 09:53:30 +0000 (10:53 +0100)
Fix caps.
Remove bufferlist stuff
Update for new API.
Add queue before appsink now that preroll-queue-len is gone.
Update for request pad changes.

examples/test-video.c
gst/rtsp-server/rtsp-client.c
gst/rtsp-server/rtsp-media-factory-uri.c
gst/rtsp-server/rtsp-media.c
gst/rtsp-server/rtsp-media.h
gst/rtsp-server/rtsp-session.c
gst/rtsp-server/rtsp-session.h

index c39c8b0..b2536cb 100644 (file)
@@ -80,9 +80,9 @@ main (int argc, char *argv[])
    * element with pay%d names will be a stream */
   factory = gst_rtsp_media_factory_new ();
   gst_rtsp_media_factory_set_launch (factory, "( "
-      "videotestsrc ! video/x-raw-yuv,width=352,height=288,framerate=15/1 ! "
+      "videotestsrc ! video/x-raw,width=352,height=288,framerate=15/1 ! "
       "x264enc ! rtph264pay name=pay0 pt=96 "
-      "audiotestsrc ! audio/x-raw-int,rate=8000 ! "
+      "audiotestsrc ! audio/x-raw,rate=8000 ! "
       "alawenc ! rtppcmapay name=pay1 pt=97 " ")");
 
   /* attach the test factory to the /test url */
index 3d4dd69..393884e 100644 (file)
@@ -445,8 +445,7 @@ link_stream (GstRTSPClient * client, GstRTSPSession * session,
 {
   GST_DEBUG ("client %p: linking stream %p", client, stream);
   gst_rtsp_session_stream_set_callbacks (stream, (GstRTSPSendFunc) do_send_data,
-      (GstRTSPSendFunc) do_send_data, (GstRTSPSendListFunc) do_send_data_list,
-      (GstRTSPSendListFunc) do_send_data_list, client, NULL);
+      (GstRTSPSendFunc) do_send_data, client, NULL);
   client->streams = g_list_prepend (client->streams, stream);
   /* make sure our session can't expire */
   gst_rtsp_session_prevent_expire (session);
@@ -457,8 +456,7 @@ unlink_stream (GstRTSPClient * client, GstRTSPSession * session,
     GstRTSPSessionStream * stream)
 {
   GST_DEBUG ("client %p: unlinking stream %p", client, stream);
-  gst_rtsp_session_stream_set_callbacks (stream, NULL, NULL, NULL, NULL, NULL,
-      NULL);
+  gst_rtsp_session_stream_set_callbacks (stream, NULL, NULL, NULL, NULL);
   client->streams = g_list_remove (client->streams, stream);
   /* our session can now expire */
   gst_rtsp_session_allow_expire (session);
index 2d38eea..2f32d2b 100644 (file)
@@ -394,7 +394,7 @@ pad_added_cb (GstElement * uribin, GstPad * pad, GstElement * element)
 
   /* get pad caps first, then call get_caps, then fail */
   if ((caps = gst_pad_get_current_caps (pad)) == NULL)
-    if ((caps = gst_pad_get_caps (pad, NULL)) == NULL)
+    if ((caps = gst_pad_query_caps (pad, NULL)) == NULL)
       goto no_caps;
 
   /* check for raw caps */
@@ -422,7 +422,7 @@ pad_added_cb (GstElement * uribin, GstPad * pad, GstElement * element)
     /* continue with new pad and caps */
     pad = gst_element_get_static_pad (convert, "src");
     if ((caps = gst_pad_get_current_caps (pad)) == NULL)
-      if ((caps = gst_pad_get_caps (pad, NULL)) == NULL)
+      if ((caps = gst_pad_query_caps (pad, NULL)) == NULL)
         goto no_caps;
   }
 
index ddf2d5b..028407e 100644 (file)
@@ -1197,17 +1197,19 @@ on_timeout (GObject * session, GObject * source, GstRTSPMediaStream * stream)
 }
 
 static GstFlowReturn
-handle_new_buffer (GstAppSink * sink, gpointer user_data)
+handle_new_sample (GstAppSink * sink, gpointer user_data)
 {
   GList *walk;
+  GstSample *sample;
   GstBuffer *buffer;
   GstRTSPMediaStream *stream;
 
-  buffer = gst_app_sink_pull_buffer (sink);
-  if (!buffer)
+  sample = gst_app_sink_pull_sample (sink);
+  if (!sample)
     return GST_FLOW_OK;
 
   stream = (GstRTSPMediaStream *) user_data;
+  buffer = gst_sample_get_buffer (sample);
 
   for (walk = stream->transports; walk; walk = g_list_next (walk)) {
     GstRTSPMediaTrans *tr = (GstRTSPMediaTrans *) walk->data;
@@ -1220,47 +1222,15 @@ handle_new_buffer (GstAppSink * sink, gpointer user_data)
         tr->send_rtcp (buffer, tr->transport->interleaved.max, tr->user_data);
     }
   }
-  gst_buffer_unref (buffer);
-
-  return GST_FLOW_OK;
-}
-
-static GstFlowReturn
-handle_new_buffer_list (GstAppSink * sink, gpointer user_data)
-{
-  GList *walk;
-  GstBufferList *blist;
-  GstRTSPMediaStream *stream;
-
-  blist = gst_app_sink_pull_buffer_list (sink);
-  if (!blist)
-    return GST_FLOW_OK;
-
-  stream = (GstRTSPMediaStream *) user_data;
-
-  for (walk = stream->transports; walk; walk = g_list_next (walk)) {
-    GstRTSPMediaTrans *tr = (GstRTSPMediaTrans *) walk->data;
-
-    if (GST_ELEMENT_CAST (sink) == stream->appsink[0]) {
-      if (tr->send_rtp_list)
-        tr->send_rtp_list (blist, tr->transport->interleaved.min,
-            tr->user_data);
-    } else {
-      if (tr->send_rtcp_list)
-        tr->send_rtcp_list (blist, tr->transport->interleaved.max,
-            tr->user_data);
-    }
-  }
-  gst_buffer_list_unref (blist);
+  gst_sample_unref (sample);
 
   return GST_FLOW_OK;
 }
 
 static GstAppSinkCallbacks sink_cb = {
   NULL,                         /* not interested in EOS */
-  NULL,                         /* not interested in preroll buffers */
-  handle_new_buffer,
-  handle_new_buffer_list
+  NULL,                         /* not interested in preroll samples */
+  handle_new_sample,
 };
 
 /* prepare the pipeline objects to handle @stream in @media */
@@ -1268,7 +1238,7 @@ static gboolean
 setup_stream (GstRTSPMediaStream * stream, guint idx, GstRTSPMedia * media)
 {
   gchar *name;
-  GstPad *pad, *teepad, *selpad;
+  GstPad *pad, *teepad, *queuepad, *selpad;
   GstPadLinkReturn ret;
   gint i;
 
@@ -1287,10 +1257,11 @@ setup_stream (GstRTSPMediaStream * stream, guint idx, GstRTSPMedia * media)
   /* create elements for the TCP transfer */
   for (i = 0; i < 2; i++) {
     stream->appsrc[i] = gst_element_factory_make ("appsrc", NULL);
+    stream->appqueue[i] = gst_element_factory_make ("queue", NULL);
     stream->appsink[i] = gst_element_factory_make ("appsink", NULL);
     g_object_set (stream->appsink[i], "async", FALSE, "sync", FALSE, NULL);
     g_object_set (stream->appsink[i], "emit-signals", FALSE, NULL);
-    g_object_set (stream->appsink[i], "preroll-queue-len", 1, NULL);
+    gst_bin_add (GST_BIN_CAST (media->pipeline), stream->appqueue[i]);
     gst_bin_add (GST_BIN_CAST (media->pipeline), stream->appsink[i]);
     gst_bin_add (GST_BIN_CAST (media->pipeline), stream->appsrc[i]);
     gst_app_sink_set_callbacks (GST_APP_SINK_CAST (stream->appsink[i]),
@@ -1298,19 +1269,19 @@ setup_stream (GstRTSPMediaStream * stream, guint idx, GstRTSPMedia * media)
   }
 
   /* hook up the stream to the RTP session elements. */
-  name = g_strdup_printf ("send_rtp_sink_%d", idx);
+  name = g_strdup_printf ("send_rtp_sink_%u", idx);
   stream->send_rtp_sink = gst_element_get_request_pad (media->rtpbin, name);
   g_free (name);
-  name = g_strdup_printf ("send_rtp_src_%d", idx);
+  name = g_strdup_printf ("send_rtp_src_%u", idx);
   stream->send_rtp_src = gst_element_get_static_pad (media->rtpbin, name);
   g_free (name);
-  name = g_strdup_printf ("send_rtcp_src_%d", idx);
+  name = g_strdup_printf ("send_rtcp_src_%u", idx);
   stream->send_rtcp_src = gst_element_get_request_pad (media->rtpbin, name);
   g_free (name);
-  name = g_strdup_printf ("recv_rtcp_sink_%d", idx);
+  name = g_strdup_printf ("recv_rtcp_sink_%u", idx);
   stream->recv_rtcp_sink = gst_element_get_request_pad (media->rtpbin, name);
   g_free (name);
-  name = g_strdup_printf ("recv_rtp_sink_%d", idx);
+  name = g_strdup_printf ("recv_rtp_sink_%u", idx);
   stream->recv_rtp_sink = gst_element_get_request_pad (media->rtpbin, name);
   g_free (name);
 
@@ -1345,18 +1316,24 @@ setup_stream (GstRTSPMediaStream * stream, guint idx, GstRTSPMedia * media)
   gst_object_unref (pad);
 
   /* link RTP sink, we're pretty sure this will work. */
-  teepad = gst_element_get_request_pad (stream->tee[0], "src%d");
+  teepad = gst_element_get_request_pad (stream->tee[0], "src_%u");
   pad = gst_element_get_static_pad (stream->udpsink[0], "sink");
   gst_pad_link (teepad, pad);
   gst_object_unref (pad);
   gst_object_unref (teepad);
 
-  teepad = gst_element_get_request_pad (stream->tee[0], "src%d");
-  pad = gst_element_get_static_pad (stream->appsink[0], "sink");
+  teepad = gst_element_get_request_pad (stream->tee[0], "src_%u");
+  pad = gst_element_get_static_pad (stream->appqueue[0], "sink");
   gst_pad_link (teepad, pad);
   gst_object_unref (pad);
   gst_object_unref (teepad);
 
+  queuepad = gst_element_get_static_pad (stream->appqueue[0], "src");
+  pad = gst_element_get_static_pad (stream->appsink[0], "sink");
+  gst_pad_link (queuepad, pad);
+  gst_object_unref (pad);
+  gst_object_unref (queuepad);
+
   /* make tee for RTCP */
   stream->tee[1] = gst_element_factory_make ("tee", NULL);
   gst_bin_add (GST_BIN_CAST (media->pipeline), stream->tee[1]);
@@ -1366,18 +1343,24 @@ setup_stream (GstRTSPMediaStream * stream, guint idx, GstRTSPMedia * media)
   gst_object_unref (pad);
 
   /* link RTCP elements */
-  teepad = gst_element_get_request_pad (stream->tee[1], "src%d");
+  teepad = gst_element_get_request_pad (stream->tee[1], "src_%u");
   pad = gst_element_get_static_pad (stream->udpsink[1], "sink");
   gst_pad_link (teepad, pad);
   gst_object_unref (pad);
   gst_object_unref (teepad);
 
-  teepad = gst_element_get_request_pad (stream->tee[1], "src%d");
-  pad = gst_element_get_static_pad (stream->appsink[1], "sink");
+  teepad = gst_element_get_request_pad (stream->tee[1], "src_%u");
+  pad = gst_element_get_static_pad (stream->appqueue[1], "sink");
   gst_pad_link (teepad, pad);
   gst_object_unref (pad);
   gst_object_unref (teepad);
 
+  queuepad = gst_element_get_static_pad (stream->appqueue[1], "src");
+  pad = gst_element_get_static_pad (stream->appsink[1], "sink");
+  gst_pad_link (queuepad, pad);
+  gst_object_unref (pad);
+  gst_object_unref (queuepad);
+
   /* make selector for the RTP receivers */
   stream->selector[0] = gst_element_factory_make ("funnel", NULL);
   gst_bin_add (GST_BIN_CAST (media->pipeline), stream->selector[0]);
@@ -1386,13 +1369,13 @@ setup_stream (GstRTSPMediaStream * stream, guint idx, GstRTSPMedia * media)
   gst_pad_link (pad, stream->recv_rtp_sink);
   gst_object_unref (pad);
 
-  selpad = gst_element_get_request_pad (stream->selector[0], "sink%d");
+  selpad = gst_element_get_request_pad (stream->selector[0], "sink_%u");
   pad = gst_element_get_static_pad (stream->udpsrc[0], "src");
   gst_pad_link (pad, selpad);
   gst_object_unref (pad);
   gst_object_unref (selpad);
 
-  selpad = gst_element_get_request_pad (stream->selector[0], "sink%d");
+  selpad = gst_element_get_request_pad (stream->selector[0], "sink_%u");
   pad = gst_element_get_static_pad (stream->appsrc[0], "src");
   gst_pad_link (pad, selpad);
   gst_object_unref (pad);
@@ -1406,13 +1389,13 @@ setup_stream (GstRTSPMediaStream * stream, guint idx, GstRTSPMedia * media)
   gst_pad_link (pad, stream->recv_rtcp_sink);
   gst_object_unref (pad);
 
-  selpad = gst_element_get_request_pad (stream->selector[1], "sink%d");
+  selpad = gst_element_get_request_pad (stream->selector[1], "sink_%u");
   pad = gst_element_get_static_pad (stream->udpsrc[1], "src");
   gst_pad_link (pad, selpad);
   gst_object_unref (pad);
   gst_object_unref (selpad);
 
-  selpad = gst_element_get_request_pad (stream->selector[1], "sink%d");
+  selpad = gst_element_get_request_pad (stream->selector[1], "sink_%u");
   pad = gst_element_get_static_pad (stream->appsrc[1], "src");
   gst_pad_link (pad, selpad);
   gst_object_unref (pad);
@@ -1701,9 +1684,9 @@ gst_rtsp_media_prepare (GstRTSPMedia * media)
   if (!media->reusable && media->reused)
     goto is_reused;
 
-  media->rtpbin = gst_element_factory_make ("gstrtpbin", NULL);
+  media->rtpbin = gst_element_factory_make ("rtpbin", NULL);
   if (media->rtpbin == NULL)
-    goto no_gstrtpbin;
+    goto no_rtpbin;
 
   GST_INFO ("preparing media %p", media);
 
@@ -1804,10 +1787,10 @@ is_reused:
     GST_WARNING ("can not reuse media %p", media);
     return FALSE;
   }
-no_gstrtpbin:
+no_rtpbin:
   {
-    GST_WARNING ("no gstrtpbin element");
-    g_warning ("failed to create element 'gstrtpbin', check your installation");
+    GST_WARNING ("no rtpbin element");
+    g_warning ("failed to create element 'rtpbin', check your installation");
     return FALSE;
   }
 state_failed:
index a7334ed..38f7c35 100644 (file)
@@ -42,7 +42,6 @@ typedef struct _GstRTSPMediaClass GstRTSPMediaClass;
 typedef struct _GstRTSPMediaTrans GstRTSPMediaTrans;
 
 typedef gboolean (*GstRTSPSendFunc)      (GstBuffer *buffer, guint8 channel, gpointer user_data);
-typedef gboolean (*GstRTSPSendListFunc)  (GstBufferList *blist, guint8 channel, gpointer user_data);
 typedef void     (*GstRTSPKeepAliveFunc) (gpointer user_data);
 
 /**
@@ -69,8 +68,6 @@ struct _GstRTSPMediaTrans {
 
   GstRTSPSendFunc      send_rtp;
   GstRTSPSendFunc      send_rtcp;
-  GstRTSPSendListFunc  send_rtp_list;
-  GstRTSPSendListFunc  send_rtcp_list;
   gpointer             user_data;
   GDestroyNotify       notify;
 
@@ -128,6 +125,7 @@ struct _GstRTSPMediaStream {
   GstElement   *udpsink[2];
   /* for TCP transport */
   GstElement   *appsrc[2];
+  GstElement   *appqueue[2];
   GstElement   *appsink[2];
 
   GstElement   *tee[2];
index ce86d43..de16415 100644 (file)
@@ -82,8 +82,7 @@ gst_rtsp_session_free_stream (GstRTSPSessionStream * stream)
   GST_INFO ("free session stream %p", stream);
 
   /* remove callbacks now */
-  gst_rtsp_session_stream_set_callbacks (stream, NULL, NULL, NULL, NULL, NULL,
-      NULL);
+  gst_rtsp_session_stream_set_callbacks (stream, NULL, NULL, NULL, NULL);
   gst_rtsp_session_stream_set_keepalive (stream, NULL, NULL, NULL);
 
   gst_rtsp_media_trans_cleanup (&stream->trans);
@@ -564,13 +563,10 @@ gst_rtsp_session_stream_set_transport (GstRTSPSessionStream * stream,
 void
 gst_rtsp_session_stream_set_callbacks (GstRTSPSessionStream * stream,
     GstRTSPSendFunc send_rtp, GstRTSPSendFunc send_rtcp,
-    GstRTSPSendListFunc send_rtp_list, GstRTSPSendListFunc send_rtcp_list,
     gpointer user_data, GDestroyNotify notify)
 {
   stream->trans.send_rtp = send_rtp;
   stream->trans.send_rtcp = send_rtcp;
-  stream->trans.send_rtp_list = send_rtp_list;
-  stream->trans.send_rtcp_list = send_rtcp_list;
   if (stream->trans.notify)
     stream->trans.notify (stream->trans.user_data);
   stream->trans.user_data = user_data;
index 4289ecb..973f196 100644 (file)
@@ -154,8 +154,6 @@ GstRTSPTransport *     gst_rtsp_session_stream_set_transport (GstRTSPSessionStre
 void                   gst_rtsp_session_stream_set_callbacks (GstRTSPSessionStream *stream,
                                                               GstRTSPSendFunc send_rtp,
                                                               GstRTSPSendFunc send_rtcp,
-                                                              GstRTSPSendListFunc send_rtp_list,
-                                                              GstRTSPSendListFunc send_rtcp_list,
                                                               gpointer user_data,
                                                               GDestroyNotify  notify);
 void                   gst_rtsp_session_stream_set_keepalive (GstRTSPSessionStream *stream,