X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fstream_output%2Fannounce.c;h=261b69dd31f929f6dfd7d24b68a6802b7a1089a6;hb=e7d54bc7d7e5fb3faf69b09d3fd157eec7139de7;hp=0fe230afe94d28731bbc5cd524c8830170a4f037;hpb=5c8acc49f87cb734a2d072cf1b3f5c0f067b5ade;p=vlc diff --git a/src/stream_output/announce.c b/src/stream_output/announce.c index 0fe230afe9..261b69dd31 100644 --- a/src/stream_output/announce.c +++ b/src/stream_output/announce.c @@ -1,10 +1,10 @@ /***************************************************************************** * announce.c : announce handler ***************************************************************************** - * Copyright (C) 2002-2004 the VideoLAN team + * Copyright (C) 2002-2007 the VideoLAN team * $Id$ * - * Authors: Clément Stenac + * Authors: Clément Stenac * * 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 @@ -18,299 +18,137 @@ * * 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., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** * Preamble *****************************************************************************/ -#include /* free() */ -#include /* sprintf() */ -#include /* strerror() */ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif -#include -#include +#include +#include +#include "stream_output.h" +#include "libvlc.h" -/***************************************************************************** - * Local prototypes - *****************************************************************************/ -#define FREE( p ) if( p ) { free( p ); (p) = NULL; } +#include +struct announce_method_t +{ +} sap_method; /**************************************************************************** * Sout-side functions ****************************************************************************/ -/** - * Register a new session with the announce handler - * - * \param p_sout a sout instance structure - * \param p_session a session descriptor - * \param p_method an announce method descriptor - * \return VLC_SUCCESS or an error - */ -int sout_AnnounceRegister( sout_instance_t *p_sout, - session_descriptor_t *p_session, - announce_method_t *p_method ) +static void sap_destroy (vlc_object_t *p_this) { - 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, "No announce handler found, creating one" ); - p_announce = announce_HandlerCreate( p_sout ); - if( !p_announce ) - { - msg_Err( p_sout, "Creation failed" ); - return VLC_ENOMEM; - } - vlc_object_yield( p_announce ); - msg_Dbg( p_sout,"Creation done" ); - } - - i_ret = announce_Register( p_announce, p_session, p_method ); - vlc_object_release( p_announce ); - - return i_ret; + libvlc_priv (p_this->p_libvlc)->p_sap = NULL; } +#undef sout_AnnounceRegisterSDP /** - * Register a new session with the announce handler, using a pregenerated SDP + * Registers a new session with the announce handler, using a pregenerated SDP * - * \param p_sout a sout instance structure + * \param obj a VLC object * \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, announce_method_t *p_method ) +session_descriptor_t * +sout_AnnounceRegisterSDP( vlc_object_t *obj, 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( p_sout ); - if( !p_announce ) - { - msg_Err( p_sout, "Creation failed" ); - return NULL; - } - vlc_object_yield( p_announce ); - } + assert (p_method == &sap_method); + (void) p_method; - if( p_method->i_type != METHOD_TYPE_SAP ) - { - msg_Warn( p_sout,"forcing SAP announcement"); - } + session_descriptor_t *p_session = calloc( 1, sizeof (*p_session) ); + if( !p_session ) + return NULL; - p_session = sout_AnnounceSessionCreate(); p_session->psz_sdp = strdup( psz_sdp ); - 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 ) + /* GRUIK. We should not convert back-and-forth from string to numbers */ + struct addrinfo *res; + if (vlc_getaddrinfo (obj, psz_dst, 0, NULL, &res) == 0) { - msg_Dbg( p_sout, "Unable to remove announce: no announce handler" ); - return VLC_ENOOBJ; + if (res->ai_addrlen <= sizeof (p_session->addr)) + memcpy (&p_session->addr, res->ai_addr, + p_session->addrlen = res->ai_addrlen); + vlc_freeaddrinfo (res); } - i_ret = announce_UnRegister( p_announce, p_session ); - - vlc_object_release( p_announce ); - return i_ret; -} - -/** - * Create and initialize a session descriptor - * - * \return a new session descriptor - */ -session_descriptor_t * sout_AnnounceSessionCreate(void) -{ - session_descriptor_t *p_session; - - p_session = (session_descriptor_t *)malloc( sizeof(session_descriptor_t)); - - if( p_session) - { - p_session->p_sap = NULL; - p_session->psz_sdp = NULL; - p_session->psz_name = NULL; - p_session->psz_uri = NULL; - p_session->i_port = 0; - p_session->psz_group = NULL; - } - - return p_session; -} + vlc_value_t lockval; + if (var_Create (obj->p_libvlc, "sap_mutex", VLC_VAR_MUTEX) + || var_Get (obj->p_libvlc, "sap_mutex", &lockval)) + goto error; -/** - * Destroy a session descriptor and free all - * - * \param p_session the session to destroy - * \return Nothing - */ -void sout_AnnounceSessionDestroy( session_descriptor_t *p_session ) -{ - if( p_session ) + vlc_mutex_lock (lockval.p_address); + sap_handler_t *p_sap = libvlc_priv (obj->p_libvlc)->p_sap; + if (p_sap == NULL) { - FREE( p_session->psz_name ); - FREE( p_session->psz_group ); - FREE( p_session->psz_uri ); - FREE( p_session->psz_sdp ); - free( p_session ); + p_sap = SAP_Create (VLC_OBJECT (obj->p_libvlc)); + libvlc_priv (obj->p_libvlc)->p_sap = p_sap; + vlc_object_set_destructor ((vlc_object_t *)p_sap, sap_destroy); } -} + else + vlc_object_hold ((vlc_object_t *)p_sap); + vlc_mutex_unlock (lockval.p_address); -/** - * Create and initialize an announcement method structure - * - * \param i_type METHOD_TYPE_SAP or METHOD_TYPE_SLP - * \return a new announce_method structure - */ -announce_method_t * sout_AnnounceMethodCreate( int i_type ) -{ - announce_method_t *p_method; + if (p_sap == NULL) + goto error; - p_method = (announce_method_t *)malloc( sizeof(announce_method_t) ); - if( p_method == NULL ) - return NULL; + msg_Dbg (obj, "adding SAP session"); + SAP_Add (p_sap, p_session ); + return p_session; - p_method->i_type = i_type; - return p_method; +error: + free (p_session->psz_sdp); + free (p_session); + return NULL; } -/************************************************************************ - * Announce handler functions (private) - ************************************************************************/ - +#undef sout_AnnounceUnRegister /** - * Create the announce handler object + * Unregisters an existing session * - * \param p_this a vlc_object structure - * \return the new announce handler or NULL on error + * \param obj a VLC object + * \param p_session the session descriptor + * \return VLC_SUCCESS or an error */ -announce_handler_t *__announce_HandlerCreate( vlc_object_t *p_this ) +int sout_AnnounceUnRegister( vlc_object_t *obj, + session_descriptor_t *p_session ) { - announce_handler_t *p_announce; - - p_announce = vlc_object_create( p_this, VLC_OBJECT_ANNOUNCE ); - - if( !p_announce ) - { - msg_Err( p_this, "out of memory" ); - return NULL; - } + sap_handler_t *p_sap = libvlc_priv (obj->p_libvlc)->p_sap; - p_announce->p_sap = NULL; + msg_Dbg (obj, "removing SAP session"); + SAP_Del (p_sap, p_session); - vlc_object_attach( p_announce, p_this->p_vlc); + vlc_value_t lockval; + var_Create (obj->p_libvlc, "sap_mutex", VLC_VAR_MUTEX); + var_Get (obj->p_libvlc, "sap_mutex", &lockval); + vlc_mutex_lock (lockval.p_address); + vlc_object_release ((vlc_object_t *)p_sap); + vlc_mutex_unlock (lockval.p_address); + free (p_session->psz_sdp); + free (p_session); - return p_announce; + return 0; } /** - * Destroy a announce handler object - * - * \param p_announce the announce handler to destroy - * \return VLC_SUCCESS or an error + * \return the SAP announce method */ -int announce_HandlerDestroy( announce_handler_t *p_announce ) +announce_method_t * sout_SAPMethod (void) { - - if( p_announce->p_sap ) - { - p_announce->p_sap->b_die = VLC_TRUE; - /* Wait for the SAP thread to exit */ - vlc_thread_join( p_announce->p_sap ); - announce_SAPHandlerDestroy( p_announce->p_sap ); - } - - /* Free the structure */ - vlc_object_destroy( p_announce ); - - return VLC_SUCCESS; + return &sap_method; } -/* Register an announce */ -int announce_Register( announce_handler_t *p_announce, - session_descriptor_t *p_session, - announce_method_t *p_method ) +void sout_MethodRelease (announce_method_t *m) { - - msg_Dbg( p_announce, "registering announce"); - if( p_method->i_type == METHOD_TYPE_SAP ) - { - /* 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 if( p_method->i_type == METHOD_TYPE_SLP ) - { - msg_Dbg( p_announce, "SLP unsupported at the moment" ); - return VLC_EGENERIC; - } - else - { - msg_Dbg( p_announce, "Announce type unsupported" ); - return VLC_EGENERIC; - } - return VLC_SUCCESS;; -} - - -/* Unregister an announce */ -int announce_UnRegister( announce_handler_t *p_announce, - session_descriptor_t *p_session ) -{ - msg_Dbg( p_announce, "unregistering announce" ); - if( p_session->p_sap != NULL ) /* SAP Announce */ - { - if( !p_announce->p_sap ) - { - msg_Err( p_announce, "can't remove announce, no SAP handler"); - return VLC_ENOOBJ; - } - p_announce->p_sap->pf_del( p_announce->p_sap, p_session ); - } - return VLC_SUCCESS; + assert (m == &sap_method); }