Merge branch 'master' into 0.11
[platform/upstream/gstreamer.git] / gst-libs / gst / rtp / gst-plugins-base-rtcp-feedback.patch
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:
7        len = 12;
8        break;
9 +    case GST_RTCP_TYPE_RTPFB:
10 +      len = 12;
11 +      break;
12 +    case GST_RTCP_TYPE_PSFB:
13 +      len = 12;
14      default:
15        goto unknown_type;
16    }
17 @@ -1637,6 +1642,147 @@ no_space:
18  }
19  
20  /**
21 + * gst_rtcp_packet_fb_get_sender_ssrc:
22 + * @packet: a valid RTPFB or PSFB #GstRTCPPacket
23 + *
24 + * Get the sender SSRC field of the RTPFB or PSFB @packet.
25 + *
26 + * Returns: the sender SSRC.
27 + */
28 +guint32
29 +gst_rtcp_packet_fb_get_sender_ssrc (GstRTCPPacket * packet)
30 +{
31 +  guint8 *data;
32 +  guint32 ssrc;
33 +
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);
38 +
39 +  data = GST_BUFFER_DATA (packet->buffer);
40 +
41 +  /* skip header */
42 +  data += packet->offset + 4;
43 +  ssrc = GST_READ_UINT32_BE (data);
44 +
45 +  return ssrc;
46 +}
47 +
48 +/**
49 + * gst_rtcp_packet_fb_set_sender_ssrc:
50 + * @packet: a valid RTPFB or PSFB #GstRTCPPacket
51 + *
52 + * Set the sender SSRC field of the RTPFB or PSFB @packet.
53 + */
54 +void
55 +gst_rtcp_packet_fb_set_sender_ssrc (GstRTCPPacket *packet, guint32 ssrc)
56 +{
57 +  guint8 *data;
58 +
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));
63 +
64 +  data = GST_BUFFER_DATA (packet->buffer);
65 +
66 +  /* skip header */
67 +  data += packet->offset + 4;
68 +  GST_WRITE_UINT32_BE (data, ssrc);
69 +}
70 +
71 +/**
72 + * gst_rtcp_packet_fb_get_media_ssrc:
73 + * @packet: a valid RTPFB or PSFB #GstRTCPPacket
74 + *
75 + * Get the media SSRC field of the RTPFB or PSFB @packet.
76 + *
77 + * Returns: the media SSRC.
78 + */
79 +guint32
80 +gst_rtcp_packet_fb_get_media_ssrc (GstRTCPPacket * packet)
81 +{
82 +  guint8 *data;
83 +  guint32 ssrc;
84 +
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);
89 +
90 +  data = GST_BUFFER_DATA (packet->buffer);
91 +
92 +  /* skip header and sender ssrc */
93 +  data += packet->offset + 8;
94 +  ssrc = GST_READ_UINT32_BE (data);
95 +
96 +  return ssrc;
97 +}
98 +
99 +/**
100 + * gst_rtcp_packet_fb_set_media_ssrc:
101 + * @packet: a valid RTPFB or PSFB #GstRTCPPacket
102 + *
103 + * Set the media SSRC field of the RTPFB or PSFB @packet.
104 + */
105 +void
106 +gst_rtcp_packet_fb_set_media_ssrc (GstRTCPPacket *packet, guint32 ssrc)
107 +{
108 +  guint8 *data;
109 +
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));
114 +
115 +  data = GST_BUFFER_DATA (packet->buffer);
116 +
117 +  /* skip header and sender ssrc */
118 +  data += packet->offset + 8;
119 +  GST_WRITE_UINT32_BE (data, ssrc);
120 +}
121 +
122 +/**
123 + * gst_rtcp_packet_psfb_get_type:
124 + * @packet: a valid PSFB #GstRTCPPacket
125 + *
126 + * Get the feedback message type of the PSFB @packet.
127 + *
128 + * Returns: The feedback message type.
129 + */
130 +GstRTCPPSFBType
131 +gst_rtcp_packet_psfb_get_type (GstRTCPPacket *packet)
132 +{
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);
136 +
137 +  return packet->count;
138 +}
139 +
140 +/**
141 + * gst_rtcp_packet_psfb_set_type:
142 + * @packet: a valid PSFB #GstRTCPPacket
143 + * @type: the #GstRTCPPSFBType to set
144 + *
145 + * Set the feedback message type of the PSFB @packet.
146 + */
147 +void
148 +gst_rtcp_packet_psfb_set_type (GstRTCPPacket *packet, GstRTCPPSFBType type)
149 +{
150 +  guint8 *data;
151 +
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));
155 +
156 +  data = GST_BUFFER_DATA (packet->buffer);
157 +
158 +  data[packet->offset] = (data[packet->offset] & 0xE0) | type;
159 +}
160 +
161 +/**
162   * gst_rtcp_ntp_to_unix:
163   * @ntptime: an NTP timestamp
164   *
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
175   *
176   * Different RTCP packet types.
177   */
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
186  } GstRTCPType;
187  
188 +/**
189 + * GstRTCPPSFBType:
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
195 + */
196 +typedef enum
197 +{
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
203 +} GstRTCPPSFBType;
204 +
205  /** 
206   * GstRTCPSDESType:
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);
211  
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);
217 +
218 +/* psfb packets */
219 +GstRTCPPSFBType gst_rtcp_packet_psfb_get_type         (GstRTCPPacket *packet);
220 +void            gst_rtcp_packet_psfb_set_type         (GstRTCPPacket *packet, GstRTCPPSFBType type);
221 +
222  /* helper functions */
223  guint64         gst_rtcp_ntp_to_unix                  (guint64 ntptime);
224  guint64         gst_rtcp_unix_to_ntp                  (guint64 unixtime);