vlc | branch: master | Thomas Guillem <[email protected]> | Fri Jun 14 15:46:16 2019 +0200| [c896210b006825278adde0c3119f42e741330a8e] | committer: Thomas Guillem
player: get vout and vout_order from VIDEO/SPU es_ids vlc_player_GetVoutFromEsId() can now return the vout used by an SPU es_id. It also returns the vout order. The on_vout_changed callback is also used for SPU es_ids. Users could check the category of the es_id to know if the vout is attached to a VIDEO es or an SPU one. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=c896210b006825278adde0c3119f42e741330a8e --- include/vlc_player.h | 9 ++++--- lib/media_player.c | 9 ++++--- modules/control/gestures.c | 8 +++++- modules/control/hotkeys.c | 8 ++++-- modules/gui/macosx/playlist/VLCPlayerController.m | 7 ++++- modules/gui/qt/components/player_controller.cpp | 12 ++++++++- src/input/player.c | 31 ++++++++++++++++++----- test/src/input/player.c | 5 +++- 8 files changed, 70 insertions(+), 19 deletions(-) diff --git a/include/vlc_player.h b/include/vlc_player.h index e5c165234f..df5b75b045 100644 --- a/include/vlc_player.h +++ b/include/vlc_player.h @@ -850,12 +850,13 @@ struct vlc_player_cbs * @param player locked player instance * @param action started or stopped * @param vout vout (can't be NULL) + * @param order vout order * @param es_id the ES id 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, - vlc_es_id_t *es_id, void *data); + enum vlc_vout_order order, vlc_es_id_t *es_id, void *data); /** * Called when the player is corked @@ -1703,11 +1704,13 @@ vlc_player_GetTrack(vlc_player_t *player, vlc_es_id_t *es_id); * @param player locked player instance * @param id an ES ID (retrieved from vlc_player_cbs.on_track_list_changed or * vlc_player_GetTrackAt()) + * @param order if not null, the order of the vout * @return a valid vout or NULL (if the track is disabled, it it's not a video - * track, or if the vout failed to start) + * or spu track, or if the vout failed to start) */ VLC_API vout_thread_t * -vlc_player_GetEsIdVout(vlc_player_t *player, vlc_es_id_t *es_id); +vlc_player_GetEsIdVout(vlc_player_t *player, vlc_es_id_t *es_id, + enum vlc_vout_order *order); /** * Get the ES identifier of a video output diff --git a/lib/media_player.c b/lib/media_player.c index 667ec517d0..cb29d76ebf 100644 --- a/lib/media_player.c +++ b/lib/media_player.c @@ -400,12 +400,15 @@ 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, vlc_es_id_t *es_id, - void *data) + vout_thread_t *vout, enum vlc_vout_order order, + vlc_es_id_t *es_id, void *data) { (void) action; (void) vout; - (void) es_id; + (void) order; + + if (vlc_es_id_GetCat(es_id) != VIDEO_ES) + return; libvlc_media_player_t *mp = data; diff --git a/modules/control/gestures.c b/modules/control/gestures.c index 804e6df2eb..668be6936a 100644 --- a/modules/control/gestures.c +++ b/modules/control/gestures.c @@ -105,6 +105,7 @@ vlc_module_end () static void player_on_vout_changed(vlc_player_t *player, enum vlc_player_vout_action action, vout_thread_t *vout, + enum vlc_vout_order order, vlc_es_id_t *es_id, void *data); static int MovedEvent( vlc_object_t *, char const *, @@ -392,11 +393,16 @@ static void player_on_vout_changed(vlc_player_t *player, enum vlc_player_vout_action action, vout_thread_t *vout, + enum vlc_vout_order order, vlc_es_id_t *es_id, void *data) { - VLC_UNUSED(player); VLC_UNUSED(es_id); + VLC_UNUSED(player); VLC_UNUSED(order); intf_thread_t *intf = data; intf_sys_t *sys = intf->p_sys; + + if (vlc_es_id_GetCat(es_id) != VIDEO_ES) + return; + switch (action) { case VLC_PLAYER_VOUT_STARTED: diff --git a/modules/control/hotkeys.c b/modules/control/hotkeys.c index 35d8557038..6d38b310ed 100644 --- a/modules/control/hotkeys.c +++ b/modules/control/hotkeys.c @@ -1053,11 +1053,15 @@ 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, - vlc_es_id_t *es_id, + enum vlc_vout_order order, vlc_es_id_t *es_id, void *data) { - VLC_UNUSED(es_id); + VLC_UNUSED(order); intf_thread_t *intf = data; + + if (vlc_es_id_GetCat(es_id) != VIDEO_ES) + return; + 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 a1fae94533..5c966aacd5 100644 --- a/modules/gui/macosx/playlist/VLCPlayerController.m +++ b/modules/gui/macosx/playlist/VLCPlayerController.m @@ -434,12 +434,17 @@ 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, + enum vlc_vout_order order, vlc_es_id_t *es_id, void *p_data) { VLC_UNUSED(p_player); VLC_UNUSED(p_vout); - VLC_UNUSED(es_id); + VLC_UNUSED(order); + + if (vlc_es_id_GetCat(es_id) != VIDEO_ES) + return; + 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 553d461d41..c19b927d45 100644 --- a/modules/gui/qt/components/player_controller.cpp +++ b/modules/gui/qt/components/player_controller.cpp @@ -710,11 +710,16 @@ 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 *, vlc_es_id_t *, void *data) +static void on_player_vout_changed(vlc_player_t *player, enum vlc_player_vout_action, + vout_thread_t *, enum vlc_vout_order, vlc_es_id_t *es_id, void *data) { PlayerControllerPrivate* that = static_cast<PlayerControllerPrivate*>(data); msg_Dbg( that->p_intf, "on_player_vout_list_changed"); + switch (vlc_es_id_GetCat(es_id)) + { + case VIDEO_ES: + { //player is locked within callbacks* size_t i_vout = 0; vout_thread_t **vouts = vlc_player_vout_HoldAll(player, &i_vout); @@ -729,6 +734,11 @@ static void on_player_vout_changed(vlc_player_t *player, enum vlc_player_vout_ac that->callAsync([that,voutsPtr,i_vout] () { that->UpdateVouts(voutsPtr.get(), i_vout); }); + break; + } + default: + break; + } } //player vout callbacks diff --git a/src/input/player.c b/src/input/player.c index b7819d5ef1..4f0d3e727a 100644 --- a/src/input/player.c +++ b/src/input/player.c @@ -59,6 +59,8 @@ struct vlc_player_track_priv struct vlc_player_track t; vout_thread_t *vout; /* weak reference */ vlc_tick_t delay; + /* only valid if selected and if category is VIDEO_ES or SPU_ES */ + enum vlc_vout_order vout_order; }; typedef struct VLC_VECTOR(struct vlc_player_program *) @@ -423,6 +425,8 @@ vlc_player_track_New(vlc_es_id_t *id, const char *name, const es_format_t *fmt) struct vlc_player_track *track = &trackpriv->t; trackpriv->delay = INT64_MAX; + trackpriv->vout = NULL; + trackpriv->vout_order = VLC_VOUT_ORDER_NONE; track->name = strdup(name); if (!track->name) @@ -1327,11 +1331,18 @@ vlc_player_GetTrack(vlc_player_t *player, vlc_es_id_t *id) } vout_thread_t * -vlc_player_GetEsIdVout(vlc_player_t *player, vlc_es_id_t *es_id) +vlc_player_GetEsIdVout(vlc_player_t *player, vlc_es_id_t *es_id, + enum vlc_vout_order *order) { struct vlc_player_track_priv *trackpriv = vlc_player_GetPrivTrack(player, es_id); - return trackpriv ? trackpriv->vout : NULL; + if (trackpriv) + { + if (order) + *order = trackpriv->vout_order; + return trackpriv->vout; + } + return NULL; } vlc_es_id_t * @@ -1343,7 +1354,7 @@ vlc_player_GetEsIdFromVout(vlc_player_t *player, vout_thread_t *vout) return NULL; static const enum es_format_category_e cats[] = { - VIDEO_ES, AUDIO_ES /* for visualisation filters */ + VIDEO_ES, SPU_ES, AUDIO_ES /* for visualisation filters */ }; for (size_t i = 0; i < ARRAY_SIZE(cats); ++i) { @@ -2060,16 +2071,17 @@ vlc_player_input_HandleVoutEvent(struct vlc_player_input *input, return; const bool is_video_es = trackpriv->t.fmt.i_cat == VIDEO_ES; - if (!is_video_es) /* XXX: will be removed on next commits */ - return; switch (ev->action) { case VLC_INPUT_EVENT_VOUT_ADDED: trackpriv->vout = ev->vout; vlc_player_SendEvent(player, on_vout_changed, - VLC_PLAYER_VOUT_STARTED, ev->vout, ev->id); + VLC_PLAYER_VOUT_STARTED, ev->vout, + ev->order, ev->id); + if (is_video_es) + { /* Register vout callbacks after the vout list event */ var_AddCallback(ev->vout, "fullscreen", vlc_player_VoutCallback, player); @@ -2078,8 +2090,11 @@ vlc_player_input_HandleVoutEvent(struct vlc_player_input *input, for (size_t i = 0; i < ARRAY_SIZE(osd_vars); ++i) var_AddCallback(ev->vout, osd_vars[i], vlc_player_VoutOSDCallback, player); + } break; case VLC_INPUT_EVENT_VOUT_DELETED: + if (is_video_es) + { /* Un-register vout callbacks before the vout list event */ var_DelCallback(ev->vout, "fullscreen", vlc_player_VoutCallback, player); @@ -2088,10 +2103,12 @@ vlc_player_input_HandleVoutEvent(struct vlc_player_input *input, for (size_t i = 0; i < ARRAY_SIZE(osd_vars); ++i) var_DelCallback(ev->vout, osd_vars[i], vlc_player_VoutOSDCallback, player); + } trackpriv->vout = NULL; vlc_player_SendEvent(player, on_vout_changed, - VLC_PLAYER_VOUT_STOPPED, ev->vout, ev->id); + VLC_PLAYER_VOUT_STOPPED, ev->vout, + VLC_VOUT_ORDER_NONE, ev->id); break; default: vlc_assert_unreachable(); diff --git a/test/src/input/player.c b/test/src/input/player.c index 012f1990aa..de916e7a8a 100644 --- a/test/src/input/player.c +++ b/test/src/input/player.c @@ -85,6 +85,7 @@ struct report_vout { enum vlc_player_vout_action action; vout_thread_t *vout; + enum vlc_vout_order order; vlc_es_id_t *es_id; }; @@ -437,12 +438,14 @@ 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, vlc_es_id_t *es_id, void *data) + vout_thread_t *vout, enum vlc_vout_order order, + vlc_es_id_t *es_id, void *data) { struct ctx *ctx = get_ctx(player, data); struct report_vout report = { .action = action, .vout = vout_Hold(vout), + .order = order, .es_id = vlc_es_id_Hold(es_id), }; assert(report.es_id); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
