[vlc-devel] [PATCH 1/9] core: Add a services advertisement API

Rémi Denis-Courmont remi at remlab.net
Fri Sep 4 15:44:02 CEST 2020


Le keskiviikkona 2. syyskuuta 2020, 16.47.23 EEST Hugo Beauzée-Luyssen a écrit 
:
> Refs #18090
> 
> Co-authored-by: Roland Bewick <roland.bewick at gmail.com>
> ---
>  include/vlc_services_advertisement.h | 119 +++++++++++++++++
>  src/Makefile.am                      |   2 +
>  src/libvlc.c                         |   8 ++
>  src/libvlc.h                         |   2 +
>  src/libvlccore.sym                   |  11 ++
>  src/misc/services_advertisement.c    | 192 +++++++++++++++++++++++++++
>  6 files changed, 334 insertions(+)
>  create mode 100644 include/vlc_services_advertisement.h
>  create mode 100644 src/misc/services_advertisement.c
> 
> diff --git a/include/vlc_services_advertisement.h
> b/include/vlc_services_advertisement.h new file mode 100644
> index 0000000000..cf713d017a
> --- /dev/null
> +++ b/include/vlc_services_advertisement.h
> @@ -0,0 +1,119 @@
> +/**************************************************************************
> *** + * vlc_services_advertisement.h : Services Advertisement functions +
> ***************************************************************************
> ** + * Copyright (C) 1999-2019 VLC authors and VideoLAN
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU Lesser General Public License as published by
> + * the Free Software Foundation; either version 2.1 of the License, or + *
> (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public License
> + * along with this program; if not, write to the Free Software Foundation,
> + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. +
> ***************************************************************************
> **/ +
> +#ifndef VLC_SERVICES_ADVERTISEMENT_H_
> +#define VLC_SERVICES_ADVERTISEMENT_H_
> +
> +#include <vlc_common.h>
> +
> +/**
> + * \file
> + * This file lists functions and structures for service advertisement (SA)
> in vlc
> + */

Do all those Doxygen comment lay out nicely?
They look a little suspiciously long for first lines.

> +
> +# ifdef __cplusplus
> +extern "C" {
> +# endif
> +
> +/**
> + * @{
> + */
> +
> +typedef struct services_advertisement_entry_t
> services_advertisement_entry_t; +
> +/**
> + * Main service advertisement structure to build a SA module
> + */
> +typedef struct services_advertisement_t
> +{
> +    struct vlc_object_t obj;
> +
> +    module_t *          p_module;             /**< Loaded module */
> +
> +    char *psz_name;                           /**< Main name of the SA */
> +    config_chain_t *p_cfg;                    /**< Configuration for the SA
> */ +
> +    const char *description;                  /**< Human-readable name */
> +
> +    void *p_sys;                              /**< Custom private data */
> +
> +    int (*pf_announce)( struct services_advertisement_t*,
> +                        services_advertisement_entry_t* );
> +    int (*pf_conceal)( struct services_advertisement_t*,
> +                       services_advertisement_entry_t* );
> +} services_advertisement_t;

I would expect new plugin type to follow new conventions, in particular pass 
close and other callbacks via a pointer to const structure.

> +
> +/***********************************************************************
> + * Service Advertisement
> + ***********************************************************************/
> +
> +/**
> + * Stops and unloads services advertisement module if it was loaded.
> + *
> + * @param libvlc the LibVLC instance
> + */
> +void vlc_sa_Destroy( libvlc_int_t *libvlc );
> +
> +/**
> + * @brief vlc_sa_Announce Announces a new service
> + * @param libvlc The LibVLC instance
> + * @param entry The entry to announce
> + * @return VLC_SUCCESS or an error code
> + */
> +VLC_API int vlc_sa_Announce( libvlc_int_t *libvlc,
> services_advertisement_entry_t* entry );
> +
> +/**
> + * @brief vlc_sa_Conceal Conceals an announced service
> + * @param libvlc The LibVLC instance
> + * @param entry The entry to conceal
> + * @return VLC_SUCCESS or an error code
> + */
> +VLC_API int vlc_sa_Conceal( libvlc_int_t *libvlc,
> services_advertisement_entry_t* entry );
> +
> +/**
> + * @brief vlc_sa_entry_New Creates a new service advertisement entry
> + * @param name The service name
> + * @param type The service type, eg. _http._tcp (without the .local suffix)
> + * @param port The port this service runs on
> + *
> + * @return A services_advertisement_entry_t on success or NULL in case of
> error + */
> +VLC_API services_advertisement_entry_t*
> +vlc_sa_entry_New( const char* name, const char* type, uint16_t port );

This has the same problem as the existing SA plugin API:
It's totally hard-wired to a specific advertisement protocol...

And it's not even up-front about it. At least the other one does say 'SDP'.

> +
> +VLC_API services_advertisement_entry_t*
> +vlc_sa_entry_Hold( services_advertisement_entry_t *entry );
> +VLC_API void vlc_sa_entry_Release( services_advertisement_entry_t *entry );
> +
> +VLC_API const char* vlc_sa_entry_Name( services_advertisement_entry_t
> *entry ); +VLC_API const char* vlc_sa_entry_Type(
> services_advertisement_entry_t *entry ); +VLC_API uint16_t
> vlc_sa_entry_Port( services_advertisement_entry_t *entry ); +
> +VLC_API size_t vlc_sa_entry_Count_TXT( services_advertisement_entry_t*
> entry ); +VLC_API const char** vlc_sa_entry_Get_TXT(
> services_advertisement_entry_t* entry ); +VLC_API bool
> vlc_sa_entry_Add_TXT( services_advertisement_entry_t* entry, +             
>                      const char* txt );
> +
> +/** @} */
> +# ifdef __cplusplus
> +}
> +# endif
> +
> +#endif
> diff --git a/src/libvlc.c b/src/libvlc.c
> index c1dcde276d..558b146561 100644
> --- a/src/libvlc.c
> +++ b/src/libvlc.c
> @@ -63,6 +63,7 @@
>  #include <vlc_modules.h>
>  #include <vlc_media_library.h>
>  #include <vlc_thumbnailer.h>
> +#include <vlc_services_advertisement.h>
> 
>  #include "libvlc.h"
> 
> @@ -92,6 +93,7 @@ libvlc_int_t * libvlc_InternalCreate( void )
>      priv = libvlc_priv (p_libvlc);
>      vlc_mutex_init(&priv->lock);
>      priv->interfaces = NULL;
> +    priv->services_advertisements = NULL;

No thanks. I think we have enough of those singletons for backward 
compatibility.

And I don't even see the point. Owner of an announce should know to remove it. 
The existing API does not have such hack.

>      priv->main_playlist = NULL;
>      priv->p_vlm = NULL;
>      priv->media_source_provider = NULL;

-- 
Rémi Denis-Courmont
http://www.remlab.net/





More information about the vlc-devel mailing list