* configure.ac : we need to define HAVE_SLP_H

* include/announce.h & vlc_common.h: slp_session_t structure definition

* module/stream_out/standard.c & src/stream_output/announce.c :
    SLP announcing support by vlc
This commit is contained in:
Clément Stenac 2003-08-13 14:17:26 +00:00
parent dcda9be62d
commit b83deb14df
5 changed files with 182 additions and 6 deletions

View File

@ -1,5 +1,5 @@
dnl Autoconf settings for vlc
dnl $Id: configure.ac,v 1.56 2003/08/12 08:19:20 sam Exp $
dnl $Id: configure.ac,v 1.57 2003/08/13 14:17:25 zorglub Exp $
AC_INIT(vlc,0.6.2)
@ -2829,11 +2829,12 @@ then
[ --with-slp=PATH libslp headers and libraries])
if test -z "${with_slp}"
then
AC_CHECK_HEADER(slp.h, have_slp="true", have_slp="false")
AC_CHECK_HEADERS(slp.h, have_slp="true", have_slp="false")
if test "${have_slp}" = "true"
then
AX_ADD_PLUGINS([slp])
AX_ADD_LDFLAGS([slp],[-lslp])
AX_ADD_LDFLAGS([vlc],[-lslp])
fi
else
AC_MSG_CHECKING(for slp headers in ${with_slp})
@ -2843,7 +2844,9 @@ then
AC_MSG_RESULT(yes)
AX_ADD_PLUGINS([slp])
AX_ADD_LDFLAGS([slp],[-L${with_slp} -lslp])
AX_ADD_LDFLAGS([vlc],[-L${with_slp} -lslp])
AX_ADD_CPPFLAGS([slp],[-I${with_slp}])
AC_DEFINE(HAVE_SLP_H)
else
dnl No libslp could be found, sorry
AC_MSG_RESULT(no)

View File

@ -2,7 +2,7 @@
* announce.h : Session announcement
*****************************************************************************
* Copyright (C) 2002 VideoLAN
* $Id: announce.h,v 1.7 2003/07/17 14:10:08 sam Exp $
* $Id: announce.h,v 1.8 2003/08/13 14:17:26 zorglub Exp $
*
* Authors: Clément Stenac <zorglub@via.ecp.fr>
*
@ -57,6 +57,12 @@ struct sap_session_t
};
struct slp_session_t
{
char *psz_url;
char *psz_name;
};
/*****************************************************************************
* Prototypes
@ -64,3 +70,8 @@ struct sap_session_t
VLC_EXPORT( sap_session_t *, sout_SAPNew, ( sout_instance_t *,char * , char * , int , char *) );
VLC_EXPORT( void, sout_SAPSend, ( sout_instance_t *,sap_session_t *) );
VLC_EXPORT( void, sout_SAPDelete, ( sout_instance_t *,sap_session_t * ) );
#ifdef HAVE_SLP_H
VLC_EXPORT( int, sout_SLPReg, (sout_instance_t*,char*,char*) );
VLC_EXPORT( int, sout_SLPDereg, (sout_instance_t*,char*,char*) );
#endif

View File

@ -3,7 +3,7 @@
* Collection of useful common types and macros definitions
*****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN
* $Id: vlc_common.h,v 1.70 2003/08/01 00:00:12 fenrir Exp $
* $Id: vlc_common.h,v 1.71 2003/08/13 14:17:26 zorglub Exp $
*
* Authors: Samuel Hocevar <sam@via.ecp.fr>
* Vincent Seguin <seguin@via.ecp.fr>
@ -264,6 +264,8 @@ typedef struct sout_stream_t sout_stream_t;
typedef struct sout_cfg_t sout_cfg_t;
typedef struct sout_format_t sout_format_t;
typedef struct sap_session_t sap_session_t;
typedef struct slp_session_t slp_session_t;
/* Decoders */
typedef struct decoder_fifo_t decoder_fifo_t;

View File

