Commit ce7a4746 authored by Pierre Ynard's avatar Pierre Ynard

rtp sout: implement rtptime parameter

This adds support for the rtptime parameter in the RTP-Info RTSP header.
It is needed by RealPlayer, otherwise it will start playing the stream
or not depending on the time of the day.
parent 5d20f8c2
No related merge requests found
......@@ -301,6 +301,7 @@ struct sout_stream_id_t
sout_stream_t *p_stream;
/* rtp field */
uint32_t i_timestamp;
uint16_t i_sequence;
uint8_t i_payload_type;
uint8_t ssrc[4];
......@@ -909,6 +910,8 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
id->p_stream = p_stream;
id->i_timestamp = 0; /* It will be filled when the first packet is sent */
/* Look for free dymanic payload type */
id->i_payload_type = 96;
while (p_sys->payload_bitmap & (1 << (id->i_payload_type - 96)))
......@@ -1662,6 +1665,13 @@ uint16_t rtp_get_seq( const sout_stream_id_t *id )
return id->i_sequence;
}
uint32_t rtp_get_ts( const sout_stream_id_t *id )
{
/* ... and this will return the value for the last packet.
* Lame, but close enough. */
return id->i_timestamp;
}
/* FIXME: this is pretty bad - if we remove and then insert an ES
* the number will get unsynched from inside RTSP */
unsigned rtp_get_num( const sout_stream_id_t *id )
......@@ -1698,6 +1708,7 @@ void rtp_packetize_common( sout_stream_id_t *id, block_t *out,
memcpy( out->p_buffer + 8, id->ssrc, 4 );
out->i_buffer = 12;
id->i_timestamp = i_timestamp;
id->i_sequence++;
}
......
......@@ -39,6 +39,7 @@ char *SDPGenerate( const sout_stream_t *p_stream, const char *rtsp_url );
int rtp_add_sink( sout_stream_id_t *id, int fd, bool rtcp_mux );
void rtp_del_sink( sout_stream_id_t *id, int fd );
uint16_t rtp_get_seq( const sout_stream_id_t *id );
uint32_t rtp_get_ts( const sout_stream_id_t *id );
unsigned rtp_get_num( const sout_stream_id_t *id );
/* RTP packetization */
......
......@@ -635,7 +635,8 @@ static int RtspHandler( rtsp_stream_t *rtsp, rtsp_stream_id_t *id,
{
/* FIXME: we really need to limit the number of tracks... */
char info[ses->trackc * ( strlen( control )
+ sizeof("url=/trackID=123;seq=65535, ") ) + 1];
+ sizeof("url=/trackID=123;seq=65535;"
"rtptime=4294967295, ") ) + 1];
size_t infolen = 0;
for( int i = 0; i < ses->trackc; i++ )
......@@ -648,11 +649,15 @@ static int RtspHandler( rtsp_stream_t *rtsp, rtsp_stream_id_t *id,
tr->playing = true;
rtp_add_sink( tr->id, tr->fd, false );
}
/* This is racy, as the first packets may have
* already been sent before we fetch this info:
* these extra packets might confuse the client. */
infolen += sprintf( info + infolen,
"url=%s/trackID=%u;seq=%u, ",
"url=%s/trackID=%u;seq=%u;rtptime=%u, ",
control,
rtp_get_num( tr->id ),
rtp_get_seq( tr->id ) );
rtp_get_seq( tr->id ),
rtp_get_ts( tr->id ) );
}
}
if( infolen > 0 )
......
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