[vlc-devel] [PATCH] rtp sout: hard code dynamic payload types to 96

Pierre Ynard linkfanel at yahoo.fr
Mon Nov 1 13:50:23 CET 2010


Payload types are scoped to the RTP session, and we put each ES in its
own session, so no risk of conflict


diff --git a/modules/misc/rtsp.c b/modules/misc/rtsp.c
index 31d8474..f2f4d1b 100644
--- a/modules/misc/rtsp.c
+++ b/modules/misc/rtsp.c
@@ -152,8 +152,6 @@ struct vod_media_t
     char         *psz_rtsp_control_v6;
     char         *psz_rtsp_path;
 
-    int  i_payload_type;
-
     vlc_mutex_t lock;
 
     /* ES list */
@@ -438,8 +436,6 @@ static vod_media_t *MediaNew( vod_t *p_vod, const char *psz_name,
 
     vlc_mutex_init( &p_media->lock );
 
-    p_media->i_payload_type = 96;
-
     p_media->i_length = input_item_GetDuration( p_item );
 
     vlc_mutex_lock( &p_item->lock );
@@ -490,12 +486,6 @@ static int MediaAddES( vod_t *p_vod, vod_media_t *p_media, es_format_t *p_fmt )
 {
     char *psz_urlc;
 
-    if( p_media->i_payload_type >= 128 )
-    {
-        msg_Err( p_vod, "too many elementary streams");
-        return VLC_EGENERIC;
-    }
-
     media_es_t *p_es = calloc( 1, sizeof(media_es_t) );
     if( !p_es )
         return VLC_ENOMEM;
@@ -511,6 +501,9 @@ static int MediaAddES( vod_t *p_vod, vod_media_t *p_media, es_format_t *p_fmt )
     }
     msg_Dbg( p_vod, "  - ES %4.4s (%s)", (char *)&p_fmt->i_codec, psz_urlc );
 
+    /* Dynamic payload. No conflict since we put each ES in its own
+     * RTP session */
+    p_es->i_payload_type = 96;
     p_es->i_clock_rate = 90000;
     p_es->i_channels = 1;
 
@@ -526,16 +519,11 @@ static int MediaAddES( vod_t *p_vod, vod_media_t *p_media, es_format_t *p_fmt )
             {
                 p_es->i_payload_type = 10;
             }
-            else
-            {
-                p_es->i_payload_type = p_media->i_payload_type++;
-            }
             p_es->psz_ptname = "L16";
             p_es->i_clock_rate = p_fmt->audio.i_rate;
             p_es->i_channels = p_fmt->audio.i_channels;
             break;
         case VLC_CODEC_U8:
-            p_es->i_payload_type = p_media->i_payload_type++;
             p_es->psz_ptname = "L8";
             p_es->i_clock_rate = p_fmt->audio.i_rate;
             p_es->i_channels = p_fmt->audio.i_channels;
@@ -549,16 +537,13 @@ static int MediaAddES( vod_t *p_vod, vod_media_t *p_media, es_format_t *p_fmt )
             p_es->psz_ptname = "MPV";
             break;
         case VLC_CODEC_A52:
-            p_es->i_payload_type = p_media->i_payload_type++;
             p_es->psz_ptname = "ac3";
             p_es->i_clock_rate = p_fmt->audio.i_rate;
             break;
         case VLC_CODEC_H263:
-            p_es->i_payload_type = p_media->i_payload_type++;
             p_es->psz_ptname = "H263-1998";
             break;
         case VLC_CODEC_H264:
-            p_es->i_payload_type = p_media->i_payload_type++;
             p_es->psz_ptname = "H264";
             p_es->psz_fmtp = NULL;
             /* FIXME AAAAAAAAAAAARRRRRRRRGGGG copied from stream_out/rtp.c */
@@ -649,7 +634,6 @@ static int MediaAddES( vod_t *p_vod, vod_media_t *p_media, es_format_t *p_fmt )
                 p_es->psz_fmtp = strdup( "packetization-mode=1" );
             break;
         case VLC_CODEC_MP4V:
-            p_es->i_payload_type = p_media->i_payload_type++;
             p_es->psz_ptname = "MP4V-ES";
             if( p_fmt->i_extra > 0 )
             {
@@ -662,7 +646,6 @@ static int MediaAddES( vod_t *p_vod, vod_media_t *p_media, es_format_t *p_fmt )
             }
             break;
         case VLC_CODEC_MP4A:
-            p_es->i_payload_type = p_media->i_payload_type++;
             p_es->psz_ptname = "mpeg4-generic";
             p_es->i_clock_rate = p_fmt->audio.i_rate;
             if( p_fmt->i_extra > 0 )
@@ -684,11 +667,9 @@ static int MediaAddES( vod_t *p_vod, vod_media_t *p_media, es_format_t *p_fmt )
             break;
         case VLC_FOURCC( 'm', 'p', '2', 'p' ):
             p_media->psz_mux = "ps";
-            p_es->i_payload_type = p_media->i_payload_type++;
             p_es->psz_ptname = "MP2P";
             break;
         case VLC_CODEC_AMR_NB:
-            p_es->i_payload_type = p_media->i_payload_type++;
             p_es->psz_ptname = "AMR";
             p_es->i_clock_rate = 8000;
             if(p_fmt->audio.i_channels == 2 )
@@ -696,7 +677,6 @@ static int MediaAddES( vod_t *p_vod, vod_media_t *p_media, es_format_t *p_fmt )
             p_es->psz_fmtp = strdup( "octet-align=1" );
             break;
         case VLC_CODEC_AMR_WB:
-            p_es->i_payload_type = p_media->i_payload_type++;
             p_es->psz_ptname = "AMR-WB";
             p_es->i_clock_rate = 16000;
             if(p_fmt->audio.i_channels == 2 )
diff --git a/modules/stream_out/rtp.c b/modules/stream_out/rtp.c
index 1559748..623b0df 100644
--- a/modules/stream_out/rtp.c
+++ b/modules/stream_out/rtp.c
@@ -281,7 +281,6 @@ struct sout_stream_sys_t
 
     /* */
     char     *psz_destination;
-    uint32_t  payload_bitmap;
     uint16_t  i_port;
     uint16_t  i_port_audio;
     uint16_t  i_port_video;
@@ -472,7 +471,6 @@ 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 = 0xFFFFFFFF;
     p_sys->i_es = 0;
     p_sys->es   = NULL;
     p_sys->rtsp = NULL;
@@ -909,20 +907,15 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
     sout_stream_sys_t *p_sys = p_stream->p_sys;
     char              *psz_sdp;
 
-    if (0 == p_sys->payload_bitmap)
-    {
-        msg_Err (p_stream, "too many RTP elementary streams");
-        return NULL;
-    }
-
     sout_stream_id_t *id = malloc( sizeof( *id ) );
     if( unlikely(id == NULL) )
         return NULL;
     id->p_stream   = p_stream;
 
-    /* Look for free dymanic payload type */
-    id->i_payload_type = 96 + clz32 (p_sys->payload_bitmap);
-    assert (id->i_payload_type < 128);
+    /* Dynamic payload type. Payload types are scoped to the RTP
+     * session, and we put each ES in its own session, so no risk of
+     * conflict. */
+    id->i_payload_type = 96;
 
     vlc_rand_bytes (&id->i_sequence, sizeof (id->i_sequence));
     vlc_rand_bytes (id->ssrc, sizeof (id->ssrc));
@@ -1357,9 +1350,6 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
                      "codec: %4.4s)", (char*)&p_fmt->i_codec );
             goto error;
     }
-    if (id->i_payload_type >= 96)
-        /* Mark dynamic payload type in use */
-        p_sys->payload_bitmap &= ~(1 << (127 - id->i_payload_type));
 
 #if 0 /* No payload formats sets this at the moment */
     int cscov = -1;
@@ -1431,10 +1421,6 @@ static int Del( sout_stream_t *p_stream, sout_stream_id_t *id )
         block_FifoRelease( id->p_fifo );
     }
 
-    /* Release dynamic payload type */
-    if (id->i_payload_type >= 96)
-        p_sys->payload_bitmap |= 1 << (127 - id->i_payload_type);
-
     free( id->psz_fmtp );
 
     if( id->rtsp_id )


Regards,

-- 
Pierre Ynard
"Une âme dans un corps, c'est comme un dessin sur une feuille de papier."



More information about the vlc-devel mailing list