@ -2,7 +2,7 @@
* standard.c
*****************************************************************************
* Copyright (C) 2001, 2002 VideoLAN
* $Id: standard.c,v 1.8 2003/07/07 15:50:43 gbazin Exp $
* $Id: standard.c,v 1.9 2003/08/13 14:17:26 zorglub Exp $
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
@ -58,6 +58,7 @@ vlc_module_end();
struct sout_stream_sys_t
{
sout_mux_t *p_mux;
slp_session_t *p_slp;
sap_session_t *p_sap;
};
@ -75,8 +76,10 @@ static int Open( vlc_object_t *p_this )
char *psz_url = sout_cfg_find_value( p_stream->p_cfg, "url" );
char *psz_ipv = sout_cfg_find_value( p_stream->p_cfg, "sap_ipv" );
char *psz_v6_scope = sout_cfg_find_value( p_stream->p_cfg, "sap_v6scope" );
sout_cfg_t *p_sap_cfg = sout_cfg_find( p_stream->p_cfg, "sap" );
sout_cfg_t *p_slp_cfg = sout_cfg_find( p_stream->p_cfg, "slp" );
sout_access_out_t *p_access;
sout_mux_t *p_mux;
@ -128,6 +131,33 @@ static int Open( vlc_object_t *p_this )
msg_Err( p_sout,"Unable to initialize SAP. SAP disabled");
}
/* *** Register with slp *** */
#ifdef HAVE_SLP_H
if( p_slp_cfg && ( strstr( psz_access, "udp" ) ||
strstr( psz_access , "rtp" ) ) )
{
p_sys->p_slp = NULL ;
msg_Info( p_this, "SLP Enabled");
if( sout_SLPReg( p_sout, psz_url,
p_slp_cfg->psz_value ? p_slp_cfg->psz_value : psz_url) )
{
msg_Warn( p_sout, "SLP Registering failed");
}
else
{
p_sys->p_slp = (slp_session_t*)malloc(sizeof(slp_session_t));
if(!p_sys->p_slp)
{
msg_Warn(p_sout,"Out of memory");
return -1;
}
p_sys->p_slp->psz_url= strdup(psz_url);
p_sys->p_slp->psz_name = strdup(
p_slp_cfg->psz_value ? p_slp_cfg->psz_value : psz_url);
}
}
#endif
/* XXX beurk */
p_sout->i_preheader = __MAX( p_sout->i_preheader, p_mux->i_preheader );
@ -155,6 +185,17 @@ static void Close( vlc_object_t * p_this )
if( p_sys->p_sap )
sout_SAPDelete( (sout_instance_t *)p_this , p_sys->p_sap );
#ifdef HAVE_SLP_H
if( p_sys->p_slp )
{
sout_SLPDereg( (sout_instance_t *)p_this,
p_sys->p_slp->psz_url,
p_sys->p_slp->psz_name);
free( p_sys->p_slp);
}
#endif
sout_MuxDelete( p_sys->p_mux );
sout_AccessOutDelete( p_access );

View File

@ -46,6 +46,10 @@
# include <sys/socket.h>
#endif
#ifdef HAVE_SLP_H
# include <slp.h>
#endif
#include "announce.h"
#include "network.h"
@ -391,3 +395,118 @@ void sout_SAPSend( sout_instance_t *p_sout, sap_session_t * p_sap )
free( psz_head );
}
/*****************************************************************************
* sout_SLPBuildName: Builds a service name according to SLP standard
*****************************************************************************/
char * sout_SLPBuildName(char *psz_url,char *psz_name)
{
char *psz_service;
unsigned int i_size;
/* name to build is: service:$(name).videolan://$(url) */
i_size = 8 + strlen(psz_name) + 12 + strlen(psz_url) + 1;
psz_service=(char *)malloc(i_size * sizeof(char));
snprintf( psz_service , i_size,
"service:%s.videolan://%s",
psz_name,psz_url);
psz_service[i_size]='\0'; /* Just to make sure */
return psz_service;
}
/*****************************************************************************
* sout_SLPReport: Reporting function. Unused at the moment but needed
*****************************************************************************/
#ifdef HAVE_SLP_H
void sout_SLPReport(SLPHandle slp_handle,SLPError slp_error,void* cookie)
{
}
#endif
/*****************************************************************************
* sout_SLPReg: Registers the program with SLP
*****************************************************************************/
int sout_SLPReg( sout_instance_t *p_sout, char * psz_url,
char * psz_name)
{
#ifdef HAVE_SLP_H
SLPHandle slp_handle;
SLPError slp_res;
char *psz_service= sout_SLPBuildName(psz_url,psz_name);
if( SLPOpen( NULL, SLP_FALSE, &slp_handle ) != SLP_OK)
{
msg_Warn(p_sout,"Unable to initialize SLP");
return -1;
}
msg_Info(p_sout , "Registering %s (name: %s) in SLP",
psz_service , psz_name);
slp_res = SLPReg ( slp_handle,
psz_service,
SLP_LIFETIME_MAXIMUM,
NULL,
psz_name,
SLP_TRUE,
sout_SLPReport,
NULL );
if( slp_res != SLP_OK )
{
msg_Warn(p_sout,"Error while registering service: %i", slp_res );
return -1;
}
return 0;
#else /* This function should never be called if this is false */
return -1
#endif
}
/*****************************************************************************
* sout_SLDePReg: Unregisters the program from SLP
*****************************************************************************/
int sout_SLPDereg( sout_instance_t *p_sout, char * psz_url,
char * psz_name)
{
#ifdef HAVE_SLP_H
SLPHandle slp_handle;
SLPError slp_res;
char *psz_service= sout_SLPBuildName(psz_url,psz_name);
if( SLPOpen( NULL, SLP_FALSE, &slp_handle ) != SLP_OK)
{
msg_Warn(p_sout,"Unable to initialize SLP");
return -1;
}
msg_Info(p_sout , "Unregistering %s from SLP",
psz_service);
slp_res = SLPDereg ( slp_handle,
psz_service,
sout_SLPReport,
NULL );
if( slp_res != SLP_OK )
{
msg_Warn(p_sout,"Error while registering service: %i", slp_res );
return -1;
}
return 0;
#else /* This function should never be called if this is false */
return -1
#endif
}