]> git.sesse.net Git - vlc/blobdiff - modules/stream_out/rtp.c
RTP out: use clz
[vlc] / modules / stream_out / rtp.c
index ac146cdcda4d7fee10c67336b8d021c1f2d8512f..309104941082f237943422468a5cee522eb68d61 100644 (file)
@@ -473,7 +473,7 @@ static int Open( vlc_object_t *p_this )
     p_sys->i_npt_zero = VLC_TS_INVALID;
     p_sys->i_pts_zero = mdate(); /* arbitrary value, could probably be
                                   * random */
-    p_sys->payload_bitmap = 0;
+    p_sys->payload_bitmap = 0xFFFFFFFF;
     p_sys->i_es = 0;
     p_sys->es   = NULL;
     p_sys->rtsp = NULL;
@@ -908,7 +908,7 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
     sout_stream_id_t  *id;
     char              *psz_sdp;
 
-    if (0xffffffff == p_sys->payload_bitmap)
+    if (0 == p_sys->payload_bitmap)
     {
         msg_Err (p_stream, "too many RTP elementary streams");
         return NULL;
@@ -952,9 +952,7 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
     id->p_stream   = p_stream;
 
     /* Look for free dymanic payload type */
-    id->i_payload_type = 96;
-    while (p_sys->payload_bitmap & (1 << (id->i_payload_type - 96)))
-        id->i_payload_type++;
+    id->i_payload_type = 96 + clz32 (p_sys->payload_bitmap);
     assert (id->i_payload_type < 128);
 
     vlc_rand_bytes (&id->i_sequence, sizeof (id->i_sequence));
@@ -1325,7 +1323,7 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
     }
     if (id->i_payload_type >= 96)
         /* Mark dynamic payload type in use */
-        p_sys->payload_bitmap |= 1 << (id->i_payload_type - 96);
+        p_sys->payload_bitmap &= ~(1 << (127 - id->i_payload_type));
 
 #if 0 /* No payload formats sets this at the moment */
     int cscov = -1;
@@ -1394,20 +1392,22 @@ static int Del( sout_stream_t *p_stream, sout_stream_id_t *id )
 
     /* Release dynamic payload type */
     if (id->i_payload_type >= 96)
-        p_sys->payload_bitmap &= ~(1 << (id->i_payload_type - 96));
+        p_sys->payload_bitmap |= 1 << (127 - id->i_payload_type);
 
     free( id->psz_fmtp );
 
     if( id->rtsp_id )
         RtspDelId( p_sys->rtsp, id->rtsp_id );
-    if( id->sinkc > 0 )
-        rtp_del_sink( id, id->sinkv[0].rtp_fd ); /* sink for explicit dst= */
     if( id->listen.fd != NULL )
     {
         vlc_cancel( id->listen.thread );
         vlc_join( id->listen.thread, NULL );
         net_ListenClose( id->listen.fd );
     }
+    /* Delete remaining sinks (incoming connections or explicit
+     * outgoing dst=) */
+    while( id->sinkc > 0 )
+        rtp_del_sink( id, id->sinkv[0].rtp_fd );
 #ifdef HAVE_SRTP
     if( id->srtp != NULL )
         srtp_destroy( id->srtp );