[vlc-devel] [PATCH 5/6] lib: media_player: rework multiple track selection API

Thomas Guillem thomas at gllm.fr
Tue Jun 16 07:16:45 CEST 2020



On Mon, Jun 15, 2020, at 23:10, Thomas Guillem wrote:
> The libvlc_media_player_update_tracklist() design was not straight-forward and
> was not easy to use on some languages. For example, vlcpp will expose a vector
> of tracks instead of a tracklist, so requiring a tracklist pointer to select
> multiple tracks adds a lot of complexity (returning a vector and keeping a
> pointer to the tracklist).
> ---
>  include/vlc/libvlc_media_player.h | 46 +++++++++++++-------------
>  lib/libvlc.sym                    |  2 +-
>  lib/media_player.c                | 55 +++++++++++++++----------------
>  test/libvlc/media_player.c        | 13 +++++---
>  4 files changed, 58 insertions(+), 58 deletions(-)
> 
> diff --git a/include/vlc/libvlc_media_player.h 
> b/include/vlc/libvlc_media_player.h
> index bd9f220ca16..e861cd5fca7 100644
> --- a/include/vlc/libvlc_media_player.h
> +++ b/include/vlc/libvlc_media_player.h
> @@ -1355,8 +1355,7 @@ libvlc_media_player_get_track_from_id( 
> libvlc_media_player_t *p_mi,
>   *
>   * \version LibVLC 4.0.0 and later.
>   *
> - * \note Use libvlc_media_player_update_tracklist() for finer track 
> selection
> - * control.
> + * \note Use libvlc_media_player_select_tracks() for multiple selection
>   *
>   * \param p_mi the media player
>   * \param type type of the selected track
> @@ -1367,6 +1366,27 @@ libvlc_media_player_select_track( 
> libvlc_media_player_t *p_mi,
>                                    libvlc_track_type_t type,
>                                    const libvlc_media_track_t *track );
>  
> +/**
> + * Select multiple tracks for one type
> + *
> + * \version LibVLC 4.0.0 and later.
> + *
> + * \note The internal track list can change between the calls of
> + * libvlc_media_player_get_tracklist() and
> + * libvlc_media_player_set_tracks(). If a track selection change but 
> the
> + * track is not present anymore, the player will just ignore it.
> + *
> + * \param p_mi the media player
> + * \param type type of the selected track
> + * \param tracks pointer to the track array
> + * \param track_count number of tracks in the track array
> + */
> +LIBVLC_API void
> +libvlc_media_player_select_tracks( libvlc_media_player_t *p_mi,
> +                                   libvlc_track_type_t type,
> +                                   const libvlc_media_track_t **tracks,
> +                                   size_t track_count );
> +
>  /**
>   * Select tracks by their string identifier
>   *
> @@ -1400,28 +1420,6 @@ libvlc_media_player_select_tracks_by_ids( 
> libvlc_media_player_t *p_mi,
>                                            libvlc_track_type_t type,
>                                            const char *psz_ids );
>  
> -/**
> - * Update the track selection for one type
> - *
> - * This function allow to select or unselect multiple tracks using the
> - * track list returned by libvlc_media_player_get_tracklist(). The 
> user can
> - * iterate on all or few libvlc_media_track_t from this list and 
> change the
> - * 'selected' boolean before calling this function.
> - *
> - * \note The internal track list can change between the calls of
> - * libvlc_media_player_get_tracklist() and
> - * libvlc_media_player_update_tracklist(). If a track selection change 
> but the
> - * track is not present anymore, the player will just ignore it.
> - *
> - * \param p_mi the media player
> - * \param type type of the selected track
> - * \param list list returned by libvlc_media_player_get_tracklist()
> - */
> -LIBVLC_API void
> -libvlc_media_player_update_tracklist( libvlc_media_player_t *p_mi,
> -                                      libvlc_track_type_t type,
> -                                      libvlc_media_tracklist_t *list );
> -
>  /**
>   * Add a slave to the current media player.
>   *
> diff --git a/lib/libvlc.sym b/lib/libvlc.sym
> index 3753ddb89be..e70d6b2e712 100644
> --- a/lib/libvlc.sym
> +++ b/lib/libvlc.sym
> @@ -187,8 +187,8 @@ libvlc_media_player_get_tracklist
>  libvlc_media_player_get_track_from_id
>  libvlc_media_player_get_selected_track
>  libvlc_media_player_select_track
> +libvlc_media_player_select_tracks
>  libvlc_media_player_select_tracks_by_ids
> -libvlc_media_player_update_tracklist
>  libvlc_media_release
>  libvlc_media_retain
>  libvlc_media_save_meta
> diff --git a/lib/media_player.c b/lib/media_player.c
> index 79550a271e2..2f390468c49 100644
> --- a/lib/media_player.c
> +++ b/lib/media_player.c
> @@ -1919,30 +1919,14 @@ 
> libvlc_media_player_select_track(libvlc_media_player_t *p_mi,
>  }
>  
>  void
> -libvlc_media_player_select_tracks_by_ids( libvlc_media_player_t *p_mi,
> -                                          libvlc_track_type_t type,
> -                                          const char *psz_ids )
> +libvlc_media_player_select_tracks(libvlc_media_player_t *p_mi,
> +                                  libvlc_track_type_t type,
> +                                  const libvlc_media_track_t **tracks,
> +                                  size_t track_count)
>  {
> -    const enum es_format_category_e cat = libvlc_track_type_to_escat(type);
> -
>      vlc_player_t *player = p_mi->player;
>  
> -    vlc_player_Lock(player);
> -
> -    vlc_player_SelectTracksByStringIds(player, cat, psz_ids);
> -
> -    vlc_player_Unlock(player);
> -}
> -
> -void
> -libvlc_media_player_update_tracklist(libvlc_media_player_t *p_mi,
> -                                     libvlc_track_type_t type,
> -                                     libvlc_media_tracklist_t *list)
> -{
> -    vlc_player_t *player = p_mi->player;
> -
> -    size_t count = libvlc_media_tracklist_count(list);
> -    vlc_es_id_t **es_id_list = vlc_alloc(count + 1, sizeof(vlc_es_id_t 
> *));
> +    vlc_es_id_t **es_id_list = vlc_alloc(track_count + 1, 
> sizeof(vlc_es_id_t *));
>      size_t es_id_idx = 0;
>  
>      if (es_id_list == NULL)
> @@ -1952,15 +1936,13 @@ 
> libvlc_media_player_update_tracklist(libvlc_media_player_t *p_mi,
>  
>      vlc_player_Lock(player);
>  
> -    for (size_t i = 0; i < count; ++i)
> +    for (size_t i = 0; i < track_count; ++i)
>      {
> -        const libvlc_media_track_t *track = 
> libvlc_media_tracklist_at(list, i);
> -        if (track->selected)
> -        {
> -            const libvlc_media_trackpriv_t *trackpriv =
> -                libvlc_media_track_to_priv(track);
> -            es_id_list[es_id_idx++] = trackpriv->es_id;
> -        }
> +        const libvlc_media_track_t *track = tracks[i];
> +        const libvlc_media_trackpriv_t *trackpriv =
> +            libvlc_media_track_to_priv(track);
> +
> +        es_id_list[es_id_idx++] = trackpriv->es_id;
>      }
>      es_id_list[es_id_idx++] = NULL;
>      vlc_player_SelectEsIdList(player, cat, es_id_list);
> @@ -1970,6 +1952,21 @@ 
> libvlc_media_player_update_tracklist(libvlc_media_player_t *p_mi,
>      free(es_id_list);
>  }
>  
> +void
> +libvlc_media_player_select_tracks_by_ids( libvlc_media_player_t *p_mi,
> +                                          libvlc_track_type_t type,
> +                                          const char *psz_ids )
> +{
> +    const enum es_format_category_e cat = libvlc_track_type_to_escat(type);
> +
> +    vlc_player_t *player = p_mi->player;
> +
> +    vlc_player_Lock(player);
> +
> +    vlc_player_SelectTracksByStringIds(player, cat, psz_ids);
> +
> +    vlc_player_Unlock(player);
> +}
>  
>  int libvlc_media_player_add_slave( libvlc_media_player_t *p_mi,
>                                     libvlc_media_slave_type_t i_type,
> diff --git a/test/libvlc/media_player.c b/test/libvlc/media_player.c
> index 088f9153d2c..8b7d3d0ae4d 100644
> --- a/test/libvlc/media_player.c
> +++ b/test/libvlc/media_player.c
> @@ -451,11 +451,16 @@ static void test_media_player_tracks(const char** 
> argv, int argc)
>      libvlc_media_tracklist_t *tracklist =
>          libvlc_media_player_get_tracklist(mp, libvlc_track_video);
>      assert(tracklist);
> -    libtrack = libvlc_media_tracklist_at(tracklist, 2);
> -    assert(libtrack && !libtrack->selected);
> -    libtrack->selected = true;
> -    libvlc_media_player_update_tracklist(mp, libvlc_track_video, 
> tracklist);
> +
> +    const libvlc_media_track_t *selecttracks[] = {
> +        libvlc_media_track_hold(libvlc_media_tracklist_at(tracklist, 
> 1)),
> +        libvlc_media_track_hold(libvlc_media_tracklist_at(tracklist, 
> 2)),
> +    };
> +    assert(selecttracks[0]->selected); /* video/1 already selected */
> +    assert(!selecttracks[1]->selected); /* select video/2 */
>      libvlc_media_tracklist_delete(tracklist);
> +
> +    libvlc_media_player_select_tracks(mp, libvlc_track_video, 
> selecttracks, 2);

Missing the 2 track_release() here. 

>      vtracks[2].toselect = true;
>  
>      /* Unselect all spu tracks */
> -- 
> 2.20.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