Commit 4adeff9f authored by Antoine Cellerier's avatar Antoine Cellerier

Implement partial screen capture and cursor following on windows.

parent e5324e70
...@@ -3,6 +3,8 @@ Changes between 0.9.1 and 1.0.0-git: ...@@ -3,6 +3,8 @@ Changes between 0.9.1 and 1.0.0-git:
Inputs: Inputs:
* Mouse cursor support in x11 screen module * Mouse cursor support in x11 screen module
* Screen module now supports partial screen capture and mouse following on
windows.
Decoders: Decoders:
* AES3 (SMPTE 302M) support * AES3 (SMPTE 302M) support
......
/***************************************************************************** /*****************************************************************************
* screen.c: Screen capture module. * screen.c: Screen capture module.
***************************************************************************** *****************************************************************************
* Copyright (C) 2004 the VideoLAN team * Copyright (C) 2004-2008 the VideoLAN team
* $Id$ * $Id$
* *
* Authors: Gildas Bazin <gbazin@videolan.org> * Authors: Gildas Bazin <gbazin@videolan.org>
* Antoine Cellerier <dionoea at videolan dot org>
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
...@@ -308,3 +309,18 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) ...@@ -308,3 +309,18 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
return VLC_EGENERIC; 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
/***************************************************************************** /*****************************************************************************
* screen.h: Screen capture module. * screen.h: Screen capture module.
***************************************************************************** *****************************************************************************
* Copyright (C) 2004 the VideoLAN team * Copyright (C) 2004-2008 the VideoLAN team
* $Id$ * $Id$
* *
* Authors: Gildas Bazin <gbazin@videolan.org> * Authors: Gildas Bazin <gbazin@videolan.org>
* Antoine Cellerier <dionoea at videolan dot org>
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
...@@ -25,8 +26,11 @@ ...@@ -25,8 +26,11 @@
#include <vlc_access.h> #include <vlc_access.h>
#include <vlc_demux.h> #include <vlc_demux.h>
#if !defined( HAVE_WIN32 ) && !defined( HAVE_BEOS ) && !defined( HAVE_DARWIN ) #if !defined( HAVE_BEOS ) && !defined( HAVE_DARWIN )
# define SCREEN_SUBSCREEN # define SCREEN_SUBSCREEN
#endif
#if !defined( HAVE_WIN32 ) && !defined( HAVE_BEOS ) && !defined( HAVE_DARWIN )
# define SCREEN_MOUSE # define SCREEN_MOUSE
#endif #endif
...@@ -69,3 +73,6 @@ int screen_InitCapture ( demux_t * ); ...@@ -69,3 +73,6 @@ int screen_InitCapture ( demux_t * );
int screen_CloseCapture( demux_t * ); int screen_CloseCapture( demux_t * );
block_t *screen_Capture( demux_t * ); block_t *screen_Capture( demux_t * );
#ifdef SCREEN_SUBSCREEN
void FollowMouse( demux_sys_t *, int, int );
#endif
...@@ -54,9 +54,11 @@ int screen_InitCapture( demux_t *p_demux ) ...@@ -54,9 +54,11 @@ int screen_InitCapture( demux_t *p_demux )
demux_sys_t *p_sys = p_demux->p_sys; demux_sys_t *p_sys = p_demux->p_sys;
screen_data_t *p_data; screen_data_t *p_data;
int i_chroma, i_bits_per_pixel; int i_chroma, i_bits_per_pixel;
vlc_value_t val;
p_sys->p_data = p_data = malloc( sizeof( screen_data_t ) ); p_sys->p_data = p_data = malloc( sizeof( screen_data_t ) );
if( !p_data )
return VLC_ENOMEM;
memset( p_data, 0, sizeof( screen_data_t ) );
/* Get the device context for the whole screen */ /* Get the device context for the whole screen */
p_data->hdc_src = CreateDC( "DISPLAY", NULL, NULL, NULL ); p_data->hdc_src = CreateDC( "DISPLAY", NULL, NULL, NULL );
...@@ -122,32 +124,6 @@ int screen_InitCapture( demux_t *p_demux ) ...@@ -122,32 +124,6 @@ int screen_InitCapture( demux_t *p_demux )
} }
/* Create the bitmap info header */
p_data->bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
p_data->bmi.bmiHeader.biWidth = p_sys->fmt.video.i_width;
p_data->bmi.bmiHeader.biHeight = - p_sys->fmt.video.i_height;
p_data->bmi.bmiHeader.biPlanes = 1;
p_data->bmi.bmiHeader.biBitCount = p_sys->fmt.video.i_bits_per_pixel;
p_data->bmi.bmiHeader.biCompression = BI_RGB;
p_data->bmi.bmiHeader.biSizeImage = 0;
p_data->bmi.bmiHeader.biXPelsPerMeter =
p_data->bmi.bmiHeader.biYPelsPerMeter = 0;
p_data->bmi.bmiHeader.biClrUsed = 0;
p_data->bmi.bmiHeader.biClrImportant = 0;
var_Create( p_demux, "screen-fragment-size",
VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
var_Get( p_demux, "screen-fragment-size", &val );
p_data->i_fragment_size =
val.i_int > 0 ? val.i_int : p_sys->fmt.video.i_height;
p_data->i_fragment_size =
val.i_int > p_sys->fmt.video.i_height ? p_sys->fmt.video.i_height :
p_data->i_fragment_size;
p_sys->f_fps *= (p_sys->fmt.video.i_height/p_data->i_fragment_size);
p_sys->i_incr = 1000000 / p_sys->f_fps;
p_data->i_fragment = 0;
p_data->p_block = 0;
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -189,6 +165,37 @@ static block_t *CaptureBlockNew( demux_t *p_demux ) ...@@ -189,6 +165,37 @@ static block_t *CaptureBlockNew( demux_t *p_demux )
int i_buffer; int i_buffer;
HBITMAP hbmp; HBITMAP hbmp;
if( p_data->bmi.bmiHeader.biSize == 0 )
{
vlc_value_t val;
/* Create the bitmap info header */
p_data->bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
p_data->bmi.bmiHeader.biWidth = p_sys->fmt.video.i_width;
p_data->bmi.bmiHeader.biHeight = - p_sys->fmt.video.i_height;
p_data->bmi.bmiHeader.biPlanes = 1;
p_data->bmi.bmiHeader.biBitCount = p_sys->fmt.video.i_bits_per_pixel;
p_data->bmi.bmiHeader.biCompression = BI_RGB;
p_data->bmi.bmiHeader.biSizeImage = 0;
p_data->bmi.bmiHeader.biXPelsPerMeter =
p_data->bmi.bmiHeader.biYPelsPerMeter = 0;
p_data->bmi.bmiHeader.biClrUsed = 0;
p_data->bmi.bmiHeader.biClrImportant = 0;
var_Create( p_demux, "screen-fragment-size",
VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
var_Get( p_demux, "screen-fragment-size", &val );
p_data->i_fragment_size =
val.i_int > 0 ? val.i_int : p_sys->fmt.video.i_height;
p_data->i_fragment_size =
val.i_int > p_sys->fmt.video.i_height ? p_sys->fmt.video.i_height :
p_data->i_fragment_size;
p_sys->f_fps *= (p_sys->fmt.video.i_height/p_data->i_fragment_size);
p_sys->i_incr = 1000000 / p_sys->f_fps;
p_data->i_fragment = 0;
p_data->p_block = 0;
}
/* Create the bitmap storage space */ /* Create the bitmap storage space */
hbmp = CreateDIBSection( p_data->hdc_dst, &p_data->bmi, DIB_RGB_COLORS, hbmp = CreateDIBSection( p_data->hdc_dst, &p_data->bmi, DIB_RGB_COLORS,
&p_buffer, NULL, 0 ); &p_buffer, NULL, 0 );
...@@ -242,11 +249,18 @@ block_t *screen_Capture( demux_t *p_demux ) ...@@ -242,11 +249,18 @@ block_t *screen_Capture( demux_t *p_demux )
} }
} }
if( !BitBlt( p_data->hdc_dst, 0, p_data->i_fragment * if( p_sys->b_follow_mouse )
p_data->i_fragment_size, {
POINT pos;
GetCursorPos( &pos );
FollowMouse( p_sys, pos.x, pos.y );
}
if( !BitBlt( p_data->hdc_dst, 0,
p_data->i_fragment * p_data->i_fragment_size,
p_sys->fmt.video.i_width, p_data->i_fragment_size, p_sys->fmt.video.i_width, p_data->i_fragment_size,
p_data->hdc_src, 0, p_data->i_fragment * p_data->hdc_src, p_sys->i_left, p_sys->i_top +
p_data->i_fragment_size, p_data->i_fragment * p_data->i_fragment_size,
IS_WINNT ? SRCCOPY | CAPTUREBLT : SRCCOPY ) ) IS_WINNT ? SRCCOPY | CAPTUREBLT : SRCCOPY ) )
{ {
msg_Err( p_demux, "error during BitBlt()" ); msg_Err( p_demux, "error during BitBlt()" );
......
/***************************************************************************** /*****************************************************************************
* x11.c: Screen capture module. * x11.c: Screen capture module.
***************************************************************************** *****************************************************************************
* Copyright (C) 2004 the VideoLAN team * Copyright (C) 2004-2008 the VideoLAN team
* $Id$ * $Id$
* *
* Authors: Gildas Bazin <gbazin@videolan.org> * Authors: Gildas Bazin <gbazin@videolan.org>
* Antoine Cellerier <dionoea at videolan dot org>
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
...@@ -133,16 +134,7 @@ block_t *screen_Capture( demux_t *p_demux ) ...@@ -133,16 +134,7 @@ block_t *screen_Capture( demux_t *p_demux )
&mask ) ) &mask ) )
{ {
if( p_sys->b_follow_mouse ) if( p_sys->b_follow_mouse )
{ FollowMouse( p_sys, root_x, root_y );
root_x -= p_sys->i_width/2;
if( root_x < 0 ) root_x = 0;
p_sys->i_left = __MIN( (unsigned int)root_x,
p_sys->i_screen_width - p_sys->i_width );
root_y -= p_sys->i_height/2;
if( root_y < 0 ) root_y = 0;
p_sys->i_top = __MIN( (unsigned int)root_y,
p_sys->i_screen_height - p_sys->i_height );
}
} }
else else
msg_Dbg( p_demux, "XQueryPointer() failed" ); msg_Dbg( p_demux, "XQueryPointer() failed" );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment