/** * This function preparses an item when needed. */ static void Preparse( playlist_t *p_playlist, input_item_t *p_item ) { vlc_mutex_lock( &p_item->lock ); int i_type = p_item->i_type; vlc_mutex_unlock( &p_item->lock ); if( i_type != ITEM_TYPE_FILE ) { input_item_SetPreparsed( p_item, true ); return; } stats_TimerStart( p_playlist, "Preparse run", STATS_TIMER_PREPARSE ); /* Do not preparse if it is already done (like by playing it) */ if( !input_item_IsPreparsed( p_item ) ) { input_Preparse( VLC_OBJECT(p_playlist), p_item ); input_item_SetPreparsed( p_item, true ); var_SetAddress( p_playlist, "item-change", p_item ); } stats_TimerStop( p_playlist, STATS_TIMER_PREPARSE ); }
/** * This function preparses an item when needed. */ static void Preparse( vlc_object_t *obj, input_item_t *p_item ) { vlc_mutex_lock( &p_item->lock ); int i_type = p_item->i_type; vlc_mutex_unlock( &p_item->lock ); if( i_type != ITEM_TYPE_FILE ) { input_item_SetPreparsed( p_item, true ); return; } /* Do not preparse if it is already done (like by playing it) */ if( !input_item_IsPreparsed( p_item ) ) { input_Preparse( obj, p_item ); input_item_SetPreparsed( p_item, true ); var_SetAddress( obj, "item-change", p_item ); } }
static void on_art_fetch_ended(input_item_t *item, bool fetched, void *userdata) { VLC_UNUSED(item); VLC_UNUSED(fetched); input_preparser_task_t *task = userdata; input_preparser_req_t *req = task->req; input_item_SetPreparsed(req->item, true); if (req->cbs && req->cbs->on_preparse_ended) req->cbs->on_preparse_ended(req->item, task->preparse_status, req->userdata); ReqRelease(req); free(task); }
/** * This function preparses an item when needed. */ static void Preparse( playlist_preparser_t *preparser, input_item_t *p_item, input_item_meta_request_option_t i_options ) { vlc_mutex_lock( &p_item->lock ); int i_type = p_item->i_type; bool b_net = p_item->b_net; vlc_mutex_unlock( &p_item->lock ); bool b_preparse = false; switch (i_type) { case ITEM_TYPE_FILE: case ITEM_TYPE_DIRECTORY: case ITEM_TYPE_PLAYLIST: case ITEM_TYPE_NODE: if (!b_net || i_options & META_REQUEST_OPTION_SCOPE_NETWORK) b_preparse = true; break; } /* Do not preparse if it is already done (like by playing it) */ if( b_preparse && !input_item_IsPreparsed( p_item ) ) { input_thread_t *input = input_CreatePreparser( preparser->object, p_item ); if( input == NULL ) return; var_AddCallback( input, "intf-event", InputEvent, &preparser->item_done ); if( input_Start( input ) == VLC_SUCCESS ) vlc_sem_wait( &preparser->item_done ); var_DelCallback( input, "intf-event", InputEvent, &preparser->item_done ); /* Normally, the input is already stopped since we waited for it. But * if the playlist preparser is being deleted, then the input might * still be running. Force it to stop. */ input_Stop( input ); input_Close( input ); var_SetAddress( preparser->object, "item-change", p_item ); } input_item_SetPreparsed( p_item, true ); input_item_SignalPreparseEnded( p_item ); }
static void PreparserCloseInput( void* preparser_, void* task_ ) { input_preparser_task_t* task = task_; input_preparser_req_t *req = task->req; input_preparser_t* preparser = preparser_; input_thread_t* input = task->input; input_item_t* item = input_priv(task->input)->p_item; int status; switch( atomic_load( &task->state ) ) { case END_S: status = ITEM_PREPARSE_DONE; break; case ERROR_S: status = ITEM_PREPARSE_FAILED; break; default: status = ITEM_PREPARSE_TIMEOUT; } input_Stop( input ); input_Close( input ); if( preparser->fetcher ) { task->preparse_status = status; if (!input_fetcher_Push(preparser->fetcher, item, 0, &input_fetcher_callbacks, task)) { ReqHold(task->req); return; } } free(task); input_item_SetPreparsed( item, true ); if (req->cbs && req->cbs->on_preparse_ended) req->cbs->on_preparse_ended(req->item, status, req->userdata); }