stream: Add functions for checking if stream is receiver or sender
authorOgnyan Tonchev <ognyan@axis.com>
Mon, 5 Feb 2018 10:49:07 +0000 (11:49 +0100)
committerSebastian Dröge <sebastian@centricular.com>
Fri, 16 Feb 2018 09:04:53 +0000 (11:04 +0200)
...and replace all checks for RECORD in GstRTSPMedia which are really
for "sender-only". This way the code becomes more generic and introducing
support for onvif-backchannel later on will require no changes in
GstRTSPMedia.

gst/rtsp-server/rtsp-media.c
gst/rtsp-server/rtsp-stream.c
gst/rtsp-server/rtsp-stream.h

index 433cc8e..193f5e0 100644 (file)
@@ -672,6 +672,25 @@ default_create_rtpbin (GstRTSPMedia * media)
   return rtpbin;
 }
 
+static gboolean
+is_receive_only (GstRTSPMedia * media)
+{
+  GstRTSPMediaPrivate *priv = media->priv;
+  gboolean recive_only = TRUE;
+  guint i;
+
+  for (i = 0; i < priv->streams->len; i++) {
+    GstRTSPStream *stream = g_ptr_array_index (priv->streams, i);
+    if (gst_rtsp_stream_is_sender (stream) ||
+        !gst_rtsp_stream_is_receiver (stream)) {
+      recive_only = FALSE;
+      break;
+    }
+  }
+
+  return recive_only;
+}
+
 /* must be called with state lock */
 static void
 check_seekable (GstRTSPMedia * media)
@@ -680,8 +699,8 @@ check_seekable (GstRTSPMedia * media)
   GstRTSPMediaPrivate *priv = media->priv;
 
   /* Update the seekable state of the pipeline in case it changed */
-  if ((priv->transport_mode & GST_RTSP_TRANSPORT_MODE_RECORD)) {
-    /* TODO: Seeking for RECORD? */
+  if (is_receive_only (media)) {
+    /* TODO: Seeking for "receive-only"? */
     priv->seekable = -1;
   } else {
     guint i, n = priv->streams->len;
@@ -2640,8 +2659,8 @@ default_handle_message (GstRTSPMedia * media, GstMessage * message)
       GST_DEBUG ("%p: went from %s to %s (pending %s)", media,
           gst_element_state_get_name (old), gst_element_state_get_name (new),
           gst_element_state_get_name (pending));
-      if ((priv->transport_mode & GST_RTSP_TRANSPORT_MODE_RECORD)
-          && old == GST_STATE_READY && new == GST_STATE_PAUSED) {
+      if (priv->no_more_pads_pending == 0 && is_receive_only (media) &&
+          old == GST_STATE_READY && new == GST_STATE_PAUSED) {
         GST_INFO ("%p: went to PAUSED, prepared now", media);
         collect_media_stats (media);
 
@@ -3851,7 +3870,7 @@ default_unsuspend (GstRTSPMedia * media)
 
   switch (priv->suspend_mode) {
     case GST_RTSP_SUSPEND_MODE_NONE:
-      if ((priv->transport_mode & GST_RTSP_TRANSPORT_MODE_RECORD))
+      if (is_receive_only (media))
         break;
       if (media_streams_blocking (media)) {
         gst_rtsp_media_set_status (media, GST_RTSP_MEDIA_STATUS_PREPARING);
index e47e95f..45b6238 100644 (file)
@@ -4590,3 +4590,51 @@ gst_rtsp_stream_is_complete (GstRTSPStream * stream)
 
   return ret;
 }
+
+/**
+ * gst_rtsp_stream_is_sender:
+ * @stream: a #GstRTSPStream
+ *
+ * Checks whether the stream is a sender.
+ *
+ * Returns: %TRUE if the stream is a sender and %FALSE otherwise.
+ */
+gboolean
+gst_rtsp_stream_is_sender (GstRTSPStream * stream)
+{
+  GstRTSPStreamPrivate *priv;
+  gboolean ret = FALSE;
+
+  g_return_val_if_fail (GST_IS_RTSP_STREAM (stream), FALSE);
+
+  priv = stream->priv;
+  g_mutex_lock (&priv->lock);
+  ret = (priv->srcpad != NULL);
+  g_mutex_unlock (&priv->lock);
+
+  return ret;
+}
+
+/**
+ * gst_rtsp_stream_is_receiver:
+ * @stream: a #GstRTSPStream
+ *
+ * Checks whether the stream is a receiver.
+ *
+ * Returns: %TRUE if the stream is a receiver and %FALSE otherwise.
+ */
+gboolean
+gst_rtsp_stream_is_receiver (GstRTSPStream * stream)
+{
+  GstRTSPStreamPrivate *priv;
+  gboolean ret = FALSE;
+
+  g_return_val_if_fail (GST_IS_RTSP_STREAM (stream), FALSE);
+
+  priv = stream->priv;
+  g_mutex_lock (&priv->lock);
+  ret = (priv->sinkpad != NULL);
+  g_mutex_unlock (&priv->lock);
+
+  return ret;
+}
index 3583d4a..dc248d1 100644 (file)
@@ -293,6 +293,12 @@ gboolean          gst_rtsp_stream_complete_stream (GstRTSPStream * stream, const
 GST_EXPORT
 gboolean           gst_rtsp_stream_is_complete (GstRTSPStream * stream);
 
+GST_EXPORT
+gboolean           gst_rtsp_stream_is_sender (GstRTSPStream * stream);
+
+GST_EXPORT
+gboolean           gst_rtsp_stream_is_receiver (GstRTSPStream * stream);
+
 /**
  * GstRTSPStreamTransportFilterFunc:
  * @stream: a #GstRTSPStream object