[vlc-devel] [PATCH 07/10] Hotkey support for secondary subtitles (Part 2) - Secondary subtitle delay

Roland Bewick roland.bewick at gmail.com
Sun May 5 12:01:47 CEST 2019


TODO in player controller will be addressed in a later commit.
---
 include/vlc_input.h                           |  8 +++-
 include/vlc_player.h                          |  8 ++--
 modules/control/hotkeys.c                     |  3 +-
 .../gui/macosx/playlist/VLCPlayerController.m |  3 +-
 .../gui/qt/components/player_controller.cpp   | 21 +++++++---
 modules/lua/libs/input.c                      |  5 ++-
 src/input/decoder.c                           |  6 +++
 src/input/decoder.h                           |  1 +
 src/input/es_out.c                            | 22 +++++++----
 src/input/es_out.h                            |  6 ++-
 src/input/event.h                             |  5 ++-
 src/input/input.c                             | 27 ++++++++-----
 src/input/input_internal.h                    |  3 +-
 src/input/player.c                            | 38 ++++++++++++-------
 src/input/var.c                               | 12 +++++-
 15 files changed, 117 insertions(+), 51 deletions(-)

diff --git a/include/vlc_input.h b/include/vlc_input.h
index e6bd8440e3..08cffa0c77 100644
--- a/include/vlc_input.h
+++ b/include/vlc_input.h
@@ -477,6 +477,12 @@ struct vlc_input_event_vout
     vout_thread_t *vout;
 };
 
+struct vlc_input_event_subtitle_delay
+{
+    vlc_tick_t i_delay;
+    bool b_secondary;
+};
+
 struct vlc_input_event
 {
     input_event_type_e type;
@@ -509,7 +515,7 @@ struct vlc_input_event
         /* INPUT_EVENT_AUDIO_DELAY */
         vlc_tick_t audio_delay;
         /* INPUT_EVENT_SUBTITLE_DELAY */
-        vlc_tick_t subtitle_delay;
+        struct vlc_input_event_subtitle_delay subtitle_delay;
         /* INPUT_EVENT_CACHE */
         float cache;
         /* INPUT_EVENT_VOUT */
diff --git a/include/vlc_player.h b/include/vlc_player.h
index f1f43b7478..d9aeb6dc22 100644
--- a/include/vlc_player.h
+++ b/include/vlc_player.h
@@ -688,7 +688,7 @@ struct vlc_player_cbs
      * @param data opaque pointer set by vlc_player_AddListener()
      */
     void (*on_subtitle_delay_changed)(vlc_player_t *player,
-        vlc_tick_t new_delay, void *data);
+        vlc_tick_t new_delay, bool b_secondary, void *data);
 
     /**
      * Called when associated subtitle has changed
@@ -2371,9 +2371,10 @@ vlc_player_SetAudioDelay(vlc_player_t *player, vlc_tick_t delay,
  * @see vlc_player_cbs.on_subtitle_delay_changed
  *
  * @param player locked player instance
+ * @param b_secondary retrieve delay for secondary subtitle track
  */
 VLC_API vlc_tick_t
