[Bug 785684] rtspconnection: Add API for sending multiple messages at once, and for having the message body consist of multiple chunks of memory

GStreamer (GNOME Bugzilla) bugzilla at gnome.org
Thu Oct 11 13:39:23 UTC 2018


https://bugzilla.gnome.org/show_bug.cgi?id=785684

Tim-Philipp Müller <t.i.m at zen.co.uk> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
 Attachment #373681|none                        |reviewed
             status|                            |

--- Comment #30 from Tim-Philipp Müller <t.i.m at zen.co.uk> ---
Comment on attachment 373681
  --> https://bugzilla.gnome.org/attachment.cgi?id=373681
rtsp: Add support for storing GstBuffers directly as body payload of messages

This patch is a bit unwieldy, maybe you could split out the "add new API to
GstRTSPMessage" bit from the "make use of it in RtspConnection" bit?

>Subject: [PATCH] rtsp: Add support for storing GstBuffers directly as body
> payload of messages
>
>This makes it unnecessary for callers to first merge together all
>memories. They are now written out one-by-one instead.
>
>At a later time this can make use of a g_output_stream_writev() and
>could also be extended with new API for sending multiple messages at
>once.

Might be worth explaining the background / scenario / reason you want to do
this, i.e. in what cases will this be helpful later (tcp interleaved?) or is it
a general optimisation?

Looking first at the RtspMessage part:

 - new API looks fine

 - The ABI compat union in the header is not really needed here if it's just a
pointer, is it? Not that it matters much, but it does make the code a bit
uglier, would be nicer not to do that :)



>--- a/gst-libs/gst/rtsp/gstrtspmessage.c
>+++ b/gst-libs/gst/rtsp/gstrtspmessage.c
>@@ -985,6 +990,13 @@ gst_rtsp_message_get_body (const GstRTSPMessage * msg, guint8 ** data,
>   g_return_val_if_fail (data != NULL, GST_RTSP_EINVAL);
>   g_return_val_if_fail (size != NULL, GST_RTSP_EINVAL);
> 
>+  if (msg->ABI.abi.body_buffer) {
>+    guint8 *data = g_malloc (gst_buffer_get_size (msg->ABI.abi.body_buffer));
>+    gst_buffer_extract (msg->ABI.abi.body_buffer, 0, data, gst_buffer_get_size (msg->ABI.abi.body_buffer));
>+    gst_buffer_replace (&((GstRTSPMessage *)msg)->ABI.abi.body_buffer, NULL);
>+    ((GstRTSPMessage *)msg)->body = data;
>+  }

Can we use gst_buffer_extract_dup() here?

Should we add a performance logging/warning or is it expected?


>@@ -1009,6 +1021,13 @@ gst_rtsp_message_steal_body (GstRTSPMessage * msg, guint8 ** data, guint * size)
>   g_return_val_if_fail (data != NULL, GST_RTSP_EINVAL);
>   g_return_val_if_fail (size != NULL, GST_RTSP_EINVAL);
> 
>+  if (msg->ABI.abi.body_buffer) {
>+    guint8 *data = g_malloc (gst_buffer_get_size (msg->ABI.abi.body_buffer));
>+    gst_buffer_extract (msg->ABI.abi.body_buffer, 0, data, gst_buffer_get_size (msg->ABI.abi.body_buffer));
>+    gst_buffer_replace (&msg->ABI.abi.body_buffer, NULL);
>+    msg->body = data;
>+  }

Can we use gst_buffer_extract_dup() here?



>+/**
>+ * gst_rtsp_message_set_body_buffer:
>+ * @msg: a #GstRTSPMessage
>+ * @buffer: a #GstBuffer
>+ *
>+ * Set the body of @msg to @buffer.
>+ *
>+ * Returns: #GST_RTSP_OK.
>+ */

Please add a "Since: 1.16" marker here (also to the other functions).


>+GstRTSPResult
>+gst_rtsp_message_get_body_buffer (const GstRTSPMessage * msg, GstBuffer ** buffer)
>+{
>+  g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL);
>+  g_return_val_if_fail (buffer != NULL, GST_RTSP_EINVAL);
>+
>+  *buffer = msg->ABI.abi.body_buffer;
>+
>+  return GST_RTSP_OK;
>+}

Is it an error to call this if only a normal data body was set but not a
buffer? Or is it expected that in this case NULL will be returned to indicate
that a buffer was not set and perhaps the caller should try the old method? Or
should we create a fallback buffer? Should document what's expected/allowed in
the docs.


>@@ -1045,6 +1154,7 @@ gst_rtsp_message_dump (GstRTSPMessage * msg)
> {
>   guint8 *data;
>   guint size;
>+  GstBuffer *body_buffer;

I would suggest initialising this to NULL since we don't check return values
below and that will make coverity and such unhappy.


RtspConnection in separate comment.

-- 
You are receiving this mail because:
You are the QA Contact for the bug.
You are the assignee for the bug.


More information about the gstreamer-bugs mailing list