From 749765b9211d1a97e73af5924ceafb8d400246b9 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20P=C3=B6lsterl?= Date: Fri, 12 Jun 2009 18:05:30 +0200 Subject: [PATCH] Added vmethod unprepare to GstRTSPMedia The default implementation sets the state of the pipeline to GST_STATE_NULL --- gst/rtsp-server/rtsp-media.c | 18 +++++++++++++++++- gst/rtsp-server/rtsp-media.h | 3 +++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/gst/rtsp-server/rtsp-media.c b/gst/rtsp-server/rtsp-media.c index cbd4e8b..fdf4a7b 100644 --- a/gst/rtsp-server/rtsp-media.c +++ b/gst/rtsp-server/rtsp-media.c @@ -54,6 +54,7 @@ static void gst_rtsp_media_finalize (GObject * obj); static gpointer do_loop (GstRTSPMediaClass *klass); static gboolean default_handle_message (GstRTSPMedia *media, GstMessage *message); +static gboolean default_unprepare (GstRTSPMedia *media); static void unlock_streams (GstRTSPMedia *media); static guint gst_rtsp_media_signals[SIGNAL_LAST] = { 0 }; @@ -94,6 +95,7 @@ gst_rtsp_media_class_init (GstRTSPMediaClass * klass) g_critical ("could not start bus thread: %s", error->message); } klass->handle_message = default_handle_message; + klass->unprepare = default_unprepare; ssrc_stream_map_key = g_quark_from_static_string ("GstRTSPServer.stream"); } @@ -1373,12 +1375,20 @@ is_reused: gboolean gst_rtsp_media_unprepare (GstRTSPMedia *media) { + GstRTSPMediaClass *klass; + gboolean success; + if (!media->prepared) return TRUE; g_message ("unprepare media %p", media); media->target_state = GST_STATE_NULL; - gst_element_set_state (media->pipeline, GST_STATE_NULL); + + klass = GST_RTSP_MEDIA_GET_CLASS (media); + if (klass->unprepare) + success = klass->unprepare (media); + else + success = TRUE; media->prepared = FALSE; media->reused = TRUE; @@ -1387,6 +1397,12 @@ gst_rtsp_media_unprepare (GstRTSPMedia *media) * recreate it */ g_signal_emit (media, gst_rtsp_media_signals[SIGNAL_UNPREPARED], 0, NULL); + return success; +} + +static gboolean +default_unprepare (GstRTSPMedia *media) { + gst_element_set_state (media->pipeline, GST_STATE_NULL); return TRUE; } diff --git a/gst/rtsp-server/rtsp-media.h b/gst/rtsp-server/rtsp-media.h index eb513e3..b8b7b19 100644 --- a/gst/rtsp-server/rtsp-media.h +++ b/gst/rtsp-server/rtsp-media.h @@ -196,6 +196,8 @@ struct _GstRTSPMedia { * @loop: the mainloop for message. * @thread: the thread dispatching messages. * @handle_message: handle a message + * @unprepare: the default implementation sets the pipeline's state + * to GST_STATE_NULL. * * The RTSP media class */ @@ -209,6 +211,7 @@ struct _GstRTSPMediaClass { /* vmethods */ gboolean (*handle_message) (GstRTSPMedia *media, GstMessage *message); + gboolean (*unprepare) (GstRTSPMedia *media); /* signals */ gboolean (*unprepared) (GstRTSPMedia *media); -- 2.7.4