Added gst-plugins-base-subtitles0.10-0.10.34 for Meego Harmattan 1.2
[mafwsubrenderer] / gst-plugins-base-subtitles0.10 / gst-libs / gst / rtp / gstrtppayloads.c
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 const GstRTPPayloadInfo *
188 gst_rtp_payload_info_for_pt (guint8 payload_type)
189 {
190   const GstRTPPayloadInfo *result = NULL;
191   gint i;
192
193   for (i = 0; info[i].media; i++) {
194     if (info[i].payload_type == payload_type) {
195       result = &info[i];
196       break;
197     }
198   }
199   return result;
200 }
201
202 /**
203  * gst_rtp_payload_info_for_name:
204  * @media: the media to find
205  * @encoding_name: the encoding name to find
206  *
207  * Get the #GstRTPPayloadInfo for @media and @encoding_name. This function is
208  * mostly used to get the default clock-rate and bandwidth for dynamic payload
209  * types specified with @media and @encoding name.
210  *
211  * The search for @encoding_name will be performed in a case insensitve way.
212  *
213  * Returns: a #GstRTPPayloadInfo or NULL when no info could be found.
214  */
215 const GstRTPPayloadInfo *
216 gst_rtp_payload_info_for_name (const gchar * media, const gchar * encoding_name)
217 {
218   const GstRTPPayloadInfo *result = NULL;
219   gint i;
220
221   for (i = 0; info[i].media; i++) {
222     if (strcmp (media, info[i].media) == 0
223         && g_ascii_strcasecmp (encoding_name, info[i].encoding_name) == 0) {
224       result = &info[i];
225       break;
226     }
227   }
228   return result;
229 }