Changeset 113:c30ff23c1383 in verona


Ignore:
Timestamp:
Apr 8, 2010 6:30:13 PM (3 years ago)
Author:
Nikita Kozlov <nikita@…>
Branch:
default
Children:
114:8ac29d37c839, 115:e450452bc74e
Message:

phAcceptCall is working, ph_call_retrieve_payloads is ok too

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • phapi/phapi.c

    r112 r113  
    129129 
    130130 
    131 static int ph_call_retrieve_payloads(phcall_t *ca, eXosip_event_t *je, int flags); 
     131static int ph_call_retrieve_payloads(phcall_t *ca, int flags); 
    132132static int ph_call_media_start(phcall_t *ca, eXosip_event_t *je, int flags, int resumeflag); 
    133133static char *ph_ipv4tostr(char *buf, const StunAddress4 addr); 
     
    220220static int  
    221221ph_req_set_body(osip_message_t *msg, const char *body, const char *mime); 
     222static char * 
     223ph_req_get_body(osip_message_t *msg); 
    222224 
    223225 
     
    584586  osip_list_init(&ca->audio_payloads); 
    585587  osip_list_clone(&ph_audio_payloads, &ca->audio_payloads, sdp_payload_clone); 
     588  osip_list_init(&ca->video_payloads); 
     589  osip_list_clone(&ph_video_payloads, &ca->video_payloads, sdp_payload_clone); 
    586590  return ca; 
    587591} 
     
    639643  if (hdr && !strcmp(hdr->hvalue, "*;+g.oma.sip-im")) 
    640644    ca->nego_mflags = PH_STREAM_DATA; 
    641   osip_list_init(&ca->audio_payloads); 
    642   osip_list_clone(&ph_audio_payloads, &ca->audio_payloads, sdp_payload_clone); 
    643  
     645 
     646  if (creatit) 
     647    { 
     648    osip_list_init(&ca->audio_payloads); 
     649    osip_list_clone(&ph_audio_payloads, &ca->audio_payloads, sdp_payload_clone); 
     650    osip_list_init(&ca->video_payloads); 
     651    osip_list_clone(&ph_video_payloads, &ca->video_payloads, sdp_payload_clone); 
     652 
     653    if (je->request && MSG_IS_INVITE(je->request)) 
     654      { 
     655      char *sdp = ph_req_get_body(je->request); 
     656 
     657      sdp_message_init(&ca->remote_sdp); 
     658      sdp_message_parse(ca->remote_sdp, sdp); 
     659      if (sdp_message_m_attr_has_type(ca->remote_sdp, "audio")) 
     660        ca->nego_mflags |= PH_STREAM_AUDIO; 
     661      if (sdp_message_m_attr_has_type(ca->remote_sdp, "video")) 
     662        ca->nego_mflags |= PH_STREAM_VIDEO; 
     663      osip_free(sdp); 
     664      } 
     665 
     666    if (je->response && MSG_IS_INVITE(je->response)) 
     667      { 
     668      char *sdp = ph_req_get_body(je->response); 
     669      if (sdp) 
     670        { 
     671        sdp_message_init(&ca->remote_sdp); 
     672        sdp_message_parse(ca->remote_sdp, sdp); 
     673        if (sdp_message_m_attr_has_type(ca->remote_sdp, "audio")) 
     674          ca->nego_mflags |= PH_STREAM_AUDIO; 
     675        if (sdp_message_m_attr_has_type(ca->remote_sdp, "video")) 
     676          ca->nego_mflags |= PH_STREAM_VIDEO; 
     677        osip_free(sdp); 
     678        } 
     679      } 
     680    } 
    644681  return ca; 
    645682} 
     
    735772  if (ca->sdpctx) 
    736773    sdp_context_free(ca->sdpctx); 
    737   if (ca->remote_sdp) 
     774  /*if (ca->remote_sdp) 
    738775    sdp_message_free(ca->remote_sdp); 
    739776  if (ca->local_sdp) 
    740     sdp_message_free(ca->local_sdp); 
    741  
    742     osip_list_special_free(&ca->audio_payloads, osip_free_func); 
    743  
    744     osip_list_special_free(&ca->video_payloads, osip_free_func); 
     777    sdp_message_free(ca->local_sdp);*/ 
     778 
     779  osip_list_special_free(&ca->audio_payloads, osip_free_func); 
     780 
     781  osip_list_special_free(&ca->video_payloads, osip_free_func); 
    745782 
    746783  memset(ca, 0, sizeof(phcall_t)); 
     
    848885ph_call_support_payload(const struct osip_list *codec_list, const sdp_payload_t *payload) 
    849886{ 
    850   sdp_payload_t *cur_payload; 
     887  const sdp_payload_t *cur_payload; 
    851888 
    852889  int pos = 0; 
     
    856893    cur_payload = (sdp_payload_t *) osip_list_get (codec_list, pos); 
    857894 
    858     if (sdp_equal_payload(cur_payload, payload)) 
    859       { 
    860       return 0; 
     895    if (sdp_equal_payload(cur_payload, payload) == 0) 
     896      { 
     897      return 1; 
    861898      } 
    862899    pos++; 
    863900    } 
    864   return -1; 
     901  return 0; 
    865902} 
    866903 
     
    898935      } 
    899936  } 
    900  
    901937 
    902938  payload->localport = si->streamport; 
     
    9991035  phcall_t *ca =(phcall_t*)sdp_context_get_user_pointer(ctx); 
    10001036 
    1001   if (!ph_call_support_payload(ca, payload)) 
     1037  if (!ph_call_support_payload(&ca->audio_payloads, payload)) 
    10021038    return -1; 
    10031039 
     
    10131049  phcall_t *ca =(phcall_t*)sdp_context_get_user_pointer(ctx); 
    10141050 
    1015   if (!ph_call_support_payload(ca, payload)) 
     1051  if (!ph_call_support_payload(&ca->video_payloads, payload)) 
    10161052    return -1; 
    10171053 
     
    12051241  DBG_SIP_NEGO("phLinePlaceCall_withCa: a new call has been placed\n"); 
    12061242 
    1207  
    1208   sdp_payload_t *cur_payload; 
    1209  
    1210   int pos = 0; 
    1211  
    12121243  local_video_port[0] = 0; 
    12131244  local_voice_port[0] = 0; 
     
    12341265    ca0->cid = -2; 
    12351266  eXosip_unlock(); 
    1236  
    1237   while (!osip_list_eol(&ca0->audio_payloads, pos)) 
    1238     { 
    1239     cur_payload = (sdp_payload_t *) osip_list_get (&ca0->audio_payloads, pos); 
    1240     printf("ca0 audio codecs %s\n", cur_payload->a_rtpmap); 
    1241     pos++; 
    1242     } 
    12431267 
    12441268  if (!ca0) 
     
    13181342      } 
    13191343      sdp_context_build_offer(ca0->sdpctx); 
     1344      ca0->local_sdp = ca0->sdpctx->offer; 
    13201345      ph_req_set_body(invite, ca0->sdpctx->offerstr, "application/sdp") 
    13211346 
     
    13321357      } 
    13331358      sdp_context_build_offer(ca0->sdpctx); 
     1359      ca0->local_sdp = ca0->sdpctx->offer; 
    13341360      ph_req_set_body(invite, ca0->sdpctx->offerstr, "application/sdp"); 
    13351361 
     
    13901416  return phLineSendMessage2(vlid, uri, uri, buff, mime, 0); 
    13911417} 
    1392  
    1393  
    1394  
    13951418 
    13961419 
     
    14161439  ph_build_from(from, sizeof(from), vl); 
    14171440 
    1418  
    1419  
    14201441  eXosip_lock(); 
    14211442  i = eXosip_message_build_request(&msg, "MESSAGE", (char *)uri, 
     
    14441465  if (!ca) 
    14451466    return -PH_BADCID; 
    1446  
    14471467 
    14481468  eXosip_lock(); 
     
    17271747  if (!i) { 
    17281748    if (!ca->sdpctx) { 
    1729       printf("build sdp ctx\n"); 
    17301749      ca->sdpctx = sdp_handler_create_context(&ph_sdp_handler, local_ip, ctct, vl->proxy); 
    17311750      ca->cfg =  &phcfg; 
    17321751      sdp_context_set_user_pointer(ca->sdpctx, ca); 
     1752      ca->sdpctx->offer = ca->remote_sdp; 
    17331753    } 
    17341754    sdp_context_build_answer(ca->sdpctx, ca->remote_sdp); 
    1735  
    1736     ph_req_set_body(msg, ca->sdpctx->offerstr, "application/sdp"); 
     1755    ca->local_sdp = ca->sdpctx->answer; 
     1756    ph_req_set_body(msg, ca->sdpctx->answerstr, "application/sdp"); 
    17371757    if (ctct) 
    17381758      osip_message_set_contact(msg, ctct); 
     
    18171837  if (i == 0 && streams != PH_STREAM_DATA) 
    18181838    { 
    1819     i = ph_call_retrieve_payloads(ca, NULL, streams | PH_STREAM_CNG ); 
     1839    i = ph_call_retrieve_payloads(ca, streams | PH_STREAM_CNG ); 
    18201840 
    18211841    ca->local_sdp_audio_port = atoi(local_voice_port); 
     
    18291849  eXosip_unlock(); 
    18301850 
    1831   if (!i && !(streams == PH_STREAM_DATA)) 
     1851  if (!i && streams != PH_STREAM_DATA) 
    18321852    i = ph_call_media_start(ca, NULL, streams, 0); 
    18331853 
     
    18771897    char tmp[16]; 
    18781898 
    1879     i = ph_call_retrieve_payloads(ca, NULL, streams); 
     1899    i = ph_call_retrieve_payloads(ca, streams); 
    18801900 
    18811901    _get_local_audio_sdp_port(tmp); 
     
    19291949 
    19301950 
    1931   i = ph_call_retrieve_payloads(ca, NULL, streams); 
     1951  i = ph_call_retrieve_payloads(ca, streams); 
    19321952 
    19331953  ca->local_sdp_audio_port = mca->local_sdp_audio_port; 
     
    30173037  else 
    30183038    { 
    3019 #ifdef OLDOSIP 
    3020     char contact[512]; 
    30213039    char from[512]; 
    30223040 
    30233041    ph_build_from(from, sizeof(from), vl); 
    3024     eXosip_guess_contact_uri(from, contact, sizeof(contact), 1); 
    3025     vl->contact = osip_strdup(contact); 
    3026 #endif 
     3042    vl->contact = osip_strdup(from); 
    30273043 
    30283044    } 
     
    39924008  ph_nat_init(); 
    39934009 
    3994   DBG_SIP_NEGO("NAT type: %s fw=%s \n", ph_nat_type_str, ph_nat_router_addr,0); 
     4010  DBG_SIP_NEGO("NAT type: %s fw=%s \n", ph_nat_type_str, ph_nat_router_addr); 
    39954011 
    39964012#ifdef OLDOSIP 
     
    41964212 
    41974213static int 
    4198 ph_call_retrieve_payloads(phcall_t *ca, eXosip_event_t *je, int flags) 
    4199 { 
    4200 #if 0 
     4214ph_rebuild_codec_list(sdp_message_t *sdp, const char *mtype, int *ptnum, char *mime, int mime_len) 
     4215{ 
     4216  int i; 
     4217  char *pt; 
     4218 
     4219  for (i = 0; !sdp_message_endof_media (sdp, i); i++) 
     4220    { 
     4221    if (strcmp(mtype, sdp_message_m_media_get(sdp, i)) == 0 && (pt = sdp_message_m_payload_get(sdp, i, 0)) != NULL) 
     4222      { 
     4223      *ptnum = atoi(pt); 
     4224      mime[0] = 0; 
     4225     // strcpy(mime, ph_media_lookup_codec_mime(*ptnum)); 
     4226      } 
     4227    } 
     4228  return 0; 
     4229} 
     4230 
     4231static int 
     4232ph_call_retrieve_payloads(phcall_t *ca, int flags) 
     4233{ 
    42014234  int  i = 0; 
    4202   DBG4_SIP_NEGO("looking for payloads...\n", 0, 0, 0); 
    4203   DBG4_SIP_NEGO("audio...\n", 0, 0, 0); 
     4235 
     4236  DBG_SIP_NEGO("looking for payloads...\n"); 
     4237  DBG_SIP_NEGO("audio...\n"); 
    42044238  if (_is_audio_enabled(flags)) 
    42054239    { 
    4206     i = eXosip_retrieve_negotiated_audio_payload(ca->did, &ca->audio_payload, ca->audio_payload_name, sizeof(ca->audio_payload_name)); 
    4207     DBG4_SIP_NEGO("remote_audio=%s payload=%s(%d)\n", ca->remote_sdp_audio_ip, ca->audio_payload_name, ca->audio_payload); 
    4208     } 
    4209  
    4210   DBG4_SIP_NEGO("video...\n", 0, 0, 0); 
     4240    ph_rebuild_codec_list(ca->local_sdp, "audio", &ca->audio_payload, ca->audio_payload_name, sizeof(ca->audio_payload_name)); 
     4241    //i = eXosip_retrieve_negotiated_audio_payload(ca->did, &ca->audio_payload, ca->audio_payload_name, sizeof(ca->audio_payload_name)); 
     4242    // DBG4_SIP_NEGO("remote_audio=%s payload=%s(%d)\n", ca->remote_sdp_audio_ip, ca->audio_payload_name, ca->audio_payload); 
     4243    } 
     4244 
     4245  DBG_SIP_NEGO("video...\n"); 
    42114246  ca->video_payload = 0; 
    42124247  if (ca->remote_sdp_video_ip[0] && (_is_video_enabled(flags))) 
    42134248    { 
    4214     i = eXosip_retrieve_negotiated_video_payload(ca->did, &ca->video_payload, ca->video_payload_name, sizeof(ca->video_payload_name)); 
    4215     DBG4_SIP_NEGO("remote_video=%s payload=%s(%d)\n", ca->remote_sdp_video_ip, ca->video_payload_name, ca->video_payload); 
    4216     } 
    4217  
    4218   DBG4_SIP_NEGO("cng...\n", 0, 0, 0); 
     4249    ph_rebuild_codec_list(ca->local_sdp, "video", &ca->video_payload, ca->video_payload_name, sizeof(ca->video_payload_name)); 
     4250    //i = eXosip_retrieve_negotiated_video_payload(ca->did, &ca->video_payload, ca->video_payload_name, sizeof(ca->video_payload_name)); 
     4251    // DBG_SIP_NEGO("remote_video=%s payload=%s(%d)\n", ca->remote_sdp_video_ip, ca->video_payload_name, ca->video_payload); 
     4252    } 
     4253 
     4254  DBG_SIP_NEGO("cng...\n"); 
    42194255  if(!i && phcfg.cng && (flags & PH_STREAM_CNG)) { 
    4220     ca->cng = !eXosip_retrieve_negotiated_specific_payload(ca->did, PH_MEDIA_CN_PT_STR, strlen(PH_MEDIA_CN_PT_STR)); 
    4221     DBG4_SIP_NEGO("cng: %d", ca->cng, 0, 0); 
     4256    // ca->cng = !eXosip_retrieve_negotiated_specific_payload(ca->did, PH_MEDIA_CN_PT_STR, strlen(PH_MEDIA_CN_PT_STR)); 
     4257    // DBG_SIP_NEGO("cng: %d", ca->cng); 
    42224258  } 
    42234259  return i; 
    4224 #endif 
    42254260} 
    42264261 
     
    46254660ph_call_new(eXosip_event_t *je) 
    46264661{ 
    4627 #ifdef OLDOSIP 
    46284662  phCallStateInfo_t info; 
    46294663  phcall_t *ca; 
    46304664  struct vline *vl; 
     4665  char *localUri, *remoteUri; 
    46314666 
    46324667  clear(info); 
    46334668  if (ph_busyFlag) 
    46344669    { 
    4635     ph_answer_request(je->tid, 486, 0); 
     4670    ph_answer_request(je->cid, je->tid, 486, 0); 
    46364671    return; 
    46374672    } 
    46384673 
    4639  
    46404674  if (ph_follow_me_addr[0]) 
    46414675    { 
    4642     ph_answer_request(je->tid, 302, ph_follow_me_addr); 
     4676    ph_answer_request(je->cid, je->tid, 302, ph_follow_me_addr); 
    46434677    return; 
    46444678    } 
    4645  
    4646   info.vlid = ph_get_vline_id(je->local_uri, je->req_uri); 
     4679  osip_uri_to_str(je->response->req_uri, &localUri); 
     4680  osip_uri_to_str(je->request->req_uri, &remoteUri); 
     4681  info.vlid = ph_get_vline_id(localUri, remoteUri); 
    46474682 
    46484683  if (!info.vlid) 
    46494684    { 
    4650     ph_answer_request(je->tid, 404, 0); 
     4685    ph_answer_request(je->cid, je->tid, 404, 0); 
    46514686    return; 
    46524687    } 
     
    46584693  if (vl->busy) 
    46594694    { 
    4660     ph_answer_request(je->tid, 486, vl->contact); 
     4695    ph_answer_request(je->cid, je->tid, 486, vl->contact); 
    46614696    return; 
    46624697    } 
     
    46654700  if (vl->followme && vl->followme[0]) 
    46664701    { 
    4667     ph_answer_request(je->tid, 302, vl->followme); 
     4702    ph_answer_request(je->cid, je->tid, 302, vl->followme); 
    46684703    return; 
    46694704    } 
     
    46784713    info.userData = je->external_reference; 
    46794714    info.event = phINCALL; 
    4680     info.u.remoteUri = je->remote_uri; 
    4681     info.localUri = je->local_uri; 
     4715    info.u.remoteUri = osip_strdup(remoteUri); 
     4716    info.localUri = osip_strdup(localUri); 
    46824717    info.streams = ca->nego_mflags; 
    4683     info.callinfo = je->call_info; 
    4684  
    4685     ph_retrieve_remote_sdp_text(je->did, (char **)&info.remoteSdp); 
     4718    info.callinfo = 0; //je->call_info; 
     4719 
     4720    info.remoteSdp = ph_req_get_body(je->response); 
     4721 
     4722    // ph_retrieve_remote_sdp_text(je->did, (char **)&info.remoteSdp); 
    46864723 
    46874724    phcb->callProgress(ca->cid, &info); 
     
    46894726  else 
    46904727    { 
    4691     ph_answer_request(je->tid, 500, vl->contact); 
    4692     } 
    4693 #endif 
    4694  
     4728    ph_answer_request(je->cid, je->tid, 500, vl->contact); 
     4729    } 
    46954730} 
    46964731 
     
    48234858  clear(info); 
    48244859 
    4825   ca = ph_locate_call(je, 1); 
     4860  ca = ph_locate_call(je, 0); 
    48264861  info.remoteSdp = sdp = ph_req_get_body(je->response); 
    48274862  if (ca) 
     
    48344869    const int mflags =  -1 & ~(PH_STREAM_MCSEND|PH_STREAM_MCRECV); 
    48354870 
    4836     ph_call_retrieve_payloads(ca, je, -1); 
    48374871    sdp_message_init(&ca->remote_sdp); 
    48384872    sdp_message_parse(ca->remote_sdp, sdp); 
     4873    ca->sdpctx->answer = ca->remote_sdp; 
    48394874    sdp_context_process_answer(ca->sdpctx, ca->remote_sdp); 
     4875    ph_call_retrieve_payloads(ca, -1); 
    48404876    ph_call_media_start(ca, je, mflags, ca->localresume); 
    48414877    } 
     
    49164952  if (!ca->localrefer) 
    49174953    { 
    4918     ph_call_retrieve_payloads(ca, je, PH_STREAM_CNG); 
     4954    ph_call_retrieve_payloads(ca, PH_STREAM_CNG); 
    49194955    ph_call_media_start(ca, je, -1, 0); 
    49204956 
     
    50365072    } 
    50375073 
    5038   ph_call_retrieve_payloads(ca, je, PH_STREAM_CNG); 
     5074  ph_call_retrieve_payloads(ca, PH_STREAM_CNG); 
    50395075 
    50405076  ret = ph_call_media_start(ca, je, -1, 0); 
     
    53345370  ca->remotehold = 0; 
    53355371 
    5336   ph_call_retrieve_payloads(ca, je, -1); 
     5372  ph_call_retrieve_payloads(ca, -1); 
    53375373  ph_call_media_start(ca, je, -1, remhold); 
    53385374 
  • phapi/sdphandler.c

    r112 r113  
    8181 
    8282int 
    83 sdp_equal_payload(sdp_payload_t *cur_payload, sdp_payload_t *payload) 
     83sdp_equal_payload(const sdp_payload_t *cur_payload, const sdp_payload_t *payload) 
    8484{ 
    8585  return strcmp(cur_payload->a_rtpmap, payload->a_rtpmap); 
     
    119119  } 
    120120  return NULL; 
     121} 
     122 
     123int sdp_message_m_attr_has_type(sdp_message_t *sdp, const char *type) 
     124{ 
     125  int i; 
     126  for (i = 0; !sdp_message_endof_media (sdp, i); i++) 
     127    { 
     128      if (strcmp(sdp_message_m_media_get(sdp, i), type) == 0) 
     129        return 1; 
     130    } 
     131  return 0; 
    121132} 
    122133 
     
    408419    { 
    409420    /* refuse this line (leave port to 0) */ 
    410     refuse_mline(answer, mtype, payload.proto, mline); 
     421   // refuse_mline(answer, mtype, payload.proto, mline); 
    411422    } 
    412423 
  • phapi/sdphandler.h

    r112 r113  
    9595void sdp_context_process_answer(sdp_context_t *ctx, sdp_message_t *remote_answer); 
    9696void sdp_context_free(sdp_context_t *ctx); 
     97int sdp_message_m_attr_has_type(sdp_message_t *sdp, const char *type); 
    9798 
    9899int sdp_payload_init (sdp_payload_t * payload); 
    99100int sdp_payload_clone(sdp_payload_t *src, sdp_payload_t **dst); 
    100 int sdp_equal_payload(sdp_payload_t *cur_payload, sdp_payload_t *payload); 
     101int sdp_equal_payload(const sdp_payload_t *cur_payload, const sdp_payload_t *payload); 
    101102int sdp_payload_list_add(struct osip_list* list, int pt, const char *rtpmap); 
    102103#endif 
  • phcpp/testphcpp.cpp

    r112 r113  
    115115               info->localUri, info->u.remoteUri, info->streams, nz(info->callinfo)); 
    116116         
    117         if (info->streams == PH_STREAM_DATA) 
     117        if (info->streams & PH_STREAM_AUDIO) 
    118118          { 
    119             acceptCall(cid, 0, PH_STREAM_DATA); 
     119            printf("INCALL ACCEPT\n"); 
     120            acceptCall(cid, 0, PH_STREAM_AUDIO, "192.168.10.145"); 
    120121            cid2 = cid; 
    121122          } 
     
    338339  cout << "Intializing and creating virtual lines " << endl;  
    339340  ph_config_t* conf = api.getConfig(); 
    340   strcpy(conf->audio_codecs, "PCMU"); 
     341  strcpy(conf->audio_codecs, "PCMA,PCMU"); 
    341342  strcpy(conf->local_rtp_port, "27000"); 
    342343  strcpy(conf->audio_dev, "default"); 
     
    348349  api.addAuthInfo(argv[1], argv[1], argv[2], NULL); 
    349350   
    350   vl1 = api.addVline(argv[1], argv[1], "voip.mbdsys.com:6060", "", 600); 
     351  vl1 = api.addVline(argv[1], argv[1], "voip.mbdsys.com:6060", "voip.mbdsys.com:6060", 600); 
    351352 
    352353  string s; 
Note: See TracChangeset for help on using the changeset viewer.