From 6f93db5ab50cd9a742a09cb18d0337a888dbb306 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 3 Sep 2007 19:31:11 +0000 Subject: [PATCH] Fix parsing of RB blocks. Original commit message from CVS: * docs/libs/gst-plugins-base-libs-sections.txt: * gst-libs/gst/rtp/gstrtcpbuffer.c: (gst_rtcp_packet_get_rb), (gst_rtcp_packet_sdes_copy_entry), (gst_rtcp_ntp_to_unix), (gst_rtcp_unix_to_ntp): * gst-libs/gst/rtp/gstrtcpbuffer.h: Fix parsing of RB blocks. Fix docs. Added helper functions to convert to/from UNIX and NTP time. API: gst_rtcp_ntp_to_unix() API: gst_rtcp_unix_to_ntp() * gst-libs/gst/rtp/gstrtpbuffer.c: (gst_rtp_buffer_validate_data), (gst_rtp_buffer_get_header_len), (gst_rtp_buffer_get_extension_data), (gst_rtp_buffer_get_payload_subbuffer), (gst_rtp_buffer_get_payload_len), (gst_rtp_buffer_get_payload), (gst_rtp_buffer_ext_timestamp): * gst-libs/gst/rtp/gstrtpbuffer.h: Fix some more docs. Implement handling of packets with extensions. Fix padding check in _validate(). Added function to get extension data. API: gst_rtp_buffer_get_header_len() API: gst_rtp_buffer_get_extension_data() --- ChangeLog | 27 ++++ docs/libs/gst-plugins-base-libs-sections.txt | 159 ++++++++++++------- gst-libs/gst/rtp/gstrtcpbuffer.c | 60 ++++++- gst-libs/gst/rtp/gstrtcpbuffer.h | 34 ++-- gst-libs/gst/rtp/gstrtpbuffer.c | 111 +++++++++++-- gst-libs/gst/rtp/gstrtpbuffer.h | 80 +++++----- 6 files changed, 342 insertions(+), 129 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1bb47182f8..e0fd978b37 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,30 @@ +2007-09-03 Wim Taymans + + * docs/libs/gst-plugins-base-libs-sections.txt: + * gst-libs/gst/rtp/gstrtcpbuffer.c: (gst_rtcp_packet_get_rb), + (gst_rtcp_packet_sdes_copy_entry), (gst_rtcp_ntp_to_unix), + (gst_rtcp_unix_to_ntp): + * gst-libs/gst/rtp/gstrtcpbuffer.h: + Fix parsing of RB blocks. + Fix docs. + Added helper functions to convert to/from UNIX and NTP time. + API: gst_rtcp_ntp_to_unix() + API: gst_rtcp_unix_to_ntp() + + * gst-libs/gst/rtp/gstrtpbuffer.c: (gst_rtp_buffer_validate_data), + (gst_rtp_buffer_get_header_len), + (gst_rtp_buffer_get_extension_data), + (gst_rtp_buffer_get_payload_subbuffer), + (gst_rtp_buffer_get_payload_len), (gst_rtp_buffer_get_payload), + (gst_rtp_buffer_ext_timestamp): + * gst-libs/gst/rtp/gstrtpbuffer.h: + Fix some more docs. + Implement handling of packets with extensions. + Fix padding check in _validate(). + Added function to get extension data. + API: gst_rtp_buffer_get_header_len() + API: gst_rtp_buffer_get_extension_data() + 2007-09-03 Wim Taymans * gst-libs/gst/rtp/gstbasertpdepayload.c: diff --git a/docs/libs/gst-plugins-base-libs-sections.txt b/docs/libs/gst-plugins-base-libs-sections.txt index 501a8d9d41..b4078af530 100644 --- a/docs/libs/gst-plugins-base-libs-sections.txt +++ b/docs/libs/gst-plugins-base-libs-sections.txt @@ -846,45 +846,61 @@ GstRTCPType GstRTCPPacket GstRTCPSDESType -gst_rtcp_buffer_end -gst_rtcp_buffer_new -gst_rtcp_buffer_add_packet -gst_rtcp_buffer_get_first_packet -gst_rtcp_buffer_get_packet_count -gst_rtcp_buffer_new_copy_data gst_rtcp_buffer_new_take_data -gst_rtcp_buffer_validate +gst_rtcp_buffer_new_copy_data + gst_rtcp_buffer_validate_data -gst_rtcp_packet_add_rb -gst_rtcp_packet_bye_add_ssrc -gst_rtcp_packet_bye_add_ssrcs -gst_rtcp_packet_bye_get_nth_ssrc -gst_rtcp_packet_bye_get_reason -gst_rtcp_packet_bye_get_reason_len -gst_rtcp_packet_bye_get_ssrc_count -gst_rtcp_packet_bye_set_reason -gst_rtcp_packet_get_count -gst_rtcp_packet_get_length -gst_rtcp_packet_get_padding -gst_rtcp_packet_get_rb -gst_rtcp_packet_get_rb_count -gst_rtcp_packet_get_type +gst_rtcp_buffer_validate + +gst_rtcp_buffer_new +gst_rtcp_buffer_end + +gst_rtcp_buffer_get_packet_count +gst_rtcp_buffer_get_first_packet gst_rtcp_packet_move_to_next +gst_rtcp_buffer_add_packet gst_rtcp_packet_remove -gst_rtcp_packet_rr_get_ssrc -gst_rtcp_packet_rr_set_ssrc -gst_rtcp_packet_sdes_add_entry -gst_rtcp_packet_sdes_add_item -gst_rtcp_packet_sdes_first_entry -gst_rtcp_packet_sdes_first_item -gst_rtcp_packet_sdes_get_entry -gst_rtcp_packet_sdes_get_item_count -gst_rtcp_packet_sdes_get_ssrc -gst_rtcp_packet_sdes_next_entry -gst_rtcp_packet_sdes_next_item -gst_rtcp_packet_set_rb + +gst_rtcp_packet_get_padding +gst_rtcp_packet_get_count +gst_rtcp_packet_get_type +gst_rtcp_packet_get_length + gst_rtcp_packet_sr_get_sender_info gst_rtcp_packet_sr_set_sender_info + +gst_rtcp_packet_rr_get_ssrc +gst_rtcp_packet_rr_set_ssrc + +gst_rtcp_packet_get_rb_count +gst_rtcp_packet_get_rb +gst_rtcp_packet_add_rb +gst_rtcp_packet_set_rb + +gst_rtcp_packet_sdes_get_item_count +gst_rtcp_packet_sdes_first_item +gst_rtcp_packet_sdes_next_item +gst_rtcp_packet_sdes_get_ssrc +gst_rtcp_packet_sdes_first_entry +gst_rtcp_packet_sdes_next_entry +gst_rtcp_packet_sdes_get_entry +gst_rtcp_packet_sdes_copy_entry + +gst_rtcp_packet_sdes_add_item +gst_rtcp_packet_sdes_add_entry + +gst_rtcp_packet_bye_get_ssrc_count +gst_rtcp_packet_bye_get_nth_ssrc +gst_rtcp_packet_bye_add_ssrc +gst_rtcp_packet_bye_add_ssrcs + +gst_rtcp_packet_bye_get_reason_len +gst_rtcp_packet_bye_get_reason +gst_rtcp_packet_bye_set_reason + +gst_rtcp_ntp_to_unix +gst_rtcp_unix_to_ntp + @@ -896,42 +912,63 @@ GstRTPPayload GST_RTP_VERSION gst_rtp_buffer_allocate_data + +gst_rtp_buffer_new_take_data +gst_rtp_buffer_new_copy_data +gst_rtp_buffer_new_allocate +gst_rtp_buffer_new_allocate_len + gst_rtp_buffer_calc_header_len gst_rtp_buffer_calc_packet_len gst_rtp_buffer_calc_payload_len -gst_rtp_buffer_default_clock_rate -gst_rtp_buffer_get_csrc -gst_rtp_buffer_get_csrc_count -gst_rtp_buffer_get_extension -gst_rtp_buffer_get_marker + +gst_rtp_buffer_validate +gst_rtp_buffer_validate_data + +gst_rtp_buffer_set_packet_len gst_rtp_buffer_get_packet_len + +gst_rtp_buffer_get_header_len + +gst_rtp_buffer_get_version +gst_rtp_buffer_set_version + gst_rtp_buffer_get_padding -gst_rtp_buffer_get_payload +gst_rtp_buffer_set_padding +gst_rtp_buffer_pad_to + +gst_rtp_buffer_get_extension +gst_rtp_buffer_set_extension +gst_rtp_buffer_get_extension_data + +gst_rtp_buffer_get_ssrc +gst_rtp_buffer_set_ssrc + +gst_rtp_buffer_get_csrc_count +gst_rtp_buffer_get_csrc +gst_rtp_buffer_set_csrc + +gst_rtp_buffer_get_marker +gst_rtp_buffer_set_marker + +gst_rtp_buffer_get_payload_type +gst_rtp_buffer_set_payload_type + +gst_rtp_buffer_get_seq +gst_rtp_buffer_set_seq + +gst_rtp_buffer_get_timestamp +gst_rtp_buffer_set_timestamp + gst_rtp_buffer_get_payload_buffer gst_rtp_buffer_get_payload_subbuffer gst_rtp_buffer_get_payload_len -gst_rtp_buffer_get_payload_type -gst_rtp_buffer_get_seq -gst_rtp_buffer_get_ssrc -gst_rtp_buffer_get_timestamp -gst_rtp_buffer_get_version -gst_rtp_buffer_new_allocate -gst_rtp_buffer_new_allocate_len -gst_rtp_buffer_new_copy_data -gst_rtp_buffer_new_take_data -gst_rtp_buffer_pad_to -gst_rtp_buffer_set_csrc -gst_rtp_buffer_set_extension -gst_rtp_buffer_set_marker -gst_rtp_buffer_set_packet_len -gst_rtp_buffer_set_padding -gst_rtp_buffer_set_payload_type -gst_rtp_buffer_set_seq -gst_rtp_buffer_set_ssrc -gst_rtp_buffer_set_timestamp -gst_rtp_buffer_set_version -gst_rtp_buffer_validate -gst_rtp_buffer_validate_data +gst_rtp_buffer_get_payload + +gst_rtp_buffer_default_clock_rate +gst_rtp_buffer_compare_seqnum +gst_rtp_buffer_ext_timestamp + GST_RTP_PAYLOAD_DYNAMIC_STRING GST_RTP_PAYLOAD_G723_53_STRING diff --git a/gst-libs/gst/rtp/gstrtcpbuffer.c b/gst-libs/gst/rtp/gstrtcpbuffer.c index c1fca3c9b3..422cf574e5 100644 --- a/gst-libs/gst/rtp/gstrtcpbuffer.c +++ b/gst-libs/gst/rtp/gstrtcpbuffer.c @@ -23,7 +23,7 @@ /** * SECTION:gstrtcpbuffer * @short_description: Helper methods for dealing with RTCP buffers - * @see_also: gstbasertppayload, gstbasertpdepayload + * @see_also: #GstBaseRTPPayload, #GstBaseRTPDepayload, #gstrtpbuffer * * Note: The API in this module is not yet declared stable. * @@ -246,6 +246,9 @@ gst_rtcp_buffer_new (guint mtu) * * Finish @buffer after being constructured. This function is usually called * after gst_rtcp_buffer_new() and after adding the RTCP items to the new buffer. + * + * The function adjusts the size of @buffer with the total length of all the + * added packets. */ void gst_rtcp_buffer_end (GstBuffer * buffer) @@ -758,7 +761,6 @@ gst_rtcp_packet_get_rb (GstRTCPPacket * packet, guint nth, guint32 * ssrc, *ssrc = GST_READ_UINT32_BE (data); data += 4; tmp = GST_READ_UINT32_BE (data); - data += 4; if (fractionlost) *fractionlost = (tmp >> 24); if (packetslost) { @@ -1563,8 +1565,6 @@ gst_rtcp_packet_bye_get_reason (GstRTCPPacket * packet) * Set the reason string to @reason in @packet. * * Returns: TRUE if the string could be set. - * - * Note: Not implemented. */ gboolean gst_rtcp_packet_bye_set_reason (GstRTCPPacket * packet, const gchar * reason) @@ -1618,3 +1618,55 @@ no_space: return FALSE; } } + +/** + * gst_rtcp_ntp_to_unix: + * @ntptime: an NTP timestamp + * + * Converts an NTP time to UNIX nanoseconds. @ntptime can typically be + * the NTP time of an SR RTCP message and contains, in the upper 32 bits, the + * number of seconds since 1900 and, in the lower 32 bits, the fractional + * seconds. The resulting value will be the number of nanoseconds since 1970. + * + * Returns: the UNIX time for @ntptime in nanoseconds. + */ +guint64 +gst_rtcp_ntp_to_unix (guint64 ntptime) +{ + guint64 unixtime; + + /* conversion from NTP timestamp (seconds since 1900) to seconds since + * 1970. */ + unixtime = ntptime - (2208988800LL << 32); + /* conversion to nanoseconds */ + unixtime = gst_util_uint64_scale (unixtime, GST_SECOND, (1LL << 32)); + + return unixtime; +} + +/** + * gst_rtcp_unix_to_ntp: + * @unixtime: an UNIX timestamp in nanoseconds + * + * Converts a UNIX timestamp in nanoseconds to an NTP time. The caller should + * pass a value with nanoseconds since 1970. The NTP time will, in the upper + * 32 bits, contain the number of seconds since 1900 and, in the lower 32 + * bits, the fractional seconds. The resulting value can be used as an ntptime + * for constructing SR RTCP packets. + * + * Returns: the NTP time for @gsttime. + */ +guint64 +gst_rtcp_unix_to_ntp (guint64 unixtime) +{ + guint64 ntptime; + + /* convert clock time to NTP time. upper 32 bits should contain the seconds + * and the lower 32 bits, the fractions of a second. */ + ntptime = gst_util_uint64_scale (unixtime, (1LL << 32), GST_SECOND); + /* conversion from UNIX timestamp (seconds since 1970) to NTP (seconds + * since 1900). */ + ntptime += (2208988800LL << 32); + + return ntptime; +} diff --git a/gst-libs/gst/rtp/gstrtcpbuffer.h b/gst-libs/gst/rtp/gstrtcpbuffer.h index 384862e3a8..57cd6c8735 100644 --- a/gst-libs/gst/rtp/gstrtcpbuffer.h +++ b/gst-libs/gst/rtp/gstrtcpbuffer.h @@ -179,15 +179,15 @@ guint16 gst_rtcp_packet_get_length (GstRTCPPacket *packet); /* sender reports */ -void gst_rtcp_packet_sr_get_sender_info (GstRTCPPacket *packet, guint32 *ssrc, - guint64 *ntptime, guint32 *rtptime, - guint32 *packet_count, guint32 *octet_count); -void gst_rtcp_packet_sr_set_sender_info (GstRTCPPacket *packet, guint32 ssrc, - guint64 ntptime, guint32 rtptime, - guint32 packet_count, guint32 octet_count); +void gst_rtcp_packet_sr_get_sender_info (GstRTCPPacket *packet, guint32 *ssrc, + guint64 *ntptime, guint32 *rtptime, + guint32 *packet_count, guint32 *octet_count); +void gst_rtcp_packet_sr_set_sender_info (GstRTCPPacket *packet, guint32 ssrc, + guint64 ntptime, guint32 rtptime, + guint32 packet_count, guint32 octet_count); /* receiver reports */ -guint32 gst_rtcp_packet_rr_get_ssrc (GstRTCPPacket *packet); -void gst_rtcp_packet_rr_set_ssrc (GstRTCPPacket *packet, guint32 ssrc); +guint32 gst_rtcp_packet_rr_get_ssrc (GstRTCPPacket *packet); +void gst_rtcp_packet_rr_set_ssrc (GstRTCPPacket *packet, guint32 ssrc); /* report blocks for SR and RR */ @@ -224,13 +224,17 @@ gboolean gst_rtcp_packet_sdes_add_entry (GstRTCPPacket *packet, Gs guint8 len, const guint8 *data); /* bye packet */ -guint gst_rtcp_packet_bye_get_ssrc_count (GstRTCPPacket *packet); -guint32 gst_rtcp_packet_bye_get_nth_ssrc (GstRTCPPacket *packet, guint nth); -gboolean gst_rtcp_packet_bye_add_ssrc (GstRTCPPacket *packet, guint32 ssrc); -gboolean gst_rtcp_packet_bye_add_ssrcs (GstRTCPPacket *packet, guint32 *ssrc, guint len); -guint8 gst_rtcp_packet_bye_get_reason_len (GstRTCPPacket *packet); -gchar* gst_rtcp_packet_bye_get_reason (GstRTCPPacket *packet); -gboolean gst_rtcp_packet_bye_set_reason (GstRTCPPacket *packet, const gchar *reason); +guint gst_rtcp_packet_bye_get_ssrc_count (GstRTCPPacket *packet); +guint32 gst_rtcp_packet_bye_get_nth_ssrc (GstRTCPPacket *packet, guint nth); +gboolean gst_rtcp_packet_bye_add_ssrc (GstRTCPPacket *packet, guint32 ssrc); +gboolean gst_rtcp_packet_bye_add_ssrcs (GstRTCPPacket *packet, guint32 *ssrc, guint len); +guint8 gst_rtcp_packet_bye_get_reason_len (GstRTCPPacket *packet); +gchar* gst_rtcp_packet_bye_get_reason (GstRTCPPacket *packet); +gboolean gst_rtcp_packet_bye_set_reason (GstRTCPPacket *packet, const gchar *reason); + +/* helper functions */ +guint64 gst_rtcp_ntp_to_unix (guint64 ntptime); +guint64 gst_rtcp_unix_to_ntp (guint64 unixtime); G_END_DECLS diff --git a/gst-libs/gst/rtp/gstrtpbuffer.c b/gst-libs/gst/rtp/gstrtpbuffer.c index 8caf494bea..4e1154d277 100644 --- a/gst-libs/gst/rtp/gstrtpbuffer.c +++ b/gst-libs/gst/rtp/gstrtpbuffer.c @@ -21,7 +21,7 @@ /** * SECTION:gstrtpbuffer * @short_description: Helper methods for dealing with RTP buffers - * @see_also: gstbasertppayload, gstbasertpdepayload + * @see_also: #GstBaseRTPPayload, #GstBaseRTPDepayload, gstrtcpbuffer * * * @@ -308,8 +308,29 @@ gst_rtp_buffer_validate_data (guint8 * data, guint len) csrc_count = (data[0] & 0x0f); header_len += csrc_count * sizeof (guint32); + /* calc extension length when present. */ + if (data[0] & 0x10) { + guint8 *extpos; + guint16 extlen; + + /* this points to the extenstion bits and header length */ + extpos = &data[header_len]; + + /* skip the header and check that we have enough space */ + header_len += 4; + if (G_UNLIKELY (len < header_len)) + goto wrong_length; + + /* skip id */ + extpos += 2; + /* read length as the number of 32 bits words */ + extlen = GST_READ_UINT16_BE (extpos); + + header_len += extlen * sizeof (guint32); + } + /* check for padding */ - if (data[0] & 0x40) + if (data[0] & 0x20) padding = data[len - 1]; else padding = 0; @@ -408,6 +429,29 @@ gst_rtp_buffer_get_packet_len (GstBuffer * buffer) return GST_BUFFER_SIZE (buffer); } +/** + * 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; + + 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; +} + /** * gst_rtp_buffer_get_version: * @buffer: the buffer @@ -480,7 +524,7 @@ gst_rtp_buffer_set_padding (GstBuffer * buffer, gboolean padding) * @buffer: the buffer * @len: the new amount of padding * - * Set the amount of padding in the RTP packing in @buffer to + * Set the amount of padding in the RTP packet in @buffer to * @len. If @len is 0, the padding is removed. * * NOTE: This function does not work correctly. @@ -532,6 +576,51 @@ gst_rtp_buffer_set_extension (GstBuffer * buffer, gboolean extension) GST_RTP_HEADER_EXTENSION (buffer) = extension; } +/** + * 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 extrnsion 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 extenstion, 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; + + 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_ssrc: * @buffer: the buffer @@ -780,10 +869,10 @@ gst_rtp_buffer_get_payload_subbuffer (GstBuffer * buffer, guint offset, g_return_val_if_fail (offset < plen, NULL); /* apply offset */ - poffset = GST_RTP_HEADER_LEN + GST_RTP_HEADER_CSRC_SIZE (buffer) + offset; + poffset = gst_rtp_buffer_get_header_len (buffer) + offset; plen -= offset; - /* see if we need to shrink the buffer even based on @len */ + /* see if we need to shrink the buffer based on @len */ if (len != -1 && len < plen) plen = len; @@ -817,16 +906,17 @@ gst_rtp_buffer_get_payload_buffer (GstBuffer * buffer) guint gst_rtp_buffer_get_payload_len (GstBuffer * buffer) { - guint len; + guint len, size; g_return_val_if_fail (GST_IS_BUFFER (buffer), 0); g_return_val_if_fail (GST_BUFFER_DATA (buffer) != NULL, 0); - len = GST_BUFFER_SIZE (buffer) - - GST_RTP_HEADER_LEN - GST_RTP_HEADER_CSRC_SIZE (buffer); + size = GST_BUFFER_SIZE (buffer); + + len = size - gst_rtp_buffer_get_header_len (buffer); if (GST_RTP_HEADER_PADDING (buffer)) - len -= ((guint8 *) GST_BUFFER_DATA (buffer))[GST_BUFFER_SIZE (buffer) - 1]; + len -= GST_BUFFER_DATA (buffer)[size - 1]; return len; } @@ -846,8 +936,7 @@ gst_rtp_buffer_get_payload (GstBuffer * buffer) g_return_val_if_fail (GST_IS_BUFFER (buffer), NULL); g_return_val_if_fail (GST_BUFFER_DATA (buffer) != NULL, NULL); - return GST_BUFFER_DATA (buffer) + GST_RTP_HEADER_LEN - + GST_RTP_HEADER_CSRC_SIZE (buffer); + return GST_BUFFER_DATA (buffer) + gst_rtp_buffer_get_header_len (buffer); } /** diff --git a/gst-libs/gst/rtp/gstrtpbuffer.h b/gst-libs/gst/rtp/gstrtpbuffer.h index 205e90c072..6695de6ee6 100644 --- a/gst-libs/gst/rtp/gstrtpbuffer.h +++ b/gst-libs/gst/rtp/gstrtpbuffer.h @@ -160,63 +160,67 @@ typedef enum #define GST_RTP_PAYLOAD_DYNAMIC_STRING "[96, 127]" /* creating buffers */ -void gst_rtp_buffer_allocate_data (GstBuffer *buffer, guint payload_len, - guint8 pad_len, guint8 csrc_count); +void gst_rtp_buffer_allocate_data (GstBuffer *buffer, guint payload_len, + guint8 pad_len, guint8 csrc_count); -GstBuffer* gst_rtp_buffer_new_take_data (gpointer data, guint len); -GstBuffer* gst_rtp_buffer_new_copy_data (gpointer data, guint len); -GstBuffer* gst_rtp_buffer_new_allocate (guint payload_len, guint8 pad_len, guint8 csrc_count); -GstBuffer* gst_rtp_buffer_new_allocate_len (guint packet_len, guint8 pad_len, guint8 csrc_count); +GstBuffer* gst_rtp_buffer_new_take_data (gpointer data, guint len); +GstBuffer* gst_rtp_buffer_new_copy_data (gpointer data, guint len); +GstBuffer* gst_rtp_buffer_new_allocate (guint payload_len, guint8 pad_len, guint8 csrc_count); +GstBuffer* gst_rtp_buffer_new_allocate_len (guint packet_len, guint8 pad_len, guint8 csrc_count); -guint gst_rtp_buffer_calc_header_len (guint8 csrc_count); -guint gst_rtp_buffer_calc_packet_len (guint payload_len, guint8 pad_len, guint8 csrc_count); -guint gst_rtp_buffer_calc_payload_len (guint packet_len, guint8 pad_len, guint8 csrc_count); +guint gst_rtp_buffer_calc_header_len (guint8 csrc_count); +guint gst_rtp_buffer_calc_packet_len (guint payload_len, guint8 pad_len, guint8 csrc_count); +guint gst_rtp_buffer_calc_payload_len (guint packet_len, guint8 pad_len, guint8 csrc_count); -gboolean gst_rtp_buffer_validate_data (guint8 *data, guint len); -gboolean gst_rtp_buffer_validate (GstBuffer *buffer); +gboolean gst_rtp_buffer_validate_data (guint8 *data, guint len); +gboolean gst_rtp_buffer_validate (GstBuffer *buffer); -void gst_rtp_buffer_set_packet_len (GstBuffer *buffer, guint len); -guint gst_rtp_buffer_get_packet_len (GstBuffer *buffer); +void gst_rtp_buffer_set_packet_len (GstBuffer *buffer, guint len); +guint gst_rtp_buffer_get_packet_len (GstBuffer *buffer); -guint8 gst_rtp_buffer_get_version (GstBuffer *buffer); -void gst_rtp_buffer_set_version (GstBuffer *buffer, guint8 version); +guint gst_rtp_buffer_get_header_len (GstBuffer *buffer); -gboolean gst_rtp_buffer_get_padding (GstBuffer *buffer); -void gst_rtp_buffer_set_padding (GstBuffer *buffer, gboolean padding); -void gst_rtp_buffer_pad_to (GstBuffer *buffer, guint len); +guint8 gst_rtp_buffer_get_version (GstBuffer *buffer); +void gst_rtp_buffer_set_version (GstBuffer *buffer, guint8 version); -gboolean gst_rtp_buffer_get_extension (GstBuffer *buffer); -void gst_rtp_buffer_set_extension (GstBuffer *buffer, gboolean extension); +gboolean gst_rtp_buffer_get_padding (GstBuffer *buffer); +void gst_rtp_buffer_set_padding (GstBuffer *buffer, gboolean padding); +void gst_rtp_buffer_pad_to (GstBuffer *buffer, guint len); -guint32 gst_rtp_buffer_get_ssrc (GstBuffer *buffer); -void gst_rtp_buffer_set_ssrc (GstBuffer *buffer, guint32 ssrc); +gboolean gst_rtp_buffer_get_extension (GstBuffer *buffer); +void gst_rtp_buffer_set_extension (GstBuffer *buffer, gboolean extension); +gboolean gst_rtp_buffer_get_extension_data (GstBuffer *buffer, guint16 *bits, + gpointer *data, guint *wordlen); -guint8 gst_rtp_buffer_get_csrc_count (GstBuffer *buffer); -guint32 gst_rtp_buffer_get_csrc (GstBuffer *buffer, guint8 idx); -void gst_rtp_buffer_set_csrc (GstBuffer *buffer, guint8 idx, guint32 csrc); +guint32 gst_rtp_buffer_get_ssrc (GstBuffer *buffer); +void gst_rtp_buffer_set_ssrc (GstBuffer *buffer, guint32 ssrc); -gboolean gst_rtp_buffer_get_marker (GstBuffer *buffer); -void gst_rtp_buffer_set_marker (GstBuffer *buffer, gboolean marker); +guint8 gst_rtp_buffer_get_csrc_count (GstBuffer *buffer); +guint32 gst_rtp_buffer_get_csrc (GstBuffer *buffer, guint8 idx); +void gst_rtp_buffer_set_csrc (GstBuffer *buffer, guint8 idx, guint32 csrc); -guint8 gst_rtp_buffer_get_payload_type (GstBuffer *buffer); -void gst_rtp_buffer_set_payload_type (GstBuffer *buffer, guint8 payload_type); +gboolean gst_rtp_buffer_get_marker (GstBuffer *buffer); +void gst_rtp_buffer_set_marker (GstBuffer *buffer, gboolean marker); -guint16 gst_rtp_buffer_get_seq (GstBuffer *buffer); -void gst_rtp_buffer_set_seq (GstBuffer *buffer, guint16 seq); +guint8 gst_rtp_buffer_get_payload_type (GstBuffer *buffer); +void gst_rtp_buffer_set_payload_type (GstBuffer *buffer, guint8 payload_type); -guint32 gst_rtp_buffer_get_timestamp (GstBuffer *buffer); -void gst_rtp_buffer_set_timestamp (GstBuffer *buffer, guint32 timestamp); +guint16 gst_rtp_buffer_get_seq (GstBuffer *buffer); +void gst_rtp_buffer_set_seq (GstBuffer *buffer, guint16 seq); + +guint32 gst_rtp_buffer_get_timestamp (GstBuffer *buffer); +void gst_rtp_buffer_set_timestamp (GstBuffer *buffer, guint32 timestamp); GstBuffer* gst_rtp_buffer_get_payload_buffer (GstBuffer *buffer); GstBuffer* gst_rtp_buffer_get_payload_subbuffer (GstBuffer *buffer, guint offset, guint len); -guint gst_rtp_buffer_get_payload_len (GstBuffer *buffer); -gpointer gst_rtp_buffer_get_payload (GstBuffer *buffer); +guint gst_rtp_buffer_get_payload_len (GstBuffer *buffer); +gpointer gst_rtp_buffer_get_payload (GstBuffer *buffer); /* some helpers */ -guint32 gst_rtp_buffer_default_clock_rate (guint8 payload_type); -gint gst_rtp_buffer_compare_seqnum (guint16 seqnum1, guint16 seqnum2); -guint64 gst_rtp_buffer_ext_timestamp (guint64 *exttimestamp, guint32 timestamp); +guint32 gst_rtp_buffer_default_clock_rate (guint8 payload_type); +gint gst_rtp_buffer_compare_seqnum (guint16 seqnum1, guint16 seqnum2); +guint64 gst_rtp_buffer_ext_timestamp (guint64 *exttimestamp, guint32 timestamp); G_END_DECLS