From 484a025f6df22131041e3c528f867854e06deace Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 29 Jan 2009 11:55:10 +0100 Subject: [PATCH] Add new RTSP message method to set header Add gst_rtsp_message_take_header() that takes ownership of the passed header value. This allows us to avoid an allocations and memory copy in some situations. API: GstRTSPMessage::gst_rtsp_message_take_header() --- docs/libs/gst-plugins-base-libs-sections.txt | 1 + gst-libs/gst/rtsp/gstrtspconnection.c | 6 ++--- gst-libs/gst/rtsp/gstrtspmessage.c | 34 ++++++++++++++++++++++------ gst-libs/gst/rtsp/gstrtspmessage.h | 3 +++ 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/docs/libs/gst-plugins-base-libs-sections.txt b/docs/libs/gst-plugins-base-libs-sections.txt index 7fcb89a..dfab0ea 100644 --- a/docs/libs/gst-plugins-base-libs-sections.txt +++ b/docs/libs/gst-plugins-base-libs-sections.txt @@ -1227,6 +1227,7 @@ gst_rtsp_message_new_data gst_rtsp_message_init_data gst_rtsp_message_parse_data gst_rtsp_message_add_header +gst_rtsp_message_take_header gst_rtsp_message_remove_header gst_rtsp_message_get_header gst_rtsp_message_append_headers diff --git a/gst-libs/gst/rtsp/gstrtspconnection.c b/gst-libs/gst/rtsp/gstrtspconnection.c index 58013d2..5d46e2c 100644 --- a/gst-libs/gst/rtsp/gstrtspconnection.c +++ b/gst-libs/gst/rtsp/gstrtspconnection.c @@ -398,12 +398,11 @@ add_auth_header (GstRTSPConnection * conn, GstRTSPMessage * message) gst_rtsp_base64_encode (user_pass, strlen (user_pass)); gchar *auth_string = g_strdup_printf ("Basic %s", user_pass64); - gst_rtsp_message_add_header (message, GST_RTSP_HDR_AUTHORIZATION, + gst_rtsp_message_take_header (message, GST_RTSP_HDR_AUTHORIZATION, auth_string); g_free (user_pass); g_free (user_pass64); - g_free (auth_string); break; } case GST_RTSP_AUTH_DIGEST:{ @@ -445,9 +444,8 @@ add_auth_header (GstRTSPConnection * conn, GstRTSPMessage * message) g_free (auth_string); auth_string = auth_string2; } - gst_rtsp_message_add_header (message, GST_RTSP_HDR_AUTHORIZATION, + gst_rtsp_message_take_header (message, GST_RTSP_HDR_AUTHORIZATION, auth_string); - g_free (auth_string); break; } default: diff --git a/gst-libs/gst/rtsp/gstrtspmessage.c b/gst-libs/gst/rtsp/gstrtspmessage.c index 9ec3ec1..44586b8 100644 --- a/gst-libs/gst/rtsp/gstrtspmessage.c +++ b/gst-libs/gst/rtsp/gstrtspmessage.c @@ -309,8 +309,7 @@ gst_rtsp_message_init_response (GstRTSPMessage * msg, GstRTSPStatusCode code, *pos = '\0'; } g_strchomp (header); - gst_rtsp_message_add_header (msg, GST_RTSP_HDR_SESSION, header); - g_free (header); + gst_rtsp_message_take_header (msg, GST_RTSP_HDR_SESSION, header); } /* FIXME copy more headers? */ @@ -491,18 +490,21 @@ gst_rtsp_message_free (GstRTSPMessage * msg) } /** - * gst_rtsp_message_add_header: + * gst_rtsp_message_take_header: * @msg: a #GstRTSPMessage * @field: a #GstRTSPHeaderField * @value: the value of the header * - * Add a header with key @field and @value to @msg. + * Add a header with key @field and @value to @msg. This function takes + * ownership of @value. * * Returns: a #GstRTSPResult. + * + * Since: 0.10.23 */ GstRTSPResult -gst_rtsp_message_add_header (GstRTSPMessage * msg, GstRTSPHeaderField field, - const gchar * value) +gst_rtsp_message_take_header (GstRTSPMessage * msg, GstRTSPHeaderField field, + gchar * value) { RTSPKeyValue key_value; @@ -510,7 +512,7 @@ gst_rtsp_message_add_header (GstRTSPMessage * msg, GstRTSPHeaderField field, g_return_val_if_fail (value != NULL, GST_RTSP_EINVAL); key_value.field = field; - key_value.value = g_strdup (value); + key_value.value = value; g_array_append_val (msg->hdr_fields, key_value); @@ -518,6 +520,24 @@ gst_rtsp_message_add_header (GstRTSPMessage * msg, GstRTSPHeaderField field, } /** + * gst_rtsp_message_add_header: + * @msg: a #GstRTSPMessage + * @field: a #GstRTSPHeaderField + * @value: the value of the header + * + * Add a header with key @field and @value to @msg. This function takes a copy + * of @value. + * + * Returns: a #GstRTSPResult. + */ +GstRTSPResult +gst_rtsp_message_add_header (GstRTSPMessage * msg, GstRTSPHeaderField field, + const gchar * value) +{ + return gst_rtsp_message_take_header (msg, field, g_strdup (value)); +} + +/** * gst_rtsp_message_remove_header: * @msg: a #GstRTSPMessage * @field: a #GstRTSPHeaderField diff --git a/gst-libs/gst/rtsp/gstrtspmessage.h b/gst-libs/gst/rtsp/gstrtspmessage.h index 1dd2c34..3fb15fa 100644 --- a/gst-libs/gst/rtsp/gstrtspmessage.h +++ b/gst-libs/gst/rtsp/gstrtspmessage.h @@ -147,6 +147,9 @@ GstRTSPResult gst_rtsp_message_parse_data (GstRTSPMessage *msg, GstRTSPResult gst_rtsp_message_add_header (GstRTSPMessage *msg, GstRTSPHeaderField field, const gchar *value); +GstRTSPResult gst_rtsp_message_take_header (GstRTSPMessage *msg, + GstRTSPHeaderField field, + gchar *value); GstRTSPResult gst_rtsp_message_remove_header (GstRTSPMessage *msg, GstRTSPHeaderField field, gint indx); -- 2.7.4