⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 standard.c

📁 video linux conference
💻 C
📖 第 1 页 / 共 2 页
字号:
        }        else        {            /* default file */            psz_access = strdup("file");        }    }    /* fix or warn of incompatible couple */    if( psz_mux && psz_access )    {        if( !strncmp( psz_access, "mmsh", 4 ) &&            strncmp( psz_mux, "asfh", 4 ) )        {            char *p = strchr( psz_mux,'{' );            msg_Warn( p_stream, "fixing to mmsh/asfh" );            if( p )            {                /* -> a little memleak but ... */                psz_mux = malloc( strlen( "asfh" ) + strlen( p ) + 1);                sprintf( psz_mux, "asfh%s", p );            }            else            {                psz_mux = strdup("asfh");            }        }        else if( ( !strncmp( psz_access, "rtp", 3 ) ||                   !strncmp( psz_access, "udp", 3 ) ) &&                 strncmp( psz_mux, "ts", 2 ) )        {            msg_Err( p_stream, "for now udp and rtp are only valid with TS" );        }        else if( strncmp( psz_access, "file", 4 ) &&                 ( !strncmp( psz_mux, "mov", 3 ) ||                   !strncmp( psz_mux, "mp4", 3 ) ) )        {            msg_Err( p_stream, "mov and mp4 work only with file output" );        }    }    msg_Dbg( p_this, "using `%s/%s://%s'", psz_access, psz_mux, psz_url );    /* *** find and open appropriate access module *** */    p_access = sout_AccessOutNew( p_sout, psz_access, psz_url );    if( p_access == NULL )    {        msg_Err( p_stream, "no suitable sout access module for `%s/%s://%s'",                 psz_access, psz_mux, psz_url );        if( psz_access ) free( psz_access );        if( psz_mux ) free( psz_mux );        return VLC_EGENERIC;    }    msg_Dbg( p_stream, "access opened" );    /* *** find and open appropriate mux module *** */    p_mux = sout_MuxNew( p_sout, psz_mux, p_access );    if( p_mux == NULL )    {        msg_Err( p_stream, "no suitable sout mux module for `%s/%s://%s'",                 psz_access, psz_mux, psz_url );        sout_AccessOutDelete( p_access );        if( psz_access ) free( psz_access );        if( psz_mux ) free( psz_mux );        return VLC_EGENERIC;    }    msg_Dbg( p_stream, "mux opened" );    /*  *** Create the SAP Session structure *** */    var_Get( p_stream, SOUT_CFG_PREFIX "sap", &val );    if( val.b_bool &&        ( strstr( psz_access, "udp" ) || strstr( psz_access , "rtp" ) ) )    {        session_descriptor_t *p_session = sout_AnnounceSessionCreate();        announce_method_t *p_method =            sout_AnnounceMethodCreate( METHOD_TYPE_SAP );        vlc_url_t url;        var_Get( p_stream, SOUT_CFG_PREFIX "name", &val );        if( *val.psz_string )        {            p_session->psz_name = strdup( val.psz_string );        }        else        {            p_session->psz_name = strdup( psz_url );        }        free( val.psz_string );        var_Get( p_stream, SOUT_CFG_PREFIX "group", &val );        if( *val.psz_string )        {            p_session->psz_group = strdup( val.psz_string );        }        free( val.psz_string );        var_Get( p_stream, SOUT_CFG_PREFIX "sap-ipv6", &val );        p_method->i_ip_version = val.b_bool ? 6 : 4;        /* Now, parse the URL to extract host and port */        vlc_UrlParse( &url, psz_url , 0);        if( url.psz_host )        {            if( url.i_port == 0 ) url.i_port = DEFAULT_PORT;            p_session->psz_uri = strdup( url.psz_host );            p_session->i_port = url.i_port;            p_session->psz_sdp = NULL;            p_session->i_ttl = config_GetInt( p_sout, "ttl" );            p_session->i_payload = 33;            msg_Info( p_this, "SAP Enabled");            sout_AnnounceRegister( p_sout, p_session, p_method );            /* FIXME: Free p_method */            p_stream->p_sys->p_session = p_session;        }        vlc_UrlClean( &url );        if( p_method->psz_address) free( p_method->psz_address );        free( p_method );    }    /* *** Register with slp *** */#ifdef HAVE_SLP_H    var_Get( p_stream, SOUT_CFG_PREFIX "slp", &val );    if( val.b_bool &&        ( strstr( psz_access, "udp" ) || strstr( psz_access ,  "rtp" ) ) )    {        int i_ret;        msg_Info( p_this, "SLP Enabled");        var_Get( p_stream, SOUT_CFG_PREFIX "name", &val );        if( *val.psz_string )        {            i_ret = sout_SLPReg( p_sout, psz_url, val.psz_string );        }        else        {            i_ret = sout_SLPReg( p_sout, psz_url, psz_url );        }        if( i_ret )        {           msg_Warn( p_sout, "SLP Registering failed");        }        else        {            p_slp = malloc(sizeof(slp_session_t));            p_slp->psz_url = strdup( psz_url );            p_slp->psz_name =                strdup( *val.psz_string ? val.psz_string : psz_url );        }        free( val.psz_string );    }#endif    p_stream->pf_add    = Add;    p_stream->pf_del    = Del;    p_stream->pf_send   = Send;    p_stream->p_sys->p_mux = p_mux;    p_stream->p_sys->p_slp = p_slp;    if( psz_access ) free( psz_access );    if( psz_mux ) free( psz_mux );    if( psz_url ) free( psz_url );    return VLC_SUCCESS;}/***************************************************************************** * Close: *****************************************************************************/static void Close( vlc_object_t * p_this ){    sout_stream_t     *p_stream = (sout_stream_t*)p_this;    sout_stream_sys_t *p_sys    = p_stream->p_sys;    sout_access_out_t *p_access = p_sys->p_mux->p_access;    if( p_sys->p_session != NULL )    {        sout_AnnounceUnRegister( p_stream->p_sout, p_sys->p_session );        sout_AnnounceSessionDestroy( p_sys->p_session );    }#ifdef HAVE_SLP_H    if( p_sys->p_slp )    {            sout_SLPDereg( (sout_instance_t *)p_this,                        p_sys->p_slp->psz_url,                        p_sys->p_slp->psz_name);            free( p_sys->p_slp);    }#endif    sout_MuxDelete( p_sys->p_mux );    sout_AccessOutDelete( p_access );    free( p_sys );}struct sout_stream_id_t{    sout_input_t *p_input;};static sout_stream_id_t * Add( sout_stream_t *p_stream, es_format_t *p_fmt ){    sout_stream_sys_t *p_sys = p_stream->p_sys;    sout_stream_id_t  *id;    id = malloc( sizeof( sout_stream_id_t ) );    if( ( id->p_input = sout_MuxAddStream( p_sys->p_mux, p_fmt ) ) == NULL )    {        free( id );        return NULL;    }    return id;}static int Del( sout_stream_t *p_stream, sout_stream_id_t *id ){    sout_stream_sys_t *p_sys = p_stream->p_sys;    sout_MuxDeleteStream( p_sys->p_mux, id->p_input );    free( id );    return VLC_SUCCESS;}static int Send( sout_stream_t *p_stream, sout_stream_id_t *id,                 block_t *p_buffer ){    sout_stream_sys_t *p_sys = p_stream->p_sys;    sout_MuxSendBuffer( p_sys->p_mux, id->p_input, p_buffer );    return VLC_SUCCESS;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -