|
1 /* GStreamer |
|
2 * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.com> |
|
3 * |
|
4 * gstrtppayloads.h: various helper functions to deal with RTP payload |
|
5 * types. |
|
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 /** |
|
24 * SECTION:gstrtppayloads |
|
25 * @short_description: Helper methods for dealing with RTP payloads |
|
26 * @see_also: gstrtpbuffer |
|
27 * |
|
28 * <refsect2> |
|
29 * <para> |
|
30 * The GstRTPPayloads helper functions makes it easy to deal with static and dynamic |
|
31 * payloads. Its main purpose is to retrieve properties such as the default clock-rate |
|
32 * and get session bandwidth information. |
|
33 * </para> |
|
34 * </refsect2> |
|
35 * |
|
36 * Last reviewed on 2007-10-01 (0.10.15) |
|
37 */ |
|
38 |
|
39 #include <string.h> |
|
40 |
|
41 #include "gstrtppayloads.h" |
|
42 |
|
43 /* pt, encoding_name, media, rate, params, bitrate */ |
|
44 static const GstRTPPayloadInfo info[] = { |
|
45 /* static audio */ |
|
46 {0, "audio", "PCMU", 8000, "1", 64000}, |
|
47 /* { 1, "audio", "reserved", 0, NULL, 0 }, */ |
|
48 /* { 2, "audio", "reserved", 0, NULL, 0 }, */ |
|
49 {3, "audio", "GSM", 8000, "1", 0}, |
|
50 {4, "audio", "G723", 8000, "1", 0}, |
|
51 {5, "audio", "DVI4", 8000, "1", 32000}, |
|
52 {6, "audio", "DVI4", 16000, "1", 64000}, |
|
53 {7, "audio", "LPC", 8000, "1", 0}, |
|
54 {8, "audio", "PCMA", 8000, "1", 64000}, |
|
55 {9, "audio", "G722", 8000, "1", 64000}, |
|
56 {10, "audio", "L16", 44100, "2", 1411200}, |
|
57 {11, "audio", "L16", 44100, "1", 705600}, |
|
58 {12, "audio", "QCELP", 8000, "1", 0}, |
|
59 {13, "audio", "CN", 8000, "1", 0}, |
|
60 {14, "audio", "MPA", 90000, NULL, 0}, |
|
61 {15, "audio", "G728", 8000, "1", 0}, |
|
62 {16, "audio", "DVI4", 11025, "1", 44100}, |
|
63 {17, "audio", "DVI4", 22050, "1", 88200}, |
|
64 {18, "audio", "G729", 8000, "1", 0}, |
|
65 /* { 19, "audio", "reserved", 0, NULL, 0 }, */ |
|
66 /* { 20, "audio", "unassigned", 0, NULL, 0 }, */ |
|
67 /* { 21, "audio", "unassigned", 0, NULL, 0 }, */ |
|
68 /* { 22, "audio", "unassigned", 0, NULL, 0 }, */ |
|
69 /* { 23, "audio", "unassigned", 0, NULL, 0 }, */ |
|
70 |
|
71 /* video and video/audio */ |
|
72 /* { 24, "video", "unassigned", 0, NULL, 0 }, */ |
|
73 {25, "video", "CelB", 90000, NULL, 0}, |
|
74 {26, "video", "JPEG", 90000, NULL, 0}, |
|
75 /* { 27, "video", "unassigned", 0, NULL, 0 }, */ |
|
76 {28, "video", "nv", 90000, NULL, 0}, |
|
77 /* { 29, "video", "unassigned", 0, NULL, 0 }, */ |
|
78 /* { 30, "video", "unassigned", 0, NULL, 0 }, */ |
|
79 {31, "video", "H261", 90000, NULL, 0}, |
|
80 {32, "video", "MPV", 90000, NULL, 0}, |
|
81 {33, "video", "MP2T", 90000, NULL, 0}, |
|
82 {34, "video", "H263", 90000, NULL, 0}, |
|
83 /* { 35-71, "unassigned", 0, 0, NULL, 0 }, */ |
|
84 /* { 72-76, "reserved", 0, 0, NULL, 0 }, */ |
|
85 /* { 77-95, "unassigned", 0, 0, NULL, 0 }, */ |
|
86 /* { 96-127, "dynamic", 0, 0, NULL, 0 }, */ |
|
87 |
|
88 /* dynamic stuff */ |
|
89 {G_MAXUINT8, "application", "parityfec", 0, NULL, 0}, /* [RFC3009] */ |
|
90 {G_MAXUINT8, "application", "rtx", 0, NULL, 0}, /* [RFC4588] */ |
|
91 {G_MAXUINT8, "audio", "AMR", 8000, NULL, 0}, /* [RFC4867][RFC3267] */ |
|
92 {G_MAXUINT8, "audio", "AMR-WB", 16000, NULL, 0}, /* [RFC4867][RFC3267] */ |
|
93 {G_MAXUINT8, "audio", "DAT12", 0, NULL, 0}, /* [RFC3190] */ |
|
94 {G_MAXUINT8, "audio", "dsr-es201108", 0, NULL, 0}, /* [RFC3557] */ |
|
95 {G_MAXUINT8, "audio", "EVRC", 8000, "1", 0}, /* [RFC4788] */ |
|
96 {G_MAXUINT8, "audio", "EVRC0", 8000, "1", 0}, /* [RFC4788] */ |
|
97 {G_MAXUINT8, "audio", "EVRC1", 8000, "1", 0}, /* [RFC4788] */ |
|
98 {G_MAXUINT8, "audio", "EVRCB", 8000, "1", 0}, /* [RFC4788] */ |
|
99 {G_MAXUINT8, "audio", "EVRCB0", 8000, "1", 0}, /* [RFC4788] */ |
|
100 {G_MAXUINT8, "audio", "EVRCB1", 8000, "1", 0}, /* [RFC4788] */ |
|
101 {G_MAXUINT8, "audio", "G7221", 16000, "1", 0}, /* [RFC3047] */ |
|
102 {G_MAXUINT8, "audio", "G726-16", 8000, "1", 0}, /* [RFC3551][RFC4856] */ |
|
103 {G_MAXUINT8, "audio", "G726-24", 8000, "1", 0}, /* [RFC3551][RFC4856] */ |
|
104 {G_MAXUINT8, "audio", "G726-32", 8000, "1", 0}, /* [RFC3551][RFC4856] */ |
|
105 {G_MAXUINT8, "audio", "G726-40", 8000, "1", 0}, /* [RFC3551][RFC4856] */ |
|
106 {G_MAXUINT8, "audio", "G729D", 8000, "1", 0}, /* [RFC3551][RFC4856] */ |
|
107 {G_MAXUINT8, "audio", "G729E", 8000, "1", 0}, /* [RFC3551][RFC4856] */ |
|
108 {G_MAXUINT8, "audio", "GSM-EFR", 8000, "1", 0}, /* [RFC3551][RFC4856] */ |
|
109 {G_MAXUINT8, "audio", "L8", 0, NULL, 0}, /* [RFC3551][RFC4856] */ |
|
110 {G_MAXUINT8, "audio", "RED", 0, NULL, 0}, /* [RFC2198][RFC3555] */ |
|
111 {G_MAXUINT8, "audio", "rtx", 0, NULL, 0}, /* [RFC4588] */ |
|
112 {G_MAXUINT8, "audio", "VDVI", 0, "1", 0}, /* [RFC3551][RFC4856] */ |
|
113 {G_MAXUINT8, "audio", "L20", 0, NULL, 0}, /* [RFC3190] */ |
|
114 {G_MAXUINT8, "audio", "L24", 0, NULL, 0}, /* [RFC3190] */ |
|
115 {G_MAXUINT8, "audio", "MP4A-LATM", 0, NULL, 0}, /* [RFC3016] */ |
|
116 {G_MAXUINT8, "audio", "mpa-robust", 90000, NULL, 0}, /* [RFC3119] */ |
|
117 {G_MAXUINT8, "audio", "parityfec", 0, NULL, 0}, /* [RFC3009] */ |
|
118 {G_MAXUINT8, "audio", "SMV", 8000, "1", 0}, /* [RFC3558] */ |
|
119 {G_MAXUINT8, "audio", "SMV0", 8000, "1", 0}, /* [RFC3558] */ |
|
120 {G_MAXUINT8, "audio", "t140c", 0, NULL, 0}, /* [RFC4351] */ |
|
121 {G_MAXUINT8, "audio", "t38", 0, NULL, 0}, /* [RFC4612] */ |
|
122 {G_MAXUINT8, "audio", "telephone-event", 0, NULL, 0}, /* [RFC4733] */ |
|
123 {G_MAXUINT8, "audio", "tone", 0, NULL, 0}, /* [RFC4733] */ |
|
124 {G_MAXUINT8, "audio", "DVI4", 0, NULL, 0}, /* [RFC4856] */ |
|
125 {G_MAXUINT8, "audio", "G722", 0, NULL, 0}, /* [RFC4856] */ |
|
126 {G_MAXUINT8, "audio", "G723", 0, NULL, 0}, /* [RFC4856] */ |
|
127 {G_MAXUINT8, "audio", "G728", 0, NULL, 0}, /* [RFC4856] */ |
|
128 {G_MAXUINT8, "audio", "G729", 0, NULL, 0}, /* [RFC4856] */ |
|
129 {G_MAXUINT8, "audio", "GSM", 0, NULL, 0}, /* [RFC4856] */ |
|
130 {G_MAXUINT8, "audio", "L16", 0, NULL, 0}, /* [RFC4856] */ |
|
131 {G_MAXUINT8, "audio", "LPC", 0, NULL, 0}, /* [RFC4856] */ |
|
132 {G_MAXUINT8, "audio", "PCMA", 0, NULL, 0}, /* [RFC4856] */ |
|
133 {G_MAXUINT8, "audio", "PCMU", 0, NULL, 0}, /* [RFC4856] */ |
|
134 {G_MAXUINT8, "text", "parityfec", 0, NULL, 0}, /* [RFC3009] */ |
|
135 {G_MAXUINT8, "text", "red", 1000, NULL, 0}, /* [RFC4102] */ |
|
136 {G_MAXUINT8, "text", "rtx", 0, NULL, 0}, /* [RFC4588] */ |
|
137 {G_MAXUINT8, "text", "t140", 1000, NULL, 0}, /* [RFC4103] */ |
|
138 {G_MAXUINT8, "video", "BMPEG", 90000, NULL, 0}, /* [RFC2343][RFC3555] */ |
|
139 {G_MAXUINT8, "video", "BT656", 90000, NULL, 0}, /* [RFC2431][RFC3555] */ |
|
140 {G_MAXUINT8, "video", "DV", 90000, NULL, 0}, /* [RFC3189] */ |
|
141 {G_MAXUINT8, "video", "H263-1998", 90000, NULL, 0}, /* [RFC2429][RFC3555] */ |
|
142 {G_MAXUINT8, "video", "H263-2000", 90000, NULL, 0}, /* [RFC2429][RFC3555] */ |
|
143 {G_MAXUINT8, "video", "MP1S", 90000, NULL, 0}, /* [RFC2250][RFC3555] */ |
|
144 {G_MAXUINT8, "video", "MP2P", 90000, NULL, 0}, /* [RFC2250][RFC3555] */ |
|
145 {G_MAXUINT8, "video", "MP4V-ES", 90000, NULL, 0}, /* [RFC3016] */ |
|
146 {G_MAXUINT8, "video", "parityfec", 0, NULL, 0}, /* [RFC3009] */ |
|
147 {G_MAXUINT8, "video", "pointer", 90000, NULL, 0}, /* [RFC2862] */ |
|
148 {G_MAXUINT8, "video", "raw", 90000, NULL, 0}, /* [RFC4175] */ |
|
149 {G_MAXUINT8, "video", "rtx", 0, NULL, 0}, /* [RFC4588] */ |
|
150 {G_MAXUINT8, "video", "SMPTE292M", 0, NULL, 0}, /* [RFC3497] */ |
|
151 {G_MAXUINT8, "video", "vc1", 90000, NULL, 0}, /* [RFC4425] */ |
|
152 |
|
153 /* not in http://www.iana.org/assignments/rtp-parameters */ |
|
154 {G_MAXUINT8, "audio", "AC3", 0, NULL, 0}, |
|
155 {G_MAXUINT8, "audio", "ILBC", 8000, NULL, 0}, |
|
156 {G_MAXUINT8, "audio", "MPEG4-GENERIC", 0, NULL, 0}, |
|
157 {G_MAXUINT8, "audio", "SPEEX", 0, NULL, 0}, |
|
158 |
|
159 {G_MAXUINT8, "application", "MPEG4-GENERIC", 0, NULL, 0}, |
|
160 |
|
161 {G_MAXUINT8, "video", "H264", 90000, NULL, 0}, |
|
162 {G_MAXUINT8, "video", "MPEG4-GENERIC", 90000, NULL, 0}, |
|
163 {G_MAXUINT8, "video", "THEORA", 0, NULL, 0}, |
|
164 {G_MAXUINT8, "video", "VORBIS", 0, NULL, 0}, |
|
165 {G_MAXUINT8, "video", "X-SV3V-ES", 90000, NULL, 0}, |
|
166 {G_MAXUINT8, "video", "X-SORENSON-VIDEO", 90000, NULL, 0}, |
|
167 |
|
168 /* real stuff */ |
|
169 {G_MAXUINT8, "video", "x-pn-realvideo", 1000, NULL, 0}, |
|
170 {G_MAXUINT8, "audio", "x-pn-realaudio", 1000, NULL, 0}, |
|
171 {G_MAXUINT8, "application", "x-pn-realmedia", 1000, NULL, 0}, |
|
172 |
|
173 /* terminator */ |
|
174 {G_MAXUINT8, NULL, NULL, 0, NULL, 0} |
|
175 }; |
|
176 |
|
177 /** |
|
178 * gst_rtp_payload_info_for_pt: |
|
179 * @payload_type: the payload_type to find |
|
180 * |
|
181 * Get the #GstRTPPayloadInfo for @payload_type. This function is |
|
182 * mostly used to get the default clock-rate and bandwidth for static payload |
|
183 * types specified with @payload_type. |
|
184 * |
|
185 * Returns: a #GstRTPPayloadInfo or NULL when no info could be found. |
|
186 */ |
|
187 #ifdef __SYMBIAN32__ |
|
188 EXPORT_C |
|
189 #endif |
|
190 |
|
191 const GstRTPPayloadInfo * |
|
192 gst_rtp_payload_info_for_pt (guint8 payload_type) |
|
193 { |
|
194 const GstRTPPayloadInfo *result = NULL; |
|
195 gint i; |
|
196 |
|
197 for (i = 0; info[i].media; i++) { |
|
198 if (info[i].payload_type == payload_type) { |
|
199 result = &info[i]; |
|
200 break; |
|
201 } |
|
202 } |
|
203 return result; |
|
204 } |
|
205 |
|
206 /** |
|
207 * gst_rtp_payload_info_for_name: |
|
208 * @media: the media to find |
|
209 * @encoding_name: the encoding name to find |
|
210 * |
|
211 * Get the #GstRTPPayloadInfo for @media and @encoding_name. This function is |
|
212 * mostly used to get the default clock-rate and bandwidth for dynamic payload |
|
213 * types specified with @media and @encoding name. |
|
214 * |
|
215 * The search for @encoding_name will be performed in a case insensitve way. |
|
216 * |
|
217 * Returns: a #GstRTPPayloadInfo or NULL when no info could be found. |
|
218 */ |
|
219 #ifdef __SYMBIAN32__ |
|
220 EXPORT_C |
|
221 #endif |
|
222 |
|
223 const GstRTPPayloadInfo * |
|
224 gst_rtp_payload_info_for_name (const gchar * media, const gchar * encoding_name) |
|
225 { |
|
226 const GstRTPPayloadInfo *result = NULL; |
|
227 gint i; |
|
228 |
|
229 for (i = 0; info[i].media; i++) { |
|
230 if (strcmp (media, info[i].media) == 0 |
|
231 && g_strcasecmp (encoding_name, info[i].encoding_name) == 0) { |
|
232 result = &info[i]; |
|
233 break; |
|
234 } |
|
235 } |
|
236 return result; |
|
237 } |