/** * gst_rtp_buffer_set_extension_data: * @buffer: the buffer * @bits: the bits specific for the extension * @length: the length that counts the number of 32-bit words in * the extension, excluding the extension header ( therefore zero is a valid length) * * Set the extension bit of the rtp buffer and fill in the @bits and @length of the * extension header. It will refuse to set the extension data if the buffer is not * large enough. * * Returns: True if done. * * Since : 0.10.18 */ gboolean gst_rtp_buffer_set_extension_data (GstBuffer * buffer, guint16 bits, guint16 length) { guint32 min_size = 0; guint8 *data; data = GST_BUFFER_DATA (buffer); /* check if the buffer is big enough to hold the extension */ min_size = GST_RTP_HEADER_LEN + GST_RTP_HEADER_CSRC_SIZE (data) + 4 + length * sizeof (guint32); if (G_UNLIKELY (min_size > GST_BUFFER_SIZE (buffer))) goto too_small; /* now we can set the extension bit */ gst_rtp_buffer_set_extension (buffer, TRUE); data += GST_RTP_HEADER_LEN + GST_RTP_HEADER_CSRC_SIZE (data); GST_WRITE_UINT16_BE (data, bits); GST_WRITE_UINT16_BE (data + 2, length); return TRUE; /* ERRORS */ too_small: { g_warning ("rtp buffer too small: need more than %d bytes but only have %d bytes", min_size, GST_BUFFER_SIZE (buffer)); return FALSE; } }
EXPORT_C #endif gboolean gst_rtp_buffer_set_extension_data (GstBuffer * buffer, guint16 bits, guint16 length) { guint32 min_size = 0; guint8 *data; g_return_val_if_fail (GST_IS_BUFFER (buffer), FALSE); g_return_val_if_fail (GST_BUFFER_DATA (buffer) != NULL, FALSE); gst_rtp_buffer_set_extension (buffer, TRUE); min_size = GST_RTP_HEADER_LEN + GST_RTP_HEADER_CSRC_SIZE (buffer) + 4 + length * sizeof (guint32); if (min_size > GST_BUFFER_SIZE (buffer)) { GST_WARNING_OBJECT (buffer, "rtp buffer too small: need more than %d bytes but only have %d bytes", min_size, GST_BUFFER_SIZE (buffer)); return FALSE; } data = GST_BUFFER_DATA (buffer) + GST_RTP_HEADER_LEN + GST_RTP_HEADER_CSRC_SIZE (buffer); GST_WRITE_UINT16_BE (data, bits); GST_WRITE_UINT16_BE (data + 2, length); return TRUE; }
/** * gst_rtp_buffer_get_extension_data: * @buffer: the buffer * @bits: location for result bits * @data: location for data * @wordlen: location for length of @data in 32 bits words * * Get the extension data. @bits will contain the extension 16 bits of custom * data. @data will point to the data in the extension and @wordlen will contain * the length of @data in 32 bits words. * * If @buffer did not contain an extension, this function will return %FALSE * with @bits, @data and @wordlen unchanged. * * Returns: TRUE if @buffer had the extension bit set. * * Since: 0.10.15 */ gboolean gst_rtp_buffer_get_extension_data (GstBuffer * buffer, guint16 * bits, gpointer * data, guint * wordlen) { guint len; guint8 *pdata; pdata = GST_BUFFER_DATA (buffer); if (!GST_RTP_HEADER_EXTENSION (pdata)) return FALSE; /* move to the extension */ len = GST_RTP_HEADER_LEN + GST_RTP_HEADER_CSRC_SIZE (pdata); pdata += len; if (bits) *bits = GST_READ_UINT16_BE (pdata); if (wordlen) *wordlen = GST_READ_UINT16_BE (pdata + 2); if (data) *data = pdata + 4; return TRUE; }
EXPORT_C #endif gboolean gst_rtp_buffer_get_extension_data (GstBuffer * buffer, guint16 * bits, gpointer * data, guint * wordlen) { guint len; guint8 *pdata; g_return_val_if_fail (GST_IS_BUFFER (buffer), FALSE); g_return_val_if_fail (GST_BUFFER_DATA (buffer) != NULL, FALSE); if (!GST_RTP_HEADER_EXTENSION (buffer)) return FALSE; /* move to the extension */ len = GST_RTP_HEADER_LEN + GST_RTP_HEADER_CSRC_SIZE (buffer); pdata = GST_BUFFER_DATA (buffer) + len; if (bits) *bits = GST_READ_UINT16_BE (pdata); if (wordlen) *wordlen = GST_READ_UINT16_BE (pdata + 2); if (data) *data = pdata + 4; return TRUE; }
/** * gst_rtp_buffer_get_header_len: * @buffer: the buffer * * Return the total length of the header in @buffer. This include the length of * the fixed header, the CSRC list and the extension header. * * Returns: The total length of the header in @buffer. */ guint gst_rtp_buffer_get_header_len (GstBuffer * buffer) { guint len; guint8 *data; data = GST_BUFFER_DATA (buffer); len = GST_RTP_HEADER_LEN + GST_RTP_HEADER_CSRC_SIZE (data); if (GST_RTP_HEADER_EXTENSION (data)) len += GST_READ_UINT16_BE (data + len + 2) * 4 + 4; return len; }
EXPORT_C #endif guint gst_rtp_buffer_get_header_len (GstBuffer * buffer) { guint len; g_return_val_if_fail (GST_IS_BUFFER (buffer), 0); len = GST_RTP_HEADER_LEN + GST_RTP_HEADER_CSRC_SIZE (buffer); if (GST_RTP_HEADER_EXTENSION (buffer)) len += GST_READ_UINT16_BE (GST_BUFFER_DATA (buffer) + len + 2) * 4 + 4; return len; }