[vlc-devel] commit: RTP output: fix port allocation in all cases ( Rémi Denis-Courmont )
git version control
git at videolan.org
Wed May 27 17:50:52 CEST 2009
vlc | branch: 1.0-bugfix | Rémi Denis-Courmont <remi at remlab.net> | Wed May 27 18:44:59 2009 +0300| [8e4c60f63ebdc1f1237b60a6ff0d1efd8cd9793d] | committer: Rémi Denis-Courmont
RTP output: fix port allocation in all cases
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=8e4c60f63ebdc1f1237b60a6ff0d1efd8cd9793d
---
modules/stream_out/rtp.c | 46 +++++++++++++++++++++-------------------------
1 files changed, 21 insertions(+), 25 deletions(-)
diff --git a/modules/stream_out/rtp.c b/modules/stream_out/rtp.c
index edd06c6..c4770f5 100644
--- a/modules/stream_out/rtp.c
+++ b/modules/stream_out/rtp.c
@@ -853,10 +853,8 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
* mux (TS/PS), then p_fmt is NULL. */
sout_stream_sys_t *p_sys = p_stream->p_sys;
sout_stream_id_t *id;
- int i_port, cscov = -1;
+ int cscov = -1;
char *psz_sdp;
- int i_port_audio_option = var_GetInteger( p_stream, "port-audio" );
- int i_port_video_option = var_GetInteger( p_stream, "port-video" );
if (0xffffffff == p_sys->payload_bitmap)
{
@@ -864,38 +862,41 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
return NULL;
}
- id = vlc_object_create( p_stream, sizeof( sout_stream_id_t ) );
- if( id == NULL )
- return NULL;
- vlc_object_attach( id, p_stream );
-
/* Choose the port */
- i_port = 0;
+ uint16_t i_port = 0;
if( p_fmt == NULL )
;
else
if( p_fmt->i_cat == AUDIO_ES && p_sys->i_port_audio > 0 )
- {
i_port = p_sys->i_port_audio;
- p_sys->i_port_audio = 0;
- }
else
if( p_fmt->i_cat == VIDEO_ES && p_sys->i_port_video > 0 )
- {
i_port = p_sys->i_port_video;
- p_sys->i_port_video = 0;
- }
- while( i_port == 0 )
+ /* We do not need the ES lock (p_sys->lock_es) here, because this is the
+ * only one thread that can *modify* the ES table. The ES lock protects
+ * the other threads from our modifications (TAB_APPEND, TAB_REMOVE). */
+ for (int i = 0; i_port && (i < p_sys->i_es); i++)
+ if (i_port == p_sys->es[i]->i_port)
+ i_port = 0; /* Port already in use! */
+ for (uint16_t p = p_sys->i_port; i_port == 0; p += 2)
{
- if( p_sys->i_port != i_port_audio_option
- && p_sys->i_port != i_port_video_option )
+ if (p == 0)
{
- i_port = p_sys->i_port;
+ msg_Err (p_stream, "too many RTP elementary streams");
+ return NULL;
}
- p_sys->i_port += 2;
+ i_port = p;
+ for (int i = 0; i_port && (i < p_sys->i_es); i++)
+ if (p == p_sys->es[i]->i_port)
+ i_port = 0;
}
+ id = vlc_object_create( p_stream, sizeof( sout_stream_id_t ) );
+ if( id == NULL )
+ return NULL;
+ vlc_object_attach( id, p_stream );
+
id->p_stream = p_stream;
/* Look for free dymanic payload type */
@@ -1311,11 +1312,6 @@ static int Del( sout_stream_t *p_stream, sout_stream_id_t *id )
TAB_REMOVE( p_sys->i_es, p_sys->es, id );
vlc_mutex_unlock( &p_sys->lock_es );
- /* Release port */
- if( id->i_port == var_GetInteger( p_stream, "port-audio" ) )
- p_sys->i_port_audio = id->i_port;
- if( id->i_port == var_GetInteger( p_stream, "port-video" ) )
- p_sys->i_port_video = id->i_port;
/* Release dynamic payload type */
if (id->i_payload_type >= 96)
p_sys->payload_bitmap &= ~(1 << (id->i_payload_type - 96));
More information about the vlc-devel
mailing list