* SDPGenerate
*****************************************************************************/
/*static*/
-char *SDPGenerate( const sout_stream_t *p_stream, const char *rtsp_url )
+char *SDPGenerate( sout_stream_t *p_stream, const char *rtsp_url )
{
- const sout_stream_sys_t *p_sys = p_stream->p_sys;
+ sout_stream_sys_t *p_sys = p_stream->p_sys;
char *psz_sdp;
struct sockaddr_storage dst;
socklen_t dstlen;
*/
int inclport;
+ vlc_mutex_lock( &p_sys->lock_es );
+ if( unlikely(p_sys->i_es == 0) )
+ goto out; /* hmm... */
+
if( p_sys->psz_destination != NULL )
{
inclport = 1;
- /* Oh boy, this is really ugly! (+ race condition on lock_es) */
+ /* Oh boy, this is really ugly! */
dstlen = sizeof( dst );
if( p_sys->es[0]->listen.fd != NULL )
getsockname( p_sys->es[0]->listen.fd[0],
psz_sdp = vlc_sdp_Start( VLC_OBJECT( p_stream ), SOUT_CFG_PREFIX,
NULL, 0, (struct sockaddr *)&dst, dstlen );
if( psz_sdp == NULL )
- return NULL;
+ goto out;
/* TODO: a=source-filter */
if( p_sys->rtcp_mux )
}
}
- /* FIXME: locking?! */
for( i = 0; i < p_sys->i_es; i++ )
{
sout_stream_id_t *id = p_sys->es[i];
"SC:RTP%c", toupper( mime_major[0] ) );
}
}
-
+out:
+ vlc_mutex_unlock( &p_sys->lock_es );
return psz_sdp;
}
char *RtspAppendTrackPath( rtsp_stream_id_t *id, const char *base );
-char *SDPGenerate( const sout_stream_t *p_stream, const char *rtsp_url );
+char *SDPGenerate( sout_stream_t *p_stream, const char *rtsp_url );
uint32_t rtp_compute_ts( const sout_stream_id_t *id, int64_t i_pts );
int rtp_add_sink( sout_stream_id_t *id, int fd, bool rtcp_mux, uint16_t *seq );