Changeset 23333fe28c426f606e9027ae2d30e4b14a245365

Show
Ignore:
Timestamp:
10/02/07 18:33:27 (2 years ago)
Author:
Rémi Denis-Courmont <rem@videolan.org>
git-committer:
Rémi Denis-Courmont <rem@videolan.org> 1171128807 +0000
git-parent:

[c66322492686f7eaffeb2622f58430984a54be82]

git-author:
Rémi Denis-Courmont <rem@videolan.org> 1171128807 +0000
Message:

Restore some kind of SAP support

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • include/vlc_sout.h

    raf518b8 r23333fe  
    216216 
    217217VLC_EXPORT(session_descriptor_t*,sout_AnnounceSessionCreate, (vlc_object_t *obj, const char *cfgpref) ); 
     218VLC_EXPORT(int,                  sout_SessionSetMedia, (vlc_object_t *obj, session_descriptor_t *, char *, char *, int, char *, int) ); 
    218219VLC_EXPORT(void,                 sout_AnnounceSessionDestroy, (session_descriptor_t *) ); 
    219220VLC_EXPORT(announce_method_t*,   sout_SAPMethod, (void) ); 
  • modules/stream_out/standard.c

    raf518b8 r23333fe  
    2525 * Preamble 
    2626 *****************************************************************************/ 
     27#include <vlc/vlc.h> 
     28#include <vlc_sout.h> 
     29 
    2730#include <stdlib.h> 
    2831#include <string.h> 
    29  
    30 #include <vlc/vlc.h> 
    31 #include <vlc_sout.h> 
     32#include <stdio.h> 
    3233 
    3334#include <vlc_network.h> 
     
    246247            psz_mux = strdup("asfh"); 
    247248        } 
    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")) 
    250253        { 
    251254            psz_mux = strdup("ts"); 
     
    338341 
    339342    /* *** 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" ) ) 
    342344    { 
    343345        session_descriptor_t *p_session; 
    344346        announce_method_t *p_method = sout_SAPMethod (); 
    345347        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); 
    347406 
    348407        /* Now, parse the URL to extract host and port */ 
     
    356415            p_session->psz_uri = strdup( url.psz_host ); 
    357416            p_session->i_port = url.i_port; 
    358             p_session->i_payload = 33; 
    359417            p_session->b_rtp = strstr( psz_access, "rtp") ? 1 : 0; 
    360418#endif 
     
    367425        sout_MethodRelease (p_method); 
    368426    } 
     427nosap: 
    369428 
    370429    p_stream->pf_add    = Add; 
  • src/stream_output/announce.c

    r861ef85 r23333fe  
    191191 
    192192    return p_session; 
     193} 
     194 
     195int 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; 
    193218} 
    194219 
  • src/stream_output/sap.c

    r861ef85 r23333fe  
    383383        { 
    384384            net_StopRecv( p_address->i_wfd ); 
     385            p_address->origlen = sizeof (p_address->orig); 
    385386            getsockname (p_address->i_wfd, (struct sockaddr *)&p_address->orig, 
    386387                         &p_address->origlen); 
     
    625626 
    626627    int res = asprintf (&psz_sdp, "%s" "%s" "%s" 
    627                         "m=video %d %s %d\r\n", 
     628                        "m=video %d %s\r\n", 
    628629                        head, 
    629630                        plgroup ?: "", 
    630631                        sfilter ?: "", 
    631632                        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); 
    634634    free (plgroup); 
    635635    free (sfilter); 
  • src/stream_output/stream_output.h

    r861ef85 r23333fe  
    8484    socklen_t addrlen; 
    8585 
    86     int i_payload;   /* SAP Payload type */ 
    87  
     86    char *sdpformat; // format suitable for SDP 
    8887    char *psz_sdp; 
    89     vlc_bool_t b_rtp; 
    9088    vlc_bool_t b_ssm; 
    9189};