X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fstream_output%2Fsdp.c;h=d2c0610655df1ac88588dc4120ba48bdf1fcebca;hb=acbad93b8b447ac9f776a53bf3e8f74f15132fe4;hp=8744eac7c5ce0189bc82790907da1cbc6bb68013;hpb=6afadbe25bc66e43d70cdd098ee35562fb37a7ae;p=vlc diff --git a/src/stream_output/sdp.c b/src/stream_output/sdp.c index 8744eac7c5..d2c0610655 100644 --- a/src/stream_output/sdp.c +++ b/src/stream_output/sdp.c @@ -19,8 +19,13 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include #include #include #include @@ -74,22 +79,23 @@ char *AddressToSDP (const struct sockaddr *addr, socklen_t addrlen, char *buf) } -static vlc_bool_t IsSDPString (const char *str) +static bool IsSDPString (const char *str) { if (strchr (str, '\r') != NULL) - return VLC_FALSE; + return false; if (strchr (str, '\n') != NULL) - return VLC_FALSE; + return false; if (!IsUTF8 (str)) - return VLC_FALSE; - return VLC_TRUE; + return false; + return true; } +static char *sdp_Start (const char *name, const char *description, const char *url, - const char *email, const char *phone, - const struct sockaddr *src, socklen_t srclen, - const struct sockaddr *addr, socklen_t addrlen) + const char *email, const char *phone, + const struct sockaddr *src, size_t srclen, + const struct sockaddr *addr, size_t addrlen) { uint64_t now = NTPtime64 (); char *sdp; @@ -126,7 +132,7 @@ char *sdp_Start (const char *name, const char *description, const char *url, } if (asprintf (&sdp, "v=0" - "\r\no=- "I64Fu" "I64Fu" IN IP%c %s" + "\r\no=- %"PRIu64" %"PRIu64" IN IP%c %s" "\r\ns=%s" "\r\ni=%s" "%s%s" // optional URL @@ -203,8 +209,9 @@ char *sdp_AddAttribute (char **sdp, const char *name, const char *fmt, ...) char *sdp_AddMedia (char **sdp, const char *type, const char *protocol, int dport, - unsigned pt, vlc_bool_t bw_indep, unsigned bw, - const char *rtpmap, const char *fmtp) + unsigned pt, bool bw_indep, unsigned bw, + const char *ptname, unsigned clock, unsigned chans, + const char *fmtp) { char *newsdp, *ptr; size_t inlen = strlen (*sdp), outlen = inlen; @@ -236,11 +243,63 @@ char *sdp_AddMedia (char **sdp, ptr += sprintf (ptr, "b=RR:0\r\n"); /* RTP payload type map */ - if (rtpmap != NULL) - sdp_AddAttribute (sdp, "rtpmap", "%u %s", pt, rtpmap); + if (ptname != NULL) + { + if ((strcmp (type, "audio") == 0) && (chans != 1)) + sdp_AddAttribute (sdp, "rtpmap", "%u %s/%u/%u", pt, ptname, clock, + chans); + else + sdp_AddAttribute (sdp, "rtpmap", "%u %s/%u", pt, ptname, clock); + } /* Format parameters */ if (fmtp != NULL) sdp_AddAttribute (sdp, "fmtp", "%u %s", pt, fmtp); return newsdp; } + + +char *vlc_sdp_Start (vlc_object_t *obj, const char *cfgpref, + const struct sockaddr *src, size_t srclen, + const struct sockaddr *addr, size_t addrlen) +{ + size_t cfglen = strlen (cfgpref); + if (cfglen > 100) + return NULL; + + char varname[cfglen + sizeof ("description")], *subvar = varname + cfglen; + strcpy (varname, cfgpref); + + strcpy (subvar, "name"); + char *name = var_GetNonEmptyString (obj, varname); + strcpy (subvar, "description"); + char *description = var_GetNonEmptyString (obj, varname); + strcpy (subvar, "url"); + char *url = var_GetNonEmptyString (obj, varname); + strcpy (subvar, "email"); + char *email = var_GetNonEmptyString (obj, varname); + strcpy (subvar, "phone"); + char *phone = var_GetNonEmptyString (obj, varname); + + char *sdp = sdp_Start (name, description, url, email, phone, + src, srclen, addr, addrlen); + free (name); + free (description); + free (url); + free (email); + free (phone); + + if (sdp == NULL) + return NULL; + + /* Totally non-standard */ + strcpy (subvar, "group"); + char *group = var_GetNonEmptyString (obj, varname); + if (group != NULL) + { + sdp_AddAttribute (&sdp, "x-plgroup", "%s", group); + free (group); + } + + return sdp; +}