summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wtaymans@redhat.com>2013-12-18 15:57:03 +0100
committerWim Taymans <wtaymans@redhat.com>2013-12-18 15:57:03 +0100
commit7a947e8dfe424664ffdfb5397d506f785397dcea (patch)
tree25181f8d85ce1091475a471460a588d1dcd44edc
parent2c08b5b529053f6030e79c818ceb3525aefa6ec1 (diff)
client: add vmethod to configure media and streams
Implement a vmethod that can be used to configure the media and the streams based on the current context. Handle the blocksize handling in the default handler. See https://bugzilla.gnome.org/show_bug.cgi?id=720667
-rw-r--r--gst/rtsp-server/rtsp-client.c56
-rw-r--r--gst/rtsp-server/rtsp-client.h6
2 files changed, 39 insertions, 23 deletions
diff --git a/gst/rtsp-server/rtsp-client.c b/gst/rtsp-server/rtsp-client.c
index 3bbd64e..0822727 100644
--- a/gst/rtsp-server/rtsp-client.c
+++ b/gst/rtsp-server/rtsp-client.c
@@ -127,6 +127,8 @@ static void client_session_finalized (GstRTSPClient * client,
GstRTSPSession * session);
static void unlink_session_transports (GstRTSPClient * client,
GstRTSPSession * session, GstRTSPSessionMedia * sessmedia);
+static gboolean default_configure_client_media (GstRTSPClient * client,
+ GstRTSPMedia * media, GstRTSPStream * stream, GstRTSPContext * ctx);
static gboolean default_configure_client_transport (GstRTSPClient * client,
GstRTSPContext * ctx, GstRTSPTransport * ct);
static GstRTSPResult default_params_set (GstRTSPClient * client,
@@ -152,6 +154,7 @@ gst_rtsp_client_class_init (GstRTSPClientClass * klass)
gobject_class->finalize = gst_rtsp_client_finalize;
klass->create_sdp = create_sdp;
+ klass->configure_client_media = default_configure_client_media;
klass->configure_client_transport = default_configure_client_transport;
klass->params_set = default_params_set;
klass->params_get = default_params_get;
@@ -1265,11 +1268,11 @@ parse_transport (const char *transport, GstRTSPLowerTrans supported,
}
static gboolean
-handle_blocksize (GstRTSPMedia * media, GstRTSPStream * stream,
- GstRTSPMessage * request)
+default_configure_client_media (GstRTSPClient * client, GstRTSPMedia * media,
+ GstRTSPStream * stream, GstRTSPContext * ctx)
{
+ GstRTSPMessage *request = ctx->request;
gchar *blocksize_str;
- gboolean ret = TRUE;
if (gst_rtsp_message_get_header (request, GST_RTSP_HDR_BLOCKSIZE,
&blocksize_str, 0) == GST_RTSP_OK) {
@@ -1277,21 +1280,29 @@ handle_blocksize (GstRTSPMedia * media, GstRTSPStream * stream,
gchar *end;
blocksize = g_ascii_strtoull (blocksize_str, &end, 10);
- if (end == blocksize_str) {
- GST_ERROR ("failed to parse blocksize");
- ret = FALSE;
- } else {
- /* we don't want to change the mtu when this media
- * can be shared because it impacts other clients */
- if (gst_rtsp_media_is_shared (media))
- return TRUE;
-
- if (blocksize > G_MAXUINT)
- blocksize = G_MAXUINT;
- gst_rtsp_stream_set_mtu (stream, blocksize);
- }
+ if (end == blocksize_str)
+ goto parse_failed;
+
+ /* we don't want to change the mtu when this media
+ * can be shared because it impacts other clients */
+ if (gst_rtsp_media_is_shared (media))
+ goto done;
+
+ if (blocksize > G_MAXUINT)
+ blocksize = G_MAXUINT;
+
+ gst_rtsp_stream_set_mtu (stream, blocksize);
+ }
+done:
+ return TRUE;
+
+ /* ERRORS */
+parse_failed:
+ {
+ GST_ERROR_OBJECT (client, "failed to parse blocksize");
+ send_generic_response (client, GST_RTSP_STS_BAD_REQUEST, ctx);
+ return FALSE;
}
- return ret;
}
static gboolean
@@ -1518,9 +1529,8 @@ handle_setup_request (GstRTSPClient * client, GstRTSPContext * ctx)
ctx->sessmedia = sessmedia;
- /* set blocksize on this stream */
- if (!handle_blocksize (media, stream, ctx->request))
- goto invalid_blocksize;
+ if (!klass->configure_client_media (client, media, stream, ctx))
+ goto configure_media_failed_no_reply;
gst_rtsp_transport_new (&ct);
@@ -1649,12 +1659,12 @@ sessmedia_unavailable:
g_free (path);
return FALSE;
}
-invalid_blocksize:
+configure_media_failed_no_reply:
{
- GST_ERROR ("client %p: invalid blocksize", client);
- send_generic_response (client, GST_RTSP_STS_BAD_REQUEST, ctx);
+ GST_ERROR ("client %p: configure_media failed", client);
g_object_unref (session);
g_free (path);
+ /* error reply is already sent */
return FALSE;
}
unsupported_transports:
diff --git a/gst/rtsp-server/rtsp-client.h b/gst/rtsp-server/rtsp-client.h
index 94d52df..17086e5 100644
--- a/gst/rtsp-server/rtsp-client.h
+++ b/gst/rtsp-server/rtsp-client.h
@@ -76,6 +76,9 @@ struct _GstRTSPClient {
/**
* GstRTSPClientClass:
* @create_sdp: called when the SDP needs to be created for media.
+ * @configure_client_media: called when the stream in media needs to be configured.
+ * The default implementation will configure the blocksize on the payloader when
+ * spcified in the request headers.
* @configure_client_transport: called when the client transport needs to be
* configured.
* @params_set: set parameters. This function should also initialize the
@@ -89,6 +92,9 @@ struct _GstRTSPClientClass {
GObjectClass parent_class;
GstSDPMessage * (*create_sdp) (GstRTSPClient *client, GstRTSPMedia *media);
+ gboolean (*configure_client_media) (GstRTSPClient * client,
+ GstRTSPMedia * media, GstRTSPStream * stream,
+ GstRTSPContext * ctx);
gboolean (*configure_client_transport) (GstRTSPClient * client,
GstRTSPContext * ctx,
GstRTSPTransport * ct);