[vlc-devel] [PATCH 4/4] player: associate tracks with vouts

Thomas Guillem thomas at gllm.fr
Wed May 29 16:24:48 CEST 2019


On Wed, May 29, 2019, at 16:19, Rémi Denis-Courmont wrote:
> Le keskiviikkona 29. toukokuuta 2019, 16.32.58 EEST Thomas Guillem a écrit :
> > This will allow API users to clearly identify vouts.
> > ---
> >  include/vlc_player.h                              |  4 +++-
> >  lib/media_player.c                                |  4 +++-
> >  modules/control/gestures.c                        |  9 ++++++---
> >  modules/control/hotkeys.c                         |  2 ++
> >  modules/gui/macosx/playlist/VLCPlayerController.m |  2 ++
> >  modules/gui/qt/components/player_controller.cpp   |  2 +-
> >  src/input/player.c                                | 13 +++++++++++--
> >  test/src/input/player.c                           | 13 ++++++++++---
> >  8 files changed, 38 insertions(+), 11 deletions(-)
> > 
> > diff --git a/include/vlc_player.h b/include/vlc_player.h
> > index 054c4abae3..17d13fee1e 100644
> > --- a/include/vlc_player.h
> > +++ b/include/vlc_player.h
> > @@ -836,10 +836,12 @@ struct vlc_player_cbs
> >       * @param player locked player instance
> >       * @param action started or stopped
> >       * @param vout vout (can't be NULL)
> > +     * @param track the track associated with this vout
> >       * @param data opaque pointer set by vlc_player_AddListener()
> >       */
> >      void (*on_vout_changed)(vlc_player_t *player,
> > -        enum vlc_player_vout_action action, vout_thread_t *vout, void
> > *data); +        enum vlc_player_vout_action action, vout_thread_t *vout,
> > +        const struct vlc_player_track *track, void *data);
> > 
> >      /**
> >       * Called when the player is corked
> > diff --git a/lib/media_player.c b/lib/media_player.c
> > index fd085c3793..45b506b43d 100644
> > --- a/lib/media_player.c
> > +++ b/lib/media_player.c
> > @@ -401,10 +401,12 @@ on_cork_changed(vlc_player_t *player, unsigned
> > cork_count, void *data)
> > 
> >  static void
> >  on_vout_changed(vlc_player_t *player, enum vlc_player_vout_action action,
> > -                vout_thread_t *vout, void *data)
> > +                vout_thread_t *vout, const struct vlc_player_track *track,
> > +                void *data)
> >  {
> >      (void) action;
> >      (void) vout;
> > +    (void) track;
> > 
> >      libvlc_media_player_t *mp = data;
> > 
> > diff --git a/modules/control/gestures.c b/modules/control/gestures.c
> > index 608747f43b..2b8b430d8a 100644
> > --- a/modules/control/gestures.c
> > +++ b/modules/control/gestures.c
> > @@ -104,7 +104,9 @@ vlc_module_end ()
> > 
> >  static void player_on_vout_changed(vlc_player_t *player,
> >                                     enum vlc_player_vout_action action,
> > -                                   vout_thread_t *vout, void *data);
> > +                                   vout_thread_t *vout,
> > +                                   const struct vlc_player_track *track,
> > +                                   void *data);
> >  static int MovedEvent( vlc_object_t *, char const *,
> >                         vlc_value_t, vlc_value_t, void * );
> >  static int ButtonEvent( vlc_object_t *, char const *,
> > @@ -389,9 +391,10 @@ static int ButtonEvent( vlc_object_t *p_this, char
> > const *psz_var, static void
> >  player_on_vout_changed(vlc_player_t *player,
> >                         enum vlc_player_vout_action action,
> > -                       vout_thread_t *vout, void *data)
> > +                       vout_thread_t *vout,
> > +                       const struct vlc_player_track *track, void *data)
> >  {
> > -    VLC_UNUSED(player);
> > +    VLC_UNUSED(player); VLC_UNUSED(track);
> >      intf_thread_t *intf = data;
> >      intf_sys_t *sys = intf->p_sys;
> >      switch (action)
> > diff --git a/modules/control/hotkeys.c b/modules/control/hotkeys.c
> > index b81debb4ea..81f0c92795 100644
> > --- a/modules/control/hotkeys.c
> > +++ b/modules/control/hotkeys.c
> > @@ -1016,8 +1016,10 @@ ViewpointMovedCallback(vlc_object_t *obj, char const
> > *var, static void
> >  player_on_vout_changed(vlc_player_t *player,
> >                         enum vlc_player_vout_action action, vout_thread_t
> > *vout, +                       const struct vlc_player_track *track,
> >                         void *data)
> >  {
> > +    VLC_UNUSED(track);
> >      intf_thread_t *intf = data;
> >      bool vrnav = var_GetBool(vout, "viewpoint-changeable");
> >      switch (action)
> > diff --git a/modules/gui/macosx/playlist/VLCPlayerController.m
> > b/modules/gui/macosx/playlist/VLCPlayerController.m index
> > 50dd9f5339..6996ad7c1d 100644
> > --- a/modules/gui/macosx/playlist/VLCPlayerController.m
> > +++ b/modules/gui/macosx/playlist/VLCPlayerController.m
> > @@ -429,10 +429,12 @@ static void cb_player_item_meta_changed(vlc_player_t
> > *p_player, static void cb_player_vout_changed(vlc_player_t *p_player,
> >                                     enum vlc_player_vout_action action,
> >                                     vout_thread_t *p_vout,
> > +                                   const struct vlc_player_track *track,
> >                                     void *p_data)
> >  {
> >      VLC_UNUSED(p_player);
> >      VLC_UNUSED(p_vout);
> > +    VLC_UNUSED(track);
> >      dispatch_async(dispatch_get_main_queue(), ^{
> >          VLCPlayerController *playerController = (__bridge
> > VLCPlayerController *)p_data; [playerController voutListUpdated];
> > diff --git a/modules/gui/qt/components/player_controller.cpp
> > b/modules/gui/qt/components/player_controller.cpp index
> > 37580926f3..77467cfb9e 100644
> > --- a/modules/gui/qt/components/player_controller.cpp
> > +++ b/modules/gui/qt/components/player_controller.cpp
> > @@ -713,7 +713,7 @@ static void on_player_subitems_changed(vlc_player_t *,
> > input_item_t *, input_ite }
> > 
> > 
> > -static void on_player_vout_changed(vlc_player_t *player, enum
> > vlc_player_vout_action, vout_thread_t *, void *data) +static void
> > on_player_vout_changed(vlc_player_t *player, enum vlc_player_vout_action,
> > vout_thread_t *,  const struct vlc_player_track *, void *data) {
> >      PlayerControllerPrivate* that =
> > static_cast<PlayerControllerPrivate*>(data); msg_Dbg( that->p_intf,
> > "on_player_vout_list_changed");
> > diff --git a/src/input/player.c b/src/input/player.c
> > index a1c44c5dc0..046b74470d 100644
> > --- a/src/input/player.c
> > +++ b/src/input/player.c
> > @@ -1792,6 +1792,7 @@ vlc_player_input_HandleVoutEvent(struct
> > vlc_player_input *input, const struct vlc_input_event_vout *ev) {
> >      assert(ev->vout);
> > +    assert(ev->id);
> > 
> >      static const char osd_vars[][sizeof("deinterlace-mode")] = {
> >          "aspect-ratio", "autoscale", "crop", "crop-bottom",
> > @@ -1800,11 +1801,19 @@ vlc_player_input_HandleVoutEvent(struct
> > vlc_player_input *input, };
> > 
> >      vlc_player_t *player = input->player;
> > +
> > +    vlc_player_track_vector *vec =
> > +        vlc_player_input_GetTrackVector(input, vlc_es_id_GetCat(ev->id));
> > +    struct vlc_player_track *track =
> > +        vec ? vlc_player_track_vector_FindById(vec, ev->id, NULL) : NULL;
> > +    if (!track)
> > +        return;
> > +
> >      switch (ev->action)
> >      {
> >          case VLC_INPUT_EVENT_VOUT_ADDED:
> >              vlc_player_SendEvent(player, on_vout_changed,
> > -                                 VLC_PLAYER_VOUT_STARTED, ev->vout);
> > +                                 VLC_PLAYER_VOUT_STARTED, ev->vout, track);
> > 
> >              /* Register vout callbacks after the vout list event */
> >              var_AddCallback(ev->vout, "fullscreen",
> > @@ -1826,7 +1835,7 @@ vlc_player_input_HandleVoutEvent(struct
> > vlc_player_input *input, vlc_player_VoutOSDCallback, player);
> > 
> >              vlc_player_SendEvent(player, on_vout_changed,
> > -                                 VLC_PLAYER_VOUT_STOPPED, ev->vout);
> > +                                 VLC_PLAYER_VOUT_STOPPED, ev->vout, track);
> 
> I would not expect a track in the stopped event, TBH.

