X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fstream_output%2Fannounce.c;h=7dedc1e0508c412716c6c08213d29f5bd8243f11;hb=dd11b53113b073ef7879fffc5d28b58152dd50bf;hp=76954107324f36b2813179bf545ac3ec76ed2b77;hpb=2f9e4e4c1287a4fd7b92c244332c35c33ad28fc8;p=vlc diff --git a/src/stream_output/announce.c b/src/stream_output/announce.c index 7695410732..7dedc1e050 100644 --- a/src/stream_output/announce.c +++ b/src/stream_output/announce.c @@ -24,14 +24,24 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include /* free() */ -#include /* sprintf() */ -#include /* strerror() */ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif -#include +#include #include #include "stream_output.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; @@ -40,55 +50,18 @@ struct announce_method_t * 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 ) -{ - 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; -} - /** * 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_uri session URI (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 *psz_sdp, const char *psz_uri, - announce_method_t *p_method ) +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*) @@ -98,7 +71,7 @@ session_descriptor_t *sout_AnnounceRegisterSDP( sout_instance_t *p_sout, if( !p_announce ) { msg_Dbg( p_sout, "no announce handler found, creating one" ); - p_announce = announce_HandlerCreate( p_sout ); + p_announce = announce_HandlerCreate( VLC_OBJECT( p_sout ) ); if( !p_announce ) { msg_Err( p_sout, "Creation failed" ); @@ -107,9 +80,20 @@ session_descriptor_t *sout_AnnounceRegisterSDP( sout_instance_t *p_sout, vlc_object_yield( p_announce ); } - p_session = sout_AnnounceSessionCreate(); + p_session = malloc( sizeof( *p_session ) ); + memset( p_session, 0, sizeof( *p_session ) ); p_session->psz_sdp = strdup( psz_sdp ); - p_session->psz_uri = strdup( psz_uri ); + + /* 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 ); @@ -137,47 +121,14 @@ int sout_AnnounceUnRegister( sout_instance_t *p_sout, 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; } -/** - * 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 == NULL) - return NULL; - - memset (p_session, 0, sizeof (*p_session)); - return p_session; -} - -/** - * 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 ) - { - FREENULL( p_session->psz_name ); - FREENULL( p_session->psz_group ); - FREENULL( p_session->psz_uri ); - FREENULL( p_session->psz_sdp ); - free( p_session ); - } -} - /** * \return the SAP announce method */ @@ -186,6 +137,11 @@ announce_method_t * sout_SAPMethod (void) return &sap_method; } +void sout_MethodRelease (announce_method_t *m) +{ + assert (m == &sap_method); +} + /************************************************************************ * Announce handler functions (private) ************************************************************************/ @@ -196,17 +152,14 @@ announce_method_t * sout_SAPMethod (void) * \param p_this a vlc_object structure * \return the new announce handler or NULL on error */ -announce_handler_t *__announce_HandlerCreate( vlc_object_t *p_this ) +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); @@ -224,23 +177,23 @@ int announce_HandlerDestroy( announce_handler_t *p_announce ) { if( p_announce->p_sap ) { - ((vlc_object_t *)p_announce->p_sap)->b_die = VLC_TRUE; - /* Wait for the SAP thread to exit */ - vlc_thread_join( (vlc_object_t *)p_announce->p_sap ); - announce_SAPHandlerDestroy( p_announce->p_sap ); + /* Exit the SAP */ + vlc_object_release( p_announce->p_sap ); } /* Free the structure */ - vlc_object_destroy( p_announce ); + vlc_object_release( p_announce ); return VLC_SUCCESS; } /* Register an announce */ -int announce_Register( announce_handler_t *p_announce, - session_descriptor_t *p_session, - announce_method_t *p_method ) +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 ) @@ -271,8 +224,8 @@ int announce_Register( announce_handler_t *p_announce, /* Unregister an announce */ -int announce_UnRegister( announce_handler_t *p_announce, - session_descriptor_t *p_session ) +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 )