diff --git a/gst/rtsp-server/rtsp-client.c b/gst/rtsp-server/rtsp-client.c index c78aeddc9b..c04eec56e4 100644 --- a/gst/rtsp-server/rtsp-client.c +++ b/gst/rtsp-server/rtsp-client.c @@ -912,7 +912,7 @@ handle_blocksize (GstRTSPMedia * media, GstRTSPMessage * request) } else { if (blocksize > G_MAXUINT) blocksize = G_MAXUINT; - gst_rtsp_media_handle_mtu (media, (guint) blocksize); + gst_rtsp_media_set_mtu (media, blocksize); } } diff --git a/gst/rtsp-server/rtsp-media-mapping.h b/gst/rtsp-server/rtsp-media-mapping.h index 19f1acf67f..1f3e120245 100644 --- a/gst/rtsp-server/rtsp-media-mapping.h +++ b/gst/rtsp-server/rtsp-media-mapping.h @@ -42,6 +42,7 @@ typedef struct _GstRTSPMediaMappingClass GstRTSPMediaMappingClass; /** * GstRTSPMediaMapping: + * @parent: parent GObject * @mappings: the mountpoint to media mappings * * Creates a #GstRTSPMediaFactory object for a given url. @@ -54,6 +55,7 @@ struct _GstRTSPMediaMapping { /** * GstRTSPMediaMappingClass: + * @parent_class: parent GObject class * @find_factory: Create or return a previously cached #GstRTSPMediaFactory object * for the given url. the default implementation will use the mappings * added with gst_rtsp_media_mapping_add_factory(). diff --git a/gst/rtsp-server/rtsp-media.c b/gst/rtsp-server/rtsp-media.c index 7987a97f3e..65c470cc31 100644 --- a/gst/rtsp-server/rtsp-media.c +++ b/gst/rtsp-server/rtsp-media.c @@ -32,6 +32,7 @@ #define DEFAULT_EOS_SHUTDOWN FALSE #define DEFAULT_BUFFER_SIZE 0x80000 #define DEFAULT_MULTICAST_GROUP "224.2.0.1" +#define DEFAULT_MTU 0 /* define to dump received RTCP packets */ #undef DUMP_STATS @@ -45,6 +46,7 @@ enum PROP_EOS_SHUTDOWN, PROP_BUFFER_SIZE, PROP_MULTICAST_GROUP, + PROP_MTU, PROP_LAST }; @@ -71,7 +73,6 @@ static gboolean default_handle_message (GstRTSPMedia * media, static void finish_unprepare (GstRTSPMedia * media); static gboolean default_unprepare (GstRTSPMedia * media); static void unlock_streams (GstRTSPMedia * media); -static void default_handle_mtu (GstRTSPMedia * media, guint mtu); static guint gst_rtsp_media_signals[SIGNAL_LAST] = { 0 }; @@ -118,6 +119,12 @@ gst_rtsp_media_class_init (GstRTSPMediaClass * klass) "The Multicast group to send media to", DEFAULT_MULTICAST_GROUP, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_MTU, + g_param_spec_uint ("mtu", "MTU", + "The MTU for the payloaders (0 = default)", + 0, G_MAXUINT, DEFAULT_MTU, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + gst_rtsp_media_signals[SIGNAL_PREPARED] = g_signal_new ("prepared", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTSPMediaClass, prepared), NULL, NULL, @@ -142,7 +149,6 @@ gst_rtsp_media_class_init (GstRTSPMediaClass * klass) klass->handle_message = default_handle_message; klass->unprepare = default_unprepare; - klass->handle_mtu = default_handle_mtu; } static void @@ -211,6 +217,9 @@ gst_rtsp_media_get_property (GObject * object, guint propid, case PROP_MULTICAST_GROUP: g_value_take_string (value, gst_rtsp_media_get_multicast_group (media)); break; + case PROP_MTU: + g_value_set_uint (value, gst_rtsp_media_get_mtu (media)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, propid, pspec); } @@ -241,6 +250,9 @@ gst_rtsp_media_set_property (GObject * object, guint propid, case PROP_MULTICAST_GROUP: gst_rtsp_media_set_multicast_group (media, g_value_get_string (value)); break; + case PROP_MTU: + gst_rtsp_media_set_mtu (media, g_value_get_uint (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, propid, pspec); } @@ -570,6 +582,46 @@ gst_rtsp_media_get_auth (GstRTSPMedia * media) return result; } +/** + * gst_rtsp_media_set_mtu: + * @media: a #GstRTSPMedia + * @mtu: a new MTU + * + * Set maximum size of one RTP packet on the payloaders. + * The @mtu will be set on all streams. + */ +void +gst_rtsp_media_set_mtu (GstRTSPMedia * media, guint mtu) +{ + gint i; + + g_return_if_fail (GST_IS_RTSP_MEDIA (media)); + + media->mtu = mtu; + for (i = 0; i < media->streams->len; i++) { + GstRTSPStream *stream; + + GST_INFO ("Setting mtu %u for stream %d", mtu, i); + + stream = g_ptr_array_index (media->streams, i); + gst_rtsp_stream_set_mtu (stream, mtu); + } +} + +/** + * gst_rtsp_media_get_mtu: + * @media: a #GstRTSPMedia + * + * Get the configured MTU. + */ +guint +gst_rtsp_media_get_mtu (GstRTSPMedia * media) +{ + g_return_val_if_fail (GST_IS_RTSP_MEDIA (media), 0); + + return media->mtu; +} + /** * gst_rtsp_media_collect_streams: * @media: a #GstRTSPMedia @@ -663,6 +715,8 @@ gst_rtsp_media_create_stream (GstRTSPMedia * media, GstElement * payloader, g_free (name); stream = gst_rtsp_stream_new (idx, payloader, srcpad); + if (media->mtu) + gst_rtsp_stream_set_mtu (stream, media->mtu); g_ptr_array_add (media->streams, stream); @@ -1394,37 +1448,3 @@ gst_rtsp_media_set_state (GstRTSPMedia * media, GstState state, return TRUE; } - -static void -default_handle_mtu (GstRTSPMedia * media, guint mtu) -{ - gint i; - - for (i = 0; i < media->streams->len; i++) { - GstRTSPStream *stream; - - GST_INFO ("Setting mtu %d for stream %d", mtu, i); - - stream = g_ptr_array_index (media->streams, i); - - g_object_set (G_OBJECT (stream->payloader), "mtu", mtu, NULL); - } -} - -/** - * gst_rtsp_media_handle_mtu: - * @media: a #GstRTSPMedia - * @mtu: the mtu - * - * Set maximum size of one RTP packet on the payloaders. - */ -void -gst_rtsp_media_handle_mtu (GstRTSPMedia * media, guint mtu) -{ - GstRTSPMediaClass *klass; - - klass = GST_RTSP_MEDIA_GET_CLASS (media); - - if (klass->handle_mtu) - klass->handle_mtu (media, mtu); -} diff --git a/gst/rtsp-server/rtsp-media.h b/gst/rtsp-server/rtsp-media.h index 16b2cceab2..88c5d81f36 100644 --- a/gst/rtsp-server/rtsp-media.h +++ b/gst/rtsp-server/rtsp-media.h @@ -106,6 +106,7 @@ struct _GstRTSPMedia { guint buffer_size; GstRTSPAuth *auth; gchar *multicast_group; + guint mtu; GstElement *element; GPtrArray *streams; @@ -155,7 +156,6 @@ struct _GstRTSPMediaClass { /* vmethods */ gboolean (*handle_message) (GstRTSPMedia *media, GstMessage *message); gboolean (*unprepare) (GstRTSPMedia *media); - void (*handle_mtu) (GstRTSPMedia *media, guint mtu); /* signals */ gboolean (*prepared) (GstRTSPMedia *media); @@ -190,6 +190,9 @@ guint gst_rtsp_media_get_buffer_size (GstRTSPMedia *media); void gst_rtsp_media_set_multicast_group (GstRTSPMedia *media, const gchar * mc); gchar * gst_rtsp_media_get_multicast_group (GstRTSPMedia *media); +void gst_rtsp_media_set_mtu (GstRTSPMedia *media, guint mtu); +guint gst_rtsp_media_get_mtu (GstRTSPMedia *media); + /* prepare the media for playback */ gboolean gst_rtsp_media_prepare (GstRTSPMedia *media); @@ -212,8 +215,6 @@ gchar * gst_rtsp_media_get_range_string (GstRTSPMedia *media, gboo gboolean gst_rtsp_media_set_state (GstRTSPMedia *media, GstState state, GPtrArray *transports); -void gst_rtsp_media_handle_mtu (GstRTSPMedia *media, guint mtu); - G_END_DECLS #endif /* __GST_RTSP_MEDIA_H__ */ diff --git a/gst/rtsp-server/rtsp-server.h b/gst/rtsp-server/rtsp-server.h index 5220ce111b..83277e0d09 100644 --- a/gst/rtsp-server/rtsp-server.h +++ b/gst/rtsp-server/rtsp-server.h @@ -120,7 +120,9 @@ GstRTSPMediaMapping * gst_rtsp_server_get_media_mapping (GstRTSPServer *serve void gst_rtsp_server_set_auth (GstRTSPServer *server, GstRTSPAuth *auth); GstRTSPAuth * gst_rtsp_server_get_auth (GstRTSPServer *server); -gboolean gst_rtsp_server_transfer_connection (GstRTSPServer * server, GSocket *socket, const gchar * ip, gint port, const gchar *initial_buffer); +gboolean gst_rtsp_server_transfer_connection (GstRTSPServer * server, GSocket *socket, + const gchar * ip, gint port, + const gchar *initial_buffer); gboolean gst_rtsp_server_io_func (GSocket *socket, GIOCondition condition, GstRTSPServer *server); diff --git a/gst/rtsp-server/rtsp-stream.c b/gst/rtsp-server/rtsp-stream.c index 9f5bd1e77a..13360bfe93 100644 --- a/gst/rtsp-server/rtsp-stream.c +++ b/gst/rtsp-server/rtsp-stream.c @@ -123,6 +123,41 @@ gst_rtsp_stream_new (guint idx, GstElement * payloader, GstPad * srcpad) return stream; } +/** + * gst_rtsp_stream_set_mtu: + * @stream: a #GstRTSPStream + * @mtu: a new MTU + * + * Configure the mtu in the payloader of @stream to @mtu. + */ +void +gst_rtsp_stream_set_mtu (GstRTSPStream * stream, guint mtu) +{ + g_return_if_fail (GST_IS_RTSP_STREAM (stream)); + + g_object_set (G_OBJECT (stream->payloader), "mtu", mtu, NULL); +} + +/** + * gst_rtsp_stream_get_mtu: + * @stream: a #GstRTSPStream + * + * Get the configured MTU in the payloader of @stream. + * + * Returns: the MTU of the payloader. + */ +guint +gst_rtsp_stream_get_mtu (GstRTSPStream * stream) +{ + guint mtu; + + g_return_val_if_fail (GST_IS_RTSP_STREAM (stream), 0); + + g_object_get (G_OBJECT (stream->payloader), "mtu", &mtu, NULL); + + return mtu; +} + static gboolean alloc_ports (GstRTSPStream * stream) { diff --git a/gst/rtsp-server/rtsp-stream.h b/gst/rtsp-server/rtsp-stream.h index 29a813b09d..98403139f6 100644 --- a/gst/rtsp-server/rtsp-stream.h +++ b/gst/rtsp-server/rtsp-stream.h @@ -119,6 +119,9 @@ GType gst_rtsp_stream_get_type (void); GstRTSPStream * gst_rtsp_stream_new (guint idx, GstElement *payloader, GstPad *srcpad); +void gst_rtsp_stream_set_mtu (GstRTSPStream * stream, guint mtu); +guint gst_rtsp_stream_get_mtu (GstRTSPStream * stream); + gboolean gst_rtsp_stream_join_bin (GstRTSPStream * stream, GstBin *bin, GstElement *rtpbin); gboolean gst_rtsp_stream_leave_bin (GstRTSPStream * stream,