]> git.sesse.net Git - vlc/blobdiff - src/stream_output/announce.c
Make access_out independent of sout instance
[vlc] / src / stream_output / announce.c
index 88052e712befe113ba9570db00d1e857a9fd16ee..7dedc1e0508c412716c6c08213d29f5bd8243f11 100644 (file)
 /*****************************************************************************
  * Preamble
  *****************************************************************************/
-#include <stdlib.h>                                                /* free() */
-#include <stdio.h>                                              /* sprintf() */
-#include <string.h>                                            /* strerror() */
-#include <assert.h>
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
 
-#include <vlc/vlc.h>
+#include <vlc_common.h>
 #include <vlc_sout.h>
-#include <vlc_network.h> /* FIXME: fix RegisterSDP() and remove this */
 #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;
@@ -42,56 +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 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( 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*)
@@ -101,7 +71,7 @@ sout_AnnounceRegisterSDP( sout_instance_t *p_sout, const char *cfgpref,
     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" );
@@ -110,17 +80,18 @@ sout_AnnounceRegisterSDP( sout_instance_t *p_sout, const char *cfgpref,
         vlc_object_yield( p_announce );
     }
 
-    p_session = sout_AnnounceSessionCreate(VLC_OBJECT (p_sout), cfgpref);
+    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_uri, 0, NULL, &res) == 0)
+    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);
-        freeaddrinfo (res);
+        vlc_freeaddrinfo (res);
     }
 
     announce_Register( p_announce, p_session, p_method );
@@ -150,69 +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 (vlc_object_t *obj,
-                                                   const char *cfgpref)
-{
-    size_t cfglen = strlen (cfgpref);
-    if (cfglen > 100)
-        return NULL;
-
-    char varname[cfglen + sizeof ("description")], *subvar = varname + cfglen;
-    strcpy (varname, cfgpref);
-
-    session_descriptor_t *p_session = calloc (1, sizeof (*p_session));
-    if (p_session == NULL)
-        return NULL;
-
-    strcpy (subvar, "name");
-    p_session->psz_name = var_GetNonEmptyString (obj, varname);
-    strcpy (subvar, "group");
-    p_session->psz_group = var_GetNonEmptyString (obj, varname);
-
-    strcpy (subvar, "description");
-    p_session->description = var_GetNonEmptyString (obj, varname);
-    strcpy (subvar, "url");
-    p_session->url = var_GetNonEmptyString (obj, varname);
-    strcpy (subvar, "email");
-    p_session->email = var_GetNonEmptyString (obj, varname);
-    strcpy (subvar, "phone");
-    p_session->phone = var_GetNonEmptyString (obj, varname);
-
-    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_sdp);
-        free (p_session->description);
-        free (p_session->url);
-        free (p_session->email);
-        free (p_session->phone);
-        free( p_session );
-    }
-}
-
 /**
  * \return the SAP announce method
  */
@@ -236,17 +152,14 @@ void sout_MethodRelease (announce_method_t *m)
  * \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);
@@ -264,22 +177,20 @@ 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;
@@ -313,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 )