⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 control.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 2 页
字号:
                 if( asprintf( &p_bkmk->psz_name, _("Bookmark %i"),                               p_input->p->i_bookmark ) == -1 )                     p_bkmk->psz_name = NULL;            }            TAB_APPEND( p_input->p->i_bookmark, p_input->p->bookmark, p_bkmk );            /* Reflect the changes on the object var */            var_Change( p_input, "bookmark", VLC_VAR_CLEARCHOICES, 0, 0 );            {                vlc_value_t val, text;                int i;                for( i = 0; i < p_input->p->i_bookmark; i++ )                {                    val.i_int = i;                    text.psz_string = p_input->p->bookmark[i]->psz_name;                    var_Change( p_input, "bookmark", VLC_VAR_ADDCHOICE,                                &val, &text );                }            }            vlc_mutex_unlock( &p_input->p->input.p_item->lock );            UpdateBookmarksOption( p_input );            return VLC_SUCCESS;        case INPUT_CHANGE_BOOKMARK:            p_bkmk = (seekpoint_t *)va_arg( args, seekpoint_t * );            i_bkmk = (int)va_arg( args, int );            vlc_mutex_lock( &p_input->p->input.p_item->lock );            if( i_bkmk < p_input->p->i_bookmark )            {                vlc_value_t val, text;                int i;                p_input->p->bookmark[i_bkmk] = p_bkmk;                /* Reflect the changes on the object var */                var_Change( p_input, "bookmark", VLC_VAR_CLEARCHOICES, 0, 0 );                for( i = 0; i < p_input->p->i_bookmark; i++ )                {                    val.i_int = i;                    text.psz_string = p_input->p->bookmark[i]->psz_name;                    var_Change( p_input, "bookmark", VLC_VAR_ADDCHOICE,                                &val, &text );                }            }            vlc_mutex_unlock( &p_input->p->input.p_item->lock );            UpdateBookmarksOption( p_input );            return VLC_SUCCESS;        case INPUT_DEL_BOOKMARK:            i_bkmk = (int)va_arg( args, int );            vlc_mutex_lock( &p_input->p->input.p_item->lock );            if( i_bkmk < p_input->p->i_bookmark )            {                vlc_value_t val, text;                int i;                p_bkmk = p_input->p->bookmark[i_bkmk];                TAB_REMOVE( p_input->p->i_bookmark, p_input->p->bookmark,                            p_bkmk );                vlc_seekpoint_Delete( p_bkmk );                /* Reflect the changes on the object var */                var_Change( p_input, "bookmark", VLC_VAR_CLEARCHOICES, 0, 0 );                for( i = 0; i < p_input->p->i_bookmark; i++ )                {                    val.i_int = i;                    text.psz_string = p_input->p->bookmark[i]->psz_name;                    var_Change( p_input, "bookmark", VLC_VAR_ADDCHOICE,                                &val, &text );                }                vlc_mutex_unlock( &p_input->p->input.p_item->lock );                UpdateBookmarksOption( p_input );                return VLC_SUCCESS;            }            vlc_mutex_unlock( &p_input->p->input.p_item->lock );            return VLC_EGENERIC;        case INPUT_GET_BOOKMARKS:            ppp_bkmk = (seekpoint_t ***)va_arg( args, seekpoint_t *** );            pi_bkmk = (int *)va_arg( args, int * );            vlc_mutex_lock( &p_input->p->input.p_item->lock );            if( p_input->p->i_bookmark )            {                int i;                *pi_bkmk = p_input->p->i_bookmark;                *ppp_bkmk = malloc( sizeof(seekpoint_t *) *                                    p_input->p->i_bookmark );                for( i = 0; i < p_input->p->i_bookmark; i++ )                {                    (*ppp_bkmk)[i] =                        vlc_seekpoint_Duplicate(p_input->p->bookmark[i]);                }                vlc_mutex_unlock( &p_input->p->input.p_item->lock );                return VLC_SUCCESS;            }            else            {                *ppp_bkmk = NULL;                *pi_bkmk = 0;                vlc_mutex_unlock( &p_input->p->input.p_item->lock );                return VLC_EGENERIC;            }            break;        case INPUT_CLEAR_BOOKMARKS:            vlc_mutex_lock( &p_input->p->input.p_item->lock );            if( p_input->p->i_bookmark )            {                int i;                for( i = p_input->p->i_bookmark - 1; i >= 0; i-- )                {                    p_bkmk = p_input->p->bookmark[i];                    TAB_REMOVE( p_input->p->i_bookmark, p_input->p->bookmark,                                p_bkmk );                    vlc_seekpoint_Delete( p_bkmk );                }                var_Change( p_input, "bookmark", VLC_VAR_CLEARCHOICES, 0, 0 );            }            vlc_mutex_unlock( &p_input->p->input.p_item->lock );            UpdateBookmarksOption( p_input );            return VLC_SUCCESS;        case INPUT_SET_BOOKMARK:            i_bkmk = (int)va_arg( args, int );            vlc_mutex_lock( &p_input->p->input.p_item->lock );            if( i_bkmk >= 0 && i_bkmk < p_input->p->i_bookmark )            {                vlc_value_t pos;                int i_ret;                if( p_input->p->bookmark[i_bkmk]->i_time_offset != -1 )                {                    pos.i_time = p_input->p->bookmark[i_bkmk]->i_time_offset;                    i_ret = var_Set( p_input, "time", pos );                }                else if( p_input->p->bookmark[i_bkmk]->i_byte_offset != -1 )                {                    // don't crash on bookmarks in live streams                    if( stream_Size( p_input->p->input.p_stream ) == 0 )                    {                        vlc_mutex_unlock( &p_input->p->input.p_item->lock );                        return VLC_EGENERIC;                    }                    pos.f_float = !p_input->p->input.p_stream ? 0 :                        p_input->p->bookmark[i_bkmk]->i_byte_offset /                        stream_Size( p_input->p->input.p_stream );                    i_ret = var_Set( p_input, "position", pos );                }                else                {                    pos.f_float = 0;                    i_ret = var_Set( p_input, "position", pos );                }                vlc_mutex_unlock( &p_input->p->input.p_item->lock );                return i_ret;            }            else            {                vlc_mutex_unlock( &p_input->p->input.p_item->lock );                return VLC_EGENERIC;            }            break;        case INPUT_ADD_OPTION:        {            const char *psz_option = va_arg( args, const char * );            const char *psz_value = va_arg( args, const char * );            char *str;            int i;            if( asprintf( &str, "%s=%s", psz_option, psz_value ) == -1 )                return VLC_ENOMEM;            i = input_item_AddOpt( p_input->p->input.p_item, str,                                  VLC_INPUT_OPTION_UNIQUE );            free( str );            return i;        }        case INPUT_GET_BYTE_POSITION:            pi_64 = (int64_t*)va_arg( args, int64_t * );            *pi_64 = !p_input->p->input.p_stream ? 0 :                stream_Tell( p_input->p->input.p_stream );            return VLC_SUCCESS;        case INPUT_SET_BYTE_SIZE:            pi_64 = (int64_t*)va_arg( args, int64_t * );            *pi_64 = !p_input->p->input.p_stream ? 0 :                stream_Size( p_input->p->input.p_stream );            return VLC_SUCCESS;        case INPUT_GET_VIDEO_FPS:        {            int i;            pf = (double*)va_arg( args, double * );            vlc_mutex_lock( &p_input->p->input.p_item->lock );            *pf = p_input->p->input.f_fps;            for( i = 0; i < p_input->p->i_slave && *pf <= 0.001; i++ )                *pf = p_input->p->slave[i]->f_fps;            vlc_mutex_unlock( &p_input->p->input.p_item->lock );            return VLC_SUCCESS;        }        case INPUT_ADD_SLAVE:            psz = (char*)va_arg( args, char * );            if( psz && *psz )            {                val.psz_string = strdup( psz );                input_ControlPush( p_input, INPUT_CONTROL_ADD_SLAVE, &val );            }            return VLC_SUCCESS;        case INPUT_GET_ATTACHMENTS: /* arg1=input_attachment_t***, arg2=int*  res=can fail */        {            input_attachment_t ***ppp_attachment = (input_attachment_t***)va_arg( args, input_attachment_t *** );            int *pi_attachment = (int*)va_arg( args, int * );            int i;            vlc_mutex_lock( &p_input->p->input.p_item->lock );            if( p_input->p->i_attachment <= 0 )            {                vlc_mutex_unlock( &p_input->p->input.p_item->lock );                *ppp_attachment = NULL;                *pi_attachment = 0;                return VLC_EGENERIC;            }            *pi_attachment = p_input->p->i_attachment;            *ppp_attachment = malloc( sizeof(input_attachment_t**) * p_input->p->i_attachment );            for( i = 0; i < p_input->p->i_attachment; i++ )                (*ppp_attachment)[i] = vlc_input_attachment_Duplicate( p_input->p->attachment[i] );            vlc_mutex_unlock( &p_input->p->input.p_item->lock );            return VLC_SUCCESS;        }        case INPUT_GET_ATTACHMENT:  /* arg1=input_attachment_t**, arg2=char*  res=can fail */        {            input_attachment_t **pp_attachment = (input_attachment_t**)va_arg( args, input_attachment_t ** );            const char *psz_name = (const char*)va_arg( args, const char * );            int i;            vlc_mutex_lock( &p_input->p->input.p_item->lock );            for( i = 0; i < p_input->p->i_attachment; i++ )            {                if( !strcmp( p_input->p->attachment[i]->psz_name, psz_name ) )                {                    *pp_attachment = vlc_input_attachment_Duplicate( p_input->p->attachment[i] );                    vlc_mutex_unlock( &p_input->p->input.p_item->lock );                    return VLC_SUCCESS;                }            }            *pp_attachment = NULL;            vlc_mutex_unlock( &p_input->p->input.p_item->lock );            return VLC_EGENERIC;        }        default:            msg_Err( p_input, "unknown query in input_vaControl" );            return VLC_EGENERIC;    }}static void UpdateBookmarksOption( input_thread_t *p_input ){    int i, i_len = 0;    char *psz_value = NULL, *psz_next = NULL;    vlc_mutex_lock( &p_input->p->input.p_item->lock );    if( p_input->p->i_bookmark > 0 )    {        for( i = 0; i < p_input->p->i_bookmark; i++ )        {            i_len += snprintf( NULL, 0, "{name=%s,bytes=%"PRId64",time=%"PRId64"}",                               p_input->p->bookmark[i]->psz_name,                               p_input->p->bookmark[i]->i_byte_offset,                               p_input->p->bookmark[i]->i_time_offset/1000000 );        }        psz_value = psz_next = malloc( i_len + p_input->p->i_bookmark );        for( i = 0; i < p_input->p->i_bookmark; i++ )        {            sprintf( psz_next, "{name=%s,bytes=%"PRId64",time=%"PRId64"}",                     p_input->p->bookmark[i]->psz_name,                     p_input->p->bookmark[i]->i_byte_offset,                     p_input->p->bookmark[i]->i_time_offset/1000000 );            psz_next += strlen( psz_next );            if( i < p_input->p->i_bookmark - 1)                *psz_next = ','; psz_next++;        }    }    vlc_mutex_unlock( &p_input->p->input.p_item->lock );    input_Control( p_input, INPUT_ADD_OPTION, "bookmarks",                   psz_value ? psz_value : "" );    free( psz_value );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -