• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* GStreamer
2  * Copyright (C) <2012> Wim Taymans <wim.taymans@gmail.com>
3  * Copyright (C) <2020> Matthew Waters <matthew@centricular.com>
4  *
5  * gstrtphdrext.h: RTP header extensions
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public
18  * License along with this library; if not, write to the
19  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  */
22 
23 #ifndef __GST_RTPHDREXT_H__
24 #define __GST_RTPHDREXT_H__
25 
26 #include <gst/gst.h>
27 #include <gst/rtp/gstrtpbuffer.h>
28 
29 G_BEGIN_DECLS
30 
31 #define GST_RTP_HDREXT_BASE "urn:ietf:params:rtp-hdrext:"
32 
33 /* RFC 6051 */
34 #define GST_RTP_HDREXT_NTP_64 "ntp-64"
35 
36 #define GST_RTP_HDREXT_NTP_64_SIZE 8
37 
38 GST_RTP_API
39 gboolean       gst_rtp_hdrext_set_ntp_64  (gpointer data, guint size, guint64 ntptime);
40 
41 GST_RTP_API
42 gboolean       gst_rtp_hdrext_get_ntp_64  (gpointer data, guint size, guint64 *ntptime);
43 
44 #define GST_RTP_HDREXT_NTP_56 "ntp-56"
45 
46 #define GST_RTP_HDREXT_NTP_56_SIZE 7
47 
48 GST_RTP_API
49 gboolean       gst_rtp_hdrext_set_ntp_56  (gpointer data, guint size, guint64 ntptime);
50 
51 GST_RTP_API
52 gboolean       gst_rtp_hdrext_get_ntp_56  (gpointer data, guint size, guint64 *ntptime);
53 
54 /**
55  * GST_RTP_HDREXT_ELEMENT_CLASS:
56  *
57  * Constant string used in element classification to signal that this element
58  * is a RTP header extension.
59  *
60  * Since: 1.20
61  */
62 #define GST_RTP_HDREXT_ELEMENT_CLASS "Network/Extension/RTPHeader"
63 
64 GST_RTP_API
65 GType gst_rtp_header_extension_get_type (void);
66 #define GST_TYPE_RTP_HEADER_EXTENSION (gst_rtp_header_extension_get_type())
67 #define GST_RTP_HEADER_EXTENSION(obj) \
68   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_HEADER_EXTENSION,GstRTPHeaderExtension))
69 #define GST_RTP_HEADER_EXTENSION_CLASS(klass) \
70   (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_HEADER_EXTENSION,GstRTPHeaderExtensionClass))
71 #define GST_RTP_HEADER_EXTENSION_GET_CLASS(obj) \
72         (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_RTP_HEADER_EXTENSION,GstRTPHeaderExtensionClass))
73 #define GST_IS_RTP_HEADER_EXTENSION(obj) \
74   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_HEADER_EXTENSION))
75 #define GST_IS_RTP_HEADER_EXTENSION_CLASS(klass) \
76   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_HEADER_EXTENSION))
77 /**
78  * GST_RTP_HEADER_EXTENSION_CAST:
79  *
80  * Since: 1.20
81  */
82 #define GST_RTP_HEADER_EXTENSION_CAST(obj) ((GstRTPHeaderExtension *)(obj))
83 
84 typedef struct _GstRTPHeaderExtension      GstRTPHeaderExtension;
85 typedef struct _GstRTPHeaderExtensionClass GstRTPHeaderExtensionClass;
86 
87 /**
88  * GstRTPHeaderExtensionFlags:
89  * @GST_RTP_HEADER_EXTENSION_ONE_BYTE: The one byte rtp extension header.
90  *              1-16 data bytes per extension with a maximum of
91  *              14 extension ids in total.
92  * @GST_RTP_HEADER_EXTENSION_TWO_BYTE: The two byte rtp extension header.
93  *              256 data bytes per extension with a maximum of 255 (or 256
94  *              including appbits) extensions in total.
95  *
96  * Flags that apply to a RTP Audio/Video header extension.
97  *
98  * Since: 1.20
99  */
100 typedef enum /*< underscore_name=gst_rtp_header_extension_flags >*/
101 {
102   GST_RTP_HEADER_EXTENSION_ONE_BYTE = (1 << 0),
103   GST_RTP_HEADER_EXTENSION_TWO_BYTE = (1 << 1),
104 } GstRTPHeaderExtensionFlags;
105 
106 /**
107  * GstRTPHeaderExtensionDirection:
108  * @GST_RTP_HEADER_EXTENSION_DIRECTION_INACTIVE: Neither send nor
109  * receive RTP Header Extensions
110  * @GST_RTP_HEADER_EXTENSION_DIRECTION_SENDONLY: Only send RTP Header
111  * Extensions @GST_RTP_HEADER_EXTENSION_DIRECTION_RECVONLY: Only
112  * receive RTP Header Extensions
113  * @GST_RTP_HEADER_EXTENSION_DIRECTION_SENDRECV: Send and receive RTP
114  * Header Extensions ext
115  * @GST_RTP_HEADER_EXTENSION_DIRECTION_INHERITED: RTP header extension
116  * direction is inherited from the stream
117  *
118  * Direction to which to apply the RTP Header Extension
119  *
120  * Since: 1.20
121  */
122 typedef enum /*< underscore_name=gst_rtp_header_extension_direction >*/
123 {
124   GST_RTP_HEADER_EXTENSION_DIRECTION_INACTIVE = 0,
125   GST_RTP_HEADER_EXTENSION_DIRECTION_SENDONLY = (1 << 0),
126   GST_RTP_HEADER_EXTENSION_DIRECTION_RECVONLY = (1 << 1),
127   GST_RTP_HEADER_EXTENSION_DIRECTION_SENDRECV = (
128     GST_RTP_HEADER_EXTENSION_DIRECTION_SENDONLY |
129     GST_RTP_HEADER_EXTENSION_DIRECTION_RECVONLY),
130   GST_RTP_HEADER_EXTENSION_DIRECTION_INHERITED = (1 << 2)
131 } GstRTPHeaderExtensionDirection;
132 
133 /**
134  * GstRTPHeaderExtension:
135  * @parent: the parent #GObject
136  * @ext_id: the configured extension id
137  *
138  * Instance struct for a RTP Audio/Video header extension.
139  *
140  * Since: 1.20
141  */
142 struct _GstRTPHeaderExtension
143 {
144   GstElement parent;
145 
146   /*< private >*/
147   gpointer _gst_reserved[GST_PADDING];
148 };
149 
150 /**
151  * GstRTPHeaderExtensionClass:
152  * @parent_class: the parent class
153  * @get_uri: retrieve the RTP extension uri
154  * @get_supported_flags: retrieve the supported flags
155  * @get_max_size: retrieve the maximum size for this extension based on the
156  *     information available from input_meta.  Implementations should attempt
157  *     to provide as accurate information as possible as the returned value
158  *     will be used to control the amount of possible data in the payload.
159  *     Implementations must return the maximum as the allocated size for
160  *     writing the extension will be at least the size of the returned value.
161  *     Return the amount of data read or <0 on failure.
162  * @write: write into @data the information for this extension.  Various
163  *     information is provided to help writing extensions in particular cases.
164  * @read: read from a rtp payloaded buffer and extract the extension
165  *     information, optionally adding some meta onto the output buffer.
166  * @set_non_rtp_sink_caps: read any information from sink caps that the header
167  *     extension needs for its function.
168  * @update_non_rtp_src_caps: update depayloader non-RTP (depayloaded) caps with
169  *     the information parsed from RTP header.
170  * @set_attributes: set the necessary attributes that may be signaled e.g. with
171  *     an SDP.
172  * @set_caps_from_attributes: write the necessary caps field/s for the configured
173  *     attributes e.g. as signalled with SDP.
174  *
175  * Base class for RTP Header extensions.
176  *
177  * Since: 1.20
178  */
179 
180 struct _GstRTPHeaderExtensionClass
181 {
182   GstElementClass parent_class;
183 
184   /*< public >*/
185   GstRTPHeaderExtensionFlags (*get_supported_flags) (GstRTPHeaderExtension * ext);
186 
187   gsize                 (*get_max_size)             (GstRTPHeaderExtension * ext,
188                                                      const GstBuffer * input_meta);
189 
190   gssize                (*write)                    (GstRTPHeaderExtension * ext,
191                                                      const GstBuffer * input_meta,
192                                                      GstRTPHeaderExtensionFlags write_flags,
193                                                      GstBuffer * output,
194                                                      guint8 * data,
195                                                      gsize size);
196 
197   gboolean              (*read)                     (GstRTPHeaderExtension * ext,
198                                                      GstRTPHeaderExtensionFlags read_flags,
199                                                      const guint8 * data,
200                                                      gsize size,
201                                                      GstBuffer * buffer);
202   gboolean              (*set_non_rtp_sink_caps)    (GstRTPHeaderExtension * ext,
203                                                      const GstCaps * caps);
204   gboolean              (*update_non_rtp_src_caps)  (GstRTPHeaderExtension * ext,
205                                                      GstCaps * caps);
206   gboolean              (*set_attributes)            (GstRTPHeaderExtension * ext,
207                                                       GstRTPHeaderExtensionDirection direction,
208                                                       const gchar * attributes);
209   gboolean              (*set_caps_from_attributes) (GstRTPHeaderExtension * ext,
210                                                      GstCaps * caps);
211 
212   /*< private >*/
213   gpointer _gst_reserved[GST_PADDING_LARGE];
214 };
215 
216 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstRTPHeaderExtension, gst_object_unref)
217 
218 /**
219  * GST_RTP_HEADER_EXTENSION_URI_METADATA_KEY:
220  *
221  * Since: 1.20
222  */
223 #define GST_RTP_HEADER_EXTENSION_URI_METADATA_KEY "RTP-Header-Extension-URI"
224 
225 GST_RTP_API
226 void                gst_rtp_header_extension_class_set_uri      (GstRTPHeaderExtensionClass *klass,
227                                                                  const gchar * uri);
228 
229 GST_RTP_API
230 const gchar *       gst_rtp_header_extension_get_uri            (GstRTPHeaderExtension * ext);
231 GST_RTP_API
232 gsize               gst_rtp_header_extension_get_max_size       (GstRTPHeaderExtension * ext,
233                                                                  const GstBuffer * input_meta);
234 GST_RTP_API
235 GstRTPHeaderExtensionFlags gst_rtp_header_extension_get_supported_flags (GstRTPHeaderExtension * ext);
236 GST_RTP_API
237 guint               gst_rtp_header_extension_get_id             (GstRTPHeaderExtension * ext);
238 GST_RTP_API
239 void                gst_rtp_header_extension_set_id             (GstRTPHeaderExtension * ext,
240                                                                  guint ext_id);
241 GST_RTP_API
242 gssize              gst_rtp_header_extension_write              (GstRTPHeaderExtension * ext,
243                                                                  const GstBuffer * input_meta,
244                                                                  GstRTPHeaderExtensionFlags write_flags,
245                                                                  GstBuffer * output,
246                                                                  guint8 * data,
247                                                                  gsize size);
248 GST_RTP_API
249 gboolean            gst_rtp_header_extension_read               (GstRTPHeaderExtension * ext,
250                                                                  GstRTPHeaderExtensionFlags read_flags,
251                                                                  const guint8 * data,
252                                                                  gsize size,
253                                                                  GstBuffer * buffer);
254 GST_RTP_API
255 gboolean            gst_rtp_header_extension_set_non_rtp_sink_caps (GstRTPHeaderExtension * ext,
256                                                                     const GstCaps * caps);
257 GST_RTP_API
258 gboolean            gst_rtp_header_extension_wants_update_non_rtp_src_caps (GstRTPHeaderExtension * ext);
259 GST_RTP_API
260 void                gst_rtp_header_extension_set_wants_update_non_rtp_src_caps (GstRTPHeaderExtension * ext,
261                                                                                 gboolean state);
262 GST_RTP_API
263 gboolean            gst_rtp_header_extension_update_non_rtp_src_caps (GstRTPHeaderExtension * ext,
264                                                                       GstCaps * caps);
265 GST_RTP_API
266 gboolean            gst_rtp_header_extension_set_caps_from_attributes (GstRTPHeaderExtension * ext,
267                                                                        GstCaps * caps);
268 GST_RTP_API
269 gboolean            gst_rtp_header_extension_set_attributes_from_caps (GstRTPHeaderExtension * ext,
270                                                                        const GstCaps * caps);
271 
272 GST_RTP_API
273 GList *             gst_rtp_get_header_extension_list           (void);
274 GST_RTP_API
275 GstRTPHeaderExtension * gst_rtp_header_extension_create_from_uri (const gchar * uri);
276 
277 GST_RTP_API
278 gchar *	            gst_rtp_header_extension_get_sdp_caps_field_name (GstRTPHeaderExtension * ext);
279 
280 GST_RTP_API
281 void	            gst_rtp_header_extension_set_direction (GstRTPHeaderExtension * ext,
282                                                             GstRTPHeaderExtensionDirection direction);
283 GST_RTP_API
284 GstRTPHeaderExtensionDirection	gst_rtp_header_extension_get_direction (GstRTPHeaderExtension * ext);
285 
286 GST_RTP_API
287 gboolean    gst_rtp_header_extension_set_caps_from_attributes_helper (GstRTPHeaderExtension * ext,
288                                                                       GstCaps * caps,
289                                                                       const gchar * attributes);
290 
291 G_END_DECLS
292 
293 #endif /* __GST_RTPHDREXT_H__ */
294 
295