static void handle_noplay(struct cfg *cf, struct rtpp_session *spa, int idx) { if (spa->rtps[idx] != NULL) { rtp_server_free(spa->rtps[idx]); spa->rtps[idx] = NULL; rtpp_log_write(RTPP_LOG_INFO, spa->log, "stopping player at port %d", spa->ports[idx]); if (spa->rtps[0] == NULL && spa->rtps[1] == NULL) { assert(cf->rtp_servers[spa->sridx] == spa); cf->rtp_servers[spa->sridx] = NULL; spa->sridx = -1; } } }
static void process_rtp_servers(struct cfg *cf, double dtime) { int j, k, sidx, len, skipfd; struct rtpp_session *sp; skipfd = 0; for (j = 0; j < cf->rtp_nsessions; j++) { sp = cf->rtp_servers[j]; if (sp == NULL) { skipfd++; continue; } if (skipfd > 0) { cf->rtp_servers[j - skipfd] = cf->rtp_servers[j]; sp->sridx = j - skipfd; } for (sidx = 0; sidx < 2; sidx++) { if (sp->rtps[sidx] == NULL || sp->addr[sidx] == NULL) continue; while ((len = rtp_server_get(sp->rtps[sidx], dtime)) != RTPS_LATER) { if (len == RTPS_EOF) { rtp_server_free(sp->rtps[sidx]); sp->rtps[sidx] = NULL; if (sp->rtps[0] == NULL && sp->rtps[1] == NULL) { assert(cf->rtp_servers[sp->sridx] == sp); cf->rtp_servers[sp->sridx] = NULL; sp->sridx = -1; } break; } for (k = (cf->stable.dmode && len < LBR_THRS) ? 2 : 1; k > 0; k--) { sendto(sp->fds[sidx], sp->rtps[sidx]->buf, len, 0, sp->addr[sidx], SA_LEN(sp->addr[sidx])); } } } } cf->rtp_nsessions -= skipfd; }
void remove_session(struct cfg *cf, struct rtpp_session *sp) { int i; rtpp_log_write(RTPP_LOG_INFO, sp->log, "RTP stats: %lu in from callee, %lu " "in from caller, %lu relayed, %lu dropped", sp->pcount[0], sp->pcount[1], sp->pcount[2], sp->pcount[3]); rtpp_log_write(RTPP_LOG_INFO, sp->log, "RTCP stats: %lu in from callee, %lu " "in from caller, %lu relayed, %lu dropped", sp->rtcp->pcount[0], sp->rtcp->pcount[1], sp->rtcp->pcount[2], sp->rtcp->pcount[3]); rtpp_log_write(RTPP_LOG_INFO, sp->log, "session on ports %d/%d is cleaned up", sp->ports[0], sp->ports[1]); for (i = 0; i < 2; i++) { if (sp->addr[i] != NULL) free(sp->addr[i]); if (sp->prev_addr[i] != NULL) free(sp->prev_addr[i]); if (sp->rtcp->addr[i] != NULL) free(sp->rtcp->addr[i]); if (sp->rtcp->prev_addr[i] != NULL) free(sp->rtcp->prev_addr[i]); if (sp->fds[i] != -1) { close(sp->fds[i]); assert(cf->sessions[sp->sidx[i]] == sp); cf->sessions[sp->sidx[i]] = NULL; assert(cf->pfds[sp->sidx[i]].fd == sp->fds[i]); cf->pfds[sp->sidx[i]].fd = -1; cf->pfds[sp->sidx[i]].events = 0; } if (sp->rtcp->fds[i] != -1) { close(sp->rtcp->fds[i]); assert(cf->sessions[sp->rtcp->sidx[i]] == sp->rtcp); cf->sessions[sp->rtcp->sidx[i]] = NULL; assert(cf->pfds[sp->rtcp->sidx[i]].fd == sp->rtcp->fds[i]); cf->pfds[sp->rtcp->sidx[i]].fd = -1; cf->pfds[sp->rtcp->sidx[i]].events = 0; } if (sp->rrcs[i] != NULL) rclose(sp, sp->rrcs[i], 1); if (sp->rtcp->rrcs[i] != NULL) rclose(sp, sp->rtcp->rrcs[i], 1); if (sp->rtps[i] != NULL) { cf->rtp_servers[sp->sridx] = NULL; rtp_server_free(sp->rtps[i]); } if (sp->codecs[i] != NULL) free(sp->codecs[i]); if (sp->rtcp->codecs[i] != NULL) free(sp->rtcp->codecs[i]); } if (sp->timeout_data.notify_tag != NULL) free(sp->timeout_data.notify_tag); hash_table_remove(cf, sp); if (sp->call_id != NULL) free(sp->call_id); if (sp->tag != NULL) free(sp->tag); rtpp_log_close(sp->log); free(sp->rtcp); rtp_resizer_free(&sp->resizers[0]); rtp_resizer_free(&sp->resizers[1]); free(sp); cf->sessions_active--; }
void remove_session(struct cfg *cf, struct rtpp_session *sp) { int i; rtpp_log_write(RTPP_LOG_INFO, sp->log, "RTP stats: %lu in from callee, %lu " "in from caller, %lu relayed, %lu dropped", sp->pcount[0], sp->pcount[1], sp->pcount[2], sp->pcount[3]); rtpp_log_write(RTPP_LOG_INFO, sp->log, "RTCP stats: %lu in from callee, %lu " "in from caller, %lu relayed, %lu dropped", sp->rtcp->pcount[0], sp->rtcp->pcount[1], sp->rtcp->pcount[2], sp->rtcp->pcount[3]); rtpp_log_write(RTPP_LOG_INFO, sp->log, "session on ports %d/%d is cleaned up", sp->ports[0], sp->ports[1]); for (i = 0; i < 2; i++) { if (sp->addr[i] != NULL) free(sp->addr[i]); if (sp->prev_addr[i] != NULL) free(sp->prev_addr[i]); if (sp->rtcp->addr[i] != NULL) free(sp->rtcp->addr[i]); if (sp->rtcp->prev_addr[i] != NULL) free(sp->rtcp->prev_addr[i]); //if(sp->stream[i]->bio != NULL) { // BIO_free(sp->stream[i]->bio); //} if (sp->stream[i] != NULL) { rtpp_dtls_free_stream(sp->stream[i]); } if (sp->rtcp->stream[i] != NULL) { rtpp_dtls_free_stream(sp->rtcp->stream[i]); } if (sp->fds[i] != -1) { close(sp->fds[i]); assert(cf->sessions[sp->sidx[i]] == sp); cf->sessions[sp->sidx[i]] = NULL; assert(cf->pfds[sp->sidx[i]].fd == sp->fds[i]); cf->pfds[sp->sidx[i]].fd = -1; cf->pfds[sp->sidx[i]].events = 0; } if (sp->rtcp->fds[i] != -1) { close(sp->rtcp->fds[i]); assert(cf->sessions[sp->rtcp->sidx[i]] == sp->rtcp); cf->sessions[sp->rtcp->sidx[i]] = NULL; assert(cf->pfds[sp->rtcp->sidx[i]].fd == sp->rtcp->fds[i]); cf->pfds[sp->rtcp->sidx[i]].fd = -1; cf->pfds[sp->rtcp->sidx[i]].events = 0; } if (sp->rrcs[i] != NULL) rclose(sp, sp->rrcs[i], 1); if (sp->rtcp->rrcs[i] != NULL) rclose(sp, sp->rtcp->rrcs[i], 1); if (sp->rtps[i] != NULL) { cf->rtp_servers[sp->sridx] = NULL; rtp_server_free(sp->rtps[i]); } if (sp->codecs[i] != NULL) free(sp->codecs[i]); if (sp->rtcp->codecs[i] != NULL) free(sp->rtcp->codecs[i]); if (sp->bridgeBindAddr[i] != NULL) // VLAN Support (FRN4811) free(sp->bridgeBindAddr[i]); if (sp->ice_u[i] != NULL) { if (sp->ice_u[i]->local_user_name != NULL) free(sp->ice_u[i]->local_user_name); if (sp->ice_u[i]->local_password != NULL) free(sp->ice_u[i]->local_password); if (sp->ice_u[i]->remote_user_name != NULL) free(sp->ice_u[i]->remote_user_name); if (sp->ice_u[i]->remote_password != NULL) free(sp->ice_u[i]->remote_password); free(sp->ice_u[i]); } if (sp->ice_candidate_list[i] != NULL) // ICE remote candidate support delete_ice_candidate(sp, i); if (sp->rtcp->ice_candidate_list[i] != NULL) delete_ice_candidate(sp->rtcp, i); if (sp->transcode) rtp_transcoder_free(&sp->trans[i],cf); if (sp->secure) { rtpp_srtp_free_context(&sp->srtp[i]); rtpp_srtp_free_context(&sp->rtcp->srtp[i]); } rtp_resizer_free(&sp->resizers[i]); }// for rtpp_stun_agent_remove(sp); //Remove stun agent Context. remove_session_frm_active_rsz_lst(sp); rtpp_log_write(RTPP_LOG_INFO, sp->log, "timed resizer lists cleaned up"); if (sp->timeout_data.notify_tag != NULL) free(sp->timeout_data.notify_tag); hash_table_remove(cf, sp); if (sp->call_id != NULL) free(sp->call_id); if (sp->tag != NULL) free(sp->tag); rtpp_log_close(sp->log); free(sp->rtcp); free(sp); cf->sessions_active--; }
void remove_session(struct cfg *cf, struct rtpp_session *sp) { int i; double session_time; session_time = getdtime() - sp->init_ts; /* Make sure structure is properly locked */ assert(pthread_mutex_islocked(&cf->glock) == 1); assert(pthread_mutex_islocked(&cf->sessinfo.lock) == 1); rtpp_log_write(RTPP_LOG_INFO, sp->log, "RTP stats: %lu in from callee, %lu " "in from caller, %lu relayed, %lu dropped", sp->pcount[0], sp->pcount[1], sp->pcount[2], sp->pcount[3]); if (sp->pcount[0] == 0 && sp->pcount[1] == 0) { CALL_METHOD(cf->stable->rtpp_stats, updatebyname, "nsess_nortp", 1); } else if (sp->pcount[0] == 0 || sp->pcount[1] == 0) { CALL_METHOD(cf->stable->rtpp_stats, updatebyname, "nsess_owrtp", 1); } rtpp_log_write(RTPP_LOG_INFO, sp->log, "RTCP stats: %lu in from callee, %lu " "in from caller, %lu relayed, %lu dropped", sp->rtcp->pcount[0], sp->rtcp->pcount[1], sp->rtcp->pcount[2], sp->rtcp->pcount[3]); if (sp->rtcp->pcount[0] == 0 && sp->rtcp->pcount[1] == 0) { CALL_METHOD(cf->stable->rtpp_stats, updatebyname, "nsess_nortcp", 1); } else if (sp->rtcp->pcount[0] == 0 || sp->rtcp->pcount[1] == 0) { CALL_METHOD(cf->stable->rtpp_stats, updatebyname, "nsess_owrtcp", 1); } rtpp_log_write(RTPP_LOG_INFO, sp->log, "session on ports %d/%d is cleaned up", sp->ports[0], sp->ports[1]); for (i = 0; i < 2; i++) { if (sp->addr[i] != NULL) free(sp->addr[i]); if (sp->prev_addr[i] != NULL) free(sp->prev_addr[i]); if (sp->rtcp->addr[i] != NULL) free(sp->rtcp->addr[i]); if (sp->rtcp->prev_addr[i] != NULL) free(sp->rtcp->prev_addr[i]); if (sp->fds[i] != -1) { shutdown(sp->fds[i], SHUT_RDWR); close(sp->fds[i]); assert(cf->sessinfo.sessions[sp->sidx[i]] == sp); cf->sessinfo.sessions[sp->sidx[i]] = NULL; assert(cf->sessinfo.pfds_rtp[sp->sidx[i]].fd == sp->fds[i]); cf->sessinfo.pfds_rtp[sp->sidx[i]].fd = -1; cf->sessinfo.pfds_rtp[sp->sidx[i]].events = 0; } if (sp->rtcp->fds[i] != -1) { shutdown(sp->rtcp->fds[i], SHUT_RDWR); close(sp->rtcp->fds[i]); assert(cf->sessinfo.pfds_rtcp[sp->rtcp->sidx[i]].fd == sp->rtcp->fds[i]); cf->sessinfo.pfds_rtcp[sp->rtcp->sidx[i]].fd = -1; cf->sessinfo.pfds_rtcp[sp->rtcp->sidx[i]].events = 0; } if (sp->rrcs[i] != NULL) { rclose(sp, sp->rrcs[i], 1); if (sp->record_single_file != 0) { sp->rtcp->rrcs[i] = NULL; sp->rrcs[NOT(i)] = NULL; sp->rtcp->rrcs[NOT(i)] = NULL; } } if (sp->rtcp->rrcs[i] != NULL) rclose(sp, sp->rtcp->rrcs[i], 1); if (sp->rtps[i] != NULL) { cf->rtp_servers[sp->sridx] = NULL; rtp_server_free(sp->rtps[i]); } if (sp->codecs[i] != NULL) free(sp->codecs[i]); if (sp->rtcp->codecs[i] != NULL) free(sp->rtcp->codecs[i]); if (sp->resizers[i] != NULL) rtp_resizer_free(sp->resizers[i]); } if (sp->timeout_data.notify_tag != NULL) free(sp->timeout_data.notify_tag); if (sp->hte != NULL) CALL_METHOD(cf->stable->sessions_ht, remove, sp->call_id, sp->hte); if (sp->call_id != NULL) free(sp->call_id); if (sp->tag != NULL) free(sp->tag); if (sp->tag_nomedianum != NULL) free(sp->tag_nomedianum); rtpp_log_close(sp->log); free(sp->rtcp); free(sp); cf->sessions_active--; CALL_METHOD(cf->stable->rtpp_stats, updatebyname, "nsess_destroyed", 1); CALL_METHOD(cf->stable->rtpp_stats, updatebyname_d, "total_duration", session_time); }