[vlc-devel] [PATCH v2 1/3] lib: Add libvlc_picture API

Thomas Guillem thomas at gllm.fr
Tue Oct 16 10:42:21 CEST 2018



On Mon, Oct 15, 2018, at 16:32, Hugo Beauzée-Luyssen wrote:
> This API is mostly meant to simplify thumbnailing management, by
> exposing a simple picture type, that can be probed for its buffer or
> saved to a file
> ---
>  include/vlc/libvlc_picture.h | 127 ++++++++++++++++++++++++++++++++
>  lib/Makefile.am              |   5 +-
>  lib/libvlc.sym               |   9 +++
>  lib/picture.c                | 137 +++++++++++++++++++++++++++++++++++
>  lib/picture_internal.h       |  46 ++++++++++++
>  5 files changed, 323 insertions(+), 1 deletion(-)
>  create mode 100644 include/vlc/libvlc_picture.h
>  create mode 100644 lib/picture.c
>  create mode 100644 lib/picture_internal.h
> 
> diff --git a/include/vlc/libvlc_picture.h b/include/vlc/libvlc_picture.h
> new file mode 100644
> index 0000000000..a421d30a92
> --- /dev/null
> +++ b/include/vlc/libvlc_picture.h
> @@ -0,0 +1,127 @@
> +/
> *****************************************************************************
> + * libvlc_picture.h:  libvlc external API
> + 
> *****************************************************************************
> + * Copyright (C) 1998-2018 VLC authors and VideoLAN
> + *
> + * Authors: Hugo Beauzée-Luyssen <hugo at beauzee.fr>
> + *
> + * 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_LIBVLC_PICTURE_H
> +#define VLC_LIBVLC_PICTURE_H 1
> +
> +# ifdef __cplusplus
> +extern "C" {
> +# endif
> +
> +typedef struct libvlc_picture_t libvlc_picture_t;
> +
> +typedef enum libvlc_picture_type_t
> +{
> +    libvlc_picture_Argb,
> +    libvlc_picture_Png,
> +    libvlc_picture_Jpg,
> +} libvlc_picture_type_t;
> +
> +/**
> + * Increment the reference count of this picture.
> + *
> + * \see libvlc_picture_release()
> + * \param p_pic A picture object
> + */
> +LIBVLC_API void
> +libvlc_picture_retain( libvlc_picture_t* p_pic );
> +
> +/**
> + * Decrement the reference count of this picture.
> + * When the reference count reaches 0, the picture will be released.
> + * The picture must not be accessed after calling this function.
> + *
> + * \see libvlc_picture_retain
> + * \param p_pic A picture object
> + */
> +LIBVLC_API void
> +libvlc_picture_release( libvlc_picture_t* p_pic );
> +
> +/**
> + * Saves this picture to a file. The image format is the same as the 
> one
> + * returned by \link libvlc_picture_type \endlink
> + *
> + * \param p_pic A picture object
> + * \param psz_path The path to the generated file
> + * \return 0 in case of success, -1 otherwise
> + */
> +LIBVLC_API int
> +libvlc_picture_save( const libvlc_picture_t* p_pic, const char* 
> psz_path );

As discussed with the player API, we prefer to never use const for opaque pointers in C since it depends of the underlying implementation (you'll have to remove the const if you use a lock in the futurue for example).

> +
> +/**
> + * Returns the image internal buffer, including potential padding.
> + * The libvlc_picture_t owns the returned buffer, which must not be 
> modified nor
> + * freed.
> + *
> + * \param p_pic A picture object
> + * \param p_size A pointer to a size_t that will hold the size of the 
> buffer [required]
> + * \return A pointer to the internal buffer.
> + */
> +LIBVLC_API const unsigned char*
> +libvlc_picture_get_buffer( const libvlc_picture_t* p_pic, size_t 
> *p_size );
> +
> +/**
> + * Returns the picture type
> + *
> + * \param p_pic A picture object
> + * \see libvlc_picture_type_t
> + */
> +LIBVLC_API libvlc_picture_type_t
> +libvlc_picture_type( const libvlc_picture_t* p_pic );
> +
> +/**
> + * Returns the image stride, ie. the number of bytes per line.
> + * This can only be called on images of type libvlc_Argb
> + *
> + * \param p_pic A picture object
> + */
> +LIBVLC_API unsigned int
> +libvlc_picture_get_stride( const libvlc_picture_t* p_pic );
> +
> +/**
> + * Returns the width of the image in pixels
> + *
> + * \param p_pic A picture object
> + */
> +LIBVLC_API unsigned int
> +libvlc_picture_get_width( const libvlc_picture_t* p_pic );
> +
> +/**
> + * Returns the height of the image in pixels
> + *
> + * \param p_pic A picture object
> + */
> +LIBVLC_API unsigned int
> +libvlc_picture_get_height( const libvlc_picture_t* p_pic );
> +
> +/**
> + * Returns the time at which this picture was generated, in 
> milliseconds
> + * \param p_pic A picture object
> + */
> +LIBVLC_API libvlc_time_t
> +libvlc_picture_get_time( const libvlc_picture_t* p_pic );
> +
> +# ifdef __cplusplus
> +}
> +# endif
> +
> +#endif // VLC_LIBVLC_PICTURE_H
> diff --git a/lib/Makefile.am b/lib/Makefile.am
> index b605cd6549..8dbbaf9d2a 100644
> --- a/lib/Makefile.am
> +++ b/lib/Makefile.am
> @@ -19,6 +19,7 @@ pkginclude_HEADERS = \
>  	../include/vlc/libvlc_media_list_player.h \
>  	../include/vlc/libvlc_media_player.h \
>  	../include/vlc/libvlc_renderer_discoverer.h \
> +	../include/vlc/libvlc_picture.h \
>  	../include/vlc/vlc.h
>  
>  nodist_pkginclude_HEADERS = ../include/vlc/libvlc_version.h
> @@ -34,6 +35,7 @@ libvlc_la_SOURCES = \
>  	media_internal.h \
>  	media_list_internal.h \
>  	media_player_internal.h \
> +	picture_internal.h \
>  	renderer_discoverer_internal.h \
>  	core.c \
>  	dialog.c \
> @@ -50,7 +52,8 @@ libvlc_la_SOURCES = \
>  	media_list_path.h \
>  	media_list_player.c \
>  	media_library.c \
> -	media_discoverer.c
> +	media_discoverer.c \
> +	picture.c
>  EXTRA_DIST = libvlc.pc.in libvlc.sym ../include/vlc/libvlc_version.h.in
>  
>  libvlc_la_LIBADD = ../src/libvlccore.la ../compat/libcompat.la $(LIBM)
> diff --git a/lib/libvlc.sym b/lib/libvlc.sym
> index 9a896ce7b2..67cd40b69c 100644
> --- a/lib/libvlc.sym
> +++ b/lib/libvlc.sym
> @@ -262,3 +262,12 @@ libvlc_set_exit_handler
>  libvlc_audio_filter_list_get
>  libvlc_video_filter_list_get
>  libvlc_module_description_list_release
> +libvlc_picture_retain
> +libvlc_picture_release
> +libvlc_picture_save
> +libvlc_picture_get_buffer
> +libvlc_picture_type
> +libvlc_picture_get_stride
> +libvlc_picture_get_width
> +libvlc_picture_get_height
> +libvlc_picture_get_time
> diff --git a/lib/picture.c b/lib/picture.c
> new file mode 100644
> index 0000000000..e8d7d4fd4a
> --- /dev/null
> +++ b/lib/picture.c
> @@ -0,0 +1,137 @@
> +/
> *****************************************************************************
> + * picture.c:  libvlc API picture management
> + 
> *****************************************************************************
> + * Copyright (C) 1998-2018 VLC authors and VideoLAN
> + *
> + * Authors: Hugo Beauzée-Luyssen <hugo at beauzee.fr>
> + *
> + * 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.
> + 
> *****************************************************************************/
> +
> +#ifdef HAVE_CONFIG_H
> +# include "config.h"
> +#endif
> +
> +#include <vlc/libvlc.h>
> +#include <vlc/libvlc_picture.h>
> +
> +#include <vlc_atomic.h>
> +#include <vlc_picture.h>
> +#include <vlc_block.h>
> +#include <vlc_fs.h>
> +
> +#include "picture_internal.h"
> +
> +struct libvlc_picture_t
> +{
> +    vlc_atomic_rc_t rc;
> +    libvlc_picture_type_t i_type;
> +    block_t* p_converted;
> +    video_format_t fmt;
> +    libvlc_time_t i_time;
> +};
> +
> +libvlc_picture_t* libvlc_picture_new( vlc_object_t* p_obj, picture_t* 
> p_input,

But here, I think you can put a const for picture_t ;)

> +                                      libvlc_picture_type_t i_type,
> +                                      unsigned int i_width, unsigned 
> int i_height )
> +{
> +    libvlc_picture_t *p_pic = malloc( sizeof( *p_pic ) );
> +    if ( unlikely( p_pic == NULL ) )
> +        return NULL;
> +    vlc_atomic_rc_init( &p_pic->rc );
> +    p_pic->i_type = i_type;
> +    p_pic->i_time = MS_FROM_VLC_TICK( p_input->date );
> +    vlc_fourcc_t format;
> +    switch ( i_type )
> +    {
> +        case libvlc_picture_Argb:
> +            format = VLC_CODEC_ARGB;
> +            break;
> +        case libvlc_picture_Jpg:
> +            format = VLC_CODEC_JPEG;
> +            break;
> +        case libvlc_picture_Png:
> +            format = VLC_CODEC_PNG;
> +            break;
default case ? assert/return NULL ?
> +    }
> +    if ( picture_Export( p_obj, &p_pic->p_converted, &p_pic->fmt,
> +                         p_input, format, i_width, i_height ) != 
> VLC_SUCCESS )
> +    {
> +        free( p_pic );
> +        return NULL;
> +    }
> +
> +    return p_pic;
> +}
> +
> +void libvlc_picture_retain( libvlc_picture_t* p_pic )
> +{
> +    vlc_atomic_rc_inc( &p_pic->rc );
> +}
> +
> +void libvlc_picture_release( libvlc_picture_t* p_pic )
> +{
> +    if ( vlc_atomic_rc_dec( &p_pic->rc ) == false )
> +        return;
> +    video_format_Clean( &p_pic->fmt );
> +    if ( p_pic->p_converted )
> +        block_Release( p_pic->p_converted );
> +    free( p_pic );
> +}
> +
> +int libvlc_picture_save( const libvlc_picture_t* p_pic, const char* 
> psz_path )
> +{
> +    FILE* p_file = vlc_fopen( psz_path, "wb" );
> +    if ( !p_file )
> +        return -1;
> +    size_t res = fwrite( p_pic->p_converted->p_buffer,
> +                         p_pic->p_converted->i_buffer, 1, p_file );
> +    fclose( p_file );
> +    return res == 1 ? 0 : -1;
> +}
> +
> +const unsigned char* libvlc_picture_get_buffer( const libvlc_picture_t* 
> p_pic,
> +                                                size_t *p_size )
> +{
> +    assert( p_size != NULL );
> +    *p_size = p_pic->p_converted->i_buffer;
> +    return p_pic->p_converted->p_buffer;
> +}
> +
> +libvlc_picture_type_t libvlc_picture_type( const libvlc_picture_t* 
> p_pic )
> +{
> +    return p_pic->i_type;
> +}
> +
> +unsigned int libvlc_picture_get_stride( const libvlc_picture_t *p_pic )
> +{
> +    assert( p_pic->i_type == libvlc_picture_Argb );
> +    return p_pic->fmt.i_width * p_pic->fmt.i_bits_per_pixel / 8;
> +}
> +
> +unsigned int libvlc_picture_get_width( const libvlc_picture_t* p_pic )
> +{
> +    return p_pic->fmt.i_visible_width;
> +}
> +
> +unsigned int libvlc_picture_get_height( const libvlc_picture_t* p_pic )
> +{
> +    return p_pic->fmt.i_visible_height;
> +}
> +
> +libvlc_time_t libvlc_picture_get_time( const libvlc_picture_t* p_pic )
> +{
> +    return p_pic->i_time;
> +}
> diff --git a/lib/picture_internal.h b/lib/picture_internal.h
> new file mode 100644
> index 0000000000..3ad68b46f5
> --- /dev/null
> +++ b/lib/picture_internal.h
> @@ -0,0 +1,46 @@
> +/
> *****************************************************************************
> + * picture_internal.h:  libvlc API picture management
> + 
> *****************************************************************************
> + * Copyright (C) 1998-2018 VLC authors and VideoLAN
> + *
> + * Authors: Hugo Beauzée-Luyssen <hugo at beauzee.fr>
> + *
> + * 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 PICTURE_INTERNAL_H
> +#define PICTURE_INTERNAL_H
> +
> +#include <vlc_picture.h>
> +
> +
> +/**
> + * \brief libvlc_picture_new Wraps a libvlccore's picture_t to a 
> libvlc_picture_t
> + * \param p_obj A vlc object
> + * \param p_input Input picture
> + * \param i_type Desired converted picture type
> + * \param i_width Converted picture width
> + * \param i_height Converted picture height
> + * \return An opaque libvlc_picture_t
> + *
> + * The picture refcount is left untouched by this function, but is 
> converted to
> + * the required format and stored as a block_t
> + * The returned picture must be released through libvlc_picture_release
> + */
> +libvlc_picture_t* libvlc_picture_new( vlc_object_t* p_obj, picture_t* 
> p_pic,
> +                                      libvlc_picture_type_t i_format,
> +                                      unsigned int i_width, unsigned 
> int i_height );
> +
> +#endif // PICTURE_INTERNAL_H
> -- 
> 2.19.1
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list