Changeset 23333fe28c426f606e9027ae2d30e4b14a245365
- Timestamp:
- 10/02/07 18:33:27 (2 years ago)
- git-parent:
- Files:
-
- include/vlc_sout.h (modified) (1 diff)
- modules/stream_out/standard.c (modified) (5 diffs)
- src/stream_output/announce.c (modified) (1 diff)
- src/stream_output/sap.c (modified) (2 diffs)
- src/stream_output/stream_output.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
include/vlc_sout.h
raf518b8 r23333fe 216 216 217 217 VLC_EXPORT(session_descriptor_t*,sout_AnnounceSessionCreate, (vlc_object_t *obj, const char *cfgpref) ); 218 VLC_EXPORT(int, sout_SessionSetMedia, (vlc_object_t *obj, session_descriptor_t *, char *, char *, int, char *, int) ); 218 219 VLC_EXPORT(void, sout_AnnounceSessionDestroy, (session_descriptor_t *) ); 219 220 VLC_EXPORT(announce_method_t*, sout_SAPMethod, (void) ); modules/stream_out/standard.c
raf518b8 r23333fe 25 25 * Preamble 26 26 *****************************************************************************/ 27 #include <vlc/vlc.h> 28 #include <vlc_sout.h> 29 27 30 #include <stdlib.h> 28 31 #include <string.h> 29 30 #include <vlc/vlc.h> 31 #include <vlc_sout.h> 32 #include <stdio.h> 32 33 33 34 #include <vlc_network.h> … … 246 247 psz_mux = strdup("asfh"); 247 248 } 248 else if( !strncmp( psz_access, "udp", 3 ) || 249 !strncmp( psz_access, "rtp", 3 ) ) 249 else if (!strcmp (psz_access, "udp") 250 || !strcmp (psz_access, "rtp") || !strcmp (psz_access, "udplite") 251 || !strcmp (psz_access, "tcp") || !strcmp (psz_access, "sctp") 252 || !strcmp (psz_access, "dccp")) 250 253 { 251 254 psz_mux = strdup("ts"); … … 338 341 339 342 /* *** Create the SAP Session structure *** */ 340 if( var_GetBool( p_stream, SOUT_CFG_PREFIX"sap" ) && 341 ( strncmp( psz_access, "udp", 3 ) || strncmp( psz_access , "rtp", 3 ) ) ) 343 if( var_GetBool( p_stream, SOUT_CFG_PREFIX"sap" ) ) 342 344 { 343 345 session_descriptor_t *p_session; 344 346 announce_method_t *p_method = sout_SAPMethod (); 345 347 vlc_url_t url; 346 p_session = sout_AnnounceSessionCreate (VLC_OBJECT (p_stream), SOUT_CFG_PREFIX); 348 const int payload_type = 33; 349 350 static const struct { const char *access; const char *fmt; } fmts[] = 351 { 352 { "udp", "udp mpeg" }, 353 { "rtp", "RTP/AVP %d" }, 354 { "udplite", "UDPLite/RTP/AVP %d" }, 355 /* Currently unsupported access outputs: */ 356 { "dccp", "DCCP/RTP/AVP %d" }, 357 { "tcp", "TCP/RTP/AVP %d" }, 358 /* TLS/DTLS variants (none implemented). */ 359 { "dtls", "UDP/TLS/RTP/AVP %d" }, 360 { "dtlslite", "UDPLite/TLS/RTP/AVP %d" }, 361 { "dccps", "DCCP/TLS/RTP/AVP %d" }, 362 { "tls", "TCP/TLS/RTP/AVP %d" }, 363 /* SRTP (not implemented) */ 364 { "srtp", "RTP/SAVP %d" }, 365 { "sudplite", "UDPLite/RTP/SAVP %d" }, 366 { "sdccp", "DCCP/RTP/SAVP %d" }, 367 { "stcp", "TCP/RTP/SAVP %d" }, 368 { NULL, NULL } 369 }; 370 const char *psz_sdp_fmt = NULL; 371 char *fmt, *src, *dst; 372 int sport, dport; 373 374 for (unsigned i = 0; fmts[i].access != NULL; i++) 375 if (strcasecmp (fmts[i].access, psz_access) == 0) 376 { 377 psz_sdp_fmt = fmts[i].fmt; 378 break; 379 } 380 381 src = var_GetNonEmptyString (p_access, "src-addr"); 382 dst = var_GetNonEmptyString (p_access, "dst-addr"); 383 sport = var_GetInteger (p_access, "src-port"); 384 dport = var_GetInteger (p_access, "dst-port"); 385 msg_Err (p_stream, "%p, %p, %d, %d", src, dst, sport, dport); 386 387 if ((psz_sdp_fmt == NULL) 388 || (asprintf (&fmt, psz_sdp_fmt, payload_type) == -1)) 389 fmt = NULL; 390 391 msg_Dbg( p_stream, "SAP advertized format: %s", fmt); 392 if ((fmt == NULL) || ((src == NULL) && (dst == NULL))) 393 { 394 msg_Err (p_access, "SAP announces not supported for access %s", 395 psz_access); 396 free (fmt); 397 free (src); 398 free (dst); 399 goto nosap; 400 } 401 402 p_session = sout_AnnounceSessionCreate (VLC_OBJECT (p_stream), 403 SOUT_CFG_PREFIX); 404 sout_SessionSetMedia (VLC_OBJECT (p_stream), p_session, fmt, 405 src, sport, dst, dport); 347 406 348 407 /* Now, parse the URL to extract host and port */ … … 356 415 p_session->psz_uri = strdup( url.psz_host ); 357 416 p_session->i_port = url.i_port; 358 p_session->i_payload = 33;359 417 p_session->b_rtp = strstr( psz_access, "rtp") ? 1 : 0; 360 418 #endif … … 367 425 sout_MethodRelease (p_method); 368 426 } 427 nosap: 369 428 370 429 p_stream->pf_add = Add; src/stream_output/announce.c
r861ef85 r23333fe 191 191 192 192 return p_session; 193 } 194 195 int sout_SessionSetMedia (vlc_object_t *obj, session_descriptor_t *p_session, 196 char *fmt, char *src, int sport, 197 char *dst, int dport) 198 { 199 p_session->sdpformat = fmt; 200 201 /* GRUIK. We should not convert back-and-forth from string to numbers */ 202 struct addrinfo *res; 203 if (vlc_getaddrinfo (obj, dst, dport, NULL, &res) == 0) 204 { 205 if (res->ai_addrlen <= sizeof (p_session->addr)) 206 memcpy (&p_session->addr, res->ai_addr, 207 p_session->addrlen = res->ai_addrlen); 208 freeaddrinfo (res); 209 } 210 if (vlc_getaddrinfo (obj, src, sport, NULL, &res) == 0) 211 { 212 if (res->ai_addrlen <= sizeof (p_session->orig)) 213 memcpy (&p_session->orig, res->ai_addr, 214 p_session->origlen = res->ai_addrlen); 215 freeaddrinfo (res); 216 } 217 return 0; 193 218 } 194 219 src/stream_output/sap.c
r861ef85 r23333fe 383 383 { 384 384 net_StopRecv( p_address->i_wfd ); 385 p_address->origlen = sizeof (p_address->orig); 385 386 getsockname (p_address->i_wfd, (struct sockaddr *)&p_address->orig, 386 387 &p_address->origlen); … … 625 626 626 627 int res = asprintf (&psz_sdp, "%s" "%s" "%s" 627 "m=video %d %s %d\r\n",628 "m=video %d %s\r\n", 628 629 head, 629 630 plgroup ?: "", 630 631 sfilter ?: "", 631 632 net_GetPort ((const struct sockaddr *)&p_session->addr), 632 p_session->b_rtp ? "RTP/AVP" : "udp", 633 p_session->i_payload); 633 p_session->sdpformat); 634 634 free (plgroup); 635 635 free (sfilter); src/stream_output/stream_output.h
r861ef85 r23333fe 84 84 socklen_t addrlen; 85 85 86 int i_payload; /* SAP Payload type */ 87 86 char *sdpformat; // format suitable for SDP 88 87 char *psz_sdp; 89 vlc_bool_t b_rtp;90 88 vlc_bool_t b_ssm; 91 89 };
