Example #1
0
void
rtp_callback_proc(struct rtp *s, rtp_event *e)
{
        struct s_session *sp;
	int		  i;

	assert(s != NULL);
	assert(e != NULL);

        sp = get_session(s);
        if (sp == NULL) {
                /* Should only happen when SOURCE_CREATED is generated in */
                /* rtp_init.                                              */
                debug_msg("Could not find session (0x%08lx)\n", (unsigned long)s);
                return;
        }

	if (sp->logger != NULL) {
		rtpdump_callback(sp->logger, e);
	}

	/* If we're a transcoder, add this source as a CSRC on the other session */
	if (sp->other_session != NULL) {
		for (i = 0; i < sp->other_session->rtp_session_count; i++) {
			rtp_add_csrc(sp->other_session->rtp_session[i], e->ssrc);
		}
	}

	switch (e->type) {
	case RX_RTP:
                process_rtp_data(sp, e->ssrc, (rtp_packet*)e->data);
                break;
	case RX_RTCP_START:
		break;
	case RX_RTCP_FINISH:
		break;
	case RX_SR:
		break;
	case RX_RR:
                process_rr(sp, e);
		break;
	case RX_RR_EMPTY:
		break;
	case RX_SDES:
                process_sdes(sp, e->ssrc, (rtcp_sdes_item*)e->data);
		break;
        case RX_APP:
                debug_msg("Received application specific report from %08x - and processing it - possible siteid packet\n", e->ssrc);
	        process_app(sp, e->ssrc, (rtcp_app*)e->data);
		xfree(e->data);
                break;
	case RX_BYE:
	case SOURCE_DELETED:
                process_delete(sp, e);
		if (sp->other_session != NULL) {
			for (i = 0; i < sp->other_session->rtp_session_count; i++) {
				rtp_del_csrc(sp->other_session->rtp_session[i], e->ssrc);
			}
		}
		break;
	case SOURCE_CREATED:
		process_create(sp, e->ssrc);
		break;
	case RR_TIMEOUT:
                process_rr_timeout(sp, e->ssrc, (rtcp_rr*)e->data);
		break;
	default:
		debug_msg("Unknown RTP event (type=%d)\n", e->type);
		abort();
	}
}
Example #2
0
void rtp_recv_callback(struct rtp *session, rtp_event * e)
{
        rtcp_app *pckt_app = (rtcp_app *) e->data;
        rtp_packet *pckt_rtp = (rtp_packet *) e->data;
        struct pdb *participants = (struct pdb *)rtp_get_userdata(session);
        struct pdb_e *state = pdb_get(participants, e->ssrc);
        struct timeval curr_time;

        switch (e->type) {
        case RX_RTP:
                if (pckt_rtp->data_len > 0) {   /* Only process packets that contain data... */
                        pbuf_insert(state->playout_buffer, pckt_rtp);
                }
                gettimeofday(&curr_time, NULL);
                tfrc_recv_data(state->tfrc_state, curr_time, pckt_rtp->seq,
                               pckt_rtp->data_len + 40);
                break;
        case RX_TFRC_RX:
                /* compute TCP friendly data rate */
                break;
        case RX_RTCP_START:
                break;
        case RX_RTCP_FINISH:
                break;
        case RX_SR:
                break;
        case RX_RR:
                process_rr(session, e);
                break;
        case RX_RR_EMPTY:
                break;
        case RX_SDES:
                process_sdes(participants, e->ssrc, (rtcp_sdes_item *) e->data);
                break;
        case RX_APP:
                pckt_app = (rtcp_app *) e->data;
                if (strncmp(pckt_app->name, "RTT_", 4) == 0) {
                        assert(pckt_app->length == 3);
                        assert(pckt_app->subtype == 0);
                        gettimeofday(&curr_time, NULL);
//                      tfrc_recv_rtt(state->tfrc_state, curr_time, ntohl(*((int *) pckt_app->data)));
                }
                break;
        case RX_BYE:
                break;
        case SOURCE_DELETED:
                {
                        struct pdb_e *pdb_item = NULL;
                        if(pdb_remove(participants, e->ssrc, &pdb_item) == 0) {
                                if (pdb_item->decoder_state_deleter) {
                                        pdb_item->decoder_state_deleter(pdb_item->decoder_state);
                                }
                        }
                }
                break;
        case SOURCE_CREATED:
                pdb_add(participants, e->ssrc);
                break;
        case RR_TIMEOUT:
                break;
        default:
                debug_msg("Unknown RTP event (type=%d)\n", e->type);
        }
}