📄 item.c
字号:
/***************************************************************************** * 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 + -