From e6b3a0a6870f766ce8857217783f3b2f99412d64 Mon Sep 17 00:00:00 2001 From: Thomas Guillem Date: Thu, 21 Oct 2021 09:45:53 +0200 Subject: [PATCH] player: add support for video delay --- include/vlc_player.h | 20 ++++++++++++++++++++ src/input/es_out.c | 9 ++++++++- src/input/input.c | 3 ++- src/player/player.c | 2 +- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/include/vlc_player.h b/include/vlc_player.h index 92eb240b4e..a9a0f400c3 100644 --- a/include/vlc_player.h +++ b/include/vlc_player.h @@ -1979,6 +1979,26 @@ vlc_player_SetAudioDelay(vlc_player_t *player, vlc_tick_t delay, vlc_player_SetCategoryDelay(player, AUDIO_ES, delay, whence); } +/** + * Helper to get the audio delay + */ +static inline vlc_tick_t +vlc_player_GetVideoDelay(vlc_player_t *player) +{ + return vlc_player_GetCategoryDelay(player, VIDEO_ES); +} + +/** + * Helper to set the audio delay + */ +static inline void +vlc_player_SetVideoDelay(vlc_player_t *player, vlc_tick_t delay, + enum vlc_player_whence whence) + +{ + vlc_player_SetCategoryDelay(player, VIDEO_ES, delay, whence); +} + /** * Helper to get the subtitle delay */ diff --git a/src/input/es_out.c b/src/input/es_out.c index ff1e31993a..7853d63d29 100644 --- a/src/input/es_out.c +++ b/src/input/es_out.c @@ -203,6 +203,7 @@ typedef struct /* delay */ vlc_tick_t i_audio_delay; vlc_tick_t i_spu_delay; + vlc_tick_t i_video_delay; /* Clock configuration */ vlc_tick_t i_pts_delay; @@ -842,7 +843,7 @@ static void EsOutSetEsDelay(es_out_t *out, es_out_id_t *es, vlc_tick_t delay) { es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out); - assert(es->fmt.i_cat == AUDIO_ES || es->fmt.i_cat == SPU_ES); + assert(es->fmt.i_cat == AUDIO_ES || es->fmt.i_cat == SPU_ES || es->fmt.i_cat == VIDEO_ES); es->delay = delay; @@ -855,6 +856,8 @@ static void EsOutSetEsDelay(es_out_t *out, es_out_id_t *es, vlc_tick_t delay) static void EsOutSetDelay( es_out_t *out, int i_cat, vlc_tick_t i_delay ) { + fprintf(stderr, "EsOutSetDelay(%d): %" PRId64 "\n", i_cat, i_delay); + es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out); es_out_id_t *es; @@ -862,6 +865,8 @@ static void EsOutSetDelay( es_out_t *out, int i_cat, vlc_tick_t i_delay ) p_sys->i_audio_delay = i_delay; else if( i_cat == SPU_ES ) p_sys->i_spu_delay = i_delay; + else if( i_cat == VIDEO_ES ) + p_sys->i_video_delay = i_delay; foreach_es_then_es_slaves(es) EsOutDecoderChangeDelay(out, es); @@ -1235,6 +1240,8 @@ static void EsOutDecoderChangeDelay( es_out_t *out, es_out_id_t *p_es ) i_delay = p_sys->i_audio_delay; else if( p_es->fmt.i_cat == SPU_ES ) i_delay = p_sys->i_spu_delay; + else if( p_es->fmt.i_cat == VIDEO_ES ) + i_delay = p_sys->i_video_delay; else return; diff --git a/src/input/input.c b/src/input/input.c index d18ab83004..f9b7801be4 100644 --- a/src/input/input.c +++ b/src/input/input.c @@ -2193,7 +2193,8 @@ static bool Control( input_thread_t *p_input, case INPUT_CONTROL_SET_CATEGORY_DELAY: assert(param.cat_delay.cat == AUDIO_ES - || param.cat_delay.cat == SPU_ES); + || param.cat_delay.cat == SPU_ES + || param.cat_delay.cat == VIDEO_ES); es_out_SetDelay(priv->p_es_out_display, param.cat_delay.cat, param.cat_delay.delay); break; diff --git a/src/player/player.c b/src/player/player.c index 022df16749..44308a839e 100644 --- a/src/player/player.c +++ b/src/player/player.c @@ -1666,7 +1666,7 @@ vlc_player_SetCategoryDelay(vlc_player_t *player, enum es_format_category_e cat, if (!input) return VLC_EGENERIC; - if (cat != AUDIO_ES && cat != SPU_ES) + if (cat != AUDIO_ES && cat != SPU_ES && cat != VIDEO_ES) return VLC_EGENERIC; vlc_tick_t *cat_delay = &input->cat_delays[cat];