-vlc_player_GetSubtitleDelay(vlc_player_t *player);
+vlc_player_GetSubtitleDelay(vlc_player_t *player, bool b_secondary);
 
 /**
  * Set subtitle synchronisation
@@ -2404,10 +2405,11 @@ vlc_player_SetSubtitleSync(vlc_player_t *player,
  * @param player locked player instance
  * @param delay a valid time
  * @param whence absolute or relative
+ * @param b_secondary apply to secondary subtitle track
  */
 VLC_API void
 vlc_player_SetSubtitleDelay(vlc_player_t *player, vlc_tick_t delay,
-                            enum vlc_player_whence whence);
+                            enum vlc_player_whence whence, bool b_secondary);
 
 /**
  * Set the subtitle text scaling factor
diff --git a/modules/control/hotkeys.c b/modules/control/hotkeys.c
index d520d8a7ed..34901e2f07 100644
--- a/modules/control/hotkeys.c
+++ b/modules/control/hotkeys.c
@@ -390,7 +390,8 @@ PLAYER_ACTION_HANDLER(Delay)
     if (type == AUDIODELAY)
         vlc_player_SetAudioDelay(player, delta, whence);
     else
-        vlc_player_SetSubtitleDelay(player, delta, whence);
+        vlc_player_SetSubtitleDelay(player, delta, whence,
+                                    b_control_secondary_subtitles);
 }
 
 static inline float
diff --git a/modules/gui/macosx/playlist/VLCPlayerController.m b/modules/gui/macosx/playlist/VLCPlayerController.m
index 01b997faed..2a6a0b3f09 100644
--- a/modules/gui/macosx/playlist/VLCPlayerController.m
+++ b/modules/gui/macosx/playlist/VLCPlayerController.m
@@ -1263,7 +1263,8 @@ static const struct vlc_player_aout_cbs player_aout_callbacks = {
 - (void)setSubtitlesDelay:(vlc_tick_t)subtitlesDelay
 {
     vlc_player_Lock(_p_player);
-    vlc_player_SetSubtitleDelay(_p_player, subtitlesDelay, VLC_PLAYER_WHENCE_ABSOLUTE);
+    vlc_player_SetSubtitleDelay(_p_player, subtitlesDelay,
+                                           VLC_PLAYER_WHENCE_ABSOLUTE, false);
     vlc_player_Unlock(_p_player);
 }
 
diff --git a/modules/gui/qt/components/player_controller.cpp b/modules/gui/qt/components/player_controller.cpp
index 6104063a8d..dfaf07dccd 100644
--- a/modules/gui/qt/components/player_controller.cpp
+++ b/modules/gui/qt/components/player_controller.cpp
@@ -587,13 +587,21 @@ static void on_player_audio_delay_changed(vlc_player_t *, vlc_tick_t new_delay,
 }
 
 static void on_player_subtitle_delay_changed(vlc_player_t *, vlc_tick_t new_delay,
-                                  void *data)
+                                  bool b_secondary, void *data)
 {
     PlayerControllerPrivate* that = static_cast<PlayerControllerPrivate*>(data);
-    msg_Dbg( that->p_intf, "on_player_subtitle_delay_changed");
-    that->callAsync([that,new_delay] (){
-        that->m_subtitleDelay = new_delay;
-        emit that->q_func()->subtitleDelayChanged( new_delay );
+    msg_Dbg( that->p_intf, "on_player_subtitle_delay_changed %d",
+             b_secondary);
+    that->callAsync([that,new_delay,b_secondary] (){
+        if (!b_secondary)
+        {
+            that->m_subtitleDelay = new_delay;
+            emit that->q_func()->subtitleDelayChanged( new_delay );
+        }
+        else
+        {
+            // TODO: Support dual subtitles
+        }
     });
 }
 
@@ -1045,7 +1053,8 @@ void PlayerController::setSubtitleDelay(VLCTick delay)
 {
     Q_D(PlayerController);
     vlc_player_locker lock{ d->m_player };
-    vlc_player_SetSubtitleDelay( d->m_player, delay, VLC_PLAYER_WHENCE_ABSOLUTE );
+    vlc_player_SetSubtitleDelay( d->m_player, delay,
+                                 VLC_PLAYER_WHENCE_ABSOLUTE, false );
 }
 
 void PlayerController::setSubtitleFPS(float fps)
diff --git a/modules/lua/libs/input.c b/modules/lua/libs/input.c
index ac69f1f7b7..31459ded05 100644
--- a/modules/lua/libs/input.c
+++ b/modules/lua/libs/input.c
@@ -491,7 +491,7 @@ static int vlclua_player_get_subtitle_delay(lua_State *L)
     vlc_player_t *player = vlclua_get_player_internal(L);
 
     vlc_player_Lock(player);
-    vlc_tick_t delay = vlc_player_GetSubtitleDelay(player);
+    vlc_tick_t delay = vlc_player_GetSubtitleDelay(player, false);
     vlc_player_Unlock(player);
 
     double delay_sec = secf_from_vlc_tick(delay);
@@ -508,7 +508,8 @@ static int vlclua_player_set_subtitle_delay(lua_State *L)
     vlc_tick_t delay = vlc_tick_from_sec(delay_sec);
 
     vlc_player_Lock(player);
-    vlc_player_SetSubtitleDelay(player, delay, VLC_PLAYER_WHENCE_ABSOLUTE);
+    vlc_player_SetSubtitleDelay(player, delay,
+                                VLC_PLAYER_WHENCE_ABSOLUTE, false);
     vlc_player_Unlock(player);
 
     return 0;
diff --git a/src/input/decoder.c b/src/input/decoder.c
index b699e52a67..f85c6e4e33 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -2389,6 +2389,12 @@ int input_DecoderSetSecondary( decoder_t *dec, bool b_secondary )
     return VLC_SUCCESS;
 }
 
+bool input_DecoderIsSecondary( decoder_t *dec )
+{
+    struct decoder_owner *p_owner = dec_get_owner( dec );
+    return p_owner->b_secondary;
+}
+
 void input_DecoderChangePause( decoder_t *p_dec, bool b_paused, vlc_tick_t i_date )
 {
     struct decoder_owner *p_owner = dec_get_owner( p_dec );
diff --git a/src/input/decoder.h b/src/input/decoder.h
index 8fdb9c174b..43a8a1159e 100644
--- a/src/input/decoder.h
+++ b/src/input/decoder.h
@@ -115,6 +115,7 @@ size_t input_DecoderGetFifoSize( decoder_t *p_dec );
  * and synchronization for dual subtitles.
  */
 int input_DecoderSetSecondary( decoder_t *dec, bool b_secondary );
