rtspsrc: Implement ONVIF backchannel support via TCP
authorSebastian Dröge <sebastian@centricular.com>
Fri, 26 Jan 2018 14:33:21 +0000 (16:33 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Fri, 16 Feb 2018 09:06:27 +0000 (11:06 +0200)
gst/rtsp/gstrtspsrc.c

index e424f47..6462510 100644 (file)
@@ -2851,9 +2851,48 @@ gst_rtspsrc_push_backchannel_buffer (GstRTSPSrc * src, guint id,
     goto out;
   }
 
-  g_signal_emit_by_name (stream->rtpsrc, "push-sample", sample, &res);
-  GST_DEBUG_OBJECT (src, "sent backchannel RTP sample %p: %s", sample,
-      gst_flow_get_name (res));
+  if (src->interleaved) {
+    GstBuffer *buffer;
+    GstMapInfo map;
+    guint8 *data;
+    guint size;
+    GstRTSPResult ret;
+    GstRTSPMessage message = { 0 };
+    GstRTSPConnInfo *conninfo;
+
+    buffer = gst_sample_get_buffer (sample);
+
+    gst_buffer_map (buffer, &map, GST_MAP_READ);
+    size = map.size;
+    data = map.data;
+
+    gst_rtsp_message_init_data (&message, stream->channel[0]);
+
+    /* lend the body data to the message */
+    gst_rtsp_message_take_body (&message, data, size);
+
+    if (stream->conninfo.connection)
+      conninfo = &stream->conninfo;
+    else
+      conninfo = &src->conninfo;
+
+    GST_DEBUG_OBJECT (src, "sending %u bytes backchannel RTP", size);
+    ret = gst_rtspsrc_connection_send (src, conninfo, &message, NULL);
+    GST_DEBUG_OBJECT (src, "sent backchannel RTP, %d", ret);
+
+    /* and steal it away again because we will free it when unreffing the
+     * buffer */
+    gst_rtsp_message_steal_body (&message, &data, &size);
+    gst_rtsp_message_unset (&message);
+
+    gst_buffer_unmap (buffer, &map);
+
+    res = GST_FLOW_OK;
+  } else {
+    g_signal_emit_by_name (stream->rtpsrc, "push-sample", sample, &res);
+    GST_DEBUG_OBJECT (src, "sent backchannel RTP sample %p: %s", sample,
+        gst_flow_get_name (res));
+  }
 
 out:
   gst_sample_unref (sample);