mirror of
https://gitlab.linphone.org/BC/public/linphone-iphone.git
synced 2026-04-20 19:18:31 +00:00
integrate G726, refactor codec number assignement and ranking
This commit is contained in:
parent
f5f8a15570
commit
c396b74b9b
5 changed files with 97 additions and 51 deletions
|
|
@ -633,17 +633,18 @@ static bool_t get_codec(LpConfig *config, const char* type, int index, PayloadTy
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define RANK_END 10000
|
||||||
static const char *codec_pref_order[]={
|
static const char *codec_pref_order[]={
|
||||||
"speex",
|
"speex",
|
||||||
|
"iLBC",
|
||||||
|
"amr",
|
||||||
"gsm",
|
"gsm",
|
||||||
"pcmu",
|
"pcmu",
|
||||||
"pcma",
|
"pcma",
|
||||||
|
"VP8-DRAFT-0-3-2"
|
||||||
"H264",
|
"H264",
|
||||||
"MP4V-ES",
|
"MP4V-ES",
|
||||||
"theora",
|
|
||||||
"H263-1998",
|
"H263-1998",
|
||||||
"H263",
|
|
||||||
"x-snow",
|
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -651,9 +652,9 @@ static int find_codec_rank(const char *mime){
|
||||||
int i;
|
int i;
|
||||||
for(i=0;codec_pref_order[i]!=NULL;++i){
|
for(i=0;codec_pref_order[i]!=NULL;++i){
|
||||||
if (strcasecmp(codec_pref_order[i],mime)==0)
|
if (strcasecmp(codec_pref_order[i],mime)==0)
|
||||||
break;
|
return i;
|
||||||
}
|
}
|
||||||
return i;
|
return RANK_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int codec_compare(const PayloadType *a, const PayloadType *b){
|
static int codec_compare(const PayloadType *a, const PayloadType *b){
|
||||||
|
|
@ -678,8 +679,8 @@ static MSList *add_missing_codecs(SalStreamType mtype, MSList *l){
|
||||||
}
|
}
|
||||||
if (pt && ms_filter_codec_supported(pt->mime_type)){
|
if (pt && ms_filter_codec_supported(pt->mime_type)){
|
||||||
if (ms_list_find(l,pt)==NULL){
|
if (ms_list_find(l,pt)==NULL){
|
||||||
/*do not enable old or experimental codecs by default*/
|
/*unranked codecs are disabled by default*/
|
||||||
if (strcasecmp(pt->mime_type,"H263")!=0 && strcasecmp(pt->mime_type,"x-snow")!=0){
|
if (find_codec_rank(pt->mime_type)!=RANK_END){
|
||||||
payload_type_set_flag(pt,PAYLOAD_TYPE_ENABLED);
|
payload_type_set_flag(pt,PAYLOAD_TYPE_ENABLED);
|
||||||
}
|
}
|
||||||
ms_message("Adding new codec %s/%i with fmtp %s",
|
ms_message("Adding new codec %s/%i with fmtp %s",
|
||||||
|
|
@ -912,22 +913,43 @@ const char * linphone_core_get_version(void){
|
||||||
return liblinphone_version;
|
return liblinphone_version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void linphone_core_assign_payload_type(LinphoneCore *lc, PayloadType *const_pt, int number, const char *recv_fmtp){
|
||||||
static MSList *linphone_payload_types=NULL;
|
|
||||||
|
|
||||||
static void linphone_core_assign_payload_type(PayloadType *const_pt, int number, const char *recv_fmtp){
|
|
||||||
PayloadType *pt;
|
PayloadType *pt;
|
||||||
pt=payload_type_clone(const_pt);
|
pt=payload_type_clone(const_pt);
|
||||||
|
if (number==-1){
|
||||||
|
/*look for a free number */
|
||||||
|
MSList *elem;
|
||||||
|
int i;
|
||||||
|
for(i=lc->dyn_pt;i<=127;++i){
|
||||||
|
bool_t already_assigned=FALSE;
|
||||||
|
for(elem=lc->payload_types;elem!=NULL;elem=elem->next){
|
||||||
|
PayloadType *it=(PayloadType*)elem->data;
|
||||||
|
if (payload_type_get_number(it)==i){
|
||||||
|
already_assigned=TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!already_assigned){
|
||||||
|
number=i;
|
||||||
|
lc->dyn_pt=i+1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (number==-1){
|
||||||
|
ms_fatal("FIXME: too many codecs, no more free numbers.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ms_message("assigning %s/%i payload type number %i",pt->mime_type,pt->clock_rate,number);
|
||||||
payload_type_set_number(pt,number);
|
payload_type_set_number(pt,number);
|
||||||
if (recv_fmtp!=NULL) payload_type_set_recv_fmtp(pt,recv_fmtp);
|
if (recv_fmtp!=NULL) payload_type_set_recv_fmtp(pt,recv_fmtp);
|
||||||
rtp_profile_set_payload(&av_profile,number,pt);
|
rtp_profile_set_payload(&av_profile,number,pt);
|
||||||
linphone_payload_types=ms_list_append(linphone_payload_types,pt);
|
lc->payload_types=ms_list_append(lc->payload_types,pt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void linphone_core_free_payload_types(void){
|
static void linphone_core_free_payload_types(LinphoneCore *lc){
|
||||||
ms_list_for_each(linphone_payload_types,(void (*)(void*))payload_type_destroy);
|
ms_list_for_each(lc->payload_types,(void (*)(void*))payload_type_destroy);
|
||||||
ms_list_free(linphone_payload_types);
|
ms_list_free(lc->payload_types);
|
||||||
linphone_payload_types=NULL;
|
lc->payload_types=NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void linphone_core_set_state(LinphoneCore *lc, LinphoneGlobalState gstate, const char *message){
|
void linphone_core_set_state(LinphoneCore *lc, LinphoneGlobalState gstate, const char *message){
|
||||||
|
|
@ -952,16 +974,14 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta
|
||||||
|
|
||||||
linphone_core_set_state(lc,LinphoneGlobalStartup,"Starting up");
|
linphone_core_set_state(lc,LinphoneGlobalStartup,"Starting up");
|
||||||
ortp_init();
|
ortp_init();
|
||||||
linphone_core_assign_payload_type(&payload_type_pcmu8000,0,NULL);
|
lc->dyn_pt=96;
|
||||||
linphone_core_assign_payload_type(&payload_type_gsm,3,NULL);
|
linphone_core_assign_payload_type(lc,&payload_type_pcmu8000,0,NULL);
|
||||||
linphone_core_assign_payload_type(&payload_type_pcma8000,8,NULL);
|
linphone_core_assign_payload_type(lc,&payload_type_gsm,3,NULL);
|
||||||
linphone_core_assign_payload_type(&payload_type_lpc1015,115,NULL);
|
linphone_core_assign_payload_type(lc,&payload_type_pcma8000,8,NULL);
|
||||||
linphone_core_assign_payload_type(&payload_type_speex_nb,110,"vbr=on");
|
linphone_core_assign_payload_type(lc,&payload_type_speex_nb,110,"vbr=on");
|
||||||
linphone_core_assign_payload_type(&payload_type_speex_wb,111,"vbr=on");
|
linphone_core_assign_payload_type(lc,&payload_type_speex_wb,111,"vbr=on");
|
||||||
linphone_core_assign_payload_type(&payload_type_speex_uwb,112,"vbr=on");
|
linphone_core_assign_payload_type(lc,&payload_type_speex_uwb,112,"vbr=on");
|
||||||
linphone_core_assign_payload_type(&payload_type_telephone_event,101,"0-11");
|
linphone_core_assign_payload_type(lc,&payload_type_telephone_event,101,"0-11");
|
||||||
linphone_core_assign_payload_type(&payload_type_ilbc,113,"mode=30");
|
|
||||||
linphone_core_assign_payload_type(&payload_type_amr,114,"octet-align=1");
|
|
||||||
|
|
||||||
#if defined(ANDROID) || defined (__IPHONE_OS_VERSION_MIN_REQUIRED)
|
#if defined(ANDROID) || defined (__IPHONE_OS_VERSION_MIN_REQUIRED)
|
||||||
/*shorten the DNS lookup time and send more retransmissions on mobiles:
|
/*shorten the DNS lookup time and send more retransmissions on mobiles:
|
||||||
|
|
@ -976,27 +996,38 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta
|
||||||
PayloadType *pt;
|
PayloadType *pt;
|
||||||
pt=payload_type_clone(&payload_type_gsm);
|
pt=payload_type_clone(&payload_type_gsm);
|
||||||
pt->clock_rate=11025;
|
pt->clock_rate=11025;
|
||||||
rtp_profile_set_payload(&av_profile,114,pt);
|
linphone_core_assign_payload_type(lc,pt,-1,NULL);
|
||||||
linphone_payload_types=ms_list_append(linphone_payload_types,pt);
|
|
||||||
pt=payload_type_clone(&payload_type_gsm);
|
|
||||||
pt->clock_rate=22050;
|
pt->clock_rate=22050;
|
||||||
rtp_profile_set_payload(&av_profile,115,pt);
|
linphone_core_assign_payload_type(lc,pt,-1,NULL);
|
||||||
linphone_payload_types=ms_list_append(linphone_payload_types,pt);
|
payload_type_destroy(pt);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef VIDEO_ENABLED
|
#ifdef VIDEO_ENABLED
|
||||||
linphone_core_assign_payload_type(&payload_type_h263,34,NULL);
|
linphone_core_assign_payload_type(lc,&payload_type_h263,34,NULL);
|
||||||
linphone_core_assign_payload_type(&payload_type_theora,97,NULL);
|
linphone_core_assign_payload_type(lc,&payload_type_theora,97,NULL);
|
||||||
linphone_core_assign_payload_type(&payload_type_h263_1998,98,"CIF=1;QCIF=1");
|
linphone_core_assign_payload_type(lc,&payload_type_h263_1998,98,"CIF=1;QCIF=1");
|
||||||
linphone_core_assign_payload_type(&payload_type_mp4v,99,"profile-level-id=3");
|
linphone_core_assign_payload_type(lc,&payload_type_mp4v,99,"profile-level-id=3");
|
||||||
linphone_core_assign_payload_type(&payload_type_x_snow,100,NULL);
|
linphone_core_assign_payload_type(lc,&payload_type_h264,102,"profile-level-id=428014");
|
||||||
linphone_core_assign_payload_type(&payload_type_h264,102,"profile-level-id=428014");
|
linphone_core_assign_payload_type(lc,&payload_type_vp8,103,NULL);
|
||||||
linphone_core_assign_payload_type(&payload_type_vp8,103,NULL);
|
linphone_core_assign_payload_type(lc,&payload_type_x_snow,-1,NULL);
|
||||||
/* due to limited space in SDP, we have to disable this h264 line which is normally no more necessary */
|
/* due to limited space in SDP, we have to disable this h264 line which is normally no more necessary */
|
||||||
/* linphone_core_assign_payload_type(&payload_type_h264,103,"packetization-mode=1;profile-level-id=428014");*/
|
/* linphone_core_assign_payload_type(&payload_type_h264,-1,"packetization-mode=1;profile-level-id=428014");*/
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*add all payload type for which we don't care about the number */
|
||||||
|
linphone_core_assign_payload_type(lc,&payload_type_ilbc,-1,"mode=30");
|
||||||
|
linphone_core_assign_payload_type(lc,&payload_type_amr,-1,"octet-align=1");
|
||||||
|
linphone_core_assign_payload_type(lc,&payload_type_lpc1015,-1,NULL);
|
||||||
|
linphone_core_assign_payload_type(lc,&payload_type_g726_16,-1,NULL);
|
||||||
|
linphone_core_assign_payload_type(lc,&payload_type_g726_24,-1,NULL);
|
||||||
|
linphone_core_assign_payload_type(lc,&payload_type_g726_32,-1,NULL);
|
||||||
|
linphone_core_assign_payload_type(lc,&payload_type_g726_40,-1,NULL);
|
||||||
|
linphone_core_assign_payload_type(lc,&payload_type_aal2_g726_16,-1,NULL);
|
||||||
|
linphone_core_assign_payload_type(lc,&payload_type_aal2_g726_24,-1,NULL);
|
||||||
|
linphone_core_assign_payload_type(lc,&payload_type_aal2_g726_32,-1,NULL);
|
||||||
|
linphone_core_assign_payload_type(lc,&payload_type_aal2_g726_40,-1,NULL);
|
||||||
|
|
||||||
ms_init();
|
ms_init();
|
||||||
/* create a mediastreamer2 event queue and set it as global */
|
/* create a mediastreamer2 event queue and set it as global */
|
||||||
/* This allows to run event's callback in linphone_core_iterate() */
|
/* This allows to run event's callback in linphone_core_iterate() */
|
||||||
|
|
@ -3957,7 +3988,7 @@ static void linphone_core_uninit(LinphoneCore *lc)
|
||||||
ms_list_for_each(lc->call_logs,(void (*)(void*))linphone_call_log_destroy);
|
ms_list_for_each(lc->call_logs,(void (*)(void*))linphone_call_log_destroy);
|
||||||
lc->call_logs=ms_list_free(lc->call_logs);
|
lc->call_logs=ms_list_free(lc->call_logs);
|
||||||
|
|
||||||
linphone_core_free_payload_types();
|
linphone_core_free_payload_types(lc);
|
||||||
ortp_exit();
|
ortp_exit();
|
||||||
linphone_core_set_state(lc,LinphoneGlobalOff,"Off");
|
linphone_core_set_state(lc,LinphoneGlobalOff,"Off");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -403,6 +403,8 @@ struct _LinphoneCore
|
||||||
codecs_config_t codecs_conf;
|
codecs_config_t codecs_conf;
|
||||||
ui_config_t ui_conf;
|
ui_config_t ui_conf;
|
||||||
autoreplier_config_t autoreplier_conf;
|
autoreplier_config_t autoreplier_conf;
|
||||||
|
MSList *payload_types;
|
||||||
|
int dyn_pt;
|
||||||
LinphoneProxyConfig *default_proxy;
|
LinphoneProxyConfig *default_proxy;
|
||||||
MSList *friends;
|
MSList *friends;
|
||||||
MSList *auth_info;
|
MSList *auth_info;
|
||||||
|
|
|
||||||
|
|
@ -306,6 +306,17 @@ static void linphone_gtk_init_codec_list(GtkTreeView *listview){
|
||||||
gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
|
gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char *get_codec_color(LinphoneCore *lc, PayloadType *pt){
|
||||||
|
const gchar *color;
|
||||||
|
if (linphone_core_check_payload_type_usability(lc,pt)) color="blue";
|
||||||
|
else color="red";
|
||||||
|
if (!linphone_core_payload_type_enabled(lc,pt)) {
|
||||||
|
color="grey";
|
||||||
|
}
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
static void linphone_gtk_show_codecs(GtkTreeView *listview, const MSList *codeclist)
|
static void linphone_gtk_show_codecs(GtkTreeView *listview, const MSList *codeclist)
|
||||||
{
|
{
|
||||||
const MSList *elem;
|
const MSList *elem;
|
||||||
|
|
@ -319,14 +330,16 @@ static void linphone_gtk_show_codecs(GtkTreeView *listview, const MSList *codecl
|
||||||
gchar *status;
|
gchar *status;
|
||||||
gint rate;
|
gint rate;
|
||||||
gfloat bitrate;
|
gfloat bitrate;
|
||||||
gchar *color;
|
const gchar *color;
|
||||||
const char *params="";
|
const char *params="";
|
||||||
|
|
||||||
struct _PayloadType *pt=(struct _PayloadType *)elem->data;
|
struct _PayloadType *pt=(struct _PayloadType *)elem->data;
|
||||||
|
|
||||||
|
color=get_codec_color(linphone_gtk_get_core(),pt);
|
||||||
if (linphone_core_payload_type_enabled(linphone_gtk_get_core(),pt)) status=_("Enabled");
|
if (linphone_core_payload_type_enabled(linphone_gtk_get_core(),pt)) status=_("Enabled");
|
||||||
else status=_("Disabled");
|
else {
|
||||||
if (linphone_core_check_payload_type_usability(linphone_gtk_get_core(),pt)) color="blue";
|
status=_("Disabled");
|
||||||
else color="red";
|
}
|
||||||
/* get an iterator */
|
/* get an iterator */
|
||||||
gtk_list_store_append(store,&iter);
|
gtk_list_store_append(store,&iter);
|
||||||
bitrate=payload_type_get_bitrate(pt)/1000.0;
|
bitrate=payload_type_get_bitrate(pt)/1000.0;
|
||||||
|
|
@ -361,13 +374,12 @@ static void linphone_gtk_check_codec_bandwidth(GtkTreeView *v){
|
||||||
g_return_if_fail(gtk_tree_model_get_iter_first(model,&iter));
|
g_return_if_fail(gtk_tree_model_get_iter_first(model,&iter));
|
||||||
do{
|
do{
|
||||||
PayloadType *pt=NULL;
|
PayloadType *pt=NULL;
|
||||||
const gchar *color;
|
|
||||||
gfloat bitrate;
|
gfloat bitrate;
|
||||||
gtk_tree_model_get(model,&iter,CODEC_PRIVDATA,&pt,-1);
|
gtk_tree_model_get(model,&iter,CODEC_PRIVDATA,&pt,-1);
|
||||||
if (linphone_core_check_payload_type_usability(linphone_gtk_get_core(),pt)) color="blue";
|
|
||||||
else color="red";
|
|
||||||
bitrate=payload_type_get_bitrate(pt)/1000.0;
|
bitrate=payload_type_get_bitrate(pt)/1000.0;
|
||||||
gtk_list_store_set(GTK_LIST_STORE(model),&iter,CODEC_COLOR, (gpointer)color,
|
gtk_list_store_set(GTK_LIST_STORE(model),&iter,CODEC_COLOR, (gpointer)get_codec_color(linphone_gtk_get_core(),pt),
|
||||||
CODEC_BITRATE, bitrate,-1);
|
CODEC_BITRATE, bitrate,-1);
|
||||||
}while(gtk_tree_model_iter_next(model,&iter));
|
}while(gtk_tree_model_iter_next(model,&iter));
|
||||||
}
|
}
|
||||||
|
|
@ -462,7 +474,8 @@ static void linphone_gtk_codec_set_enable(GtkWidget *button, gboolean enabled){
|
||||||
store=GTK_LIST_STORE(mod);
|
store=GTK_LIST_STORE(mod);
|
||||||
gtk_tree_model_get(mod,&iter,CODEC_PRIVDATA,&pt,-1);
|
gtk_tree_model_get(mod,&iter,CODEC_PRIVDATA,&pt,-1);
|
||||||
linphone_core_enable_payload_type(linphone_gtk_get_core(),pt,enabled);
|
linphone_core_enable_payload_type(linphone_gtk_get_core(),pt,enabled);
|
||||||
gtk_list_store_set(store,&iter,CODEC_STATUS, enabled ? _("Enabled") : _("Disabled"), -1);
|
gtk_list_store_set(store,&iter,CODEC_STATUS, enabled ? _("Enabled") : _("Disabled"),
|
||||||
|
CODEC_COLOR,(gpointer)get_codec_color(linphone_gtk_get_core(),pt), -1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
Subproject commit 548c7012382db6442a2ec75f4d9ff8f67c853244
|
Subproject commit 9300335bbb536c4e67961c9c0b6b6b013fc4e8ff
|
||||||
2
oRTP
2
oRTP
|
|
@ -1 +1 @@
|
||||||
Subproject commit 536ad766cf13da4115c456170afee96113de533f
|
Subproject commit 3e3ba3f4922a9f2eaddd782b571abf3968aa41b9
|
||||||
Loading…
Add table
Reference in a new issue