X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fstream_out%2Frtp.c;h=90a893a6ceec0786066603c455d53864b7894826;hb=bc650c59ca6d2edbf555dc0cec11091f274b42f5;hp=a50a816846bd0c276cc63336bc6f2388ed7c7a20;hpb=3cee798c0b1f013d89874bfbe43709fa3de506cb;p=vlc diff --git a/modules/stream_out/rtp.c b/modules/stream_out/rtp.c index a50a816846..90a893a6ce 100644 --- a/modules/stream_out/rtp.c +++ b/modules/stream_out/rtp.c @@ -69,10 +69,10 @@ #define NAME_LONGTEXT N_( \ "This is the name of the session that will be announced in the SDP " \ "(Session Descriptor)." ) -#define DESC_TEXT N_("Session description") +#define DESC_TEXT N_("Session descriptipn") #define DESC_LONGTEXT N_( \ - "This allows you to give a broader description of the stream, that will " \ - "be announced in the SDP (Session Descriptor)." ) + "This allows you to give a short description with details about the stream, " \ + "that will be announced in the SDP (Session Descriptor)." ) #define URL_TEXT N_("Session URL") #define URL_LONGTEXT N_( \ "This allows you to give an URL with more details about the stream " \ @@ -80,8 +80,13 @@ "be announced in the SDP (Session Descriptor)." ) #define EMAIL_TEXT N_("Session email") #define EMAIL_LONGTEXT N_( \ - "This allows you to give a contact mail address for the stream, that will " \ - "be announced in the SDP (Session Descriptor)." ) + "This allows you to give a contact mail address for the stream, that will " \ + "be announced in the SDP (Session Descriptor)." ) +#define PHONE_TEXT N_("Session phone number") +#define PHONE_LONGTEXT N_( \ + "This allows you to give a contact telephone number for the stream, that will " \ + "be announced in the SDP (Session Descriptor)." ) + #define PORT_TEXT N_("Port") #define PORT_LONGTEXT N_( \ "This allows you to specify the base port for the RTP streaming." ) @@ -141,6 +146,8 @@ vlc_module_begin(); URL_LONGTEXT, VLC_TRUE ); add_string( SOUT_CFG_PREFIX "email", "", NULL, EMAIL_TEXT, EMAIL_LONGTEXT, VLC_TRUE ); + add_string( SOUT_CFG_PREFIX "phone", "", NULL, PHONE_TEXT, + PHONE_LONGTEXT, VLC_TRUE ); add_integer( SOUT_CFG_PREFIX "port", 1234, NULL, PORT_TEXT, PORT_LONGTEXT, VLC_TRUE ); @@ -170,7 +177,7 @@ vlc_module_end(); *****************************************************************************/ static const char *ppsz_sout_options[] = { "dst", "name", "port", "port-audio", "port-video", "*sdp", "ttl", "mux", - "description", "url", "email", + "description", "url", "email", "phone", "dccp", "tcp", "udplite", "mp4a-latm", NULL }; @@ -686,15 +693,16 @@ char *SDPGenerate( const sout_stream_t *p_stream, const char *rtsp_url ) dstlen = sizeof( struct sockaddr_in ); } - psz_sdp = sdp_Start( p_sys->psz_session_name, - p_sys->psz_session_description, - p_sys->psz_session_url, p_sys->psz_session_email, - NULL, NULL, 0, (struct sockaddr *)&dst, dstlen ); + psz_sdp = vlc_sdp_Start( VLC_OBJECT( p_stream ), SOUT_CFG_PREFIX, + NULL, 0, (struct sockaddr *)&dst, dstlen ); if( psz_sdp == NULL ) return NULL; /* TODO: a=source-filter */ + if( rtsp_url != NULL ) + sdp_AddAttribute ( &psz_sdp, "control", "%s", rtsp_url ); + /* FIXME: locking?! */ for( i = 0; i < p_sys->i_es; i++ ) { @@ -721,7 +729,8 @@ char *SDPGenerate( const sout_stream_t *p_stream, const char *rtsp_url ) id->psz_rtpmap, id->psz_fmtp); if( rtsp_url != NULL ) - sdp_AddAttribute ( &psz_sdp, "control", "/trackID=%d", i ); + sdp_AddAttribute ( &psz_sdp, "control", "%s/trackID=%d", + rtsp_url, i ); } return psz_sdp; @@ -741,6 +750,7 @@ static int rtp_packetize_mp4a_latm ( sout_stream_t *, sout_stream_id_t *, block_ static int rtp_packetize_h263 ( sout_stream_t *, sout_stream_id_t *, block_t * ); static int rtp_packetize_h264 ( sout_stream_t *, sout_stream_id_t *, block_t * ); static int rtp_packetize_amr ( sout_stream_t *, sout_stream_id_t *, block_t * ); +static int rtp_packetize_t140 ( sout_stream_t *, sout_stream_id_t *, block_t * ); static void sprintf_hexa( char *s, uint8_t *p_data, int i_data ) { @@ -1066,6 +1076,11 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt ) id->i_clock_rate = p_fmt->audio.i_rate; id->pf_packetize = rtp_packetize_amr; break; + case VLC_FOURCC( 't', '1', '4', '0' ): + id->psz_rtpmap = strdup( "t140/1000" ); + id->i_clock_rate = 1000; + id->pf_packetize = rtp_packetize_t140; + break; default: msg_Err( p_stream, "cannot add this stream (unsupported " @@ -1991,6 +2006,52 @@ static int rtp_packetize_amr( sout_stream_t *p_stream, sout_stream_id_t *id, return VLC_SUCCESS; } +static int rtp_packetize_t140( sout_stream_t *p_stream, sout_stream_id_t *id, + block_t *in ) +{ + const size_t i_max = id->i_mtu - 12; + const uint8_t *p_data = in->p_buffer; + size_t i_data = in->i_buffer; + + for( unsigned i_packet = 0; i_data > 0; i_packet++ ) + { + size_t i_payload = i_data; + + /* Make sure we stop on an UTF-8 character boundary + * (assuming the input is valid UTF-8) */ + if( i_data > i_max ) + { + i_payload = i_max; + + while( ( p_data[i_payload] & 0xC0 ) == 0x80 ) + { + if( i_payload == 0 ) + return VLC_SUCCESS; /* fishy input! */ + + i_payload--; + } + } + + block_t *out = block_New( p_stream, 12 + i_payload ); + if( out == NULL ) + return VLC_SUCCESS; + + rtp_packetize_common( id, out, 0, in->i_pts + i_packet ); + memcpy( out->p_buffer + 12, p_data, i_payload ); + + out->i_buffer = 12 + i_payload; + out->i_dts = out->i_pts; + out->i_length = 0; + + rtp_packetize_send( id, out ); + + p_data += i_payload; + i_data -= i_payload; + } + + return VLC_SUCCESS; +} + /***************************************************************************** * Non-RTP mux *****************************************************************************/