vlc | branch: master | Thomas Guillem <[email protected]> | Wed Jun 19 14:21:35 2019 +0200| [6c4c3d503d68120cc6577e6be3e7f3de1db3b06b] | committer: Thomas Guillem
player: add vlc_player_SetEsIdDelay This allow to set the delay of one particular track. Once set, this delay will override the delay of the track category. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=6c4c3d503d68120cc6577e6be3e7f3de1db3b06b --- include/vlc_player.h | 48 +++++++++++++++++++++++ modules/gui/qt/components/player_controller.cpp | 1 + src/input/player.c | 51 +++++++++++++++++++++++++ src/libvlccore.sym | 2 + 4 files changed, 102 insertions(+) diff --git a/include/vlc_player.h b/include/vlc_player.h index 2fe226ab70..0e66690efa 100644 --- a/include/vlc_player.h +++ b/include/vlc_player.h @@ -547,6 +547,17 @@ struct vlc_player_cbs vlc_es_id_t *unselected_id, vlc_es_id_t *selected_id, void *data); /** + * Called when a track delay has changed + * + * @param player locked player instance + * @param es_id valid track id + * @param delay a valid delay or INT64_MAX if the delay of this track is + * canceled + */ + void (*on_track_delay_changed)(vlc_player_t *player, + vlc_es_id_t *es_id, vlc_tick_t delay, void *data); + + /** * Called when a new program is added, removed or updated * * @note The program is only valid from this callback context. Users should @@ -2450,6 +2461,9 @@ vlc_player_GetCategoryDelay(vlc_player_t *player, enum es_format_category_e cat) * @note A successful call will trigger the * vlc_player_cbs.on_category_delay_changed event. * + * @warning This has no effect on tracks where the delay was set by + * vlc_player_SetEsIdDelay() + * * @param player locked player instance * @param cat AUDIO_ES or SPU_ES (VIDEO_ES not supported yet) * @param delay a valid time @@ -2461,6 +2475,40 @@ vlc_player_SetCategoryDelay(vlc_player_t *player, enum es_format_category_e cat, vlc_tick_t delay, enum vlc_player_whence whence); /** + * Get the delay of a track + * + * @see vlc_player_cbs.on_track_delay_changed + * + * @param player locked player instance + * @param id an ES ID (retrieved from vlc_player_cbs.on_track_list_changed or + * vlc_player_GetTrackAt()) + * @return a valid delay or INT64_MAX is no delay is set for this track + */ +VLC_API vlc_tick_t +vlc_player_GetEsIdDelay(vlc_player_t *player, vlc_es_id_t *es_id); + +/** + * Set the delay of one track + * + * @note A successful call will trigger the + * vlc_player_cbs.on_track_delay_changed event. + * + * @warning Setting the delay of one specific track will override previous and + * future changes of delay made by vlc_player_SetCategoryDelay() + * + * @param player locked player instance + * @param id an ES ID (retrieved from vlc_player_cbs.on_track_list_changed or + * vlc_player_GetTrackAt()) + * @param delay a valid time or INT64_MAX to use default category delay + * @param whence absolute or relative + * @return VLC_SUCCESS or VLC_EGENERIC if the category of the es_id is not + * handled (VIDEO_ES not supported yet) + */ +VLC_API int +vlc_player_SetEsIdDelay(vlc_player_t *player, vlc_es_id_t *es_id, + vlc_tick_t delay, enum vlc_player_whence whence); + +/** * Helper to get the audio delay */ static inline vlc_tick_t diff --git a/modules/gui/qt/components/player_controller.cpp b/modules/gui/qt/components/player_controller.cpp index aeb5954cfa..553d461d41 100644 --- a/modules/gui/qt/components/player_controller.cpp +++ b/modules/gui/qt/components/player_controller.cpp @@ -810,6 +810,7 @@ static const struct vlc_player_cbs player_cbs = { on_player_length_changed, on_player_track_list_changed, on_player_track_selection_changed, + NULL /* on_player_track_delay_changed */, on_player_program_list_changed, on_player_program_selection_changed, on_player_titles_changed, diff --git a/src/input/player.c b/src/input/player.c index a038ae67d6..040d1aebef 100644 --- a/src/input/player.c +++ b/src/input/player.c @@ -55,6 +55,7 @@ struct vlc_player_track_priv { struct vlc_player_track t; vout_thread_t *vout; /* weak reference */ + vlc_tick_t delay; }; typedef struct VLC_VECTOR(struct vlc_player_program *) @@ -417,6 +418,9 @@ vlc_player_track_New(vlc_es_id_t *id, const char *name, const es_format_t *fmt) if (!trackpriv) return NULL; struct vlc_player_track *track = &trackpriv->t; + + trackpriv->delay = INT64_MAX; + track->name = strdup(name); if (!track->name) { @@ -2878,6 +2882,53 @@ vlc_player_GetCategoryDelay(vlc_player_t *player, enum es_format_category_e cat) return input->cat_delays[cat]; } +int +vlc_player_SetEsIdDelay(vlc_player_t *player, vlc_es_id_t *es_id, + vlc_tick_t delay, enum vlc_player_whence whence) +{ + bool absolute = whence == VLC_PLAYER_WHENCE_ABSOLUTE; + struct vlc_player_input *input = vlc_player_get_input_locked(player); + if (!input) + return VLC_EGENERIC; + + struct vlc_player_track_priv *trackpriv = + vlc_player_input_FindTrackById(input, es_id, NULL); + if (trackpriv == NULL || + (trackpriv->t.fmt.i_cat != AUDIO_ES && trackpriv->t.fmt.i_cat != SPU_ES)) + return VLC_EGENERIC; + + if (absolute) + trackpriv->delay = delay; + else + { + if (trackpriv->delay == INT64_MAX) + trackpriv->delay = 0; + trackpriv->delay += delay; + delay = trackpriv->delay; + } + + input_SetEsIdDelay(input->thread, es_id, delay); + if (delay != INT64_MAX) + vlc_player_vout_OSDMessage(player, _("%s delay: %i ms"), + trackpriv->t.name, + (int)MS_FROM_VLC_TICK(delay)); + vlc_player_SendEvent(player, on_track_delay_changed, es_id, delay); + + return VLC_SUCCESS; +} + +vlc_tick_t +vlc_player_GetEsIdDelay(vlc_player_t *player, vlc_es_id_t *es_id) +{ + struct vlc_player_input *input = vlc_player_get_input_locked(player); + if (!input) + return 0; + + struct vlc_player_track_priv *trackpriv = + vlc_player_input_FindTrackById(input, es_id, NULL); + return trackpriv ? trackpriv->delay : INT64_MAX; +} + static struct { const char var[sizeof("video")]; const char sout_var[sizeof("sout-video")]; diff --git a/src/libvlccore.sym b/src/libvlccore.sym index 64a6c0123b..3e959dc21f 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -789,6 +789,7 @@ vlc_player_GetCategoryDelay vlc_player_GetCategoryLanguage vlc_player_GetCurrentMedia vlc_player_GetError +vlc_player_GetEsIdDelay vlc_player_GetEsIdFromVout vlc_player_GetLength vlc_player_GetPosition @@ -850,6 +851,7 @@ vlc_player_SetAssociatedSubsFPS vlc_player_SetAtoBLoop vlc_player_SetCategoryDelay vlc_player_SetCurrentMedia +vlc_player_SetEsIdDelay vlc_player_SetMediaStoppedAction vlc_player_SetRecordingEnabled vlc_player_SetRenderer _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
