};
-rtcp_sender_t *OpenRTCP (vlc_object_t *obj, int rtp_fd,
- int proto, uint16_t dport)
+rtcp_sender_t *OpenRTCP (vlc_object_t *obj, int rtp_fd, int proto)
{
rtcp_sender_t *rtcp;
uint8_t *ptr;
char src[NI_MAXNUMERICHOST], dst[NI_MAXNUMERICHOST];
- int sport;
+ int sport, dport;
int fd;
if (net_GetSockAddress (rtp_fd, src, &sport)
- || net_GetPeerAddress (rtp_fd, dst, NULL))
+ || net_GetPeerAddress (rtp_fd, dst, &dport))
return NULL;
sport++;
+ dport++;
+
fd = net_OpenDgram (obj, src, sport, dst, dport, AF_UNSPEC, proto);
if (fd == -1)
return NULL;
SetWBE (lenptr, ptr - sdes);
rtcp->length = ptr - rtcp->payload;
- return VLC_SUCCESS;
+ return rtcp;
}
typedef struct rtp_sink_t
{
int rtp_fd;
- int rtcp_fd;
+ rtcp_sender_t *rtcp;
} rtp_sink_t;
struct sout_stream_id_t
vlc_mutex_lock( &id->lock_sink );
for( int i = 0; i < id->sinkc; i++ )
+ {
send( id->sinkv[i].rtp_fd, out->p_buffer, out->i_buffer, 0 );
+ SendRTCP( id->sinkv[i].rtcp, out );
+ }
vlc_mutex_unlock( &id->lock_sink );
block_Release( out );
int rtp_add_sink( sout_stream_id_t *id, int fd )
{
- rtp_sink_t sink = { fd, -1 };
+ rtp_sink_t sink = { fd, NULL };
+ sink.rtcp = OpenRTCP( VLC_OBJECT( id->p_stream ), fd, IPPROTO_UDP );
+ if( sink.rtcp == NULL )
+ msg_Err( id, "RTCP failed!" );
vlc_mutex_lock( &id->lock_sink );
INSERT_ELEM( id->sinkv, id->sinkc, id->sinkc, sink );
void rtp_del_sink( sout_stream_id_t *id, int fd )
{
+ rtp_sink_t sink = { fd, NULL };
+
/* NOTE: must be safe to use if fd is not included */
vlc_mutex_lock( &id->lock_sink );
for( int i = 0; i < id->sinkc; i++ )
{
if (id->sinkv[i].rtp_fd == fd)
{
+ sink = id->sinkv[i];
REMOVE_ELEM( id->sinkv, id->sinkc, i );
break;
}
}
vlc_mutex_unlock( &id->lock_sink );
- net_Close( fd );
+
+ CloseRTCP( sink.rtcp );
+ net_Close( sink.rtp_fd );
}
/****************************************************************************
/* RTCP */
typedef struct rtcp_sender_t rtcp_sender_t;
-rtcp_sender_t *OpenRTCP (vlc_object_t *obj, int rtp_fd,
- int proto, uint16_t dport);
+rtcp_sender_t *OpenRTCP (vlc_object_t *obj, int rtp_fd, int proto);
void CloseRTCP (rtcp_sender_t *rtcp);
void SendRTCP (rtcp_sender_t *restrict rtcp, const block_t *rtp);