[vlc-devel] [PATCH 5/5] libvlc: add a function to release strings allocated by libvlc functions
Steve Lhomme
robux4 at ycbcr.xyz
Fri May 24 14:20:14 CEST 2019
On 2019-05-24 14:01, Rémi Denis-Courmont wrote:
> Hi,
>
> If you are going to change how plain strings are returned, I think first
> should be revisited whether the string should be a copy at all.
>
> It looks to me that, in most case, we should just return a 'const char
> *' whose lifetime is the same as the input object, or until the object
> is modified. Thus we eliminate error cases *and* heap problems.
It's a possibility. I was also thing of returning const char* (that
libvlc_free_string would accept and unconst). Because we certainly don't
want the host app to write in memory we allocated.
The problem I see with tying the strings to the objects is that we would
need to keep tracks of the calls and when the value change, or
accumulate them which might grow a lot over time before the object is
released. For example get_meta() is probably called a lot, often to read
the same meta field again.
It's a bit of work but manageable.
> And the marquee getter can probably be removed completely. It's rather
> schizophrenic to query what is the marquee text that you just set.
> Probably never used in real life.
>
> Le 24 mai 2019 12:47:31 GMT+03:00, Steve Lhomme <robux4 at ycbcr.xyz> a écrit :
>
> ------------------------------------------------------------------------
> include/vlc/libvlc.h | 8 ++++++++
> include/vlc/libvlc_media.h | 2 ++
> include/vlc/libvlc_media_player.h | 7 +++++--
> lib/core.c | 5 +++++
> lib/libvlc.sym | 1 +
> 5 files changed, 21 insertions(+), 2 deletions(-)
>
> diff --git a/include/vlc/libvlc.h b/include/vlc/libvlc.h
> index 0ec0045c96..789b881f55 100644
> --- a/include/vlc/libvlc.h
> +++ b/include/vlc/libvlc.h
> @@ -277,6 +277,14 @@ LIBVLC_API const char * libvlc_get_compiler(void);
> */
> LIBVLC_API const char * libvlc_get_changeset(void);
>
> +/**
> + * Frees a string returned by a LibVLC function.
> + *
> + * \param ptr the string pointer
> + * \version LibVLC 4.0.0 and later
> + */
> +LIBVLC_API void libvlc_free_string( char *ptr );
> +
> /** \defgroup libvlc_event LibVLC asynchronous events
> * LibVLC emits asynchronous events.
> *
> diff --git a/include/vlc/libvlc_media.h b/include/vlc/libvlc_media.h
> index cd335a6e08..c72e026106 100644
> --- a/include/vlc/libvlc_media.h
> +++ b/include/vlc/libvlc_media.h
> @@ -548,6 +548,7 @@ LIBVLC_API void libvlc_media_release( libvlc_media_t *p_md );
> *
> * \param p_md a media descriptor object
> * \return string with mrl of media descriptor object
> + * (it result must be released \ref with libvlc_free_string()).
> */
> LIBVLC_API char *libvlc_media_get_mrl( libvlc_media_t *p_md );
>
> @@ -572,6 +573,7 @@ LIBVLC_API libvlc_media_t *libvlc_media_duplicate( libvlc_media_t *p_md );
> * \param p_md the media descriptor
> * \param e_meta the meta to read
> * \return the media's meta
> + * (it result must be released \ref with libvlc_free_string()).
> */
> LIBVLC_API char *libvlc_media_get_meta( libvlc_media_t *p_md,
> libvlc_meta_t e_meta );
> diff --git a/include/vlc/libvlc_media_player.h b/include/vlc/libvlc_media_player.h
> index f4981cecbc..5f46cb3048 100644
> --- a/include/vlc/libvlc_media_player.h
> +++ b/include/vlc/libvlc_media_player.h
> @@ -1491,7 +1491,7 @@ LIBVLC_API void libvlc_video_set_scale( libvlc_media_player_t *p_mi, float f_fac
> *
> * \param p_mi the media player
> * \return the video aspect ratio or NULL if unspecified
> - * (the result must be released with free()).
> + * (it result must be released \ref with libvlc_free_string()).
> */
> LIBVLC_API char *libvlc_video_get_aspect_ratio( libvlc_media_player_t *p_mi );
>
> @@ -1661,6 +1661,7 @@ void libvlc_chapter_descriptions_release( libvlc_chapter_description_t **p_chapt
> *
> * \param p_mi the media player
> * \return the crop filter geometry or NULL if unset
> + * (it result must be released \ref with libvlc_free_string()).
> */
> LIBVLC_API char *libvlc_video_get_crop_geometry( libvlc_media_player_t *p_mi );
>
> @@ -1776,6 +1777,8 @@ LIBVLC_API int libvlc_video_get_marquee_int( libvlc_media_player_t *p_mi,
> *
> * \param p_mi libvlc media player
> * \param option marq option to get \see libvlc_video_marquee_option_t
> + * \return the string corresponding to the marquee option
> + * (it result must be released with libvlc_free_string()).
> */
> LIBVLC_API char *libvlc_video_get_marquee_string( libvlc_media_player_t *p_mi,
> unsigned option );
> @@ -2086,7 +2089,7 @@ LIBVLC_API void libvlc_audio_output_device_set( libvlc_media_player_t *mp,
> * \param mp media player
> * \return the current audio output device identifier
> * NULL if no device is selected or in case of error
> - * (the result must be released with free()).
> + * (the result must be released \ref with libvlc_free_string()).
> * \version LibVLC 3.0.0 or later.
> */
> LIBVLC_API char *libvlc_audio_output_device_get( libvlc_media_player_t *mp );
> diff --git a/lib/core.c b/lib/core.c
> index 6edf14b154..f5af61e459 100644
> --- a/lib/core.c
> +++ b/lib/core.c
> @@ -151,6 +151,11 @@ const char * libvlc_get_changeset(void)
> return psz_vlc_changeset;
> }
>
> +void libvlc_free_string( void *ptr )
> +{
> + free( ptr );
> +}
> +
> static libvlc_module_description_t *module_description_list_get(
> libvlc_instance_t *p_instance, const char *capability )
> {
> diff --git a/lib/libvlc.sym b/lib/libvlc.sym
> index 436681a4c3..15c777b00a 100644
> --- a/lib/libvlc.sym
> +++ b/lib/libvlc.sym
> @@ -49,6 +49,7 @@ libvlc_dialog_set_callbacks
> libvlc_dialog_set_context
> libvlc_event_attach
> libvlc_event_detach
> +libvlc_free_string
> libvlc_get_changeset
> libvlc_get_compiler
> libvlc_get_fullscreen
>
>
> --
> Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser
> ma brièveté.
>
> _______________________________________________
> 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