/** * Processes a packet received from the RTP socket. */ static void rtp_process (demux_t *demux, block_t *block) { demux_sys_t *sys = demux->p_sys; if (block->i_buffer < 2) goto drop; const uint8_t ptype = rtp_ptype (block); if (ptype >= 72 && ptype <= 76) goto drop; /* Muxed RTCP, ignore for now FIXME */ #ifdef HAVE_SRTP if (sys->srtp != NULL) { size_t len = block->i_buffer; if (srtp_recv (sys->srtp, block->p_buffer, &len)) { msg_Dbg (demux, "SRTP authentication/decryption failed"); goto drop; } block->i_buffer = len; } #endif /* TODO: use SDP and get rid of this hack */ if (unlikely(sys->autodetect)) { /* Autodetect payload type, _before_ rtp_queue() */ rtp_autodetect (demux, sys->session, block); sys->autodetect = false; } rtp_queue (demux, sys->session, block); return; drop: block_Release (block); }
void *rtp_thread (void *data) { demux_t *demux = data; demux_sys_t *p_sys = demux->p_sys; bool autodetect = true; if (vlc_timer_create (&p_sys->timer, rtp_process, data)) return NULL; vlc_cleanup_push (timer_cleanup, (void *)p_sys->timer); for (;;) { block_t *block = rtp_recv (demux); if (block == NULL) break; if (autodetect) { /* Autodetect payload type, _before_ rtp_queue() */ /* No need for lock - the queue is empty. */ if (rtp_autodetect (demux, p_sys->session, block)) { block_Release (block); continue; } autodetect = false; } int canc = vlc_savecancel (); vlc_mutex_lock (&p_sys->lock); rtp_queue (demux, p_sys->session, block); vlc_mutex_unlock (&p_sys->lock); vlc_restorecancel (canc); rtp_process (demux); } vlc_cleanup_run (); return NULL; }