+bool input_DecoderIsSecondary( decoder_t *dec );
 
 void input_DecoderSetVoutMouseEvent( decoder_t *, vlc_mouse_event, void * );
 int  input_DecoderAddVoutOverlay( decoder_t *, subpicture_t *, int * );
diff --git a/src/input/es_out.c b/src/input/es_out.c
index bd2f9f1025..5080b67a19 100644
--- a/src/input/es_out.c
+++ b/src/input/es_out.c
@@ -181,7 +181,7 @@ typedef struct
 
     /* delay */
     vlc_tick_t i_audio_delay;
-    vlc_tick_t i_spu_delay;
+    vlc_tick_t spu_delays[2]; /* Primary / Secondary subtitle delay */
 
     /* Clock configuration */
     vlc_tick_t  i_pts_delay;
@@ -564,7 +564,8 @@ static bool EsOutDecodersIsEmpty( es_out_t *out )
     return true;
 }
 
-static void EsOutSetDelay( es_out_t *out, int i_cat, vlc_tick_t i_delay )
+static void EsOutSetDelay( es_out_t *out, int i_cat, vlc_tick_t i_delay,
+                           bool b_secondary )
 {
     es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out);
     es_out_id_t *es;
@@ -572,7 +573,7 @@ static void EsOutSetDelay( es_out_t *out, int i_cat, vlc_tick_t i_delay )
     if( i_cat == AUDIO_ES )
         p_sys->i_audio_delay = i_delay;
     else if( i_cat == SPU_ES )
-        p_sys->i_spu_delay = i_delay;
+        p_sys->spu_delays[b_secondary] = i_delay;
 
     foreach_es_then_es_slaves(es)
         EsOutDecoderChangeDelay(out, es);
@@ -902,7 +903,10 @@ static void EsOutDecoderChangeDelay( es_out_t *out, es_out_id_t *p_es )
     if( p_es->fmt.i_cat == AUDIO_ES )
         i_delay = p_sys->i_audio_delay;
     else if( p_es->fmt.i_cat == SPU_ES )
-        i_delay = p_sys->i_spu_delay;
+    {
+        bool b_secondary = p_es->p_dec && input_DecoderIsSecondary(p_es->p_dec);
+        i_delay = p_sys->spu_delays[b_secondary];
+    }
     else
         return;
 
@@ -2212,8 +2216,11 @@ static void EsOutSelect( es_out_t *out, es_out_id_t *es, bool b_force )
         !b_select_secondary_subtitle )
         p_esprops->p_main_es = es;
 
-    if (es->fmt.i_cat == SPU_ES && es->p_dec)
-         input_DecoderSetSecondary( es->p_dec, b_select_secondary_subtitle );
+    if( es->fmt.i_cat == SPU_ES && es->p_dec )
+    {
+        input_DecoderSetSecondary( es->p_dec, b_select_secondary_subtitle );
+        EsOutDecoderChangeDelay(out, es);
+    }
 }
 
 static void EsOutCreateCCChannels( es_out_t *out, vlc_fourcc_t codec, uint64_t i_bitmap,
@@ -3008,7 +3015,8 @@ static int EsOutVaControlLocked( es_out_t *out, int i_query, va_list args )
     {
         const int i_cat = va_arg( args, int );
         const vlc_tick_t i_delay = va_arg( args, vlc_tick_t );
-        EsOutSetDelay( out, i_cat, i_delay );
+        const bool b_secondary = va_arg( args, int );
+        EsOutSetDelay( out, i_cat, i_delay, b_secondary );
         return VLC_SUCCESS;
     }
 
diff --git a/src/input/es_out.h b/src/input/es_out.h
index 42b7d0152a..53c3befa7d 100644
--- a/src/input/es_out.h
+++ b/src/input/es_out.h
@@ -124,9 +124,11 @@ static inline bool es_out_GetEmpty( es_out_t *p_out )
     assert( !i_ret );
     return b;
 }
