[vlc-devel] [PATCH 06/10] Hotkey support for secondary subtitles (Part 1) - Toggle control of primary/secondary subtitles - Adjust Secondary subtitle margin (NB: Margin is only applied the first time the subtitle is rendered.)

Thomas Guillem thomas at gllm.fr
Mon May 6 09:37:03 CEST 2019


Nitpick:
The commit title is too long. Add more text to the commit message instead.

On Sun, May 5, 2019, at 12:03, Roland Bewick wrote:
> ---
>  include/vlc_actions.h               |  2 ++
>  modules/control/hotkeys.c           | 18 ++++++++++++++++--
>  src/input/player.c                  |  5 ++++-
>  src/libvlc-module.c                 |  6 ++++++
>  src/misc/actions.c                  |  1 +
>  src/video_output/video_output.c     |  4 ++--
>  src/video_output/vout_internal.h    |  4 ++--
>  src/video_output/vout_intf.c        | 21 ++++++++++++++++++++-
>  src/video_output/vout_subpictures.c |  9 ++++++---
>  9 files changed, 59 insertions(+), 11 deletions(-)
> 
> diff --git a/include/vlc_actions.h b/include/vlc_actions.h
> index 62f0afae53..e8e2224c80 100644
> --- a/include/vlc_actions.h
> +++ b/include/vlc_actions.h
> @@ -191,6 +191,8 @@ typedef enum vlc_action_id {
>      ACTIONID_SUBDELAY_UP,
>      /* subtitle toggle */
>      ACTIONID_SUBTITLE_TOGGLE,
> +    /* dual subtitle control */
> +    ACTIONID_SUBTITLE_CONTROL_SECONDARY,
>      /* subtitle sync */
>      ACTIONID_SUBSYNC_MARKAUDIO,
>      ACTIONID_SUBSYNC_MARKSUB,
> diff --git a/modules/control/hotkeys.c b/modules/control/hotkeys.c
> index 774d833b87..d520d8a7ed 100644
> --- a/modules/control/hotkeys.c
> +++ b/modules/control/hotkeys.c
> @@ -51,6 +51,8 @@ struct intf_sys_t
>  
>  static void handle_action(intf_thread_t *, vlc_action_id_t);
>  
> +static bool b_control_secondary_subtitles = false;
> +
>  /*****************************
>   * interface action handling *
>   *****************************/
> @@ -447,6 +449,14 @@ PLAYER_ACTION_HANDLER(ToggleSubtitle)
>      vlc_player_ToggleSubtitle(player);
>  }
>  
> +PLAYER_ACTION_HANDLER(ControlSubtitleSecondary)
> +{
> +    VLC_UNUSED(action_id);
> +    b_control_secondary_subtitles = !b_control_secondary_subtitles;
> +    vlc_player_vout_OSDMessage(player, _("%s subtitle control"),
> +        b_control_secondary_subtitles ? "Secondary" : "Primary");
> +}
> +
>  PLAYER_ACTION_HANDLER(SyncSubtitle)
>  {
>      switch (action_id)
> @@ -762,13 +772,15 @@ VOUT_ACTION_HANDLER(Deinterlace)
>  
>  VOUT_ACTION_HANDLER(SubtitleDisplay)
>  {
> +    char* psz_sub_margin = b_control_secondary_subtitles ?
> +        "secondary-sub-margin" : "sub-margin";
>      switch (action_id)
>      {
>          case ACTIONID_SUBPOS_DOWN:
> -            var_DecInteger(vout, "sub-margin");
> +            var_DecInteger(vout, psz_sub_margin);
>              break;
>          case ACTIONID_SUBPOS_UP:
> -            var_IncInteger(vout, "sub-margin");
> +            var_IncInteger(vout, psz_sub_margin);
>              break;
>          default:
>          {
> @@ -858,6 +870,8 @@ static struct vlc_action const actions[] =
>      VLC_ACTION_PLAYER(AUDIODELAY_DOWN, SUBDELAY_UP, Delay, true)
>      VLC_ACTION_PLAYER(RATE_NORMAL, RATE_FASTER_FINE, Rate, true)
>      VLC_ACTION_PLAYER(SUBTITLE_TOGGLE, SUBTITLE_TOGGLE, 
> ToggleSubtitle, true)
> +    VLC_ACTION_PLAYER(SUBTITLE_CONTROL_SECONDARY, 
> SUBTITLE_CONTROL_SECONDARY,
> +                      ControlSubtitleSecondary, true)
>      VLC_ACTION_PLAYER(SUBSYNC_MARKAUDIO, SUBSYNC_RESET, SyncSubtitle, 
> true)
>      VLC_ACTION_PLAYER(NAV_ACTIVATE, NAV_RIGHT, Navigate, true)
>      VLC_ACTION_PLAYER(VIEWPOINT_FOV_IN, VIEWPOINT_ROLL_ANTICLOCK, 
> Viewpoint, true)
> diff --git a/src/input/player.c b/src/input/player.c
> index 977fc95d94..483f6f0947 100644
> --- a/src/input/player.c
> +++ b/src/input/player.c
> @@ -1795,7 +1795,7 @@ vlc_player_input_HandleVoutEvent(struct 
> vlc_player_input *input,
>      static const char osd_vars[][sizeof("deinterlace-mode")] = {
>          "aspect-ratio", "autoscale", "crop", "crop-bottom",
>          "crop-top", "crop-left", "crop-right", "deinterlace",
> -        "deinterlace-mode", "sub-margin", "zoom"
> +        "deinterlace-mode", "sub-margin", "secondary-sub-margin", 
> "zoom"
>      };
>  
>      vlc_player_t *player = input->player;
> @@ -3287,6 +3287,9 @@ vlc_player_VoutOSDCallback(vlc_object_t *this, 
> const char *var,
>  
>      else if (strcmp(var, "sub-margin") == 0)
>          vouts_osd_Message(&vout, 1, _("Subtitle position %d px"), 
> newval.i_int);
> +    
> +    else if (strcmp(var, "secondary-sub-margin") == 0)
> +        vouts_osd_Message(&vout, 1, _("Secondary subtitle position %d 
> px"), newval.i_int);
>  
>      else if (strcmp(var, "sub-text-scale") == 0)
>          vouts_osd_Message(&vout, 1, _("Subtitle text scale %d%%"), 
> newval.i_int);
> diff --git a/src/libvlc-module.c b/src/libvlc-module.c
> index bbc21a32a5..c6e793695f 100644
> --- a/src/libvlc-module.c
> +++ b/src/libvlc-module.c
> @@ -1460,6 +1460,8 @@ static const char *const mouse_wheel_texts[] = {
>  #define SUBTITLE_TRACK_KEY_LONGTEXT N_("Cycle through the available 
> subtitle tracks.")
>  #define SUBTITLE_TOGGLE_KEY_TEXT N_("Toggle subtitles")
>  #define SUBTITLE_TOGGLE_KEY_LONGTEXT N_("Toggle subtitle track 
> visibility.")
> +#define SUBTITLE_CONTROL_SECONDARY_KEY_TEXT N_("Toggle secondary 
> subtitle control")
> +#define SUBTITLE_CONTROL_SECONDARY_KEY_LONGTEXT N_("Use original 
> subtitle controls to manage secondary subtitles.")
>  #define PROGRAM_SID_NEXT_KEY_TEXT N_("Cycle next program Service ID")
>  #define PROGRAM_SID_NEXT_KEY_LONGTEXT N_("Cycle through the available 
> next program Service IDs (SIDs).")
>  #define PROGRAM_SID_PREV_KEY_TEXT N_("Cycle previous program Service 
> ID")
> @@ -2360,6 +2362,7 @@ vlc_module_begin ()
>  #   define KEY_AUDIO_TRACK        "l"
>  #   define KEY_SUBTITLE_TRACK     "s"
>  #   define KEY_SUBTITLE_TOGGLE    "Shift+s"
> +#   define KEY_SUBTITLE_CONTROL_S "Command+Shift+v"
>  #   define KEY_SUBTITLE_REVTRACK  "Alt+s"
>  #   define KEY_PROGRAM_SID_NEXT   "x"
>  #   define KEY_PROGRAM_SID_PREV   "Shift+x"
> @@ -2503,6 +2506,7 @@ vlc_module_begin ()
>  #   define KEY_AUDIO_TRACK        "b"
>  #   define KEY_SUBTITLE_TRACK     "v"
>  #   define KEY_SUBTITLE_TOGGLE    "Shift+v"
> +#   define KEY_SUBTITLE_CONTROL_S "Ctrl+Shift+v"
>  #   define KEY_SUBTITLE_REVTRACK  "Alt+v"
>  #   define KEY_PROGRAM_SID_NEXT   "x"
>  #   define KEY_PROGRAM_SID_PREV   "Shift+x"
> @@ -2672,6 +2676,8 @@ vlc_module_begin ()
>              SUBTITLE_TRACK_KEY_TEXT, SUBTITLE_TRACK_KEY_LONGTEXT)
>      add_key("key-subtitle-toggle", KEY_SUBTITLE_TOGGLE,
>              SUBTITLE_TOGGLE_KEY_TEXT, SUBTITLE_TOGGLE_KEY_LONGTEXT)
> +    add_key("key-subtitle-control-secondary", KEY_SUBTITLE_CONTROL_S,
> +            SUBTITLE_CONTROL_SECONDARY_KEY_TEXT, 
> SUBTITLE_CONTROL_SECONDARY_KEY_LONGTEXT)
>      add_key("key-program-sid-next", KEY_PROGRAM_SID_NEXT,
>              PROGRAM_SID_NEXT_KEY_TEXT, PROGRAM_SID_NEXT_KEY_LONGTEXT)
>      add_key("key-program-sid-prev", KEY_PROGRAM_SID_PREV,
> diff --git a/src/misc/actions.c b/src/misc/actions.c
> index e10eb94790..b6e76e75d9 100644
> --- a/src/misc/actions.c
> +++ b/src/misc/actions.c
> @@ -347,6 +347,7 @@ static const struct name2action
>      { "subsync-markaudio", ACTIONID_SUBSYNC_MARKAUDIO, },
>      { "subsync-marksub", ACTIONID_SUBSYNC_MARKSUB, },
>      { "subsync-reset", ACTIONID_SUBSYNC_RESET, },
> +    { "subtitle-control-secondary", 
> ACTIONID_SUBTITLE_CONTROL_SECONDARY, },
>      { "subtitle-revtrack", ACTIONID_SUBTITLE_REVERSE_TRACK, },
>      { "subtitle-text-scale-down", ACTIONID_SUBTITLE_TEXT_SCALE_DOWN, },
>      { "subtitle-text-scale-normal", 
> ACTIONID_SUBTITLE_TEXT_SCALE_NORMAL, },
> diff --git a/src/video_output/video_output.c 
> b/src/video_output/video_output.c
> index 4043369b6f..39136e1275 100644
> --- a/src/video_output/video_output.c
> +++ b/src/video_output/video_output.c
> @@ -572,13 +572,13 @@ void vout_ControlChangeSubFilters(vout_thread_t 
> *vout, const char *filters)
>      vlc_mutex_unlock(&vout->p->spu_lock);
>  }
>  
> -void vout_ChangeSubMargin(vout_thread_t *vout, int margin)
> +void vout_ChangeSubMargin(vout_thread_t *vout, int margin, bool b_secondary)
>  {
>      if (unlikely(vout->p->spu == NULL))
>          return;
>  
>      vlc_mutex_lock(&vout->p->spu_lock);
> -    spu_ChangeMargin(vout->p->spu, margin);
> +    spu_ChangeMargin(vout->p->spu, margin, b_secondary);
>      vlc_mutex_unlock(&vout->p->spu_lock);
>  }
>  
> diff --git a/src/video_output/vout_internal.h 
> b/src/video_output/vout_internal.h
> index 9e4473b384..2375418a60 100644
> --- a/src/video_output/vout_internal.h
> +++ b/src/video_output/vout_internal.h
> @@ -237,7 +237,7 @@ void vout_ChangeCropBorder(vout_thread_t *, int 
> left, int top, int right, int bo
>  void vout_ControlChangeFilters(vout_thread_t *, const char *);
>  void vout_ControlChangeSubSources(vout_thread_t *, const char *);
>  void vout_ControlChangeSubFilters(vout_thread_t *, const char *);
> -void vout_ChangeSubMargin(vout_thread_t *, int);
> +void vout_ChangeSubMargin(vout_thread_t *, int, bool b_secondary);
>  void vout_ChangeViewpoint( vout_thread_t *, const vlc_viewpoint_t *);
>  
>  /* */
> @@ -259,7 +259,7 @@ void spu_Detach( spu_t * );
>  void spu_clock_Set(spu_t *, vlc_clock_t *, bool b_secondary);
>  void spu_clock_Reset(spu_t *, bool b_secondary);
>  void spu_clock_SetDelay(spu_t *spu, vlc_tick_t delay, bool b_secondary);
> -void spu_ChangeMargin(spu_t *, int);
> +void spu_ChangeMargin(spu_t *, int, bool b_secondary);
>  void spu_SetHighlight(spu_t *, const vlc_spu_highlight_t*);
>  
>  /**
> diff --git a/src/video_output/vout_intf.c b/src/video_output/vout_intf.c
> index 260c160ab4..b0a4469a04 100644
> --- a/src/video_output/vout_intf.c
> +++ b/src/video_output/vout_intf.c
> @@ -74,6 +74,8 @@ static int SubFilterCallback( vlc_object_t *, char const *,
>                                vlc_value_t, vlc_value_t, void * );
>  static int SubMarginCallback( vlc_object_t *, char const *,
>                                vlc_value_t, vlc_value_t, void * );
> +static int SecondarySubMarginCallback( vlc_object_t *, char const *,
> +                                       vlc_value_t, vlc_value_t, void * );
>  static int ViewpointCallback( vlc_object_t *, char const *,
>                                vlc_value_t, vlc_value_t, void * );
>  
> @@ -286,6 +288,11 @@ void vout_IntfInit( vout_thread_t *p_vout )
>                  VLC_VAR_INTEGER | VLC_VAR_DOINHERIT | VLC_VAR_ISCOMMAND );
>      var_AddCallback( p_vout, "sub-margin", SubMarginCallback, NULL );
>  
> +    /* Add secondary-sub-margin variable (dual subtitles) */
> +    var_Create( p_vout, "secondary-sub-margin",
> +                VLC_VAR_INTEGER | VLC_VAR_DOINHERIT | 
> VLC_VAR_ISCOMMAND );
> +    var_AddCallback( p_vout, "secondary-sub-margin", 
> SecondarySubMarginCallback, NULL );
> +
>      /* Mouse coordinates */
>      var_Create( p_vout, "mouse-button-down", VLC_VAR_INTEGER );
>      var_Create( p_vout, "mouse-moved", VLC_VAR_COORDS );
> @@ -309,12 +316,14 @@ void vout_IntfReinit( vout_thread_t *p_vout )
>      var_TriggerCallback( p_vout, "sub-source" );
>      var_TriggerCallback( p_vout, "sub-filter" );
>      var_TriggerCallback( p_vout, "sub-margin" );
> +    var_TriggerCallback( p_vout, "secondary-sub-margin" );
>  }
>  
>  void vout_IntfDeinit(vlc_object_t *obj)
>  {
>      var_DelCallback(obj, "viewpoint", ViewpointCallback, NULL);
>      var_DelCallback(obj, "sub-margin", SubMarginCallback, NULL);
> +    var_DelCallback(obj, "secondary-sub-margin", 
> SecondarySubMarginCallback, NULL);
>      var_DelCallback(obj, "sub-filter", SubFilterCallback, NULL);
>      var_DelCallback(obj, "sub-source", SubSourceCallback, NULL);
>      var_DelCallback(obj, "video-filter", VideoFilterCallback, NULL);
> @@ -610,7 +619,17 @@ static int SubMarginCallback( vlc_object_t 
> *p_this, char const *psz_cmd,
>      vout_thread_t *p_vout = (vout_thread_t *)p_this;
>      VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval); VLC_UNUSED(p_data);
>  
> -    vout_ChangeSubMargin(p_vout, newval.i_int);
> +    vout_ChangeSubMargin(p_vout, newval.i_int, false);
> +    return VLC_SUCCESS;
> +}
> +
> +static int SecondarySubMarginCallback( vlc_object_t *p_this, char 
> const *psz_cmd,
> +                              vlc_value_t oldval, vlc_value_t newval, 
> void *p_data)
> +{
> +    vout_thread_t *p_vout = (vout_thread_t *)p_this;
> +    VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval); VLC_UNUSED(p_data);
> +
> +    vout_ChangeSubMargin(p_vout, newval.i_int, true);
>      return VLC_SUCCESS;
>  }
>  
> diff --git a/src/video_output/vout_subpictures.c 
> b/src/video_output/vout_subpictures.c
> index 52aab98900..7349a22482 100644
> --- a/src/video_output/vout_subpictures.c
> +++ b/src/video_output/vout_subpictures.c
> @@ -94,7 +94,7 @@ struct spu_private_t {
>      video_palette_t palette;              /**< force palette of 
> subpicture */
>  
>      int secondary_sub_alignment;   /**< force alignment for secondary subs */
> -    int secondary_sub_margin;      /**< move the secondary sub vertically  */
> +    atomic_int secondary_sub_margin;/**< move the secondary sub vertically */
>  
>      /* Subpiture filters */
>      char           *source_chain_current;
> @@ -1855,11 +1855,14 @@ void spu_ChangeFilters(spu_t *spu, const char *filters)
>      vlc_mutex_unlock(&sys->lock);
>  }
>  
> -void spu_ChangeMargin(spu_t *spu, int margin)
> +void spu_ChangeMargin(spu_t *spu, int margin, bool b_secondary)
>  {
>      spu_private_t *sys = spu->p;
>  
> -    atomic_store(&sys->margin, margin);
> +    if (!b_secondary)
> +        atomic_store(&sys->margin, margin);
> +    else
> +        atomic_store(&sys->secondary_sub_margin, margin);
>  }
>  
>  void spu_SetHighlight(spu_t *spu, const vlc_spu_highlight_t *hl)
> -- 
> 2.17.1
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list