12024
|
1 /*
|
|
2 The mediastreamer library aims at providing modular media processing and I/O
|
|
3 for linphone, but also for any telephony application.
|
|
4 Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org
|
|
5
|
|
6 This library is free software; you can redistribute it and/or
|
|
7 modify it under the terms of the GNU Lesser General Public
|
|
8 License as published by the Free Software Foundation; either
|
|
9 version 2.1 of the License, or (at your option) any later version.
|
|
10
|
|
11 This library is distributed in the hope that it will be useful,
|
|
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
14 Lesser General Public License for more details.
|
|
15
|
|
16 You should have received a copy of the GNU Lesser General Public
|
|
17 License along with this library; if not, write to the Free Software
|
|
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
19 */
|
|
20
|
|
21
|
|
22 #include "mscodec.h"
|
|
23
|
|
24 #ifdef SME
|
|
25 #include "msGSMdecoder.h"
|
|
26 #include "msLPC10decoder.h"
|
|
27 #endif
|
|
28 #include "msMUlawdec.h"
|
|
29 #include "msAlawdec.h"
|
|
30
|
|
31 #ifdef TRUESPEECH
|
|
32 extern MSCodecInfo TrueSpeechinfo;
|
|
33 #endif
|
|
34
|
|
35 #ifdef VIDEO_ENABLED
|
|
36 extern void ms_AVCodec_init();
|
|
37 #endif
|
|
38
|
|
39 #define UDP_HDR_SZ 8
|
|
40 #define RTP_HDR_SZ 12
|
|
41 #define IP4_HDR_SZ 20 /*20 is the minimum, but there may be some options*/
|
|
42
|
|
43
|
|
44
|
|
45
|
|
46 /* register all statically linked codecs */
|
|
47 void ms_codec_register_all()
|
|
48 {
|
|
49 // ms_filter_register(MS_FILTER_INFO(&GSMinfo));
|
|
50 // ms_filter_register(MS_FILTER_INFO(&LPC10info));
|
|
51 ms_filter_register(MS_FILTER_INFO(&MULAWinfo));
|
|
52 ms_filter_register(MS_FILTER_INFO(&ALAWinfo));
|
|
53 #ifdef TRUESPEECH
|
|
54 ms_filter_register(MS_FILTER_INFO(&TrueSpeechinfo));
|
|
55 #endif
|
|
56 #ifdef VIDEO_ENABLED
|
|
57 ms_AVCodec_init();
|
|
58 #endif
|
|
59
|
|
60 }
|
|
61
|
|
62 /* returns a list of MSCodecInfo */
|
|
63 GList * ms_codec_get_all_audio()
|
|
64 {
|
|
65 GList *audio_codecs=NULL;
|
|
66 GList *elem=filter_list;
|
|
67 MSFilterInfo *info;
|
|
68 while (elem!=NULL)
|
|
69 {
|
|
70 info=(MSFilterInfo *)elem->data;
|
|
71 if (info->type==MS_FILTER_AUDIO_CODEC){
|
|
72 audio_codecs=g_list_append(audio_codecs,info);
|
|
73 }
|
|
74 elem=g_list_next(elem);
|
|
75 }
|
|
76 return audio_codecs;
|
|
77 }
|
|
78
|
|
79
|
|
80 MSCodecInfo * ms_audio_codec_info_get(gchar *name)
|
|
81 {
|
|
82 GList *elem=filter_list;
|
|
83 MSFilterInfo *info;
|
|
84 while (elem!=NULL)
|
|
85 {
|
|
86 info=(MSFilterInfo *)elem->data;
|
|
87 if ( (info->type==MS_FILTER_AUDIO_CODEC) ){
|
|
88 MSCodecInfo *codinfo=(MSCodecInfo *)info;
|
|
89 if (strcmp(codinfo->description,name)==0){
|
|
90 return MS_CODEC_INFO(info);
|
|
91 }
|
|
92 }
|
|
93 elem=g_list_next(elem);
|
|
94 }
|
|
95 return NULL;
|
|
96 }
|
|
97
|
|
98 MSCodecInfo * ms_video_codec_info_get(gchar *name)
|
|
99 {
|
|
100 GList *elem=filter_list;
|
|
101 MSFilterInfo *info;
|
|
102 while (elem!=NULL)
|
|
103 {
|
|
104 info=(MSFilterInfo *)elem->data;
|
|
105 if ( (info->type==MS_FILTER_VIDEO_CODEC) ){
|
|
106 MSCodecInfo *codinfo=(MSCodecInfo *)info;
|
|
107 if (strcmp(codinfo->description,name)==0){
|
|
108 return MS_CODEC_INFO(info);
|
|
109 }
|
|
110 }
|
|
111 elem=g_list_next(elem);
|
|
112 }
|
|
113 return NULL;
|
|
114 }
|
|
115
|
|
116 /* returns a list of MSCodecInfo */
|
|
117 GList * ms_codec_get_all_video()
|
|
118 {
|
|
119 GList *video_codecs=NULL;
|
|
120 GList *elem=filter_list;
|
|
121 MSFilterInfo *info;
|
|
122 while (elem!=NULL)
|
|
123 {
|
|
124 info=(MSFilterInfo *)elem->data;
|
|
125 if (info->type==MS_FILTER_VIDEO_CODEC){
|
|
126 video_codecs=g_list_append(video_codecs,info);
|
|
127 }
|
|
128 elem=g_list_next(elem);
|
|
129 }
|
|
130 return video_codecs;
|
|
131 }
|
|
132
|
|
133 MSFilter * ms_encoder_new(gchar *name)
|
|
134 {
|
|
135 GList *elem=filter_list;
|
|
136 MSFilterInfo *info;
|
|
137 while (elem!=NULL)
|
|
138 {
|
|
139 info=(MSFilterInfo *)elem->data;
|
|
140 if ((info->type==MS_FILTER_AUDIO_CODEC) || (info->type==MS_FILTER_VIDEO_CODEC)){
|
|
141 MSCodecInfo *codinfo=(MSCodecInfo *)elem->data;
|
|
142 if (strcmp(info->name,name)==0){
|
|
143 return codinfo->encoder();
|
|
144 }
|
|
145 }
|
|
146 elem=g_list_next(elem);
|
|
147 }
|
|
148 return NULL;
|
|
149 }
|
|
150
|
|
151 MSFilter * ms_decoder_new(gchar *name)
|
|
152 {
|
|
153 GList *elem=filter_list;
|
|
154 MSFilterInfo *info;
|
|
155 while (elem!=NULL)
|
|
156 {
|
|
157 info=(MSFilterInfo *)elem->data;
|
|
158 if ((info->type==MS_FILTER_AUDIO_CODEC) || (info->type==MS_FILTER_VIDEO_CODEC)){
|
|
159 MSCodecInfo *codinfo=(MSCodecInfo *)elem->data;
|
|
160 if (strcmp(info->name,name)==0){
|
|
161 return codinfo->decoder();
|
|
162 }
|
|
163 }
|
|
164 elem=g_list_next(elem);
|
|
165 }
|
|
166 return NULL;
|
|
167 }
|
|
168
|
|
169 MSFilter * ms_encoder_new_with_pt(gint pt)
|
|
170 {
|
|
171 GList *elem=filter_list;
|
|
172 MSFilterInfo *info;
|
|
173 while (elem!=NULL)
|
|
174 {
|
|
175 info=(MSFilterInfo *)elem->data;
|
|
176 if ((info->type==MS_FILTER_AUDIO_CODEC) || (info->type==MS_FILTER_VIDEO_CODEC)){
|
|
177 MSCodecInfo *codinfo=(MSCodecInfo *)elem->data;
|
|
178 if (codinfo->pt==pt){
|
|
179 return codinfo->encoder();
|
|
180 }
|
|
181 }
|
|
182 elem=g_list_next(elem);
|
|
183 }
|
|
184 return NULL;
|
|
185 }
|
|
186
|
|
187 MSFilter * ms_decoder_new_with_pt(gint pt)
|
|
188 {
|
|
189 GList *elem=filter_list;
|
|
190 MSFilterInfo *info;
|
|
191 while (elem!=NULL)
|
|
192 {
|
|
193 info=(MSFilterInfo *)elem->data;
|
|
194 if ((info->type==MS_FILTER_AUDIO_CODEC) || (info->type==MS_FILTER_VIDEO_CODEC)){
|
|
195 MSCodecInfo *codinfo=(MSCodecInfo *)elem->data;
|
|
196 if (codinfo->pt==pt){
|
|
197 return codinfo->decoder();
|
|
198 }
|
|
199 }
|
|
200 elem=g_list_next(elem);
|
|
201 }
|
|
202 return NULL;
|
|
203 }
|
|
204
|
|
205 MSFilter * ms_decoder_new_with_string_id(gchar *id)
|
|
206 {
|
|
207 GList *elem=filter_list;
|
|
208 MSFilterInfo *info;
|
|
209 while (elem!=NULL)
|
|
210 {
|
|
211 info=(MSFilterInfo *)elem->data;
|
|
212 if ((info->type==MS_FILTER_AUDIO_CODEC) || (info->type==MS_FILTER_VIDEO_CODEC)){
|
|
213 MSCodecInfo *codinfo=(MSCodecInfo *)elem->data;
|
|
214 if (strcasecmp(codinfo->description,id)==0){
|
|
215 return codinfo->decoder();
|
|
216 }
|
|
217 }
|
|
218 elem=g_list_next(elem);
|
|
219 }
|
|
220 return NULL;
|
|
221 }
|
|
222
|
|
223 MSFilter * ms_encoder_new_with_string_id(gchar *id)
|
|
224 {
|
|
225 GList *elem=filter_list;
|
|
226 MSFilterInfo *info;
|
|
227 while (elem!=NULL)
|
|
228 {
|
|
229 info=(MSFilterInfo *)elem->data;
|
|
230 if ((info->type==MS_FILTER_AUDIO_CODEC) || (info->type==MS_FILTER_VIDEO_CODEC)){
|
|
231 MSCodecInfo *codinfo=(MSCodecInfo *)elem->data;
|
|
232 if (strcasecmp(codinfo->description,id)==0){
|
|
233 return codinfo->encoder();
|
|
234 }
|
|
235 }
|
|
236 elem=g_list_next(elem);
|
|
237 }
|
|
238 return NULL;
|
|
239 }
|
|
240 /* return 0 if codec can be used with bandwidth, -1 else*/
|
|
241 int ms_codec_is_usable(MSCodecInfo *codec,double bandwidth)
|
|
242 {
|
|
243 double codec_band;
|
|
244 double npacket;
|
|
245 double packet_size;
|
|
246
|
|
247 if (((MSFilterInfo*)codec)->type==MS_FILTER_AUDIO_CODEC)
|
|
248 {
|
|
249 /* calculate the total bandwdith needed by codec (including headers for rtp, udp, ip)*/
|
|
250 /* number of packet per second*/
|
|
251 npacket=2.0*(double)(codec->rate)/(double)(codec->fr_size);
|
|
252 packet_size=(double)(codec->dt_size)+UDP_HDR_SZ+RTP_HDR_SZ+IP4_HDR_SZ;
|
|
253 codec_band=packet_size*8.0*npacket;
|
|
254 }
|
|
255 else return -1;
|
|
256 return(codec_band<bandwidth);
|
|
257 }
|