-static inline void es_out_SetDelay( es_out_t *p_out, int i_cat, vlc_tick_t i_delay )
+static inline void es_out_SetDelay( es_out_t *p_out, int i_cat,
+                                    vlc_tick_t i_delay, bool b_secondary )
 {
-    int i_ret = es_out_Control( p_out, ES_OUT_SET_DELAY, i_cat, i_delay );
+    int i_ret = es_out_Control( p_out, ES_OUT_SET_DELAY, i_cat,
+                                i_delay, b_secondary );
     assert( !i_ret );
 }
 static inline int es_out_SetRecordState( es_out_t *p_out, bool b_record )
diff --git a/src/input/event.h b/src/input/event.h
index 5da39053d2..36493b513b 100644
--- a/src/input/event.h
+++ b/src/input/event.h
@@ -101,11 +101,12 @@ static inline void input_SendEventAudioDelay(input_thread_t *p_input,
 }
 
 static inline void input_SendEventSubtitleDelay(input_thread_t *p_input,
-                                                 vlc_tick_t i_delay)
+                                                 vlc_tick_t i_delay,
+                                                 bool b_secondary)
 {
     input_SendEvent(p_input, &(struct vlc_input_event) {
         .type = INPUT_EVENT_SUBTITLE_DELAY,
-        .subtitle_delay = i_delay,
+        .subtitle_delay = {i_delay, b_secondary},
     });
 }
 
diff --git a/src/input/input.c b/src/input/input.c
index 0965800f90..9a3cd9c535 100644
--- a/src/input/input.c
+++ b/src/input/input.c
@@ -426,7 +426,7 @@ static input_thread_t *Create( vlc_object_t *p_parent,
 
     priv->i_audio_delay =
         VLC_TICK_FROM_MS( var_GetInteger( p_input, "audio-desync" ) );
-    priv->i_spu_delay = 0;
+    priv->spu_delays[0] = priv->spu_delays[1] = 0;
 
     /* */
     if( !priv->b_preparsing )
@@ -1059,10 +1059,12 @@ static void SetSubtitlesOptions( input_thread_t *p_input )
     int64_t sub_delay = var_InheritInteger( p_input, "sub-delay" );
     if( sub_delay != 0 )
     {
-        priv->i_spu_delay = vlc_tick_from_samples(sub_delay, 10);
-        input_SendEventSubtitleDelay( p_input, priv->i_spu_delay );
+        priv->spu_delays[0] = vlc_tick_from_samples(sub_delay, 10);
+        input_SendEventSubtitleDelay( p_input, priv->spu_delays[0], false );
         /* UpdatePtsDelay will be called next by InitPrograms */
     }
+
+    /* TODO: Support secondary subtitle delay */
 }
 
 static void GetVarSlaves( input_thread_t *p_input,
@@ -1279,7 +1281,7 @@ static void UpdatePtsDelay( input_thread_t *p_input )
         i_pts_delay = 0;
 
     /* Take care of audio/spu delay */
-    const vlc_tick_t i_extra_delay = __MIN( p_sys->i_audio_delay, p_sys->i_spu_delay );
+    const vlc_tick_t i_extra_delay = __MIN( __MIN( p_sys->i_audio_delay, p_sys->spu_delays[0] ), p_sys->spu_delays[1] );
     if( i_extra_delay < 0 )
         i_pts_delay -= i_extra_delay;
 
@@ -1288,9 +1290,12 @@ static void UpdatePtsDelay( input_thread_t *p_input )
 
     /* */
     es_out_SetDelay( input_priv(p_input)->p_es_out_display, AUDIO_ES,
-                     p_sys->i_audio_delay );
-    es_out_SetDelay( input_priv(p_input)->p_es_out_display, SPU_ES,
-                     p_sys->i_spu_delay );
+                     p_sys->i_audio_delay, false );
+    for ( int i = 0; i < 2; i++ )
+    {
+        es_out_SetDelay( input_priv(p_input)->p_es_out_display, SPU_ES,
+                        p_sys->spu_delays[i], i );
+    }
     es_out_SetJitter( input_priv(p_input)->p_es_out, i_pts_delay, 0, i_cr_average );
 }
 
