[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