[vlc-devel] [PATCH 03/14] Add variable to enable/disable dual subtitles

Jean-Baptiste Kempf jb at videolan.org
Sat May 11 09:46:41 CEST 2019


core and gui should be split, when this patch is applied.

On Sat, 11 May 2019, at 08:33, Roland Bewick wrote:
> Added "Enable Dual Subtitles" option to QT subtitle menu
> ---
>  include/vlc_player.h                              | 24 +++++++++++++++++++++++
>  modules/gui/macosx/playlist/VLCPlayerController.m |  1 +
>  modules/gui/qt/components/player_controller.cpp   | 19 ++++++++++++++++++
>  modules/gui/qt/components/player_controller.hpp   |  4 ++++
>  modules/gui/qt/components/player_controller_p.hpp |  3 ++-
>  modules/gui/qt/main_interface.cpp                 |  7 +++++++
>  modules/gui/qt/main_interface.hpp                 |  5 +++++
>  modules/gui/qt/qml/menus/SubtitleMenu.qml         |  8 ++++++++
>  src/input/es_out.c                                |  3 ++-
>  src/input/player.c                                | 11 +++++++++++
>  src/input/var.c                                   |  1 +
>  src/libvlc-module.c                               | 23 ++++++++++++++++++++++
>  src/libvlccore.sym                                |  1 +
>  13 files changed, 108 insertions(+), 2 deletions(-)
> 
> diff --git a/include/vlc_player.h b/include/vlc_player.h
> index 077b3883ad..c09e226910 100644
> --- a/include/vlc_player.h
> +++ b/include/vlc_player.h
> @@ -695,6 +695,18 @@ struct vlc_player_cbs
>       */
>      void (*on_associated_subs_fps_changed)(vlc_player_t *player,
>          float subs_fps, void *data);
> +    
> +    /**
> +     * Called when dual subtitles enabled has changed
> +     *
> +     * @see vlc_player_SetDualSubtitlesEnabled()
> +     *
> +     * @param player locked player instance
> +     * @param enabled true if dual subtitle selection is enabled
> +     * @param data opaque pointer set by vlc_player_AddListener()
> +     */
> +    void (*on_dual_subtitles_enabled_changed)(vlc_player_t *player,
> +        bool enabled, void *data);
>  
>      /**
>       * Called when a new renderer item is set
> @@ -2260,6 +2272,18 @@ VLC_API float
>  vlc_player_GetAssociatedSubsFPS(vlc_player_t *player);
>  
>  /**
> + * Enable or disable the abiltity to select multiple sub tracks.
> + *
> + * @note A successful call will trigger the
> + * vlc_player_cbs.on_dual_subtitles_enabled_changed event.
> + *
> + * @param player locked player instance
> + * @param enabled Enable dual subtitle track selection
> + */
> +VLC_API void
> +vlc_player_SetDualSubtitlesEnabled(vlc_player_t *player, bool enabled);
> +
> +/**
>   * Set the renderer
>   *
>   * Valid for the current media and all future ones.
> diff --git a/modules/gui/macosx/playlist/VLCPlayerController.m 
> b/modules/gui/macosx/playlist/VLCPlayerController.m
> index 463bee5946..d23770995f 100644
> --- a/modules/gui/macosx/playlist/VLCPlayerController.m
> +++ b/modules/gui/macosx/playlist/VLCPlayerController.m
> @@ -462,6 +462,7 @@ static const struct vlc_player_cbs player_callbacks 
> = {
>      cb_player_audio_delay_changed,
>      cb_player_subtitle_delay_changed,
>      cb_player_associated_subs_fps_changed,
> +    NULL, //cb_player_dual_subtitles_enabled_changed
>      cb_player_renderer_changed,
>      cb_player_record_changed,
>      NULL, //cb_player_signal_changed,
> diff --git a/modules/gui/qt/components/player_controller.cpp 
> b/modules/gui/qt/components/player_controller.cpp
> index e42f7b5b9d..011f9916f6 100644
> --- a/modules/gui/qt/components/player_controller.cpp
> +++ b/modules/gui/qt/components/player_controller.cpp
> @@ -607,6 +607,16 @@ static void 
> on_player_associated_subs_fps_changed(vlc_player_t *, float subs_fps
>      });
>  }
>  
> +static void on_player_dual_subtitles_enabled_changed(vlc_player_t *, 
> bool enabled, void *data)
> +{
> +    PlayerControllerPrivate* that = 
> static_cast<PlayerControllerPrivate*>(data);
> +    msg_Dbg( that->p_intf, "on_dual_subtitles_enabled_changed");
> +    that->callAsync([that,enabled] (){
> +        that->m_dualSubtitlesEnabled = enabled;
> +        emit that->q_func()->dualSubtitlesEnabledChanged( enabled );
> +    });
> +}
> +
>  void on_player_renderer_changed(vlc_player_t *, vlc_renderer_item_t 
> *new_item, void *data)
>  {
>      VLC_UNUSED(new_item);
> @@ -818,6 +828,7 @@ static const struct vlc_player_cbs player_cbs = {
>      on_player_audio_delay_changed,
>      on_player_subtitle_delay_changed,
>      on_player_associated_subs_fps_changed,
> +    on_player_dual_subtitles_enabled_changed,
>      on_player_renderer_changed,
>      on_player_record_changed,
>      on_player_signal_changed,
> @@ -1055,6 +1066,13 @@ void PlayerController::setSubtitleFPS(float fps)
>      vlc_player_SetAssociatedSubsFPS( d->m_player, fps );
>  }
>  
> +void PlayerController::setDualSubtitlesEnabled(bool enabled)
> +{
> +    Q_D(PlayerController);
> +    vlc_player_locker lock{ d->m_player };
> +    vlc_player_SetDualSubtitlesEnabled( d->m_player, enabled );
> +}
> +
>  //TITLE/CHAPTER/MENU
>  
>  void PlayerController::sectionPrev()
> @@ -1471,6 +1489,7 @@ PRIMITIVETYPE_GETTER(bool, isPausable, 
> m_capabilities & VLC_INPUT_CAPABILITIES_P
>  PRIMITIVETYPE_GETTER(bool, isRecordable, m_capabilities & 
> VLC_INPUT_CAPABILITIES_RECORDABLE)
>  PRIMITIVETYPE_GETTER(bool, isRateChangable, m_capabilities & 
> VLC_INPUT_CAPABILITIES_CHANGE_RATE)
>  PRIMITIVETYPE_GETTER(float, getSubtitleFPS, m_subtitleFPS)
> +PRIMITIVETYPE_GETTER(bool, areDualSubtitlesEnabled, 
> m_dualSubtitlesEnabled)
>  PRIMITIVETYPE_GETTER(bool, hasVideoOutput, m_hasVideo)
>  PRIMITIVETYPE_GETTER(float, getBuffering, m_buffering)
>  PRIMITIVETYPE_GETTER(PlayerController::MediaStopAction, 
> getMediaStopAction, m_mediaStopAction)
> diff --git a/modules/gui/qt/components/player_controller.hpp 
> b/modules/gui/qt/components/player_controller.hpp
> index cdf7c8129d..dc474d836f 100644
> --- a/modules/gui/qt/components/player_controller.hpp
> +++ b/modules/gui/qt/components/player_controller.hpp
> @@ -125,6 +125,7 @@ public:
>      Q_PROPERTY(VLCTick audioDelay READ getAudioDelay WRITE 
> setAudioDelay NOTIFY audioDelayChanged)
>      Q_PROPERTY(VLCTick subtitleDelay READ getSubtitleDelay WRITE 
> setSubtitleDelay NOTIFY subtitleDelayChanged)
>      Q_PROPERTY(float subtitleFPS READ getSubtitleFPS WRITE 
> setSubtitleFPS NOTIFY subtitleFPSChanged)
> +    Q_PROPERTY(bool dualSubtitlesEnabled READ areDualSubtitlesEnabled 
> WRITE setDualSubtitlesEnabled NOTIFY dualSubtitlesEnabledChanged)
>  
>      //title/chapters/menu
>      Q_PROPERTY(TitleListModel* titles READ getTitles CONSTANT)
> @@ -271,6 +272,8 @@ public slots:
>      void setSubtitleDelay( VLCTick );
>      float getSubtitleFPS( ) const;
>      void setSubtitleFPS( float );
> +    bool areDualSubtitlesEnabled() const;
> +    void setDualSubtitlesEnabled( bool );
>  
>      //title/chapters/menu
>      TitleListModel* getTitles();
> @@ -353,6 +356,7 @@ signals:
>      void audioDelayChanged(VLCTick);
>      void subtitleDelayChanged(VLCTick);
>      void subtitleFPSChanged(float);
> +    void dualSubtitlesEnabledChanged(bool);
>  
>      //title/chapters/menu
>      void hasTitlesChanged( bool );
> diff --git a/modules/gui/qt/components/player_controller_p.hpp 
> b/modules/gui/qt/components/player_controller_p.hpp
> index 3a52205aa2..c03da62da7 100644
> --- a/modules/gui/qt/components/player_controller_p.hpp
> +++ b/modules/gui/qt/components/player_controller_p.hpp
> @@ -91,7 +91,8 @@ public:
>  
>      VLCTick      m_audioDelay = 0;
>      VLCTick      m_subtitleDelay = 0;
> -    float           m_subtitleFPS = 1.0;
> +    float        m_subtitleFPS = 1.0;
> +    bool         m_dualSubtitlesEnabled = false;
>  
>      //title/chapters/menu
>      TitleListModel m_titleList;
> diff --git a/modules/gui/qt/main_interface.cpp 
> b/modules/gui/qt/main_interface.cpp
> index ef185c3f25..ebb341ddfc 100644
> --- a/modules/gui/qt/main_interface.cpp
> +++ b/modules/gui/qt/main_interface.cpp
> @@ -550,6 +550,13 @@ void MainInterface::setInterfaceAlwaysOnTop( bool 
> on_top )
>      emit interfaceAlwaysOnTopChanged(on_top);
>  }
>  
> +void MainInterface::setDualSubtitlesEnabled( bool enabled )
> +{
> +    b_dualSubtitlesEnabled = enabled;
> +    THEMIM->setDualSubtitlesEnabled(enabled);
> +    emit dualSubtitlesEnabledChanged(enabled);
> +}
> +
>  /* Asynchronous calls for video window contrlos */
>  int MainInterface::enableVideo( vout_window_t *p_wnd,
>                                   const vout_window_cfg_t *cfg )
> diff --git a/modules/gui/qt/main_interface.hpp 
> b/modules/gui/qt/main_interface.hpp
> index 3ceb91b40f..eab8500db9 100644
> --- a/modules/gui/qt/main_interface.hpp
> +++ b/modules/gui/qt/main_interface.hpp
> @@ -66,6 +66,7 @@ class MainInterface : public QVLCMW
>      Q_PROPERTY(bool interfaceAlwaysOnTop READ isInterfaceAlwaysOnTop 
> WRITE setInterfaceAlwaysOnTop NOTIFY interfaceAlwaysOnTopChanged)
>      Q_PROPERTY(bool interfaceFullScreen READ isInterfaceFullScreen 
> WRITE setInterfaceFullScreen NOTIFY interfaceFullScreenChanged)
>      Q_PROPERTY(bool hasEmbededVideo READ hasEmbededVideo NOTIFY 
> hasEmbededVideoChanged)
> +    Q_PROPERTY(bool dualSubtitlesEnabled READ areDualSubtitlesEnabled 
> WRITE setDualSubtitlesEnabled NOTIFY dualSubtitlesEnabledChanged)
>      Q_PROPERTY(VLCVarChoiceModel* extraInterfaces READ 
> getExtraInterfaces CONSTANT)
>  
>  public:
> @@ -113,6 +114,7 @@ public:
>      bool isInterfaceFullScreen() { return b_interfaceFullScreen; }
>      bool isInterfaceAlwaysOnTop() { return b_interfaceOnTop; }
>      bool hasEmbededVideo() { return m_hasEmbededVideo; }
> +    bool areDualSubtitlesEnabled() { return b_dualSubtitlesEnabled; }
>      QList<QQmlError> qmlErrors() const;
>  
>  protected:
> @@ -137,6 +139,7 @@ protected:
>  
>      /* */
>      void setInterfaceFullScreen( bool );
> +    void setDualSubtitlesEnabled( bool );
>      void computeMinimumSize();
>  
>      /* */
> @@ -187,6 +190,7 @@ protected:
>      bool                 b_plDocked;            ///< Is the playlist docked ?
>  
>      bool                 b_hasPausedWhenMinimized;
> +    bool                 b_dualSubtitlesEnabled;
>  
>      static const Qt::Key kc[10]; /* easter eggs */
>      int i_kc_offset;
> @@ -245,6 +249,7 @@ signals:
>      void interfaceAlwaysOnTopChanged(bool);
>      void interfaceFullScreenChanged(bool);
>      void hasEmbededVideoChanged(bool);
> +    void dualSubtitlesEnabledChanged(bool);
>  };
>  
>  #endif
> diff --git a/modules/gui/qt/qml/menus/SubtitleMenu.qml 
> b/modules/gui/qt/qml/menus/SubtitleMenu.qml
> index 7ac1a9da29..0c74076516 100644
> --- a/modules/gui/qt/qml/menus/SubtitleMenu.qml
> +++ b/modules/gui/qt/qml/menus/SubtitleMenu.qml
> @@ -32,4 +32,12 @@ Utils.MenuExt {
>          enabled: player.isPlaying
>          model: player.subtitleTracks
>      }
> +
> +    Action {
> +        text: qsTr("&Enable Dual Subtitles")
> +        checkable: true
> +        enabled: player.isPlaying
> +        checked: rootWindow.dualSubtitlesEnabled
> +        onTriggered: rootWindow.dualSubtitlesEnabled = 
> !rootWindow.dualSubtitlesEnabled
> +    }
>  }
> diff --git a/src/input/es_out.c b/src/input/es_out.c
> index a9f4e3012b..1f2afca557 100644
> --- a/src/input/es_out.c
> +++ b/src/input/es_out.c
> @@ -2081,7 +2081,8 @@ static void EsOutSelect( es_out_t *out, 
> es_out_id_t *es, bool b_force )
>      bool b_select_secondary_subtitle = es->fmt.i_cat == SPU_ES && 
>                                 p_sys->b_multiple_subtitle_selection &&
>                                 p_esprops->p_main_es != NULL &&
> -                               EsIsSelected(p_esprops->p_main_es);
> +                               EsIsSelected(p_esprops->p_main_es) &&
> +                               var_GetBool( p_sys->p_input, 
> "multiple-spus" );
>  
>      if ( b_select_secondary_subtitle &&
>           EsOutCountSelected( p_sys, es->fmt.i_cat ) > 1 )
> diff --git a/src/input/player.c b/src/input/player.c
> index 843f86000c..47298e9fcd 100644
> --- a/src/input/player.c
> +++ b/src/input/player.c
> @@ -2155,6 +2155,17 @@ vlc_player_GetAssociatedSubsFPS(vlc_player_t *player)
>      return var_GetFloat(player, "sub-fps");
>  }
>  
> +void 
> +vlc_player_SetDualSubtitlesEnabled(vlc_player_t *player, bool enabled)
> +{
> +    struct vlc_player_input *input = 
> vlc_player_get_input_locked(player);
> +    if (input)
> +    {
> +        var_SetBool(input->thread, "multiple-spus", enabled);
> +        vlc_player_SendEvent(player, 
> on_dual_subtitles_enabled_changed, enabled);
> +    }
> +}
> +
>  void
>  vlc_player_InvalidateNextMedia(vlc_player_t *player)
>  {
> diff --git a/src/input/var.c b/src/input/var.c
> index 7822d66003..9110624eab 100644
> --- a/src/input/var.c
> +++ b/src/input/var.c
> @@ -726,6 +726,7 @@ void input_ConfigVarInit ( input_thread_t *p_input )
>          var_Create( p_input, "video", VLC_VAR_BOOL | VLC_VAR_DOINHERIT 
> );
>          var_Create( p_input, "audio", VLC_VAR_BOOL | VLC_VAR_DOINHERIT 
> );
>          var_Create( p_input, "spu", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
> +        var_Create( p_input, "multiple-spus", VLC_VAR_BOOL);
>  
>          var_Create( p_input, "video-track", 
> VLC_VAR_INTEGER|VLC_VAR_DOINHERIT );
>          var_Create( p_input, "audio-track", 
> VLC_VAR_INTEGER|VLC_VAR_DOINHERIT );
> diff --git a/src/libvlc-module.c b/src/libvlc-module.c
> index aeddd1844b..aef485b45a 100644
> --- a/src/libvlc-module.c
> +++ b/src/libvlc-module.c
> @@ -370,6 +370,11 @@ static const char *const ppsz_pos_descriptions[] =
>  { N_("Center"), N_("Left"), N_("Right"), N_("Top"), N_("Bottom"),
>    N_("Top-Left"), N_("Top-Right"), N_("Bottom-Left"), 
> N_("Bottom-Right") };
>  
> +static const int pi_sub_align_values[] = { -1, 0, 1, 2, 4, 8, 5, 6, 9, 10 };
> +static const char *const ppsz_sub_align_descriptions[] =
> +{ N_("Unset"), N_("Center"), N_("Left"), N_("Right"), N_("Top"), N_("Bottom"),
> +  N_("Top-Left"), N_("Top-Right"), N_("Bottom-Left"), N_("Bottom-Right") };
> +
>  #define SS_TEXT N_("Disable screensaver")
>  #define SS_LONGTEXT N_("Disable the screensaver during video playback." )
>  
> @@ -742,6 +747,15 @@ static const char *const ppsz_prefres[] = {
>  #define SPU_LONGTEXT N_( \
>      "You can completely disable the sub-picture processing.")
>  
> +#define SECONDARY_SPU_POSITION_TEXT N_("Position of secondary 
> subtitles")
> +#define SECONDARY_SPU_POSITION_LONGTEXT N_( \
> +    "Place on video where to display secondary subtitles (default 
> bottom center).")
> +
> +#define SECONDARY_SUB_MARGIN_TEXT N_("Force secondary subtitle 
> position")
> +#define SECONDARY_SUB_MARGIN_LONGTEXT N_( \
> +    "You can use this option to vertically adjust the position 
> secondary " \
> +    "subtitles are displayed.")
> +
>  #define OSD_TEXT N_("On Screen Display")
>  #define OSD_LONGTEXT N_( \
>      "VLC can display messages on the video. This is called OSD (On 
> Screen " \
> @@ -1752,6 +1766,15 @@ vlc_module_begin ()
>      add_module_list("sub-filter", "sub filter", NULL,
>                      SUB_FILTER_TEXT, SUB_FILTER_LONGTEXT)
>  
> +    set_section( N_( "Dual Subtitles" ) , NULL )
> +    add_integer( "secondary-spu-alignment", -1, SECONDARY_SPU_POSITION_TEXT,
> +                 SECONDARY_SPU_POSITION_LONGTEXT, false )
> +        change_integer_list( pi_sub_align_values, ppsz_sub_align_descriptions )
> +    /* Push the secondary subtitles up a bit so they won't overlap with
> +       the primary subtitles using the default settings.*/
> +    add_integer( "secondary-sub-margin", 100, SECONDARY_SUB_MARGIN_TEXT,
> +                 SECONDARY_SUB_MARGIN_LONGTEXT, true )
> +
>  /* Input options */
>      set_category( CAT_INPUT )
>      set_subcategory( SUBCAT_INPUT_GENERAL )
> diff --git a/src/libvlccore.sym b/src/libvlccore.sym
> index d0070d42b8..175d9a9639 100644
> --- a/src/libvlccore.sym
> +++ b/src/libvlccore.sym
> @@ -869,6 +869,7 @@ vlc_player_SetSubtitleDelay
>  vlc_player_SetSubtitleSync
>  vlc_player_SetSubtitleTextScale
>  vlc_player_SetSubtitleMultipleSelection
> +vlc_player_SetDualSubtitlesEnabled
>  vlc_player_SetTeletextEnabled
>  vlc_player_SetTeletextTransparency
>  vlc_player_SetTrackCategoryEnabled
> -- 
> 2.11.0
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel

-- 
Jean-Baptiste Kempf -  President
+33 672 704 734


More information about the vlc-devel mailing list