- p_session->psz_sdp = (char *)malloc(
- sizeof("v=0\n"
- "o=- 12 12 IN IP4 127.0.0.1\n" /* FIXME */
- "s=\n"
- "c=IN IP4 /\n"
- "m=video udp\n"
- "a=tool:VLC "VERSION"\n"
- "a=type:broadcast")
- + strlen( p_session->psz_name )
- + strlen( p_session->psz_uri ) + 300 );
- if( !p_session->psz_sdp )
- {
- msg_Err( p_sap, "out of memory" );
- return VLC_ENOMEM;
- }
- sprintf( p_session->psz_sdp,
- "v=0\n"
- "o=- 12 12 IN IP4 127.0.0.1\n"
- "s=%s\n"
- "c=IN IP4 %s/%d\n"
- "m=video %d udp %d\n"
- "a=tool:VLC "VERSION"\n"
- "a=type:broadcast\n",
- p_session->psz_name,
- p_session->psz_uri, p_session->i_ttl,
- p_session->i_port, p_session->i_payload );
- msg_Dbg( p_sap, "Generated SDP (%i bytes):\n%s", strlen(p_session->psz_sdp),
- p_session->psz_sdp );
- return VLC_SUCCESS;
+ char *psz_group, *psz_name, *psz_sdp;
+
+ char *head = StartSDP (p_session->psz_name, p_session->description,
+ p_session->url, p_session->email, p_session->phone, b_ssm,
+ (const struct sockaddr *)&p_session->orig, p_session->origlen,
+ (const struct sockaddr *)&p_session->addr, p_session->addrlen);
+ if (head == NULL)
+ return NULL;
+
+ psz_group = p_session->psz_group;
+ psz_name = p_session->psz_name;
+
+ char *plgroup;
+ if ((psz_group == NULL)
+ || (asprintf (&plgroup, "a=x-plgroup:%s\r\n", psz_group) == -1))
+ plgroup = NULL;
+
+ const char *comedia = NULL;
+ if (!strncasecmp (p_session->sdpformat, "DCCP", 4)
+ || !strncasecmp (p_session->sdpformat, "TCP", 3))
+ comedia = "a=setup:passive\r\n"
+ "a=connection:new\r\n";
+
+ int res = asprintf (&psz_sdp, "%s" "%s" "%s"
+ "m=video %d %s\r\n",
+ head,
+ plgroup ?: "",
+ comedia ?: "",
+ ntohs (net_GetPort ((const struct sockaddr *)&p_session->addr)),
+ p_session->sdpformat);
+ free (plgroup);
+
+ if (res == -1)
+ return NULL;
+
+ msg_Dbg( p_sap, "Generated SDP (%i bytes):\n%s", strlen(psz_sdp),
+ psz_sdp );
+ return psz_sdp;