1 diff --git a/gst-libs/gst/rtp/gstrtcpbuffer.c b/gst-libs/gst/rtp/gstrtcpbuffer.c
2 index ab77c8a..fb35a92 100644
3 --- a/gst-libs/gst/rtp/gstrtcpbuffer.c
4 +++ b/gst-libs/gst/rtp/gstrtcpbuffer.c
5 @@ -449,6 +449,11 @@ gst_rtcp_buffer_add_packet (GstBuffer * buffer, GstRTCPType type,
6 case GST_RTCP_TYPE_APP:
9 + case GST_RTCP_TYPE_RTPFB:
12 + case GST_RTCP_TYPE_PSFB:
17 @@ -1637,6 +1642,147 @@ no_space:
21 + * gst_rtcp_packet_fb_get_sender_ssrc:
22 + * @packet: a valid RTPFB or PSFB #GstRTCPPacket
24 + * Get the sender SSRC field of the RTPFB or PSFB @packet.
26 + * Returns: the sender SSRC.
29 +gst_rtcp_packet_fb_get_sender_ssrc (GstRTCPPacket * packet)
34 + g_return_val_if_fail (packet != NULL, 0);
35 + g_return_val_if_fail ((packet->type == GST_RTCP_TYPE_RTPFB ||
36 + packet->type == GST_RTCP_TYPE_PSFB), 0);
37 + g_return_val_if_fail (GST_IS_BUFFER (packet->buffer), 0);
39 + data = GST_BUFFER_DATA (packet->buffer);
42 + data += packet->offset + 4;
43 + ssrc = GST_READ_UINT32_BE (data);
49 + * gst_rtcp_packet_fb_set_sender_ssrc:
50 + * @packet: a valid RTPFB or PSFB #GstRTCPPacket
52 + * Set the sender SSRC field of the RTPFB or PSFB @packet.
55 +gst_rtcp_packet_fb_set_sender_ssrc (GstRTCPPacket *packet, guint32 ssrc)
59 + g_return_if_fail (packet != NULL);
60 + g_return_if_fail (packet->type == GST_RTCP_TYPE_RTPFB ||
61 + packet->type == GST_RTCP_TYPE_PSFB);
62 + g_return_if_fail (GST_IS_BUFFER (packet->buffer));
64 + data = GST_BUFFER_DATA (packet->buffer);
67 + data += packet->offset + 4;
68 + GST_WRITE_UINT32_BE (data, ssrc);
72 + * gst_rtcp_packet_fb_get_media_ssrc:
73 + * @packet: a valid RTPFB or PSFB #GstRTCPPacket
75 + * Get the media SSRC field of the RTPFB or PSFB @packet.
77 + * Returns: the media SSRC.
80 +gst_rtcp_packet_fb_get_media_ssrc (GstRTCPPacket * packet)
85 + g_return_val_if_fail (packet != NULL, 0);
86 + g_return_val_if_fail ((packet->type == GST_RTCP_TYPE_RTPFB ||
87 + packet->type == GST_RTCP_TYPE_PSFB), 0);
88 + g_return_val_if_fail (GST_IS_BUFFER (packet->buffer), 0);
90 + data = GST_BUFFER_DATA (packet->buffer);
92 + /* skip header and sender ssrc */
93 + data += packet->offset + 8;
94 + ssrc = GST_READ_UINT32_BE (data);
100 + * gst_rtcp_packet_fb_set_media_ssrc:
101 + * @packet: a valid RTPFB or PSFB #GstRTCPPacket
103 + * Set the media SSRC field of the RTPFB or PSFB @packet.
106 +gst_rtcp_packet_fb_set_media_ssrc (GstRTCPPacket *packet, guint32 ssrc)
110 + g_return_if_fail (packet != NULL);
111 + g_return_if_fail (packet->type == GST_RTCP_TYPE_RTPFB ||
112 + packet->type == GST_RTCP_TYPE_PSFB);
113 + g_return_if_fail (GST_IS_BUFFER (packet->buffer));
115 + data = GST_BUFFER_DATA (packet->buffer);
117 + /* skip header and sender ssrc */
118 + data += packet->offset + 8;
119 + GST_WRITE_UINT32_BE (data, ssrc);
123 + * gst_rtcp_packet_psfb_get_type:
124 + * @packet: a valid PSFB #GstRTCPPacket
126 + * Get the feedback message type of the PSFB @packet.
128 + * Returns: The feedback message type.
131 +gst_rtcp_packet_psfb_get_type (GstRTCPPacket *packet)
133 + g_return_val_if_fail (packet != NULL, GST_RTCP_PSFB_TYPE_INVALID);
134 + g_return_val_if_fail (packet->type == GST_RTCP_TYPE_PSFB,
135 + GST_RTCP_PSFB_TYPE_INVALID);
137 + return packet->count;
141 + * gst_rtcp_packet_psfb_set_type:
142 + * @packet: a valid PSFB #GstRTCPPacket
143 + * @type: the #GstRTCPPSFBType to set
145 + * Set the feedback message type of the PSFB @packet.
148 +gst_rtcp_packet_psfb_set_type (GstRTCPPacket *packet, GstRTCPPSFBType type)
152 + g_return_if_fail (packet != NULL);
153 + g_return_if_fail (packet->type == GST_RTCP_TYPE_PSFB);
154 + g_return_if_fail (GST_IS_BUFFER (packet->buffer));
156 + data = GST_BUFFER_DATA (packet->buffer);
158 + data[packet->offset] = (data[packet->offset] & 0xE0) | type;
162 * gst_rtcp_ntp_to_unix:
163 * @ntptime: an NTP timestamp
165 diff --git a/gst-libs/gst/rtp/gstrtcpbuffer.h b/gst-libs/gst/rtp/gstrtcpbuffer.h
166 index 9c908a8..bb247c9 100644
167 --- a/gst-libs/gst/rtp/gstrtcpbuffer.h
168 +++ b/gst-libs/gst/rtp/gstrtcpbuffer.h
169 @@ -42,6 +42,8 @@ G_BEGIN_DECLS
170 * @GST_RTCP_TYPE_SDES: Source description
171 * @GST_RTCP_TYPE_BYE: Goodbye
172 * @GST_RTCP_TYPE_APP: Application defined
173 + * @GST_RTCP_TYPE_RTPFB: Transport layer feedback
174 + * @GST_RTCP_TYPE_PSFB: Payload-specific feedback
176 * Different RTCP packet types.
178 @@ -52,9 +54,28 @@ typedef enum
179 GST_RTCP_TYPE_RR = 201,
180 GST_RTCP_TYPE_SDES = 202,
181 GST_RTCP_TYPE_BYE = 203,
182 - GST_RTCP_TYPE_APP = 204
183 + GST_RTCP_TYPE_APP = 204,
184 + GST_RTCP_TYPE_RTPFB = 205,
185 + GST_RTCP_TYPE_PSFB = 206
190 + * @GST_RTCP_PSFB_TYPE_INVALID: Invalid type
191 + * @GST_RTCP_PSFB_TYPE_PLI: Picture Loss Indication
192 + * @GST_RTCP_PSFB_TYPE_SLI: Slice Loss Indication
193 + * @GST_RTCP_PSFB_TYPE_RPSI: Reference Picture Selection Indication
194 + * @GST_RTCP_PSFB_TYPE_AFB: Application layer Feedback
198 + GST_RTCP_PSFB_TYPE_INVALID = 0,
199 + GST_RTCP_PSFB_TYPE_PLI = 1,
200 + GST_RTCP_PSFB_TYPE_SLI = 2,
201 + GST_RTCP_PSFB_TYPE_RPSI = 3,
202 + GST_RTCP_PSFB_TYPE_AFB = 15
207 * @GST_RTCP_SDES_INVALID: Invalid SDES entry
208 @@ -232,6 +253,16 @@ guint8 gst_rtcp_packet_bye_get_reason_len (GstRTCPPacket *packet);
209 gchar* gst_rtcp_packet_bye_get_reason (GstRTCPPacket *packet);
210 gboolean gst_rtcp_packet_bye_set_reason (GstRTCPPacket *packet, const gchar *reason);
212 +/* feedback packets */
213 +guint32 gst_rtcp_packet_fb_get_sender_ssrc (GstRTCPPacket *packet);
214 +void gst_rtcp_packet_fb_set_sender_ssrc (GstRTCPPacket *packet, guint32 ssrc);
215 +guint32 gst_rtcp_packet_fb_get_media_ssrc (GstRTCPPacket *packet);
216 +void gst_rtcp_packet_fb_set_media_ssrc (GstRTCPPacket *packet, guint32 ssrc);
219 +GstRTCPPSFBType gst_rtcp_packet_psfb_get_type (GstRTCPPacket *packet);
220 +void gst_rtcp_packet_psfb_set_type (GstRTCPPacket *packet, GstRTCPPSFBType type);
222 /* helper functions */
223 guint64 gst_rtcp_ntp_to_unix (guint64 ntptime);
224 guint64 gst_rtcp_unix_to_ntp (guint64 unixtime);