Commit 340c83d8 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

RTP out: use a bitmap for dynamic payload book keeping

Fixes payload type overflow especially when using sout keep/gather.
parent 06dbb781
...@@ -263,14 +263,13 @@ struct sout_stream_sys_t ...@@ -263,14 +263,13 @@ struct sout_stream_sys_t
/* */ /* */
char *psz_destination; char *psz_destination;
uint32_t payload_bitmap;
uint16_t i_port; uint16_t i_port;
uint16_t i_port_audio; uint16_t i_port_audio;
uint16_t i_port_video; uint16_t i_port_video;
uint8_t proto; uint8_t proto;
bool rtcp_mux; bool rtcp_mux;
int i_ttl:9; int i_ttl:9;
/* when need to use a private one or when using muxer */
unsigned i_payload_type:7;
bool b_latm; bool b_latm;
/* in case we do TS/PS over rtp */ /* in case we do TS/PS over rtp */
...@@ -439,7 +438,7 @@ static int Open( vlc_object_t *p_this ) ...@@ -439,7 +438,7 @@ static int Open( vlc_object_t *p_this )
p_sys->b_latm = var_GetBool( p_stream, SOUT_CFG_PREFIX "mp4a-latm" ); p_sys->b_latm = var_GetBool( p_stream, SOUT_CFG_PREFIX "mp4a-latm" );
p_sys->i_payload_type = 96; p_sys->payload_bitmap = 0;
p_sys->i_es = 0; p_sys->i_es = 0;
p_sys->es = NULL; p_sys->es = NULL;
p_sys->rtsp = NULL; p_sys->rtsp = NULL;
...@@ -852,6 +851,12 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt ) ...@@ -852,6 +851,12 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
int i_port, cscov = -1; int i_port, cscov = -1;
char *psz_sdp; char *psz_sdp;
if (0xffffffff == p_sys->payload_bitmap)
{
msg_Err (p_stream, "too many RTP elementary streams");
return NULL;
}
id = vlc_object_create( p_stream, sizeof( sout_stream_id_t ) ); id = vlc_object_create( p_stream, sizeof( sout_stream_id_t ) );
if( id == NULL ) if( id == NULL )
return NULL; return NULL;
...@@ -889,7 +894,12 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt ) ...@@ -889,7 +894,12 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
id->p_stream = p_stream; id->p_stream = p_stream;
id->i_sequence = rand()&0xffff; id->i_sequence = rand()&0xffff;
id->i_payload_type = p_sys->i_payload_type; /* 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++;
assert (id->i_payload_type < 128);
id->ssrc[0] = rand()&0xff; id->ssrc[0] = rand()&0xff;
id->ssrc[1] = rand()&0xff; id->ssrc[1] = rand()&0xff;
id->ssrc[2] = rand()&0xff; id->ssrc[2] = rand()&0xff;
...@@ -1223,7 +1233,6 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt ) ...@@ -1223,7 +1233,6 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
id->pf_packetize = rtp_packetize_amr; id->pf_packetize = rtp_packetize_amr;
break; break;
case VLC_FOURCC( 's', 'p', 'x', ' ' ): case VLC_FOURCC( 's', 'p', 'x', ' ' ):
id->i_payload_type = p_sys->i_payload_type++;
id->psz_enc = "SPEEX"; id->psz_enc = "SPEEX";
id->pf_packetize = rtp_packetize_spx; id->pf_packetize = rtp_packetize_spx;
break; break;
...@@ -1238,15 +1247,15 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt ) ...@@ -1238,15 +1247,15 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
"codec:%4.4s)", (char*)&p_fmt->i_codec ); "codec:%4.4s)", (char*)&p_fmt->i_codec );
goto error; goto error;
} }
if (id->i_payload_type >= 96)
/* Mark dynamic payload type in use */
p_sys->payload_bitmap |= 1 << (id->i_payload_type - 96);
if( cscov != -1 ) if( cscov != -1 )
cscov += 8 /* UDP */ + 12 /* RTP */; cscov += 8 /* UDP */ + 12 /* RTP */;
if( id->sinkc > 0 ) if( id->sinkc > 0 )
net_SetCSCov( id->sinkv[0].rtp_fd, cscov, -1 ); net_SetCSCov( id->sinkv[0].rtp_fd, cscov, -1 );
if( id->i_payload_type == p_sys->i_payload_type )
p_sys->i_payload_type++;
if( p_sys->rtsp != NULL ) if( p_sys->rtsp != NULL )
id->rtsp_id = RtspAddId( p_sys->rtsp, id, p_sys->i_es, id->rtsp_id = RtspAddId( p_sys->rtsp, id, p_sys->i_es,
GetDWBE( id->ssrc ), GetDWBE( id->ssrc ),
...@@ -1303,6 +1312,9 @@ static int Del( sout_stream_t *p_stream, sout_stream_id_t *id ) ...@@ -1303,6 +1312,9 @@ static int Del( sout_stream_t *p_stream, sout_stream_id_t *id )
p_sys->i_port_audio = id->i_port; p_sys->i_port_audio = id->i_port;
if( id->i_port == var_GetInteger( p_stream, "port-video" ) ) if( id->i_port == var_GetInteger( p_stream, "port-video" ) )
p_sys->i_port_video = id->i_port; 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));
free( id->psz_fmtp ); free( id->psz_fmtp );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment