* vout_intf.c : video output interface
*****************************************************************************
* Copyright (C) 2000-2007 the VideoLAN team
- * $Id$
*
* Authors: Gildas Bazin <gbazin@videolan.org>
*
# include "config.h"
#endif
-#include <vlc/vlc.h>
+#include <vlc_common.h>
#include <stdio.h>
#include <stdlib.h> /* free() */
#include <sys/types.h> /* opendir() */
#include <dirent.h> /* opendir() */
+#include <assert.h>
#include <vlc_interface.h>
#include <vlc_block.h>
#include <vlc_playlist.h>
#include <vlc_vout.h>
+#include <vlc_window.h>
#include <vlc_image.h>
#include <vlc_osd.h>
#include <vlc_charset.h>
unsigned int *pi_width_hint,
unsigned int *pi_height_hint )
{
- intf_thread_t *p_intf = NULL;
- vlc_list_t *p_list;
- void *p_window;
- vlc_value_t val;
- int i;
-
/* Small kludge */
if( !var_Type( p_vout, "aspect-ratio" ) ) vout_IntfInit( p_vout );
*pi_height_hint = p_vout->i_window_height;
/* Check whether someone provided us with a window ID */
- var_Get( p_vout->p_libvlc, "drawable", &val );
- if( val.i_int ) return (void *)(intptr_t)val.i_int;
+ int drawable = var_CreateGetInteger( p_vout, "drawable" );
+ if( drawable ) return (void *)(intptr_t)drawable;
- /* Find if the main interface supports embedding */
- p_list = vlc_list_find( p_vout, VLC_OBJECT_INTF, FIND_ANYWHERE );
- if( !p_list ) return NULL;
+ vout_window_t *wnd = vlc_custom_create (VLC_OBJECT(p_vout), sizeof (*wnd),
+ VLC_OBJECT_GENERIC, "window");
+ if (wnd == NULL)
+ return NULL;
- for( i = 0; i < p_list->i_count; i++ )
- {
- p_intf = (intf_thread_t *)p_list->p_values[i].p_object;
- if( p_intf->pf_request_window ) break;
- p_intf = NULL;
- }
+ wnd->vout = p_vout;
+ wnd->width = *pi_width_hint;
+ wnd->height = *pi_height_hint;
+ wnd->pos_x = *pi_x_hint;
+ wnd->pos_y = *pi_y_hint;
+ vlc_object_attach (wnd, p_vout);
- if( !p_intf )
+ wnd->module = module_Need (wnd, "vout window", 0, 0);
+ if (wnd->module == NULL)
{
- vlc_list_release( p_list );
+ msg_Dbg (wnd, "no window provider available");
+ vlc_object_release (wnd);
return NULL;
}
-
- vlc_object_yield( p_intf );
- vlc_list_release( p_list );
-
- p_window = p_intf->pf_request_window( p_intf, p_vout, pi_x_hint, pi_y_hint,
- pi_width_hint, pi_height_hint );
-
- if( !p_window ) vlc_object_release( p_intf );
- else p_vout->p_parent_intf = p_intf;
-
- return p_window;
+ p_vout->p_window = wnd;
+ *pi_width_hint = wnd->width;
+ *pi_height_hint = wnd->height;
+ *pi_x_hint = wnd->pos_x;
+ *pi_y_hint = wnd->pos_y;
+ return wnd->handle;
}
-void vout_ReleaseWindow( vout_thread_t *p_vout, void *p_window )
+void vout_ReleaseWindow( vout_thread_t *p_vout, void *dummy )
{
- intf_thread_t *p_intf = p_vout->p_parent_intf;
+ vout_window_t *wnd = p_vout->p_window;
- if( !p_intf ) return;
-
- vlc_mutex_lock( &p_intf->object_lock );
- if( p_intf->b_dead )
- {
- vlc_mutex_unlock( &p_intf->object_lock );
+ if (wnd == NULL)
return;
- }
+ p_vout->p_window = NULL;
- if( !p_intf->pf_release_window )
- {
- msg_Err( p_vout, "no pf_release_window");
- vlc_mutex_unlock( &p_intf->object_lock );
- vlc_object_release( p_intf );
- return;
- }
-
- p_intf->pf_release_window( p_intf, p_window );
+ assert (wnd->module);
+ module_Unneed (wnd, wnd->module);
- p_vout->p_parent_intf = NULL;
- vlc_mutex_unlock( &p_intf->object_lock );
- vlc_object_release( p_intf );
+ vlc_object_release (wnd);
+ (void)dummy;
}
-int vout_ControlWindow( vout_thread_t *p_vout, void *p_window,
+int vout_ControlWindow( vout_thread_t *p_vout, void *dummy,
int i_query, va_list args )
{
- intf_thread_t *p_intf = p_vout->p_parent_intf;
- int i_ret;
-
- if( !p_intf ) return VLC_EGENERIC;
-
- vlc_mutex_lock( &p_intf->object_lock );
- if( p_intf->b_dead )
- {
- vlc_mutex_unlock( &p_intf->object_lock );
- return VLC_EGENERIC;
- }
+ vout_window_t *wnd = p_vout->p_window;
- if( !p_intf->pf_control_window )
- {
- msg_Err( p_vout, "no pf_control_window");
- vlc_mutex_unlock( &p_intf->object_lock );
+ if (wnd == NULL)
return VLC_EGENERIC;
- }
- i_ret = p_intf->pf_control_window( p_intf, p_window, i_query, args );
- vlc_mutex_unlock( &p_intf->object_lock );
- return i_ret;
+ assert (wnd->control);
+ return wnd->control (wnd, i_query, args);
}
/*****************************************************************************
/* Destination object-id is following object: */
i_id = atoi( &val.psz_string[7] );
- p_dest = ( vlc_object_t* )vlc_current_object( i_id );
+ p_dest = ( vlc_object_t* )vlc_object_get( i_id );
if( !p_dest )
{
msg_Err( p_vout, "Cannot find calling object" );
{
msg_Err( p_vout, "Could not get snapshot" );
image_HandlerDelete( p_image );
- vlc_cond_signal( &p_dest->object_wait );
+ vlc_object_signal_maybe( VLC_OBJECT(p_dest) );
vlc_object_release( p_dest );
return VLC_EGENERIC;
}
{
block_Release( p_block );
image_HandlerDelete( p_image );
- vlc_cond_signal( &p_dest->object_wait );
+ vlc_object_signal_maybe( VLC_OBJECT(p_dest) );
vlc_object_release( p_dest );
return VLC_ENOMEM;
}
block_Release( p_block );
free( p_snapshot );
image_HandlerDelete( p_image );
- vlc_cond_signal( &p_dest->object_wait );
+ vlc_object_signal_maybe( VLC_OBJECT(p_dest) );
vlc_object_release( p_dest );
return VLC_ENOMEM;
}
block_Release( p_block );
/* Unlock the object */
- vlc_cond_signal( &p_dest->object_wait );
+ vlc_object_signal_maybe( VLC_OBJECT(p_dest) );
vlc_object_release( p_dest );
image_HandlerDelete( p_image );
if( !val.psz_string )
{
msg_Err( p_vout, "no path specified for snapshots" );
+ image_HandlerDelete( p_image );
return VLC_EGENERIC;
}
var_Get( p_vout, "snapshot-format", &format );
{
case VOUT_REPARENT:
case VOUT_CLOSE:
- if( p_vout->p_parent_intf )
- {
- vlc_object_release( p_vout->p_parent_intf );
- p_vout->p_parent_intf = NULL;
- }
+ vout_ReleaseWindow( p_vout, NULL );
return VLC_SUCCESS;
- break;
case VOUT_SNAPSHOT:
p_vout->b_snapshot = true;
return VLC_SUCCESS;
- break;
default:
msg_Dbg( p_vout, "control query not supported" );
- return VLC_EGENERIC;
}
+ return VLC_EGENERIC;
}
/*****************************************************************************
vlc_value_t oldval, vlc_value_t newval, void *p_data )
{
vout_thread_t *p_vout = (vout_thread_t *)p_this;
- playlist_t *p_playlist = pl_Yield( p_this );
vout_Control( p_vout, VOUT_SET_STAY_ON_TOP, newval.b_bool );
(void)psz_cmd; (void)oldval; (void)p_data;
- /* Modify playlist as well because the vout might have to be restarted */
- var_Create( p_playlist, "video-on-top", VLC_VAR_BOOL );
- var_Set( p_playlist, "video-on-top", newval );
+ /* Modify libvlc as well because the vout might have to be restarted */
+ var_Create( p_vout->p_libvlc, "video-on-top", VLC_VAR_BOOL );
+ var_Set( p_vout->p_libvlc, "video-on-top", newval );
- pl_Release( p_this );
return VLC_SUCCESS;
}
{
vout_thread_t *p_vout = (vout_thread_t *)p_this;
vlc_value_t val;
- playlist_t *p_playlist = pl_Yield( p_this );
(void)psz_cmd; (void)oldval; (void)p_data;
p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE;
- /* Modify playlist as well because the vout might have to be restarted */
- var_Create( p_playlist, "fullscreen", VLC_VAR_BOOL );
- var_Set( p_playlist, "fullscreen", newval );
- pl_Release( p_playlist );
+ /* Modify libvlc as well because the vout might have to be restarted */
+ var_Create( p_vout->p_libvlc, "fullscreen", VLC_VAR_BOOL );
+ var_Set( p_vout->p_libvlc, "fullscreen", newval );
val.b_bool = true;
var_Set( p_vout, "intf-change", val );