X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fstream_output%2Fannounce.c;h=37e3300b7ca981086681fff8cd9870200019de2b;hb=12ade3e3bc975d5426ba4af155b7372c31093b31;hp=b1d6d97d50b8dfbb0210d01656b39e1b49b8f1c1;hpb=d212179528ff468f9aed583eef8552203b32093f;p=vlc diff --git a/src/stream_output/announce.c b/src/stream_output/announce.c index b1d6d97d50..37e3300b7c 100644 --- a/src/stream_output/announce.c +++ b/src/stream_output/announce.c @@ -24,20 +24,17 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include #include #include "stream_output.h" +#include "libvlc.h" #include -/* 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; @@ -46,103 +43,96 @@ struct announce_method_t * Sout-side functions ****************************************************************************/ -/** - * Create and initialize a session descriptor - * - * \return a new session descriptor - */ -static session_descriptor_t * sout_AnnounceSessionCreate (vlc_object_t *obj, - const char *cfgpref) +static void sap_destroy (vlc_object_t *p_this) { - return calloc (1, sizeof (session_descriptor_t)); + libvlc_priv (p_this->p_libvlc)->p_sap = NULL; } +#undef sout_AnnounceRegisterSDP + +static vlc_mutex_t sap_mutex = VLC_STATIC_MUTEX; + /** - * 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_uri session address (needed for SAP address auto detection) + * \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 *cfgpref, - const char *psz_sdp, const char *psz_uri, - announce_method_t *p_method ) +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( VLC_OBJECT( 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; + + session_descriptor_t *p_session = calloc( 1, sizeof (*p_session) ); + if( !p_session ) + return NULL; - p_session = sout_AnnounceSessionCreate(VLC_OBJECT (p_sout), cfgpref); 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_uri, 0, NULL, &res) == 0) + if (vlc_getaddrinfo (obj, 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); + freeaddrinfo (res); + } + + vlc_mutex_lock (&sap_mutex); + sap_handler_t *p_sap = libvlc_priv (obj->p_libvlc)->p_sap; + if (p_sap == NULL) + { + 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 (&sap_mutex); - announce_Register( p_announce, p_session, p_method ); + if (p_sap == NULL) + goto error; - vlc_object_release( p_announce ); + msg_Dbg (obj, "adding SAP session"); + SAP_Add (p_sap, p_session ); return p_session; + +error: + free (p_session->psz_sdp); + free (p_session); + return NULL; } +#undef sout_AnnounceUnRegister /** - * UnRegister an existing session + * Unregisters an existing session * - * \param p_sout a sout instance structure + * \param obj a VLC object * \param p_session the session descriptor * \return VLC_SUCCESS or an error */ -int sout_AnnounceUnRegister( sout_instance_t *p_sout, +int sout_AnnounceUnRegister( vlc_object_t *obj, 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 ); + sap_handler_t *p_sap = libvlc_priv (obj->p_libvlc)->p_sap; - vlc_object_release( p_announce ); + msg_Dbg (obj, "removing SAP session"); + SAP_Del (p_sap, p_session); - return i_ret; -} + vlc_mutex_lock (&sap_mutex); + vlc_object_release ((vlc_object_t *)p_sap); + vlc_mutex_unlock (&sap_mutex); -/** - * Destroy a session descriptor and free all - * - * \param p_session the session to destroy - * \return Nothing - */ -void sout_AnnounceSessionDestroy( session_descriptor_t *p_session ) -{ - free( p_session ); + free (p_session->psz_sdp); + free (p_session); + + return 0; } /** @@ -157,99 +147,3 @@ 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 ) - { - msg_Err( p_this, "out of memory" ); - 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 ) - { - vlc_object_kill ((vlc_object_t *)p_announce->p_sap); - /* Wait for the SAP thread to exit */ - vlc_thread_join( (vlc_object_t *)p_announce->p_sap ); - announce_SAPHandlerDestroy( p_announce->p_sap ); - } - - /* Free the structure */ - vlc_object_destroy( 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; -}