#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>
int drawable = var_CreateGetInteger( p_vout, "drawable" );
if( drawable ) return (void *)(intptr_t)drawable;
- return NULL;
+ vout_window_t *wnd = vlc_custom_create (VLC_OBJECT(p_vout), sizeof (*wnd),
+ VLC_OBJECT_GENERIC, "window");
+ if (wnd == NULL)
+ return 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);
+
+ wnd->module = module_Need (wnd, "vout window", 0, 0);
+ if (wnd->module == NULL)
+ {
+ msg_Dbg (wnd, "no window provider available");
+ vlc_object_release (wnd);
+ return NULL;
+ }
+ 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 )
{
- (void)p_vout; (void)p_window;
+ vout_window_t *wnd = p_vout->p_window;
+
+ if (wnd == NULL)
+ return;
+ p_vout->p_window = NULL;
+
+ assert (wnd->module);
+ module_Unneed (wnd, wnd->module);
+
+ 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 )
{
- (void)p_vout; (void)p_window; (void)i_query; (void)args;
+ (void)dummy;
+ vout_window_t *wnd = p_vout->p_window;
+
+ if (wnd == NULL)
+ return VLC_EGENERIC;
+
+ assert (wnd->control);
+ return wnd->control (wnd, i_query, args);
}
/*****************************************************************************
const char *psz_label;
} p_crop_values[] = {
{ "", N_("Default") },
- { "1:1", "1:1" },
- { "4:3", "4:3" },
- { "16:9", "16:9" },
{ "16:10", "16:10" },
- { "5:4", "5:4" },
- { "5:3", "5:3" },
- { "1.85:1", "1.85:1" },
+ { "16:9", "16:9" },
+ { "185:100", "1.85:1" },
{ "221:100", "2.21:1" },
{ "235:100", "2.35:1" },
{ "239:100", "2.39:1" },
+ { "5:3", "5:3" },
+ { "4:3", "4:3" },
+ { "5:4", "5:4" },
+ { "1:1", "1:1" },
{ NULL, NULL } };
static const struct
/* Save the snapshot to a memory zone */
fmt_in = p_vout->fmt_in;
fmt_out.i_sar_num = fmt_out.i_sar_den = 1;
+ fmt_out.i_chroma = VLC_FOURCC( 'p','n','g',' ' );
+
fmt_out.i_width = var_GetInteger( p_vout, "snapshot-width" );
fmt_out.i_height = var_GetInteger( p_vout, "snapshot-height" );
- fmt_out.i_chroma = VLC_FOURCC( 'p','n','g',' ' );
+ /* If snapshot-width and/or snapshot height were not specified,
+ use a default snapshot width of 320 */
+ if( fmt_out.i_width == 0 && fmt_out.i_height == 0 )
+ {
+ fmt_out.i_width = 320;
+ }
+
+ if( fmt_out.i_width == 0 && fmt_out.i_height > 0 )
+ {
+ fmt_out.i_width = (fmt_in.i_width * fmt_out.i_height) / fmt_in.i_height;
+ }
+ else if( fmt_out.i_height == 0 && fmt_out.i_width > 0 )
+ {
+ fmt_out.i_height = (fmt_in.i_height * fmt_out.i_width) / fmt_in.i_width;
+ }
+ else
+ {
+ fmt_out.i_width = fmt_in.i_width;
+ fmt_out.i_height = fmt_in.i_height;
+ }
p_block = ( block_t* ) image_Write( p_image, p_pic, &fmt_in, &fmt_out );
if( !p_block )
{
msg_Err( p_vout, "Could not get snapshot" );
image_HandlerDelete( p_image );
- vlc_object_signal_maybe( VLC_OBJECT(p_dest) );
+ vlc_object_signal( p_dest );
vlc_object_release( p_dest );
return VLC_EGENERIC;
}
{
block_Release( p_block );
image_HandlerDelete( p_image );
- vlc_object_signal_maybe( VLC_OBJECT(p_dest) );
+ vlc_object_signal( p_dest );
vlc_object_release( p_dest );
return VLC_ENOMEM;
}
block_Release( p_block );
free( p_snapshot );
image_HandlerDelete( p_image );
- vlc_object_signal_maybe( VLC_OBJECT(p_dest) );
+ vlc_object_signal( p_dest );
vlc_object_release( p_dest );
return VLC_ENOMEM;
}
block_Release( p_block );
/* Unlock the object */
- vlc_object_signal_maybe( VLC_OBJECT(p_dest) );
+ vlc_object_signal( p_dest );
vlc_object_release( p_dest );
image_HandlerDelete( p_image );
}
if( p_mypicturesdir == NULL )
- {
- if( asprintf( &val.psz_string, "%s", config_GetHomeDir() ) == -1 )
- val.psz_string = NULL;
- }
+ val.psz_string = strdup( config_GetHomeDir() );
else
- {
- if( asprintf( &val.psz_string, p_mypicturesdir ) == -1 )
- val.psz_string = NULL;
- free( p_mypicturesdir );
- }
+ val.psz_string = p_mypicturesdir;
}
#else
{
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;
}
/*****************************************************************************
i_aspect_num, i_aspect_den,
p_vout->fmt_in.i_sar_num, p_vout->fmt_in.i_sar_den );
- var_Get( p_vout, "crop", &val );
- return CropCallback( p_this, "crop", val, val, 0 );
+ if( var_Get( p_vout, "crop", &val ) )
+ return VLC_EGENERIC;
+
+ int i_ret = CropCallback( p_this, "crop", val, val, 0 );
+ free( val.psz_string );
+ return i_ret;
}
static int OnTopCallback( vlc_object_t *p_this, char const *psz_cmd,
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 );