| /* GStreamer |
| * Copyright (C) <2007> Wim Taymans <wim@fluendo.com> |
| * |
| * gstrtcpbuffer.h: various helper functions to manipulate buffers |
| * with RTCP payload. |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Library General Public |
| * License as published by the Free Software Foundation; either |
| * version 2 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Library General Public License for more details. |
| * |
| * You should have received a copy of the GNU Library General Public |
| * License along with this library; if not, write to the |
| * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, |
| * Boston, MA 02110-1301, USA. |
| */ |
| |
| #ifndef __GST_RTCPBUFFER_H__ |
| #define __GST_RTCPBUFFER_H__ |
| |
| #include <gst/gst.h> |
| |
| G_BEGIN_DECLS |
| |
| /** |
| * GST_RTCP_VERSION: |
| * |
| * The supported RTCP version 2. |
| */ |
| #define GST_RTCP_VERSION 2 |
| |
| /** |
| * GstRTCPType: |
| * @GST_RTCP_TYPE_INVALID: Invalid type |
| * @GST_RTCP_TYPE_SR: Sender report |
| * @GST_RTCP_TYPE_RR: Receiver report |
| * @GST_RTCP_TYPE_SDES: Source description |
| * @GST_RTCP_TYPE_BYE: Goodbye |
| * @GST_RTCP_TYPE_APP: Application defined |
| * @GST_RTCP_TYPE_RTPFB: Transport layer feedback. |
| * @GST_RTCP_TYPE_PSFB: Payload-specific feedback. |
| * @GST_RTCP_TYPE_XR: Extended report. |
| * |
| * Different RTCP packet types. |
| */ |
| typedef enum |
| { |
| GST_RTCP_TYPE_INVALID = 0, |
| GST_RTCP_TYPE_SR = 200, |
| GST_RTCP_TYPE_RR = 201, |
| GST_RTCP_TYPE_SDES = 202, |
| GST_RTCP_TYPE_BYE = 203, |
| GST_RTCP_TYPE_APP = 204, |
| GST_RTCP_TYPE_RTPFB = 205, |
| GST_RTCP_TYPE_PSFB = 206, |
| GST_RTCP_TYPE_XR = 207 |
| } GstRTCPType; |
| |
| /* FIXME 2.0: backwards compatibility define for enum typo */ |
| #define GST_RTCP_RTPFB_TYPE_RCTP_SR_REQ GST_RTCP_RTPFB_TYPE_RTCP_SR_REQ |
| |
| /** |
| * GstRTCPFBType: |
| * @GST_RTCP_FB_TYPE_INVALID: Invalid type |
| * @GST_RTCP_RTPFB_TYPE_NACK: Generic NACK |
| * @GST_RTCP_RTPFB_TYPE_TMMBR: Temporary Maximum Media Stream Bit Rate Request |
| * @GST_RTCP_RTPFB_TYPE_TMMBN: Temporary Maximum Media Stream Bit Rate |
| * Notification |
| * @GST_RTCP_RTPFB_TYPE_RTCP_SR_REQ: Request an SR packet for early |
| * synchronization |
| * @GST_RTCP_PSFB_TYPE_PLI: Picture Loss Indication |
| * @GST_RTCP_PSFB_TYPE_SLI: Slice Loss Indication |
| * @GST_RTCP_PSFB_TYPE_RPSI: Reference Picture Selection Indication |
| * @GST_RTCP_PSFB_TYPE_AFB: Application layer Feedback |
| * @GST_RTCP_PSFB_TYPE_FIR: Full Intra Request Command |
| * @GST_RTCP_PSFB_TYPE_TSTR: Temporal-Spatial Trade-off Request |
| * @GST_RTCP_PSFB_TYPE_TSTN: Temporal-Spatial Trade-off Notification |
| * @GST_RTCP_PSFB_TYPE_VBCN: Video Back Channel Message |
| * |
| * Different types of feedback messages. |
| */ |
| typedef enum |
| { |
| /* generic */ |
| GST_RTCP_FB_TYPE_INVALID = 0, |
| /* RTPFB types */ |
| GST_RTCP_RTPFB_TYPE_NACK = 1, |
| /* RTPFB types assigned in RFC 5104 */ |
| GST_RTCP_RTPFB_TYPE_TMMBR = 3, |
| GST_RTCP_RTPFB_TYPE_TMMBN = 4, |
| /* RTPFB types assigned in RFC 6051 */ |
| GST_RTCP_RTPFB_TYPE_RTCP_SR_REQ = 5, |
| /* PSFB types */ |
| GST_RTCP_PSFB_TYPE_PLI = 1, |
| GST_RTCP_PSFB_TYPE_SLI = 2, |
| GST_RTCP_PSFB_TYPE_RPSI = 3, |
| GST_RTCP_PSFB_TYPE_AFB = 15, |
| /* PSFB types assigned in RFC 5104 */ |
| GST_RTCP_PSFB_TYPE_FIR = 4, |
| GST_RTCP_PSFB_TYPE_TSTR = 5, |
| GST_RTCP_PSFB_TYPE_TSTN = 6, |
| GST_RTCP_PSFB_TYPE_VBCN = 7, |
| } GstRTCPFBType; |
| |
| /** |
| * GstRTCPSDESType: |
| * @GST_RTCP_SDES_INVALID: Invalid SDES entry |
| * @GST_RTCP_SDES_END: End of SDES list |
| * @GST_RTCP_SDES_CNAME: Canonical name |
| * @GST_RTCP_SDES_NAME: User name |
| * @GST_RTCP_SDES_EMAIL: User's electronic mail address |
| * @GST_RTCP_SDES_PHONE: User's phone number |
| * @GST_RTCP_SDES_LOC: Geographic user location |
| * @GST_RTCP_SDES_TOOL: Name of application or tool |
| * @GST_RTCP_SDES_NOTE: Notice about the source |
| * @GST_RTCP_SDES_PRIV: Private extensions |
| * |
| * Different types of SDES content. |
| */ |
| typedef enum |
| { |
| GST_RTCP_SDES_INVALID = -1, |
| GST_RTCP_SDES_END = 0, |
| GST_RTCP_SDES_CNAME = 1, |
| GST_RTCP_SDES_NAME = 2, |
| GST_RTCP_SDES_EMAIL = 3, |
| GST_RTCP_SDES_PHONE = 4, |
| GST_RTCP_SDES_LOC = 5, |
| GST_RTCP_SDES_TOOL = 6, |
| GST_RTCP_SDES_NOTE = 7, |
| GST_RTCP_SDES_PRIV = 8 |
| } GstRTCPSDESType; |
| |
| /** |
| * GST_RTCP_MAX_SDES: |
| * |
| * The maximum text length for an SDES item. |
| */ |
| #define GST_RTCP_MAX_SDES 255 |
| |
| /** |
| * GST_RTCP_MAX_RB_COUNT: |
| * |
| * The maximum amount of Receiver report blocks in RR and SR messages. |
| */ |
| #define GST_RTCP_MAX_RB_COUNT 31 |
| |
| /** |
| * GST_RTCP_MAX_SDES_ITEM_COUNT: |
| * |
| * The maximum amount of SDES items. |
| */ |
| #define GST_RTCP_MAX_SDES_ITEM_COUNT 31 |
| |
| /** |
| * GST_RTCP_MAX_BYE_SSRC_COUNT: |
| * |
| * The maximum amount of SSRCs in a BYE packet. |
| */ |
| #define GST_RTCP_MAX_BYE_SSRC_COUNT 31 |
| |
| /** |
| * GST_RTCP_VALID_MASK: |
| * |
| * Mask for version, padding bit and packet type pair |
| */ |
| #define GST_RTCP_VALID_MASK (0xc000 | 0x2000 | 0xfe) |
| |
| /** |
| * GST_RTCP_REDUCED_SIZE_VALID_MASK: |
| * |
| * Mask for version, padding bit and packet type pair allowing reduced size |
| * packets, basically it accepts other types than RR and SR |
| */ |
| #define GST_RTCP_REDUCED_SIZE_VALID_MASK (0xc000 | 0x2000 | 0xf8) |
| |
| /** |
| * GST_RTCP_VALID_VALUE: |
| * |
| * Valid value for the first two bytes of an RTCP packet after applying |
| * #GST_RTCP_VALID_MASK to them. |
| */ |
| #define GST_RTCP_VALID_VALUE ((GST_RTCP_VERSION << 14) | GST_RTCP_TYPE_SR) |
| |
| typedef struct _GstRTCPBuffer GstRTCPBuffer; |
| typedef struct _GstRTCPPacket GstRTCPPacket; |
| |
| struct _GstRTCPBuffer |
| { |
| GstBuffer *buffer; |
| GstMapInfo map; |
| }; |
| |
| #define GST_RTCP_BUFFER_INIT { NULL, GST_MAP_INFO_INIT } |
| |
| /** |
| * GstRTCPPacket: |
| * @rtcp: pointer to RTCP buffer |
| * @offset: offset of packet in buffer data |
| * |
| * Data structure that points to a packet at @offset in @buffer. |
| * The size of the structure is made public to allow stack allocations. |
| */ |
| struct _GstRTCPPacket |
| { |
| GstRTCPBuffer *rtcp; |
| guint offset; |
| |
| /*< private >*/ |
| gboolean padding; /* padding field of current packet */ |
| guint8 count; /* count field of current packet */ |
| GstRTCPType type; /* type of current packet */ |
| guint16 length; /* length of current packet in 32-bits words */ |
| |
| guint item_offset; /* current item offset for navigating SDES */ |
| guint item_count; /* current item count */ |
| guint entry_offset; /* current entry offset for navigating SDES items */ |
| }; |
| |
| /* creating buffers */ |
| |
| GST_EXPORT |
| GstBuffer* gst_rtcp_buffer_new_take_data (gpointer data, guint len); |
| |
| GST_EXPORT |
| GstBuffer* gst_rtcp_buffer_new_copy_data (gconstpointer data, guint len); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_buffer_validate_data (guint8 *data, guint len); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_buffer_validate (GstBuffer *buffer); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_buffer_validate_data_reduced (guint8 *data, guint len); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_buffer_validate_reduced (GstBuffer *buffer); |
| |
| |
| GST_EXPORT |
| GstBuffer* gst_rtcp_buffer_new (guint mtu); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_buffer_map (GstBuffer *buffer, GstMapFlags flags, GstRTCPBuffer *rtcp); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_buffer_unmap (GstRTCPBuffer *rtcp); |
| |
| /* adding/retrieving packets */ |
| |
| GST_EXPORT |
| guint gst_rtcp_buffer_get_packet_count (GstRTCPBuffer *rtcp); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_buffer_get_first_packet (GstRTCPBuffer *rtcp, GstRTCPPacket *packet); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_packet_move_to_next (GstRTCPPacket *packet); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_buffer_add_packet (GstRTCPBuffer *rtcp, GstRTCPType type, |
| GstRTCPPacket *packet); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_packet_remove (GstRTCPPacket *packet); |
| |
| /* working with packets */ |
| |
| GST_EXPORT |
| gboolean gst_rtcp_packet_get_padding (GstRTCPPacket *packet); |
| |
| GST_EXPORT |
| guint8 gst_rtcp_packet_get_count (GstRTCPPacket *packet); |
| |
| GST_EXPORT |
| GstRTCPType gst_rtcp_packet_get_type (GstRTCPPacket *packet); |
| |
| GST_EXPORT |
| guint16 gst_rtcp_packet_get_length (GstRTCPPacket *packet); |
| |
| |
| /* sender reports */ |
| |
| GST_EXPORT |
| void gst_rtcp_packet_sr_get_sender_info (GstRTCPPacket *packet, guint32 *ssrc, |
| guint64 *ntptime, guint32 *rtptime, |
| guint32 *packet_count, guint32 *octet_count); |
| |
| GST_EXPORT |
| void gst_rtcp_packet_sr_set_sender_info (GstRTCPPacket *packet, guint32 ssrc, |
| guint64 ntptime, guint32 rtptime, |
| guint32 packet_count, guint32 octet_count); |
| /* receiver reports */ |
| |
| GST_EXPORT |
| guint32 gst_rtcp_packet_rr_get_ssrc (GstRTCPPacket *packet); |
| |
| GST_EXPORT |
| void gst_rtcp_packet_rr_set_ssrc (GstRTCPPacket *packet, guint32 ssrc); |
| |
| |
| /* report blocks for SR and RR */ |
| |
| GST_EXPORT |
| guint gst_rtcp_packet_get_rb_count (GstRTCPPacket *packet); |
| |
| GST_EXPORT |
| void gst_rtcp_packet_get_rb (GstRTCPPacket *packet, guint nth, guint32 *ssrc, |
| guint8 *fractionlost, gint32 *packetslost, |
| guint32 *exthighestseq, guint32 *jitter, |
| guint32 *lsr, guint32 *dlsr); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_packet_add_rb (GstRTCPPacket *packet, guint32 ssrc, |
| guint8 fractionlost, gint32 packetslost, |
| guint32 exthighestseq, guint32 jitter, |
| guint32 lsr, guint32 dlsr); |
| |
| GST_EXPORT |
| void gst_rtcp_packet_set_rb (GstRTCPPacket *packet, guint nth, guint32 ssrc, |
| guint8 fractionlost, gint32 packetslost, |
| guint32 exthighestseq, guint32 jitter, |
| guint32 lsr, guint32 dlsr); |
| |
| /* profile-specific extensions for SR and RR */ |
| |
| GST_EXPORT |
| gboolean gst_rtcp_packet_add_profile_specific_ext (GstRTCPPacket * packet, |
| const guint8 * data, guint len); |
| |
| GST_EXPORT |
| guint16 gst_rtcp_packet_get_profile_specific_ext_length (GstRTCPPacket * packet); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_packet_get_profile_specific_ext (GstRTCPPacket * packet, |
| guint8 ** data, guint * len); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_packet_copy_profile_specific_ext (GstRTCPPacket * packet, |
| guint8 ** data, guint * len); |
| |
| /* source description packet */ |
| |
| GST_EXPORT |
| guint gst_rtcp_packet_sdes_get_item_count (GstRTCPPacket *packet); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_packet_sdes_first_item (GstRTCPPacket *packet); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_packet_sdes_next_item (GstRTCPPacket *packet); |
| |
| GST_EXPORT |
| guint32 gst_rtcp_packet_sdes_get_ssrc (GstRTCPPacket *packet); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_packet_sdes_first_entry (GstRTCPPacket *packet); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_packet_sdes_next_entry (GstRTCPPacket *packet); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_packet_sdes_get_entry (GstRTCPPacket *packet, |
| GstRTCPSDESType *type, guint8 *len, |
| guint8 **data); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_packet_sdes_copy_entry (GstRTCPPacket *packet, |
| GstRTCPSDESType *type, guint8 *len, |
| guint8 **data); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_packet_sdes_add_item (GstRTCPPacket *packet, guint32 ssrc); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_packet_sdes_add_entry (GstRTCPPacket *packet, GstRTCPSDESType type, |
| guint8 len, const guint8 *data); |
| |
| /* bye packet */ |
| |
| GST_EXPORT |
| guint gst_rtcp_packet_bye_get_ssrc_count (GstRTCPPacket *packet); |
| |
| GST_EXPORT |
| guint32 gst_rtcp_packet_bye_get_nth_ssrc (GstRTCPPacket *packet, guint nth); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_packet_bye_add_ssrc (GstRTCPPacket *packet, guint32 ssrc); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_packet_bye_add_ssrcs (GstRTCPPacket *packet, guint32 *ssrc, guint len); |
| |
| GST_EXPORT |
| guint8 gst_rtcp_packet_bye_get_reason_len (GstRTCPPacket *packet); |
| |
| GST_EXPORT |
| gchar* gst_rtcp_packet_bye_get_reason (GstRTCPPacket *packet); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_packet_bye_set_reason (GstRTCPPacket *packet, const gchar *reason); |
| |
| /* app packets */ |
| |
| GST_EXPORT |
| void gst_rtcp_packet_app_set_subtype (GstRTCPPacket * packet, guint8 subtype); |
| |
| GST_EXPORT |
| guint8 gst_rtcp_packet_app_get_subtype (GstRTCPPacket * packet); |
| |
| GST_EXPORT |
| void gst_rtcp_packet_app_set_ssrc (GstRTCPPacket * packet, guint32 ssrc); |
| |
| GST_EXPORT |
| guint32 gst_rtcp_packet_app_get_ssrc (GstRTCPPacket * packet); |
| |
| GST_EXPORT |
| void gst_rtcp_packet_app_set_name (GstRTCPPacket * packet, const gchar *name); |
| |
| GST_EXPORT |
| const gchar* gst_rtcp_packet_app_get_name (GstRTCPPacket * packet); |
| |
| GST_EXPORT |
| guint16 gst_rtcp_packet_app_get_data_length (GstRTCPPacket * packet); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_packet_app_set_data_length (GstRTCPPacket * packet, guint16 wordlen); |
| |
| GST_EXPORT |
| guint8* gst_rtcp_packet_app_get_data (GstRTCPPacket * packet); |
| |
| /* feedback packets */ |
| |
| GST_EXPORT |
| guint32 gst_rtcp_packet_fb_get_sender_ssrc (GstRTCPPacket *packet); |
| |
| GST_EXPORT |
| void gst_rtcp_packet_fb_set_sender_ssrc (GstRTCPPacket *packet, guint32 ssrc); |
| |
| GST_EXPORT |
| guint32 gst_rtcp_packet_fb_get_media_ssrc (GstRTCPPacket *packet); |
| |
| GST_EXPORT |
| void gst_rtcp_packet_fb_set_media_ssrc (GstRTCPPacket *packet, guint32 ssrc); |
| |
| GST_EXPORT |
| GstRTCPFBType gst_rtcp_packet_fb_get_type (GstRTCPPacket *packet); |
| |
| GST_EXPORT |
| void gst_rtcp_packet_fb_set_type (GstRTCPPacket *packet, GstRTCPFBType type); |
| |
| GST_EXPORT |
| guint16 gst_rtcp_packet_fb_get_fci_length (GstRTCPPacket *packet); |
| |
| GST_EXPORT |
| gboolean gst_rtcp_packet_fb_set_fci_length (GstRTCPPacket *packet, guint16 wordlen); |
| |
| GST_EXPORT |
| guint8 * gst_rtcp_packet_fb_get_fci (GstRTCPPacket *packet); |
| |
| /* helper functions */ |
| |
| GST_EXPORT |
| guint64 gst_rtcp_ntp_to_unix (guint64 ntptime); |
| |
| GST_EXPORT |
| guint64 gst_rtcp_unix_to_ntp (guint64 unixtime); |
| |
| GST_EXPORT |
| const gchar * gst_rtcp_sdes_type_to_name (GstRTCPSDESType type); |
| |
| GST_EXPORT |
| GstRTCPSDESType gst_rtcp_sdes_name_to_type (const gchar *name); |
| |
| G_END_DECLS |
| |
| #endif /* __GST_RTCPBUFFER_H__ */ |
| |