@@ -2179,10 +2184,12 @@ static bool Control( input_thread_t *p_input,
 
         case INPUT_CONTROL_SET_SPU_DELAY:
             if( param.delay.b_absolute )
-                priv->i_spu_delay = param.delay.i_val;
+                priv->spu_delays[param.delay.b_secondary] = param.delay.i_val;
             else
-                priv->i_spu_delay += param.delay.i_val;
-            input_SendEventSubtitleDelay( p_input, priv->i_spu_delay );
+                priv->spu_delays[param.delay.b_secondary] += param.delay.i_val;
+            input_SendEventSubtitleDelay( p_input,
+                                          priv->spu_delays[param.delay.b_secondary],
+                                          param.delay.b_secondary );
             UpdatePtsDelay( p_input );
             break;
 
diff --git a/src/input/input_internal.h b/src/input/input_internal.h
index 0cd8484ca8..37f7c1c664 100644
--- a/src/input/input_internal.h
+++ b/src/input/input_internal.h
@@ -95,6 +95,7 @@ typedef union
     struct {
         bool b_absolute;
         vlc_tick_t i_val;
+        bool b_secondary;
     } delay;
     struct {
         vlc_es_id_t *id;
@@ -141,7 +142,7 @@ typedef struct input_thread_private_t
 
     /* Delays */
     vlc_tick_t  i_audio_delay;
-    vlc_tick_t  i_spu_delay;
+    vlc_tick_t  spu_delays[2]; /* Primary and secondary subtitle delay */
 
     /* Output */
     bool            b_out_pace_control; /* XXX Move it ot es_sout ? */
diff --git a/src/input/player.c b/src/input/player.c
index 483f6f0947..a3b9fde884 100644
--- a/src/input/player.c
+++ b/src/input/player.c
@@ -108,7 +108,7 @@ struct vlc_player_input
     struct input_stats_t stats;
 
     vlc_tick_t audio_delay;
-    vlc_tick_t subtitle_delay;
+    vlc_tick_t subtitle_delays[2];
 
     struct
     {
@@ -649,7 +649,8 @@ vlc_player_input_New(vlc_player_t *player, input_item_t *item)
 
     memset(&input->stats, 0, sizeof(input->stats));
 
-    input->audio_delay = input->subtitle_delay = 0;
+    input->audio_delay = input->subtitle_delays[0]
+                       = input->subtitle_delays[1] = 0;
 
     input->subsync.audio_time =
     input->subsync.subtitle_time = VLC_TICK_INVALID;
@@ -1965,10 +1966,15 @@ input_thread_Events(input_thread_t *input_thread,
                                  input->audio_delay);
             break;
         case INPUT_EVENT_SUBTITLE_DELAY:
-            input->subtitle_delay = event->subtitle_delay;
+        {
+            bool b_secondary = event->subtitle_delay.b_secondary;
+            int i_delay = event->subtitle_delay.i_delay;
+            input->subtitle_delays[b_secondary] = i_delay;
             vlc_player_SendEvent(player, on_subtitle_delay_changed,
-                                 input->subtitle_delay);
+                                 input->subtitle_delays[b_secondary],
+                                 event->subtitle_delay.b_secondary);
             break;
+        }
         case INPUT_EVENT_CACHE:
             input->cache = event->cache;
             vlc_player_SendEvent(player, on_buffering_changed, event->cache);
@@ -2711,6 +2717,7 @@ vlc_player_SetAudioDelay(vlc_player_t *player, vlc_tick_t delay,
             .delay = {
                 .b_absolute = whence == VLC_PLAYER_WHENCE_ABSOLUTE,
                 .i_val = delay,
+                .b_secondary = false,
             },
     });
 
@@ -2729,7 +2736,8 @@ vlc_player_GetAudioDelay(vlc_player_t *player)
 
 static void
 vlc_player_SetSubtitleDelayInternal(vlc_player_t *player, vlc_tick_t delay,
-                                    enum vlc_player_whence whence)
+                                    enum vlc_player_whence whence,
+                                    bool b_secondary)
 {
     bool absolute = whence == VLC_PLAYER_WHENCE_ABSOLUTE;
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
@@ -2741,16 +2749,19 @@ vlc_player_SetSubtitleDelayInternal(vlc_player_t *player, vlc_tick_t delay,
             .delay = {
                 .b_absolute = absolute,
                 .i_val = delay,
+                .b_secondary = b_secondary,
             },
     });
 }
 
 void
 vlc_player_SetSubtitleDelay(vlc_player_t *player, vlc_tick_t delay,
-                            enum vlc_player_whence whence)
+                            enum vlc_player_whence whence,
+                            bool b_secondary)
 {
-    vlc_player_SetSubtitleDelayInternal(player, delay, whence);
-    vlc_player_vout_OSDMessage(player, _("Subtitle delay: %s%i ms"),
+    vlc_player_SetSubtitleDelayInternal(player, delay, whence, b_secondary);
+    vlc_player_vout_OSDMessage(player, _("%subtitle delay: %s%i ms"),
+                               b_secondary ? "Secondary s" : "S",
                                whence == VLC_PLAYER_WHENCE_ABSOLUTE ? "" : "+",
                                (int)MS_FROM_VLC_TICK(delay));
 }
@@ -2842,10 +2853,10 @@ vlc_player_SubtitleSyncApply(vlc_player_t *player)
     input->subsync.audio_time = VLC_TICK_INVALID;
     input->subsync.subtitle_time = VLC_TICK_INVALID;
     vlc_player_SetSubtitleDelayInternal(player, delay,
-                                        VLC_PLAYER_WHENCE_RELATIVE);
+                                        VLC_PLAYER_WHENCE_RELATIVE, false);
 
     long long delay_ms = MS_FROM_VLC_TICK(delay);
