[vlc-devel] [PATCH] libvlc: expand media player API to reveal full information about titles and chapters

Alexey Sokolov alexey at asokolov.org
Sun Jan 25 10:27:20 CET 2015


Caller needs to free() one of returned psz_name, but not the other one?

23.01.2015 12:46, Felix Paul Kühne пишет:
> ---
>  include/vlc/libvlc_media_player.h | 45 +++++++++++++++++++++++
>  lib/libvlc.sym                    |  2 ++
>  lib/media_player.c                | 76 +++++++++++++++++++++++++++++++++++++++
>  3 files changed, 123 insertions(+)
>
> diff --git a/include/vlc/libvlc_media_player.h b/include/vlc/libvlc_media_player.h
> index c55e85d..d50ea9d 100644
> --- a/include/vlc/libvlc_media_player.h
> +++ b/include/vlc/libvlc_media_player.h
> @@ -60,6 +60,31 @@ typedef struct libvlc_track_description_t
>  
>  } libvlc_track_description_t;
>  
> +
> +/**
> + * Description for chapters.
> + * It contains information about time and byte off set as well as
> + * name (description string).
> + */
> +typedef struct libvlc_chapter_description_t
> +{
> +    int64_t i_byte_offset;
> +    int64_t i_time_offset;
> +    char *psz_name;
> +} libvlc_chapter_description_t;
> +
> +/**
> + * Description for titles. It contains id, name (description string), duration and size,
> + * and information if it is a menu.
> + */
> +typedef struct libvlc_title_description_t
> +{
> +    bool b_menu;
> +    char *psz_name;
> +    int64_t i_duration;
> +    int64_t i_size;
> +} libvlc_title_description_t;
> +
>  /**
>   * Description for audio output. It contains
>   * name, description and pointer to next record.
> @@ -1129,6 +1154,16 @@ LIBVLC_API libvlc_track_description_t *
>          libvlc_video_get_title_description( libvlc_media_player_t *p_mi );
>  
>  /**
> + * Get the full description of a title
> + *
> + * \param p_mi the media player
> + * \return structure containing the full description of the respective title
> + * \version LibVLC 3.0.0 and later.
> + */
> +LIBVLC_API libvlc_title_description_t *
> +    libvlc_media_player_get_full_title_description( libvlc_media_player_t *p_mi, int i_title );
> +
> +/**
>   * Get the description of available chapters for specific title.
>   *
>   * \param p_mi the media player
> @@ -1139,6 +1174,16 @@ LIBVLC_API libvlc_track_description_t *
>          libvlc_video_get_chapter_description( libvlc_media_player_t *p_mi, int i_title );
>  
>  /**
> + * Get the full description of a chapter
> + *
> + * \param p_mi the media player
> + * \return structure containing the full description of the respective chapter
> + * \version LibVLC 3.0.0 and later.
> + */
> +LIBVLC_API libvlc_chapter_description_t *
> +    libvlc_media_player_get_full_chapter_description( libvlc_media_player_t *p_mi, int i_title, int i_chapter );
> +
> +/**
>   * Get current crop filter geometry.
>   *
>   * \param p_mi the media player
> diff --git a/lib/libvlc.sym b/lib/libvlc.sym
> index 7810ed7..4be9f47 100644
> --- a/lib/libvlc.sym
> +++ b/lib/libvlc.sym
> @@ -141,6 +141,8 @@ libvlc_media_player_get_chapter
>  libvlc_media_player_get_chapter_count
>  libvlc_media_player_get_chapter_count_for_title
>  libvlc_media_player_get_fps
> +libvlc_media_player_get_full_chapter_description
> +libvlc_media_player_get_full_title_description
>  libvlc_media_player_get_hwnd
>  libvlc_media_player_get_length
>  libvlc_media_player_get_media
> diff --git a/lib/media_player.c b/lib/media_player.c
> index 3ca1e10..fd10452 100644
> --- a/lib/media_player.c
> +++ b/lib/media_player.c
> @@ -1223,6 +1223,82 @@ int libvlc_media_player_get_title_count( libvlc_media_player_t *p_mi )
>      return i_ret == VLC_SUCCESS ? val.i_int : -1;
>  }
>  
> +libvlc_title_description_t *
> +libvlc_media_player_get_full_title_description( libvlc_media_player_t *p_mi, int i_title )
> +{
> +    input_thread_t *p_input = libvlc_get_input_thread( p_mi );
> +    libvlc_title_description_t *p_title_description = NULL;
> +
> +    if (!p_input)
> +        return NULL;
> +
> +    input_title_t *p_title = NULL;
> +
> +    if (input_Control(p_input, INPUT_GET_TITLE_INFO, &p_title, &i_title) != VLC_SUCCESS) {
> +        vlc_object_release(p_input);
> +        return NULL;
> +    }
> +    vlc_object_release(p_input);
> +
> +    if (!p_title)
> +        return NULL;
> +
> +    p_title_description = (libvlc_title_description_t *) malloc(sizeof(libvlc_title_description_t *));
> +    if (!p_title_description) {
> +        libvlc_printerr("Not enough memory");
> +        return NULL;
> +    }
> +
> +    p_title_description->b_menu = p_title->b_menu;
> +    if (p_title->psz_name)
> +        p_title_description->psz_name = strdup(p_title->psz_name);
> +    else
> +        p_title_description->psz_name = NULL;
> +    p_title_description->i_duration = p_title->i_length;
> +    p_title_description->i_size = p_title->i_size;
> +
> +    return p_title_description;
> +}
> +
> +libvlc_chapter_description_t *
> +libvlc_media_player_get_full_chapter_description( libvlc_media_player_t *p_mi, int i_title, int i_chapter )
> +{
> +    input_thread_t *p_input = libvlc_get_input_thread( p_mi );
> +    libvlc_chapter_description_t *p_chapter_description = NULL;
> +
> +    if (!p_input)
> +        return NULL;
> +
> +    input_title_t *p_title = NULL;
> +
> +    if (input_Control(p_input, INPUT_GET_TITLE_INFO, &p_title, &i_title) != VLC_SUCCESS) {
> +        vlc_object_release(p_input);
> +        return NULL;
> +    }
> +    vlc_object_release(p_input);
> +
> +    if (!p_title)
> +        return NULL;
> +
> +    if (i_chapter >= p_title->i_seekpoint)
> +        return NULL;
> +
> +    p_chapter_description = (libvlc_chapter_description_t *) malloc(sizeof(libvlc_chapter_description_t *));
> +    if (!p_chapter_description) {
> +        libvlc_printerr("Not enough memory");
> +        return NULL;
> +    }
> +
> +    p_chapter_description->i_byte_offset = p_title->seekpoint[i_chapter]->i_byte_offset;
> +    p_chapter_description->i_time_offset = p_title->seekpoint[i_chapter]->i_time_offset;
> +    if (p_title->seekpoint[i_chapter]->psz_name)
> +        p_chapter_description->psz_name = p_title->seekpoint[i_chapter]->psz_name;
> +    else
> +        p_chapter_description->psz_name = NULL;
> +
> +    return p_chapter_description;
> +}
> +
>  void libvlc_media_player_next_chapter( libvlc_media_player_t *p_mi )
>  {
>      input_thread_t *p_input_thread;




More information about the vlc-devel mailing list