rtsp-server: port some more to 0.11

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.
This commit is contained in:
Wim Taymans 2011-12-09 10:53:30 +01:00
parent d098205996
commit fde25cd9c3
7 changed files with 51 additions and 78 deletions

View 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 */

View 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);

View 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;
}

View 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:

View 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];

View 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;

View 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,