X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess%2Fscreen%2Fscreen.c;h=2d359c6fd33735036efce99a5a23154b17f8f358;hb=12ade3e3bc975d5426ba4af155b7372c31093b31;hp=c4f7422ab85f24fab6c1df32b4fd918bfd446cbd;hpb=3561b9b28f58eb7a4183e158a8fd973800d31ceb;p=vlc diff --git a/modules/access/screen/screen.c b/modules/access/screen/screen.c index c4f7422ab8..2d359c6fd3 100644 --- a/modules/access/screen/screen.c +++ b/modules/access/screen/screen.c @@ -1,10 +1,11 @@ /***************************************************************************** * screen.c: Screen capture module. ***************************************************************************** - * Copyright (C) 2004 the VideoLAN team + * Copyright (C) 2004-2008 the VideoLAN team * $Id$ * * Authors: Gildas Bazin + * Antoine Cellerier * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,6 +32,7 @@ #include #include +#include #include "screen.h" /***************************************************************************** @@ -62,15 +64,22 @@ #define WIDTH_TEXT N_( "Subscreen width" ) #define WIDTH_LONGTEXT N_( \ - "Subscreen width." ) + "Subscreen width" ) #define HEIGHT_TEXT N_( "Subscreen height" ) #define HEIGHT_LONGTEXT N_( \ - "Subscreen height." ) + "Subscreen height" ) #define FOLLOW_MOUSE_TEXT N_( "Follow the mouse" ) #define FOLLOW_MOUSE_LONGTEXT N_( \ - "Follow the mouse when capturing a subscreen" ) + "Follow the mouse when capturing a subscreen." ) +#endif + +#ifdef SCREEN_MOUSE +#define MOUSE_TEXT N_( "Mouse pointer image" ) +#define MOUSE_LONGTEXT N_( \ + "If specified, will use the image to draw the mouse pointer on the " \ + "capture." ) #endif static int Open ( vlc_object_t * ); @@ -82,34 +91,39 @@ static void Close( vlc_object_t * ); # define SCREEN_FPS 5 #endif -vlc_module_begin(); - set_description( N_("Screen Input") ); - set_shortname( N_("Screen" )); - set_category( CAT_INPUT ); - set_subcategory( SUBCAT_INPUT_ACCESS ); +vlc_module_begin () + set_description( N_("Screen Input") ) + set_shortname( N_("Screen" )) + set_category( CAT_INPUT ) + set_subcategory( SUBCAT_INPUT_ACCESS ) add_integer( "screen-caching", DEFAULT_PTS_DELAY / 1000, NULL, - CACHING_TEXT, CACHING_LONGTEXT, true ); - add_float( "screen-fps", SCREEN_FPS, 0, FPS_TEXT, FPS_LONGTEXT, true ); + CACHING_TEXT, CACHING_LONGTEXT, true ) + add_float( "screen-fps", SCREEN_FPS, 0, FPS_TEXT, FPS_LONGTEXT, true ) #ifdef SCREEN_SUBSCREEN - add_integer( "screen-top", 0, NULL, TOP_TEXT, TOP_LONGTEXT, true ); - add_integer( "screen-left", 0, NULL, LEFT_TEXT, LEFT_LONGTEXT, true ); - add_integer( "screen-width", 0, NULL, WIDTH_TEXT, WIDTH_LONGTEXT, true ); - add_integer( "screen-height", 0, NULL, HEIGHT_TEXT, HEIGHT_LONGTEXT, true ); + add_integer( "screen-top", 0, NULL, TOP_TEXT, TOP_LONGTEXT, true ) + add_integer( "screen-left", 0, NULL, LEFT_TEXT, LEFT_LONGTEXT, true ) + add_integer( "screen-width", 0, NULL, WIDTH_TEXT, WIDTH_LONGTEXT, true ) + add_integer( "screen-height", 0, NULL, HEIGHT_TEXT, HEIGHT_LONGTEXT, true ) add_bool( "screen-follow-mouse", false, NULL, FOLLOW_MOUSE_TEXT, - FOLLOW_MOUSE_LONGTEXT, true ); + FOLLOW_MOUSE_LONGTEXT, true ) +#endif + +#ifdef SCREEN_MOUSE + add_file( "screen-mouse-image", "", NULL, MOUSE_TEXT, MOUSE_LONGTEXT, + true ) #endif #ifdef WIN32 add_integer( "screen-fragment-size", 0, NULL, FRAGS_TEXT, - FRAGS_LONGTEXT, true ); + FRAGS_LONGTEXT, true ) #endif - set_capability( "access_demux", 0 ); - add_shortcut( "screen" ); - set_callbacks( Open, Close ); -vlc_module_end(); + set_capability( "access_demux", 0 ) + add_shortcut( "screen" ) + set_callbacks( Open, Close ) +vlc_module_end () /***************************************************************************** * Local prototypes @@ -124,21 +138,19 @@ static int Open( vlc_object_t *p_this ) { demux_t *p_demux = (demux_t*)p_this; demux_sys_t *p_sys; - vlc_value_t val; /* Fill p_demux field */ p_demux->pf_demux = Demux; p_demux->pf_control = Control; - p_demux->p_sys = p_sys = malloc( sizeof( demux_sys_t ) ); - memset( p_sys, 0, sizeof( demux_sys_t ) ); + p_demux->p_sys = p_sys = calloc( 1, sizeof( demux_sys_t ) ); + if( !p_sys ) + return VLC_ENOMEM; /* Update default_pts to a suitable value for screen access */ var_Create( p_demux, "screen-caching", VLC_VAR_INTEGER|VLC_VAR_DOINHERIT ); - var_Create( p_demux, "screen-fps", VLC_VAR_FLOAT|VLC_VAR_DOINHERIT ); - var_Get( p_demux, "screen-fps", &val ); - p_sys->f_fps = val.f_float; - p_sys->i_incr = 1000000 / val.f_float; + p_sys->f_fps = var_CreateGetFloat( p_demux, "screen-fps" ); + p_sys->i_incr = 1000000 / p_sys->f_fps;; p_sys->i_next_date = 0; #ifdef SCREEN_SUBSCREEN @@ -179,7 +191,9 @@ static int Open( vlc_object_t *p_this ) { p_sys->i_screen_width = p_sys->fmt.video.i_width; p_sys->i_screen_height = p_sys->fmt.video.i_height; + p_sys->fmt.video.i_visible_width = p_sys->fmt.video.i_width = p_sys->i_width; + p_sys->fmt.video.i_visible_height = p_sys->fmt.video.i_height = p_sys->i_height; p_sys->b_follow_mouse = var_CreateGetInteger( p_demux, "screen-follow-mouse" ); @@ -189,6 +203,31 @@ static int Open( vlc_object_t *p_this ) } #endif +#ifdef SCREEN_MOUSE + char * psz_mouse = var_CreateGetNonEmptyString( p_demux, + "screen-mouse-image" ); + if( psz_mouse ) + { + image_handler_t *p_image; + video_format_t fmt_in, fmt_out; + msg_Dbg( p_demux, "Using %s for the mouse pointer image", psz_mouse ); + memset( &fmt_in, 0, sizeof( fmt_in ) ); + memset( &fmt_out, 0, sizeof( fmt_out ) ); + fmt_out.i_chroma = VLC_CODEC_RGBA; + p_image = image_HandlerCreate( p_demux ); + if( p_image ) + { + p_sys->p_mouse = + image_ReadUrl( p_image, psz_mouse, &fmt_in, &fmt_out ); + image_HandlerDelete( p_image ); + } + if( !p_sys->p_mouse ) + msg_Err( p_demux, "Failed to open mouse pointer image (%s)", + psz_mouse ); + free( psz_mouse ); + } +#endif + p_sys->es = es_out_Add( p_demux->out, &p_sys->fmt ); return VLC_SUCCESS; @@ -203,6 +242,10 @@ static void Close( vlc_object_t *p_this ) demux_sys_t *p_sys = p_demux->p_sys; screen_CloseCapture( p_demux ); +#ifdef SCREEN_MOUSE + if( p_sys->p_mouse ) + picture_Release( p_sys->p_mouse ); +#endif free( p_sys ); } @@ -259,7 +302,12 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) case DEMUX_GET_PTS_DELAY: pi64 = (int64_t*)va_arg( args, int64_t * ); - *pi64 = (int64_t)var_GetInteger( p_demux, "screen-caching" ) *1000; + *pi64 = var_GetInteger( p_demux, "screen-caching" ) *1000; + return VLC_SUCCESS; + + case DEMUX_GET_TIME: + pi64 = (int64_t*)va_arg( args, int64_t * ); + *pi64 = mdate(); return VLC_SUCCESS; /* TODO implement others */ @@ -267,3 +315,75 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) return VLC_EGENERIC; } } + +#ifdef SCREEN_SUBSCREEN +void FollowMouse( demux_sys_t *p_sys, int i_x, int i_y ) +{ + i_x -= p_sys->i_width/2; + if( i_x < 0 ) i_x = 0; + p_sys->i_left = __MIN( (unsigned int)i_x, + p_sys->i_screen_width - p_sys->i_width ); + + i_y -= p_sys->i_height/2; + if( i_y < 0 ) i_y = 0; + p_sys->i_top = __MIN( (unsigned int)i_y, + p_sys->i_screen_height - p_sys->i_height ); +} +#endif + +#ifdef SCREEN_MOUSE +void RenderCursor( demux_t *p_demux, int i_x, int i_y, + uint8_t *p_dst ) +{ + demux_sys_t *p_sys = p_demux->p_sys; + if( !p_sys->dst.i_planes ) + picture_Setup( &p_sys->dst, + p_sys->fmt.video.i_chroma, + p_sys->fmt.video.i_width, + p_sys->fmt.video.i_height, + p_sys->fmt.video.i_sar_num, + p_sys->fmt.video.i_sar_den ); + if( !p_sys->p_blend ) + { + p_sys->p_blend = vlc_object_create( p_demux, sizeof(filter_t) ); + if( p_sys->p_blend ) + { + es_format_Init( &p_sys->p_blend->fmt_in, VIDEO_ES, + VLC_CODEC_RGBA ); + p_sys->p_blend->fmt_in.video = p_sys->p_mouse->format; + p_sys->p_blend->fmt_out = p_sys->fmt; + p_sys->p_blend->p_module = + module_need( p_sys->p_blend, "video blending", NULL, false ); + if( !p_sys->p_blend->p_module ) + { + msg_Err( p_demux, "Could not load video blending module" ); + vlc_object_release( p_sys->p_blend ); + p_sys->p_blend = NULL; + } + } + } + if( p_sys->p_blend ) + { + p_sys->dst.p->p_pixels = p_dst; + p_sys->p_blend->pf_video_blend( p_sys->p_blend, + &p_sys->dst, + p_sys->p_mouse, +#ifdef SCREEN_SUBSCREEN + i_x-p_sys->i_left, +#else + i_x, +#endif +#ifdef SCREEN_SUBSCREEN + i_y-p_sys->i_top, +#else + i_y, +#endif + 255 ); + } + else + { + picture_Release( p_sys->p_mouse ); + p_sys->p_mouse = NULL; + } +} +#endif