-    long long totdelay_ms = MS_FROM_VLC_TICK(input->subtitle_delay + delay);
+    long long totdelay_ms = MS_FROM_VLC_TICK(input->subtitle_delays[0] + delay);
     vlc_player_vout_OSDMessage(player, _("Sub sync: corrected %"PRId64
                                " ms (total delay = %"PRId64" ms)"),
                                delay_ms, totdelay_ms);
@@ -2857,7 +2868,8 @@ vlc_player_SubtitleSyncReset(vlc_player_t *player)
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
     if (!input)
         return;
-    vlc_player_SetSubtitleDelayInternal(player, 0, VLC_PLAYER_WHENCE_ABSOLUTE);
+    vlc_player_SetSubtitleDelayInternal(player, 0, VLC_PLAYER_WHENCE_ABSOLUTE,
+                                        false);
     input->subsync.audio_time = VLC_TICK_INVALID;
     input->subsync.subtitle_time = VLC_TICK_INVALID;
     vlc_player_vout_OSDMessage(player, _("Sub sync: delay reset"));
@@ -2898,10 +2910,10 @@ vlc_player_SetSelectSecondarySubtitle(vlc_player_t *player, bool select)
 }
 
 vlc_tick_t
-vlc_player_GetSubtitleDelay(vlc_player_t *player)
+vlc_player_GetSubtitleDelay(vlc_player_t *player, bool b_secondary)
 {
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
-    return input ? input->subtitle_delay : 0;
+    return input ? input->subtitle_delays[b_secondary] : 0;
 }
 
 int
diff --git a/src/input/var.c b/src/input/var.c
index 9c9e7b9dba..5255227a03 100644
--- a/src/input/var.c
+++ b/src/input/var.c
@@ -410,9 +410,15 @@ void input_LegacyEvents( input_thread_t *p_input,
             var_Change( p_input, "audio-delay", VLC_VAR_SETVALUE, val );
             break;
         case INPUT_EVENT_SUBTITLE_DELAY:
-            val.i_int = event->subtitle_delay;
-            var_Change( p_input, "spu-delay", VLC_VAR_SETVALUE, val );
+        {
+            /* Dual subtitles are not supported in legacy GUI */
+            if ( !event->subtitle_delay.b_secondary )
+            {
+                val.i_int = event->subtitle_delay.i_delay;
+                var_Change( p_input, "spu-delay", VLC_VAR_SETVALUE, val );
+            }
             break;
+        }
         case INPUT_EVENT_BOOKMARK:
             UpdateBookmarksOption( p_input );
             break;
@@ -1073,6 +1079,8 @@ static int EsDelayCallback ( vlc_object_t *p_this, char const *psz_cmd,
         .delay = {
             .b_absolute = true,
             .i_val = newval.i_int,
+            /* Dual subtitles are not supported in legacy GUI */
+            .b_secondary = false,
         },
     };
     if( !strcmp( psz_cmd, "audio-delay" ) )
-- 
2.17.1



More information about the vlc-devel mailing list