sip-lab 1.15.0 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/sip.cpp CHANGED
@@ -424,6 +424,8 @@ struct Call {
424
424
 
425
425
  pjmedia_sdp_session *active_local_sdp;
426
426
  pjmedia_sdp_session *active_remote_sdp;
427
+
428
+ bool local_sdp_answer_already_set;
427
429
  };
428
430
 
429
431
  #define MAX_TCP_DATA 4096
@@ -2071,9 +2073,9 @@ int pjw_call_respond(long call_id, const char *json) {
2071
2073
  set_error("pjsip_rx_data_free_cloned failed with status=%i", status);
2072
2074
  goto out;
2073
2075
  }
2076
+ call->pending_rdata = 0;
2074
2077
 
2075
2078
  call->pending_request = -1;
2076
- call->pending_rdata = 0;
2077
2079
  }
2078
2080
 
2079
2081
  goto out;
@@ -2084,13 +2086,16 @@ int pjw_call_respond(long call_id, const char *json) {
2084
2086
 
2085
2087
  if (call->pending_rdata && call->pending_rdata->msg_info.msg->body &&
2086
2088
  call->pending_rdata->msg_info.msg->body->len) {
2087
- if (!process_media(call, call->inv->dlg, document, true)) {
2088
- goto out;
2089
- }
2089
+ if(!call->local_sdp_answer_already_set) {
2090
+ if (!process_media(call, call->inv->dlg, document, true)) {
2091
+ goto out;
2092
+ }
2090
2093
 
2091
- status = pjsip_inv_set_sdp_answer(call->inv, call->local_sdp);
2094
+ status = pjsip_inv_set_sdp_answer(call->inv, call->local_sdp);
2095
+ call->local_sdp_answer_already_set = true;
2096
+ }
2092
2097
  } else {
2093
- // delayed media. we need to sned the offer
2098
+ printf("delayed media. we need to send the offer\n");
2094
2099
  if (!process_media(call, call->inv->dlg, document, false)) {
2095
2100
  goto out;
2096
2101
  }
@@ -2114,15 +2119,17 @@ int pjw_call_respond(long call_id, const char *json) {
2114
2119
 
2115
2120
  call->inv_initial_answer_required = false;
2116
2121
 
2117
- if (code >= 200) {
2122
+ if (code >= 200 && code < 300) {
2118
2123
  status = pjsip_rx_data_free_cloned(call->pending_rdata);
2119
2124
  if (status != PJ_SUCCESS) {
2120
2125
  set_error("pjsip_rx_data_free_cloned failed with status=%i", status);
2121
2126
  goto out;
2122
2127
  }
2123
-
2124
- call->pending_request = -1;
2125
2128
  call->pending_rdata = 0;
2129
+
2130
+ if (code >= 200 && code < 300) {
2131
+ call->pending_request = -1;
2132
+ }
2126
2133
  }
2127
2134
  } else {
2128
2135
  status = pjsip_inv_answer(call->inv, code, &r,
@@ -2133,7 +2140,20 @@ int pjw_call_respond(long call_id, const char *json) {
2133
2140
  goto out;
2134
2141
  }
2135
2142
 
2136
- call->pending_request = -1;
2143
+ if (code >= 200 && code < 300) {
2144
+ if(call->pending_rdata) {
2145
+ status = pjsip_rx_data_free_cloned(call->pending_rdata);
2146
+ if (status != PJ_SUCCESS) {
2147
+ set_error("pjsip_rx_data_free_cloned failed with status=%i", status);
2148
+ goto out;
2149
+ }
2150
+ call->pending_rdata = 0;
2151
+ }
2152
+
2153
+ if (code >= 200 && code < 300) {
2154
+ call->pending_request = -1;
2155
+ }
2156
+ }
2137
2157
 
2138
2158
  if (!add_headers(call->inv->dlg->pool, tdata, document)) {
2139
2159
  goto out;
@@ -2145,6 +2165,10 @@ int pjw_call_respond(long call_id, const char *json) {
2145
2165
  set_error("pjsip_inv_send_msg failed with status=%i", status);
2146
2166
  goto out;
2147
2167
  }
2168
+
2169
+ if(code >= 200 && code < 300) {
2170
+ call->local_sdp_answer_already_set = false;
2171
+ }
2148
2172
  out:
2149
2173
  PJW_UNLOCK();
2150
2174
  if (pjw_errorstring[0]) {
@@ -4076,10 +4100,11 @@ int find_sdp_media_by_media_endpt(const pjmedia_sdp_session *sdp,
4076
4100
  printf("find_sdp_media_by_media_endpt %x\n", me);
4077
4101
  for (int i = 0; i < sdp->media_count; i++) {
4078
4102
  pjmedia_sdp_media *media = sdp->media[i];
4079
- printf("i=%d me->port=%i media->desc.port=%i me->media=%.*s media->desc.media=%.*s\n", i, me->port, media->desc.port, me->media.slen, me->media.ptr, media->desc.media.slen, media->desc.media.ptr);
4103
+ printf("i=%d me->port=%i media->desc.port=%i me->media=%.*s media->desc.media=%.*s me->transport=%.*s media->desc.transport=%.*s\n", i, me->port, media->desc.port, me->media.slen, me->media.ptr, media->desc.media.slen, media->desc.media.ptr, me->transport.slen, me->transport.ptr, media->desc.transport.slen, media->desc.transport.ptr);
4080
4104
 
4081
4105
  if ((me->port == media->desc.port) &&
4082
- (pj_strcmp(&me->media, &media->desc.media) == 0)) {
4106
+ (pj_strcmp(&me->media, &media->desc.media) == 0) &&
4107
+ (pj_strcmp(&me->transport, &media->desc.transport) == 0)) {
4083
4108
  *media_out = media;
4084
4109
  printf("found\n");
4085
4110
  return i;
@@ -4128,10 +4153,10 @@ void gen_media_json(char *dest, int len, Call *call,
4128
4153
  if(!me->port) {
4129
4154
  switch (me->type) {
4130
4155
  case ENDPOINT_TYPE_AUDIO:
4131
- p += sprintf(p, "{\"type\": \"audio\", \"transport\": \"%.*s\", \"port\": 0}", me->transport.slen, me->transport.ptr);
4156
+ p += sprintf(p, "{\"type\": \"audio\", \"protocol\": \"%.*s\", \"port\": 0}", me->transport.slen, me->transport.ptr);
4132
4157
  break;
4133
4158
  case ENDPOINT_TYPE_MRCP:
4134
- p += sprintf(p, "{\"type\": \"mrcp\", \"transport\": \"%.*s\", \"port\": 0}", me->transport.slen, me->transport.ptr);
4159
+ p += sprintf(p, "{\"type\": \"mrcp\", \"protocol\": \"%.*s\", \"port\": 0}", me->transport.slen, me->transport.ptr);
4135
4160
  break;
4136
4161
  default:
4137
4162
  p += sprintf(p, "{\"type\": \"unknown\", \"port\": 0}");
@@ -4163,7 +4188,7 @@ void gen_media_json(char *dest, int len, Call *call,
4163
4188
  pj_str_t *remote_addr = &remote_conn->addr;
4164
4189
 
4165
4190
  p += sprintf(p,
4166
- "{\"type\": \"audio\", \"transport\": \"%.*s\", \"local\": {\"addr\": \"%.*s\", "
4191
+ "{\"type\": \"audio\", \"protocol\": \"%.*s\", \"local\": {\"addr\": \"%.*s\", "
4167
4192
  "\"port\": %d, \"mode\": \"%s\"}, \"remote\": {\"addr\": "
4168
4193
  "\"%.*s\", \"port\": %d, \"mode\": \"%s\"}, \"fmt\": [",
4169
4194
  me->transport.slen, me->transport.ptr,
@@ -4188,7 +4213,7 @@ void gen_media_json(char *dest, int len, Call *call,
4188
4213
  }
4189
4214
  case ENDPOINT_TYPE_MRCP: {
4190
4215
  p += sprintf(p,
4191
- "{\"type\": \"mrcp\", \"transport\": \"%.*s\", \"local\": {\"port\": %d}, "
4216
+ "{\"type\": \"mrcp\", \"protocol\": \"%.*s\", \"local\": {\"port\": %d}, "
4192
4217
  "\"remote\": {\"port\": %d}}",
4193
4218
  me->transport.slen, me->transport.ptr,
4194
4219
  local_sdp->media[idx]->desc.port,
@@ -4414,18 +4439,24 @@ MediaEndpoint *find_media_endpt_by_sdp_media(Call *call,
4414
4439
 
4415
4440
  if (pj_strcmp2(&local_media->desc.media, "audio") == 0) {
4416
4441
  if (ENDPOINT_TYPE_AUDIO == me->type) {
4417
- in_use_chart[i] = true;
4418
- return me;
4442
+ if (pj_strcmp(&local_media->desc.transport, &me->transport)) {
4443
+ in_use_chart[i] = true;
4444
+ return me;
4445
+ }
4419
4446
  }
4420
4447
  } else if (pj_strcmp2(&local_media->desc.media, "video") == 0) {
4421
4448
  if (ENDPOINT_TYPE_VIDEO == me->type) {
4422
- in_use_chart[i] = true;
4423
- return me;
4449
+ if (pj_strcmp(&local_media->desc.transport, &me->transport)) {
4450
+ in_use_chart[i] = true;
4451
+ return me;
4452
+ }
4424
4453
  }
4425
4454
  } else if (pj_strcmp2(&local_media->desc.media, "application") == 0) {
4426
4455
  if (ENDPOINT_TYPE_MRCP == me->type) {
4427
- in_use_chart[i] = true;
4428
- return me;
4456
+ if (pj_strcmp(&local_media->desc.transport, &me->transport)) {
4457
+ in_use_chart[i] = true;
4458
+ return me;
4459
+ }
4429
4460
  }
4430
4461
  } else {
4431
4462
  printf("local_media->desc.media=%.*s\n", local_media->desc.media.slen,