+/**
+ ****************************************************************************
+ * find a named object and increment its refcount
+ *****************************************************************************
+ * This function recursively looks for a given object name. i_mode can be one
+ * of FIND_PARENT, FIND_CHILD or FIND_ANYWHERE.
+ *****************************************************************************/
+void * __vlc_object_find_name( vlc_object_t *p_this, const char *psz_name,
+ int i_mode )
+{
+ vlc_object_t *p_found;
+
+ vlc_mutex_lock( &structure_lock );
+
+ /* If have the requested name ourselves, don't look further */
+ if( !(i_mode & FIND_STRICT)
+ && p_this->psz_object_name
+ && !strcmp( p_this->psz_object_name, psz_name ) )
+ {
+ p_this->i_refcount++;
+ vlc_mutex_unlock( &structure_lock );
+ return p_this;
+ }
+
+ /* Otherwise, recursively look for the object */
+ if( (i_mode & 0x000f) == FIND_ANYWHERE )
+ {
+ vlc_object_t *p_root = p_this;
+
+ /* Find the root */
+ while( p_root->p_parent != NULL &&
+ p_root != VLC_OBJECT( p_this->p_libvlc ) )
+ {
+ p_root = p_root->p_parent;
+ }
+
+ p_found = FindObjectName( p_root, psz_name,
+ (i_mode & ~0x000f)|FIND_CHILD );
+ if( p_found == NULL && p_root != VLC_OBJECT( p_this->p_libvlc ) )
+ {
+ p_found = FindObjectName( VLC_OBJECT( p_this->p_libvlc ),
+ psz_name, (i_mode & ~0x000f)|FIND_CHILD );
+ }
+ }
+ else
+ {
+ p_found = FindObjectName( p_this, psz_name, i_mode );
+ }
+
+ vlc_mutex_unlock( &structure_lock );
+
+ return p_found;
+}
+