- i_size += sizeof( "m=**d*o * RTP/AVP *\r\n" ) + 19;
- if( p_es->psz_rtpmap )
- {
- i_size += sizeof( "a=rtpmap:* *\r\n" ) +
- strlen( p_es->psz_rtpmap ) + 9;
- }
- if( p_es->psz_fmtp )
- {
- i_size += sizeof( "a=fmtp:* *\r\n" ) +
- strlen( p_es->psz_fmtp ) + 9;
- }
- }
- i_size += (strlen( psz_control ) + strlen( ip ) + 9) * p_media->i_es;
-
- p = psz_sdp = malloc( i_size );
- p += sprintf( p, "v=0\r\n" );
- p += sprintf( p, "o=- "I64Fd" %d IN IP%c %s\r\n",
- p_media->i_sdp_id, p_media->i_sdp_version, ipv, ip );
- if( *p_media->psz_session_name )
- p += sprintf( p, "s=%s\r\n", p_media->psz_session_name );
- if( *p_media->psz_session_description )
- p += sprintf( p, "i=%s\r\n", p_media->psz_session_description );
- if( *p_media->psz_session_url )
- p += sprintf( p, "u=%s\r\n", p_media->psz_session_url );
- if( *p_media->psz_session_email )
- p += sprintf( p, "e=%s\r\n", p_media->psz_session_email );
-
- p += sprintf( p, "c=IN IP%c %s\r\n", ipv, ipv == '6' ? "::" : "0.0.0.0" );
- p += sprintf( p, "t=0 0\r\n" ); /* FIXME */
- p += sprintf( p, "a=tool:"PACKAGE_STRING"\r\n" );
+ psz_control = ipv6 ? p_media->psz_rtsp_control_v6
+ : p_media->psz_rtsp_control_v4;
+
+ /* Dummy destination address for RTSP */
+ struct sockaddr_storage dst;
+ socklen_t dstlen = ipv6 ? sizeof( struct sockaddr_in6 )
+ : sizeof( struct sockaddr_in );
+ memset (&dst, 0, dstlen);
+ dst.ss_family = ipv6 ? AF_INET6 : AF_INET;
+#ifdef HAVE_SA_LEN
+ dst.ss_len = dstlen;
+#endif
+
+ psz_sdp = vlc_sdp_Start( VLC_OBJECT( p_media->p_vod ), "sout-rtp-",
+ NULL, 0, (struct sockaddr *)&dst, dstlen );
+ if( psz_sdp == NULL )
+ return NULL;