[vlc-devel] [PATCH 4/4] player: associate tracks with vouts
Rémi Denis-Courmont
remi at remlab.net
Wed May 29 16:18:55 CEST 2019
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.
How do you foresee the event to change ES<->vout mapping?
> 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/
More information about the vlc-devel
mailing list