示例#1
0
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;
	}
   }
}
示例#2
0
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;
}
示例#3
0
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--;
}
示例#4
0
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--;

}
示例#5
0
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);
}