[vlc-devel] [PATCH v2 03/11] actions: seek and change volume if not menu|interactive|360
Rémi Denis-Courmont
remi at remlab.net
Wed Aug 9 21:51:13 CEST 2017
Le keskiviikkona 9. elokuuta 2017, 18.16.27 EEST Hugo Beauzée-Luyssen a
écrit :
> From: Thomas Guillem <thomas at gllm.fr>
>
> ---
> src/misc/actions.c | 219
> ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 134
> insertions(+), 85 deletions(-)
>
> diff --git a/src/misc/actions.c b/src/misc/actions.c
> index 50b10382f5..a5c360284f 100644
> --- a/src/misc/actions.c
> +++ b/src/misc/actions.c
> @@ -801,6 +801,63 @@ static float adjust_rate_fine( playlist_t *p_playlist,
> const int i_dir ) return f_rate;
> }
>
> +static void do_volume_up( vlc_actions_t *p_as, vout_thread_t *p_vout,
> + playlist_t *p_playlist )
> +{
> + float vol;
> + if( playlist_VolumeUp( p_playlist, 1, &vol ) == 0 )
> + display_volume( p_as, p_vout, vol );
> +}
> +
> +static void do_volume_down( vlc_actions_t *p_as, vout_thread_t *p_vout,
> + playlist_t *p_playlist )
> +{
> + float vol;
> + if( playlist_VolumeDown( p_playlist, 1, &vol ) == 0 )
> + display_volume( p_as, p_vout, vol );
> +}
> +
> +static void do_seek( vlc_actions_t *p_as, vout_thread_t *p_notify_vout,
> + input_thread_t *p_input, vlc_action_id_t i_action )
> +{
> + if( p_input == NULL || !var_GetBool( p_input, "can-seek" ) )
> + return;
> +
> + const char *varname;
> + int sign = +1;
> + switch( i_action )
> + {
> + case ACTIONID_JUMP_BACKWARD_EXTRASHORT:
> + sign = -1;
> + case ACTIONID_JUMP_FORWARD_EXTRASHORT:
> + varname = "extrashort-jump-size";
> + break;
> + case ACTIONID_JUMP_BACKWARD_SHORT:
> + sign = -1;
> + case ACTIONID_JUMP_FORWARD_SHORT:
> + varname = "short-jump-size";
> + break;
> + case ACTIONID_JUMP_BACKWARD_MEDIUM:
> + sign = -1;
> + case ACTIONID_JUMP_FORWARD_MEDIUM:
> + varname = "medium-jump-size";
> + break;
> + case ACTIONID_JUMP_BACKWARD_LONG:
> + sign = -1;
> + case ACTIONID_JUMP_FORWARD_LONG:
> + varname = "long-jump-size";
> + break;
> + default:
> + vlc_assert_unreachable();
> + }
> +
> + mtime_t it = var_InheritInteger( p_input, varname );
> + if( it < 0 )
> + return;
> + var_SetInteger( p_input, "time-offset", it * sign * CLOCK_FREQ );
> + display_position( p_as, p_notify_vout, p_input );
> +}
> +
> static void register_osd_channels( vlc_actions_t *p_as, vout_thread_t
> *p_vout ) {
> /* Register OSD channels */
> @@ -927,19 +984,11 @@ handle_playlist_actions( playlist_t *p_playlist,
> vlc_action_id_t i_action, break;
> }
> case ACTIONID_VOL_UP:
> - {
> - float vol;
> - if( playlist_VolumeUp( p_playlist, 1, &vol ) == 0 )
> - display_volume( p_as, p_notify_vout, vol );
> + do_volume_up( p_as, p_notify_vout, p_playlist );
> break;
> - }
> case ACTIONID_VOL_DOWN:
> - {
> - float vol;
> - if( playlist_VolumeDown( p_playlist, 1, &vol ) == 0 )
> - display_volume( p_as, p_notify_vout, vol );
> + do_volume_down( p_as, p_notify_vout, p_playlist );
> break;
> - }
> case ACTIONID_VOL_MUTE:
> {
> int mute = playlist_MuteGet( p_playlist );
> @@ -1345,49 +1394,8 @@ static void handle_input_actions( playlist_t
> *p_playlist, vlc_action_id_t i_acti case ACTIONID_JUMP_FORWARD_MEDIUM:
> case ACTIONID_JUMP_BACKWARD_LONG:
> case ACTIONID_JUMP_FORWARD_LONG:
> - {
> - if( p_input == NULL || !var_GetBool( p_input, "can-seek" ) )
> - break;
> -
> - const char *varname;
> - int sign = +1;
> - switch( i_action )
> - {
> - case ACTIONID_JUMP_BACKWARD_EXTRASHORT:
> - sign = -1;
> - /* fall through */
> - case ACTIONID_JUMP_FORWARD_EXTRASHORT:
> - varname = "extrashort-jump-size";
> - break;
> - case ACTIONID_JUMP_BACKWARD_SHORT:
> - sign = -1;
> - /* fall through */
> - case ACTIONID_JUMP_FORWARD_SHORT:
> - varname = "short-jump-size";
> - break;
> - case ACTIONID_JUMP_BACKWARD_MEDIUM:
> - sign = -1;
> - /* fall through */
> - case ACTIONID_JUMP_FORWARD_MEDIUM:
> - varname = "medium-jump-size";
> - break;
> - case ACTIONID_JUMP_BACKWARD_LONG:
> - sign = -1;
> - /* fall through */
> - case ACTIONID_JUMP_FORWARD_LONG:
> - varname = "long-jump-size";
> - break;
> - default:
> - vlc_assert_unreachable();
> - }
> -
> - mtime_t it = var_InheritInteger( p_input, varname );
> - if( it < 0 )
> - break;
> - var_SetInteger( p_input, "time-offset", it * sign * CLOCK_FREQ
> ); - display_position( p_as, p_notify_vout, p_input );
> + do_seek( p_as, p_notify_vout, p_input, i_action );
> break;
> - }
>
> /* Input navigation */
> case ACTIONID_TITLE_PREV:
> @@ -1819,43 +1827,84 @@ handle_input_vout_actions( playlist_t *p_playlist,
> vlc_action_id_t i_action, break;
> }
> case ACTIONID_NAV_UP:
> - {
> - if( p_vout )
> - input_UpdateViewpoint( p_input,
> - &(vlc_viewpoint_t) { .pitch = -1.f
> }, - false );
> - if( p_input )
> - input_Control( p_input, INPUT_NAV_UP, NULL );
> - break;
> - }
> case ACTIONID_NAV_DOWN:
> - {
> - if( p_vout )
> - input_UpdateViewpoint( p_input,
> - &(vlc_viewpoint_t) { .pitch = 1.f },
> - false );
> - if( p_input )
> - input_Control( p_input, INPUT_NAV_DOWN, NULL );
> - break;
> - }
> case ACTIONID_NAV_LEFT:
> - {
> - if( p_vout )
> - input_UpdateViewpoint( p_input,
> - &(vlc_viewpoint_t) { .yaw = -1.f },
> - false );
> - if( p_input )
> - input_Control( p_input, INPUT_NAV_LEFT, NULL );
> - break;
> - }
> case ACTIONID_NAV_RIGHT:
> {
> - if( p_vout )
> - input_UpdateViewpoint( p_input,
> - &(vlc_viewpoint_t) { .yaw = 1.f },
> - false );
> - if( p_input )
> - input_Control( p_input, INPUT_NAV_RIGHT, NULL );
> + if( !p_input )
> + break;
> + bool b_vrnav = p_vout &&
> + var_GetBool( p_vout, "viewpoint-changeable" );
> + if( b_vrnav )
> + {
> + switch( i_action )
> + {
> + case ACTIONID_NAV_UP:
> + input_UpdateViewpoint( p_input,
> + &(vlc_viewpoint_t) {
> + .pitch = -1.f
> + },
> + false );
> + break;
> + case ACTIONID_NAV_DOWN:
> + input_UpdateViewpoint( p_input,
> + &(vlc_viewpoint_t) {
> + .pitch = 1.f
> + },
> + false );
> + break;
> + case ACTIONID_NAV_LEFT:
> + input_UpdateViewpoint( p_input,
> + &(vlc_viewpoint_t) {
> + .yaw = -1.f
> + },
> + false );
> + break;
> + case ACTIONID_NAV_RIGHT:
> + input_UpdateViewpoint( p_input,
> + &(vlc_viewpoint_t) {
> + .yaw = 1.f
> + },
> + false );
> + break;
> + default:
> + vlc_assert_unreachable();
> + }
> + break;
> + }
> + input_title_t *p_title = NULL;
> + int i_title_id = -1;
> + if ( input_Control( p_input, INPUT_GET_TITLE_INFO, &p_title,
> + &i_title_id ) == VLC_SUCCESS
> + && p_title->i_flags &
> (INPUT_TITLE_INTERACTIVE|INPUT_TITLE_MENU) )
> + {
> +
> + input_Control( p_input, i_action - ACTIONID_NAV_ACTIVATE
> + + INPUT_NAV_ACTIVATE, NULL );
> + }
This whole block looks like obvious ToCToU bug.
> + else
> + {
> + switch( i_action )
> + {
> + case ACTIONID_NAV_UP:
> + do_volume_up( p_as, p_notify_vout, p_playlist );
> + break;
> + case ACTIONID_NAV_DOWN:
> + do_volume_down( p_as, p_notify_vout, p_playlist );
> + break;
> + case ACTIONID_NAV_LEFT:
> + do_seek( p_as, p_notify_vout, p_input,
> + ACTIONID_JUMP_BACKWARD_SHORT );
> + break;
> + case ACTIONID_NAV_RIGHT:
> + do_seek( p_as, p_notify_vout, p_input,
> + ACTIONID_JUMP_FORWARD_SHORT );
> + break;
> + default:
> + break;
> + }
> + }
> + vlc_input_title_Delete( p_title );
> break;
> }
> case ACTIONID_VIEWPOINT_FOV_IN:
--
雷米‧德尼-库尔蒙
https://www.remlab.net/
More information about the vlc-devel
mailing list