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(); } }
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); } }