+
+ i_index++;
+ }
+
+ /* Lock all selected modules */
+ p_tmp = p_first;
+ while( p_tmp != NULL )
+ {
+ LockModule( p_tmp->p_module );
+ p_tmp = p_tmp->p_next;
+ }
+
+ /* We can release the global lock, module refcounts were incremented */
+ vlc_mutex_unlock( &p_this->p_vlc->module_bank.lock );
+
+ /* Parse the linked list and use the first successful module */
+ p_tmp = p_first;
+ while( p_tmp != NULL )
+ {
+ /* Test the requested capability */
+ switch( i_capability )
+ {
+ case MODULE_CAPABILITY_ACCESS:
+ i_ret = p_tmp->p_module->p_functions->access.functions.
+ access.pf_open( (input_thread_t *)p_data );
+ break;
+
+ case MODULE_CAPABILITY_DEMUX:
+ i_ret = p_tmp->p_module->p_functions->demux.functions.
+ demux.pf_init( (input_thread_t *)p_data );
+ break;
+
+ case MODULE_CAPABILITY_NETWORK:
+ i_ret = p_tmp->p_module->p_functions->network.functions.
+ network.pf_open( p_this, (network_socket_t *)p_data );
+ break;
+
+ case MODULE_CAPABILITY_DECODER:
+ i_ret = p_tmp->p_module->p_functions->dec.functions.
+ dec.pf_probe( (u8 *)p_data );
+ break;
+
+ case MODULE_CAPABILITY_INTF:
+ i_ret = p_tmp->p_module->p_functions->intf.functions.
+ intf.pf_open( (intf_thread_t *)p_data );
+ break;
+
+ case MODULE_CAPABILITY_AOUT:
+ i_ret = p_tmp->p_module->p_functions->aout.functions.
+ aout.pf_open( (aout_thread_t *)p_data );
+ break;
+
+ case MODULE_CAPABILITY_VOUT:
+ i_ret = p_tmp->p_module->p_functions->vout.functions.
+ vout.pf_create( (vout_thread_t *)p_data );
+ break;
+
+ case MODULE_CAPABILITY_CHROMA:
+ i_ret = p_tmp->p_module->p_functions->chroma.functions.
+ chroma.pf_init( (vout_thread_t *)p_data );
+ break;
+
+ case MODULE_CAPABILITY_IDCT:
+ case MODULE_CAPABILITY_IMDCT:
+ case MODULE_CAPABILITY_MOTION:
+ case MODULE_CAPABILITY_DOWNMIX:
+ case MODULE_CAPABILITY_MEMCPY:
+ /* This one always works */
+ i_ret = 0;
+ break;
+
+ default:
+ msg_Err( p_this, "unknown module type %i", i_capability );
+ i_ret = -1;
+ break;
+ }
+
+ /* If the high score was broken, we have a new champion */
+ if( i_ret == 0 )
+ {
+ break;
+ }
+ else
+ {
+ UnlockModule( p_tmp->p_module );
+ }
+
+ p_tmp = p_tmp->p_next;
+ }
+
+ /* Store the locked module value */
+ if( p_tmp != NULL )
+ {
+ p_module = p_tmp->p_module;
+ p_tmp = p_tmp->p_next;
+ }
+ else
+ {
+ p_module = NULL;
+ }
+
+ /* Unlock the remaining modules */
+ while( p_tmp != NULL )
+ {
+ UnlockModule( p_tmp->p_module );
+ p_tmp = p_tmp->p_next;