[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