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

📄 item.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************** * item.c: input_item management ***************************************************************************** * Copyright (C) 1998-2004 the VideoLAN team * $Id$ * * Authors: Clément Stenac <zorglub@videolan.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/#ifdef HAVE_CONFIG_H# include "config.h"#endif#include <assert.h>#include <vlc_common.h>#include "vlc_playlist.h"#include "vlc_interface.h"#include "input_internal.h"static void GuessType( input_item_t *p_item );/** Stuff moved out of vlc_input.h -- FIXME: should probably not be inline * anyway. */static inline void input_item_Init( vlc_object_t *p_o, input_item_t *p_i ){    memset( p_i, 0, sizeof(input_item_t) );    p_i->psz_name = NULL;    p_i->psz_uri = NULL;    TAB_INIT( p_i->i_es, p_i->es );    TAB_INIT( p_i->i_options, p_i->ppsz_options );    p_i->optflagv = NULL, p_i->optflagc = 0;    TAB_INIT( p_i->i_categories, p_i->pp_categories );    p_i->i_type = ITEM_TYPE_UNKNOWN;    p_i->b_fixed_name = true;    p_i->p_stats = NULL;    p_i->p_meta = NULL;    vlc_mutex_init( &p_i->lock );    vlc_event_manager_t * p_em = &p_i->event_manager;    vlc_event_manager_init( p_em, p_i, p_o );    vlc_event_manager_register_event_type( p_em, vlc_InputItemMetaChanged );    vlc_event_manager_register_event_type( p_em, vlc_InputItemSubItemAdded );    vlc_event_manager_register_event_type( p_em, vlc_InputItemDurationChanged );    vlc_event_manager_register_event_type( p_em, vlc_InputItemPreparsedChanged );    vlc_event_manager_register_event_type( p_em, vlc_InputItemNameChanged );    vlc_event_manager_register_event_type( p_em, vlc_InputItemInfoChanged );    vlc_event_manager_register_event_type( p_em, vlc_InputItemErrorWhenReadingChanged );}static inline void input_item_Clean( input_item_t *p_i ){    int i;    vlc_event_manager_fini( &p_i->event_manager );    free( p_i->psz_name );    free( p_i->psz_uri );    if( p_i->p_stats )    {        vlc_mutex_destroy( &p_i->p_stats->lock );        free( p_i->p_stats );    }    if( p_i->p_meta )        vlc_meta_Delete( p_i->p_meta );    for( i = 0; i < p_i->i_options; i++ )        free( p_i->ppsz_options[i] );    TAB_CLEAN( p_i->i_options, p_i->ppsz_options );    free( p_i->optflagv);    for( i = 0; i < p_i->i_es; i++ )    {        es_format_Clean( p_i->es[i] );        free( p_i->es[i] );    }    TAB_CLEAN( p_i->i_es, p_i->es );    for( i = 0; i < p_i->i_categories; i++ )    {        info_category_t *p_category = p_i->pp_categories[i];        int j;        for( j = 0; j < p_category->i_infos; j++ )        {            struct info_t *p_info = p_category->pp_infos[j];            free( p_info->psz_name);            free( p_info->psz_value );            free( p_info );        }        TAB_CLEAN( p_category->i_infos, p_category->pp_infos );        free( p_category->psz_name );        free( p_category );    }    TAB_CLEAN( p_i->i_categories, p_i->pp_categories );    vlc_mutex_destroy( &p_i->lock );}void input_item_SetHasErrorWhenReading( input_item_t *p_i, bool error ){    vlc_event_t event;    if( p_i->b_error_when_reading == error )        return;    p_i->b_error_when_reading = error;    /* Notify interested third parties */    event.type = vlc_InputItemErrorWhenReadingChanged;    event.u.input_item_error_when_reading_changed.new_value = error;    vlc_event_send( &p_i->event_manager, &event );}void input_item_SetMeta( input_item_t *p_i, vlc_meta_type_t meta_type, const char *psz_val ){    vlc_event_t event;    vlc_mutex_lock( &p_i->lock );    if( !p_i->p_meta )        p_i->p_meta = vlc_meta_New();    vlc_meta_Set( p_i->p_meta, meta_type, psz_val );    vlc_mutex_unlock( &p_i->lock );    /* Notify interested third parties */    event.type = vlc_InputItemMetaChanged;    event.u.input_item_meta_changed.meta_type = meta_type;    vlc_event_send( &p_i->event_manager, &event );}/** * Get the item from an input thread */input_item_t *input_GetItem( input_thread_t *p_input ){    assert( p_input && p_input->p );    return p_input->p->input.p_item;}void input_item_CopyOptions( input_item_t *p_parent,                                          input_item_t *p_child ){    int i;    for( i = 0 ; i< p_parent->i_options; i++ )    {        char *psz_option= strdup( p_parent->ppsz_options[i] );        if( !strcmp( psz_option, "meta-file" ) )        {            free( psz_option );            continue;        }        p_child->i_options++;        p_child->ppsz_options = (char **)realloc( p_child->ppsz_options,                                                  p_child->i_options *                                                  sizeof( char * ) );        p_child->ppsz_options[p_child->i_options-1] = psz_option;        p_child->optflagc++;        p_child->optflagv = (uint8_t *)realloc( p_child->optflagv,                                                p_child->optflagc );        p_child->optflagv[p_child->optflagc - 1] = p_parent->optflagv[i];    }}void input_item_SetName( input_item_t *p_item, const char *psz_name ){    free( p_item->psz_name );    p_item->psz_name = strdup( psz_name );}/* This won't hold the item, but can tell to interested third parties * Like the playlist, that there is a new sub item. With this design * It is not the input item's responsability to keep all the ref of * the input item children. */void input_item_AddSubItem( input_item_t *p_parent,                                         input_item_t *p_child ){    vlc_event_t event;    p_parent->i_type = ITEM_TYPE_PLAYLIST;    /* Notify interested third parties */    event.type = vlc_InputItemSubItemAdded;    event.u.input_item_subitem_added.p_new_child = p_child;    vlc_event_send( &p_parent->event_manager, &event );}int input_item_AddOption (input_item_t *item, const char *str){    return input_item_AddOpt (item, str, VLC_INPUT_OPTION_TRUSTED);}bool input_item_HasErrorWhenReading (input_item_t *item){    return item->b_error_when_reading;}bool input_item_MetaMatch( input_item_t *p_i, vlc_meta_type_t meta_type, const char *psz ){    vlc_mutex_lock( &p_i->lock );    if( !p_i->p_meta )    {        vlc_mutex_unlock( &p_i->lock );        return false;    }    const char * meta = vlc_meta_Get( p_i->p_meta, meta_type );    bool ret = meta && strcasestr( meta, psz );    vlc_mutex_unlock( &p_i->lock );    return ret;}char * input_item_GetMeta( input_item_t *p_i, vlc_meta_type_t meta_type ){    char * psz = NULL;    vlc_mutex_lock( &p_i->lock );    if( !p_i->p_meta )    {        vlc_mutex_unlock( &p_i->lock );        return NULL;    }    if( vlc_meta_Get( p_i->p_meta, meta_type ) )        psz = strdup( vlc_meta_Get( p_i->p_meta, meta_type ) );    vlc_mutex_unlock( &p_i->lock );    return psz;}char * input_item_GetName( input_item_t * p_i ){    vlc_mutex_lock( &p_i->lock );    char *psz_s = p_i->psz_name ? strdup( p_i->psz_name ) : NULL;    vlc_mutex_unlock( &p_i->lock );    return psz_s;}char * input_item_GetURI( input_item_t * p_i ){    vlc_mutex_lock( &p_i->lock );    char *psz_s = p_i->psz_uri ? strdup( p_i->psz_uri ) : NULL;    vlc_mutex_unlock( &p_i->lock );    return psz_s;}void input_item_SetURI( input_item_t * p_i, char * psz_uri ){    vlc_mutex_lock( &p_i->lock );    free( p_i->psz_uri );    p_i->psz_uri = strdup( psz_uri );    vlc_mutex_unlock( &p_i->lock );}mtime_t input_item_GetDuration( input_item_t * p_i ){    vlc_mutex_lock( &p_i->lock );    mtime_t i_duration = p_i->i_duration;    vlc_mutex_unlock( &p_i->lock );    return i_duration;}void input_item_SetDuration( input_item_t * p_i, mtime_t i_duration ){    bool send_event = false;    vlc_mutex_lock( &p_i->lock );    if( p_i->i_duration != i_duration )    {        p_i->i_duration = i_duration;        send_event = true;    }    vlc_mutex_unlock( &p_i->lock );    if ( send_event == true )    {        vlc_event_t event;        event.type = vlc_InputItemDurationChanged;        event.u.input_item_duration_changed.new_duration = i_duration;        vlc_event_send( &p_i->event_manager, &event );    }    return;}bool input_item_IsPreparsed( input_item_t *p_i ){

⌨️ 快捷键说明

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