diff --git a/examples/test-video.c b/examples/test-video.c index c39c8b0828..b2536cb725 100644 --- a/examples/test-video.c +++ b/examples/test-video.c @@ -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 */ diff --git a/gst/rtsp-server/rtsp-client.c b/gst/rtsp-server/rtsp-client.c index 3d4dd69126..393884e546 100644 --- a/gst/rtsp-server/rtsp-client.c +++ b/gst/rtsp-server/rtsp-client.c @@ -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); diff --git a/gst/rtsp-server/rtsp-media-factory-uri.c b/gst/rtsp-server/rtsp-media-factory-uri.c index 2d38eea26e..2f32d2b418 100644 --- a/gst/rtsp-server/rtsp-media-factory-uri.c +++ b/gst/rtsp-server/rtsp-media-factory-uri.c @@ -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; } diff --git a/gst/rtsp-server/rtsp-media.c b/gst/rtsp-server/rtsp-media.c index ddf2d5bf45..028407e18d 100644 --- a/gst/rtsp-server/rtsp-media.c +++ b/gst/rtsp-server/rtsp-media.c @@ -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: diff --git a/gst/rtsp-server/rtsp-media.h b/gst/rtsp-server/rtsp-media.h index a7334edb90..38f7c353b6 100644 --- a/gst/rtsp-server/rtsp-media.h +++ b/gst/rtsp-server/rtsp-media.h @@ -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]; diff --git a/gst/rtsp-server/rtsp-session.c b/gst/rtsp-server/rtsp-session.c index ce86d43f27..de16415cb6 100644 --- a/gst/rtsp-server/rtsp-session.c +++ b/gst/rtsp-server/rtsp-session.c @@ -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; diff --git a/gst/rtsp-server/rtsp-session.h b/gst/rtsp-server/rtsp-session.h index 4289ecba8f..973f196cf4 100644 --- a/gst/rtsp-server/rtsp-session.h +++ b/gst/rtsp-server/rtsp-session.h @@ -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,