]> git.sesse.net Git - vlc/blobdiff - src/stream_output/announce.c
Use var_Inherit* instead of var_CreateGet*.
[vlc] / src / stream_output / announce.c
index 90bd8142fc678220d8ac037592f259ce9679990a..37e3300b7ca981086681fff8cd9870200019de2b 100644 (file)
@@ -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 <zorglub@videolan.org>
+ * 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
  *
  * 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 <stdlib.h>                                                /* free() */
-#include <stdio.h>                                              /* sprintf() */
-#include <string.h>                                            /* strerror() */
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
 
-#include <vlc/vlc.h>
-#include <vlc/sout.h>
+#include <vlc_common.h>
+#include <vlc_sout.h>
+#include "stream_output.h"
+#include "libvlc.h"
 
-/*****************************************************************************
- * Local prototypes
- *****************************************************************************/
-#define FREE( p ) if( p ) { free( p ); (p) = NULL; }
+#include <assert.h>
 
+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" );
-    }
+    libvlc_priv (p_this->p_libvlc)->p_sap = NULL;
+}
 
-    i_ret = announce_Register( p_announce, p_session, p_method );
-    vlc_object_release( p_announce );
+#undef sout_AnnounceRegisterSDP
 
-    return i_ret;
-}
+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 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( 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 );
-    p_session->psz_uri = strdup( psz_uri );
-    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);
+        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)
+    vlc_mutex_lock (&sap_mutex);
+    sap_handler_t *p_sap = libvlc_priv (obj->p_libvlc)->p_sap;
+    if (p_sap == NULL)
     {
-        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;
+        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);
 
-    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 )
-    {
-        FREE( p_session->psz_name );
-        FREE( p_session->psz_group );
-        FREE( p_session->psz_uri );
-        FREE( p_session->psz_sdp );
-        free( p_session );
-    }
-}
-
-/**
- * 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_mutex_lock (&sap_mutex);
+    vlc_object_release ((vlc_object_t *)p_sap);
+    vlc_mutex_unlock (&sap_mutex);
 
+    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);
 }