#define RTP_HDR_SZ 12
#define IP4_HDR_SZ 20 /*20 is the minimum, but there may be some options*/
-const char *payload_type_get_description(PayloadType *pt){
- return _((const char *)pt->user_data);
-}
-
-void payload_type_set_enable(PayloadType *pt,int value)
+static void payload_type_set_enable(PayloadType *pt,int value)
{
if ((value)!=0) payload_type_set_flag(pt,PAYLOAD_TYPE_ENABLED); \
else payload_type_unset_flag(pt,PAYLOAD_TYPE_ENABLED);
}
-
-bool_t payload_type_enabled(PayloadType *pt) {
+static bool_t payload_type_enabled(PayloadType *pt) {
return (((pt)->flags & PAYLOAD_TYPE_ENABLED)!=0);
}
+bool_t linphone_core_payload_type_enabled(LinphoneCore *lc, PayloadType *pt){
+ if (ms_list_find(lc->codecs_conf.audio_codecs,pt) || ms_list_find(lc->codecs_conf.video_codecs,pt)){
+ return payload_type_enabled(pt);
+ }
+ ms_error("Getting enablement status of codec not in audio or video list of PayloadType !");
+ return FALSE;
+}
+
+int linphone_core_enable_payload_type(LinphoneCore *lc, PayloadType *pt, bool_t enabled){
+ if (ms_list_find(lc->codecs_conf.audio_codecs,pt) || ms_list_find(lc->codecs_conf.video_codecs,pt)){
+ payload_type_set_enable(pt,enabled);
+ return 0;
+ }
+ ms_error("Enabling codec not in audio or video list of PayloadType !");
+ return -1;
+}
+
+const char *linphone_core_get_payload_type_description(LinphoneCore *lc, PayloadType *pt){
+ if (ms_filter_codec_supported(pt->mime_type)){
+ MSFilterDesc *desc=ms_filter_get_encoder(pt->mime_type);
+ return _(desc->text);
+ }
+ return NULL;
+}
+
+
/*this function makes a special case for speex/8000.
This codec is variable bitrate. The 8kbit/s mode is interesting when having a low upload bandwidth, but its quality
is not very good. We 'd better use its 15kbt/s mode when we have enough bandwidth*/
return ret;
}
-static PayloadType * find_payload(RtpProfile *prof, PayloadType *pt /*from config*/){
- PayloadType *candidate=NULL;
- int i;
- PayloadType *it;
- for(i=0;i<127;++i){
- it=rtp_profile_get_payload(prof,i);
- if (it!=NULL && strcasecmp(pt->mime_type,it->mime_type)==0
- && (pt->clock_rate==it->clock_rate || pt->clock_rate<=0)
- && payload_type_get_user_data(it)==NULL ){
- if ( (pt->recv_fmtp && it->recv_fmtp && strcasecmp(pt->recv_fmtp,it->recv_fmtp)==0) ||
- (pt->recv_fmtp==NULL && it->recv_fmtp==NULL) ){
- /*exact match*/
- return it;
- }else candidate=it;
- }
- }
- return candidate;
-}
-
-static bool_t check_h264_packmode(PayloadType *payload, MSFilterDesc *desc){
- if (payload->recv_fmtp==NULL || strstr(payload->recv_fmtp,"packetization-mode")==0){
- /*this is packetization-mode=0 H264, we only support it with a multislicing
- enabled version of x264*/
- if (strstr(desc->text,"x264") && strstr(desc->text,"multislicing")==0){
- /*this is x264 without multisclicing*/
- ms_message("Disabling packetization-mode=0 H264 codec because "
- "of lack of multislicing support");
- return FALSE;
- }
- }
- return TRUE;
-}
-
-static MSList *fix_codec_list(RtpProfile *prof, MSList *conflist)
-{
- MSList *elem;
- MSList *newlist=NULL;
- PayloadType *payload,*confpayload;
-
- for (elem=conflist;elem!=NULL;elem=ms_list_next(elem))
- {
- confpayload=(PayloadType*)elem->data;
- payload=find_payload(prof,confpayload);
- if (payload!=NULL){
- if (ms_filter_codec_supported(confpayload->mime_type)){
- MSFilterDesc *desc=ms_filter_get_encoder(confpayload->mime_type);
- if (strcasecmp(confpayload->mime_type,"H264")==0){
- if (!check_h264_packmode(confpayload,desc)){
- continue;
- }
- }
- payload_type_set_user_data(payload,(void*)desc->text);
- payload_type_set_enable(payload,payload_type_enabled(confpayload));
- newlist=ms_list_append(newlist,payload);
- }
- }
- else{
- ms_warning("Cannot support %s/%i: does not exist.",confpayload->mime_type,
- confpayload->clock_rate);
- }
- }
- return newlist;
-}
-
-
-void linphone_core_setup_local_rtp_profile(LinphoneCore *lc)
-{
- int i;
- MSList *audiopt,*videopt;
- PayloadType *payload;
- bool_t prepend;
- lc->local_profile=rtp_profile_clone_full(&av_profile);
- /* first look at the list given by configuration file to see if
- it is correct */
- audiopt=fix_codec_list(lc->local_profile,lc->codecs_conf.audio_codecs);
- videopt=fix_codec_list(lc->local_profile,lc->codecs_conf.video_codecs);
- /* now find and add payloads that are not listed in the configuration
- codec list */
- for (i=0;i<127;i++)
- {
- payload=rtp_profile_get_payload(lc->local_profile,i);
- if (payload!=NULL){
- if (payload_type_get_user_data(payload)!=NULL) continue;
- /* find a mediastreamer codec for this payload type */
- if (ms_filter_codec_supported(payload->mime_type)){
- MSFilterDesc *desc=ms_filter_get_encoder(payload->mime_type);
- ms_message("Adding new codec %s/%i",payload->mime_type,payload->clock_rate);
- payload_type_set_enable(payload,1);
- payload_type_set_user_data(payload,(void *)desc->text);
- prepend=FALSE;
- /* by default, put speex, mpeg4, or h264 on top of list*/
- if (strcmp(payload->mime_type,"speex")==0)
- prepend=TRUE;
- else if (strcmp(payload->mime_type,"MP4V-ES")==0)
- prepend=TRUE;
- else if (strcasecmp(payload->mime_type,"H264")==0){
- if (check_h264_packmode(payload,desc))
- prepend=TRUE;
- else continue;
- }
- switch (payload->type){
- case PAYLOAD_AUDIO_CONTINUOUS:
- case PAYLOAD_AUDIO_PACKETIZED:
- if (prepend)
- audiopt=ms_list_prepend(audiopt,(void *)payload);
- else
- audiopt=ms_list_append(audiopt,(void *)payload);
- break;
- case PAYLOAD_VIDEO:
- if (prepend)
- videopt=ms_list_prepend(videopt,(void *)payload);
- else
- videopt=ms_list_append(videopt,(void *)payload);
- break;
- default:
- ms_error("Unsupported rtp media type.");
- }
- }
- }
- }
- ms_list_for_each(lc->codecs_conf.audio_codecs,(void (*)(void*))payload_type_destroy);
- ms_list_for_each(lc->codecs_conf.video_codecs,(void (*)(void *))payload_type_destroy);
- ms_list_free(lc->codecs_conf.audio_codecs);
- ms_list_free(lc->codecs_conf.video_codecs);
- /* set the fixed lists instead:*/
- lc->codecs_conf.audio_codecs=audiopt;
- lc->codecs_conf.video_codecs=videopt;
- linphone_core_update_allocated_audio_bandwidth(lc);
-}
-
-int from_2char_without_params(osip_from_t *from,char **str)
-{
- osip_from_t *tmpfrom=NULL;
- osip_from_clone(from,&tmpfrom);
- if (tmpfrom!=NULL){
- while(!osip_list_eol(&tmpfrom->gen_params,0)){
- osip_generic_param_t *param=(osip_generic_param_t*)osip_list_get(&tmpfrom->gen_params,0);
- osip_generic_param_free(param);
- osip_list_remove(&tmpfrom->gen_params,0);
- }
- }else return -1;
- osip_from_to_str(tmpfrom,str);
- osip_from_free(tmpfrom);
- return 0;
-}
-
bool_t lp_spawn_command_line_sync(const char *command, char **result,int *command_ret){
#if !defined(_WIN32_WCE)
FILE *f=popen(command,"r");
bool_t got_audio,got_video;
bool_t cone_audio=FALSE,cone_video=FALSE;
struct timeval init,cur;
+ SalEndpointCandidate *ac,*vc;
+
+ ac=&call->localdesc->streams[0].candidates[0];
+ vc=&call->localdesc->streams[1].candidates[0];
+
if (parse_stun_server_addr(server,&ss,&ss_len)<0){
ms_error("Fail to parser stun server address: %s",server);
return;
usleep(10000);
#endif
- if (recvStunResponse(sock1,call->audio_params.natd_addr,
- &call->audio_params.natd_port,&id)>0){
+ if (recvStunResponse(sock1,ac->addr,
+ &ac->port,&id)>0){
ms_message("STUN test result: local audio port maps to %s:%i",
- call->audio_params.natd_addr,
- call->audio_params.natd_port);
+ ac->addr,
+ ac->port);
if (id==11)
cone_audio=TRUE;
got_audio=TRUE;
}
- if (recvStunResponse(sock2,call->video_params.natd_addr,
- &call->video_params.natd_port,&id)>0){
+ if (recvStunResponse(sock2,vc->addr,
+ &vc->port,&id)>0){
ms_message("STUN test result: local video port maps to %s:%i",
- call->video_params.natd_addr,
- call->video_params.natd_port);
+ vc->addr,
+ vc->port);
if (id==22)
cone_video=TRUE;
got_video=TRUE;
}else{
if (!cone_audio) {
ms_warning("NAT is symmetric for audio port");
- call->audio_params.natd_port=0;
+ ac->addr[0]='\0';
+ ac->port=0;
}
}
if (sock2>=0){
}else{
if (!cone_video) {
ms_warning("NAT is symmetric for video port.");
- call->video_params.natd_port=0;
+ vc->addr[0]='\0';
+ vc->port=0;
}
}
}