+/*
+ * Get vout thread from current input
+ *
+ * Object lock is NOT held.
+ */
+static vout_thread_t *get_vout_thread( libvlc_media_player_t *p_mi )
+{
+ vout_thread_t *p_vout_thread;
+
+ p_vout_thread = input_GetVout( p_mi->p_input_thread );
+ if( p_vout_thread )
+ {
+ var_AddCallback( p_vout_thread, "mouse-button-down", mouse_button, p_mi );
+ var_AddCallback( p_vout_thread, "mouse-moved", mouse_moved, p_mi );
+ var_AddCallback( p_vout_thread, "mouse-clicked", mouse_clicked, p_mi );
+ var_AddCallback( p_vout_thread, "mouse-object", mouse_object, p_mi );
+ }
+
+ return p_vout_thread;
+}
+
+/*
+ * Release the associated vout thread.
+ *
+ * Object lock is NOT held.
+ */
+static void release_vout_thread( libvlc_media_player_t *p_mi )
+{
+ vout_thread_t *p_vout_thread;
+
+ if( !p_mi || !p_mi->p_vout_thread )
+ return;
+
+ p_vout_thread = p_mi->p_vout_thread;
+
+ var_DelCallback( p_vout_thread, "mouse-button-down", mouse_button, p_mi );
+ var_DelCallback( p_vout_thread, "mouse-moved", mouse_moved, p_mi );
+ var_DelCallback( p_vout_thread, "mouse-clicked", mouse_clicked, p_mi );
+ var_DelCallback( p_vout_thread, "mouse-object", mouse_object, p_mi );
+
+ vlc_object_release( p_vout_thread );
+ p_mi->p_vout_thread = NULL;
+}
+