+/**
+ * find an object given its ID
+ *
+ * This function looks for the object whose i_object_id field is i_id. We
+ * use a dichotomy so that lookups are in log2(n).
+ *****************************************************************************/
+void * __vlc_object_get( vlc_object_t *p_this, int i_id )
+{
+ int i_max, i_middle;
+ vlc_object_t **pp_objects;
+
+ vlc_mutex_lock( &structure_lock );
+
+ pp_objects = p_this->p_libvlc->pp_objects;
+
+ /* Perform our dichotomy */
+ for( i_max = p_this->p_libvlc->i_objects - 1 ; ; )
+ {
+ i_middle = i_max / 2;
+
+ if( pp_objects[i_middle]->i_object_id > i_id )
+ {
+ i_max = i_middle;
+ }
+ else if( pp_objects[i_middle]->i_object_id < i_id )
+ {
+ if( i_middle )
+ {
+ pp_objects += i_middle;
+ i_max -= i_middle;
+ }
+ else
+ {
+ /* This happens when there are only two remaining objects */
+ if( pp_objects[i_middle+1]->i_object_id == i_id )
+ {
+ vlc_mutex_unlock( &structure_lock );
+ pp_objects[i_middle+1]->i_refcount++;
+ return pp_objects[i_middle+1];
+ }
+ break;
+ }
+ }
+ else
+ {
+ vlc_mutex_unlock( &structure_lock );
+ pp_objects[i_middle]->i_refcount++;
+ return pp_objects[i_middle];
+ }
+
+ if( i_max == 0 )
+ {
+ /* this means that i_max == i_middle, and since we have already
+ * tested pp_objects[i_middle]), p_found is properly set. */
+ break;
+ }
+ }
+
+ vlc_mutex_unlock( &structure_lock );
+ return NULL;
+}
+
+/**
+ ****************************************************************************
+ * find a typed object and increment its refcount