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

📄 announce.c

📁 VLC Player Source Code
💻 C
字号:
/***************************************************************************** * announce.c : announce handler ***************************************************************************** * Copyright (C) 2002-2007 the VideoLAN team * $Id: 7dedc1e0508c412716c6c08213d29f5bd8243f11 $ * * Authors: Clément Stenac <zorglub@videolan.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************//***************************************************************************** * Preamble *****************************************************************************/#ifdef HAVE_CONFIG_H# include "config.h"#endif#include <vlc_common.h>#include <vlc_sout.h>#include "stream_output.h"#include <assert.h>/* Private functions for the announce handler */static announce_handler_t*  announce_HandlerCreate( vlc_object_t *);static int announce_Register( announce_handler_t *p_announce,                              session_descriptor_t *p_session,                              announce_method_t *p_method );static int announce_UnRegister( announce_handler_t *p_announce,                                session_descriptor_t *p_session );struct announce_method_t{} sap_method;/**************************************************************************** * Sout-side functions ****************************************************************************//** *  Register a new session with the announce handler, using a pregenerated SDP * * \param p_sout a sout instance structure * \param psz_sdp the SDP to register * \param psz_dst session address (needed for SAP address auto detection) * \param p_method an announce method descriptor * \return the new session descriptor structure */session_descriptor_t *sout_AnnounceRegisterSDP( sout_instance_t *p_sout, const char *psz_sdp,                            const char *psz_dst, announce_method_t *p_method ){    session_descriptor_t *p_session;    announce_handler_t *p_announce = (announce_handler_t*)                                     vlc_object_find( p_sout,                                              VLC_OBJECT_ANNOUNCE,                                              FIND_ANYWHERE );    if( !p_announce )    {        msg_Dbg( p_sout, "no announce handler found, creating one" );        p_announce = announce_HandlerCreate( VLC_OBJECT( p_sout ) );        if( !p_announce )        {            msg_Err( p_sout, "Creation failed" );            return NULL;        }        vlc_object_yield( p_announce );    }    p_session = malloc( sizeof( *p_session ) );    memset( p_session, 0, sizeof( *p_session ) );    p_session->psz_sdp = strdup( psz_sdp );    /* GRUIK. We should not convert back-and-forth from string to numbers */    struct addrinfo *res;    if (vlc_getaddrinfo (VLC_OBJECT (p_sout), psz_dst, 0, NULL, &res) == 0)    {        if (res->ai_addrlen <= sizeof (p_session->addr))            memcpy (&p_session->addr, res->ai_addr,                    p_session->addrlen = res->ai_addrlen);        vlc_freeaddrinfo (res);    }    announce_Register( p_announce, p_session, p_method );    vlc_object_release( p_announce );    return p_session;}/** *  UnRegister an existing session * * \param p_sout a sout instance structure * \param p_session the session descriptor * \return VLC_SUCCESS or an error */int sout_AnnounceUnRegister( sout_instance_t *p_sout,                             session_descriptor_t *p_session ){    int i_ret;    announce_handler_t *p_announce = (announce_handler_t*)                              vlc_object_find( p_sout,                                              VLC_OBJECT_ANNOUNCE,                                              FIND_ANYWHERE );    if( !p_announce )    {        msg_Dbg( p_sout, "unable to remove announce: no announce handler" );        return VLC_ENOOBJ;    }    i_ret  = announce_UnRegister( p_announce, p_session );    if( i_ret == 0 )        free( p_session );    vlc_object_release( p_announce );    return i_ret;}/** * \return the SAP announce method */announce_method_t * sout_SAPMethod (void){    return &sap_method;}void sout_MethodRelease (announce_method_t *m){    assert (m == &sap_method);}/************************************************************************ * Announce handler functions (private) ************************************************************************//** * Create the announce handler object * * \param p_this a vlc_object structure * \return the new announce handler or NULL on error */static announce_handler_t *announce_HandlerCreate( vlc_object_t *p_this ){    announce_handler_t *p_announce;    p_announce = vlc_object_create( p_this, VLC_OBJECT_ANNOUNCE );    if( !p_announce )        return NULL;    p_announce->p_sap = NULL;    vlc_object_attach( p_announce, p_this->p_libvlc);    return p_announce;}/** * Destroy a  announce handler object * * \param p_announce the announce handler to destroy * \return VLC_SUCCESS or an error */int announce_HandlerDestroy( announce_handler_t *p_announce ){    if( p_announce->p_sap )    {        /* Exit the SAP */        vlc_object_release( p_announce->p_sap );    }    /* Free the structure */    vlc_object_release( p_announce );    return VLC_SUCCESS;}/* Register an announce */static int announce_Register( announce_handler_t *p_announce,                              session_descriptor_t *p_session,                              announce_method_t *p_method ){    if (p_method == NULL)        return VLC_EGENERIC;    msg_Dbg( p_announce, "registering announce");    if( p_method == &sap_method )    {        /* Do we already have a SAP announce handler ? */        if( !p_announce->p_sap )        {            sap_handler_t *p_sap = announce_SAPHandlerCreate( p_announce );            msg_Dbg( p_announce, "creating SAP announce handler");            if( !p_sap )            {                msg_Err( p_announce, "SAP handler creation failed" );                return VLC_ENOOBJ;            }            p_announce->p_sap = p_sap;        }        /* this will set p_session->p_sap for later deletion */        msg_Dbg( p_announce, "adding SAP session");        p_announce->p_sap->pf_add( p_announce->p_sap, p_session );    }    else    {        msg_Err( p_announce, "announce type unsupported" );        return VLC_EGENERIC;    }    return VLC_SUCCESS;}/* Unregister an announce */static int announce_UnRegister( announce_handler_t *p_announce,                                session_descriptor_t *p_session ){    msg_Dbg( p_announce, "unregistering announce" );    if( p_announce->p_sap )        p_announce->p_sap->pf_del( p_announce->p_sap, p_session );    return VLC_SUCCESS;}

⌨️ 快捷键说明

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