diff --git a/gst/rtsp/gstrtspsrc.c b/gst/rtsp/gstrtspsrc.c index e424f47025..6462510452 100644 --- a/gst/rtsp/gstrtspsrc.c +++ b/gst/rtsp/gstrtspsrc.c @@ -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);