1. rtcp/rtp on udp
rt->nb_rtsp_streams = 1; // one stream for each pair rtcp/rtp
udp_read_packet {
1. get rtsp_hd, rtp_handle, rtcp_handle
get rtsp_hd =>
ffurl_get_file_handle(rt->rtsp_hd); {
// URLContext *h; i.e., rt->rtsp_hd // from RTSPState's rtsp_hd
TCPContext *s = h->priv_data;
return s->fd;
}
get rtp_handle/rtsp_handle =>
ffurl_get_multi_file_handle(rtsp_st->rtp_handle,
&fds, &fdsnum) {
// URLContext *h; i.e., rtsp_st->rtp_handle; // from RTSPStream's rtp_handle
RTPContext *s = h->priv_data;
hs[0] = s->rtp_fd;
hs[1] = s->rtcp_fd;
}
2. poll three handles
in ffurl_read(rtsp_st->rtp_handle, buf, buf_size);
rtp_handle, rtcp_handle once more polled.
}
if(rt->transport == RTSP_TRANSPORT_RTP) {
ff_rtp_parse_packet
}
2. rtp over rtsp (tcp)
rt->nb_rtsp_streams = 1 // one stream for each rtsp session.
ff_rtsp_tcp_read_packet
if(rt->transport == RTSP_TRANSPORT_RTP) {
ff_rtp_parse_packet
}