Why not ? The track (or es_out_t) is always valid in that case. This allow more controls for users, to identify which vout is stopping.

> How do you foresee the event to change ES<->vout mapping?
I'm not sure if I understand correctly.

When playing 2 videos in a raw with the same vout.

on_vout_changed(VLC_PLAYER_VOUT_STARTED, main_vout, video_es_id_one);
on_vout_changed(VLC_PLAYER_VOUT_STOPPED, main_vout, video_es_id_one);
on_vout_changed(VLC_PLAYER_VOUT_STARTED, main_vout, video_es_id_two);
on_vout_changed(VLC_PLAYER_VOUT_STOPPED, main_vout, video_es_id_two);


> 
> > break;
> >          default:
> >              vlc_assert_unreachable();
> > diff --git a/test/src/input/player.c b/test/src/input/player.c
> > index 8406e4352f..20df9d00bc 100644
> > --- a/test/src/input/player.c
> > +++ b/test/src/input/player.c
> > @@ -79,6 +79,7 @@ struct report_vout
> >  {
> >      enum vlc_player_vout_action action;
> >      vout_thread_t *vout;
> > +    struct vlc_player_track *track;
> >  };
> > 
> >  struct report_media_subitems
> > @@ -434,14 +435,17 @@ player_on_statistics_changed(vlc_player_t *player,
> >  static void
> >  player_on_vout_changed(vlc_player_t *player,
> >                              enum vlc_player_vout_action action,
> > -                            vout_thread_t *vout, void *data)
> > +                            vout_thread_t *vout,
> > +                            const struct vlc_player_track *track,
> > +                            void *data)
> >  {
> >      struct ctx *ctx = get_ctx(player, data);
> >      struct report_vout report = {
> >          .action = action,
> > -        .vout = vout,
> > +        .vout = vout_Hold(vout),
> > +        .track = vlc_player_track_Dup(track),
> >      };
> > -    vout_Hold(vout);
> > +    assert(report.track);
> >      VEC_PUSH(on_vout_changed, report);
> >  }
> > 
> > @@ -570,7 +574,10 @@ ctx_reset(struct ctx *ctx)
> >      {
> >          struct report_vout report;
> >          FOREACH_VEC(report, on_vout_changed)
> > +        {
> >              vout_Release(report.vout);
> > +            vlc_player_track_Delete(report.track);
> > +        }
> >      }
> > 
> >      {
> 
> 
> -- 
> Rémi Denis-Courmont
> http://www.remlab.net/
> 
> 
> 
> _______________________________________________
> 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