]> git.sesse.net Git - vlc/blob - modules/access/screen/x11.c
Fix UIC compilation.
[vlc] / modules / access / screen / x11.c
1 /*****************************************************************************
2  * x11.c: Screen capture module.
3  *****************************************************************************
4  * Copyright (C) 2004 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Gildas Bazin <gbazin@videolan.org>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22  *****************************************************************************/
23
24 /*****************************************************************************
25  * Preamble
26  *****************************************************************************/
27
28 #ifdef HAVE_CONFIG_H
29 # include "config.h"
30 #endif
31
32 #include <vlc/vlc.h>
33
34 #include <X11/Xlib.h>
35 #include <X11/Xutil.h>
36
37 #include "screen.h"
38
39 int screen_InitCapture( demux_t *p_demux )
40 {
41     demux_sys_t *p_sys = p_demux->p_sys;
42     Display *p_display;
43     XWindowAttributes win_info;
44     int i_chroma;
45
46     /* Open the display */
47     p_display = XOpenDisplay( NULL );
48     if( !p_display )
49     {
50         msg_Err( p_demux, "cannot open display" );
51         return VLC_EGENERIC;
52     }
53     p_sys->p_data = (void *)p_display;
54
55     /* Get the parameters of the root window */
56     if( !XGetWindowAttributes( p_display,
57                                DefaultRootWindow( p_display ),
58                                &win_info ) )
59     {
60         msg_Err( p_demux, "can't get root window attributes" );
61         XCloseDisplay( p_display );
62         return VLC_EGENERIC;
63     }
64
65     switch( win_info.depth )
66     {
67     case 8: /* FIXME: set the palette */
68         i_chroma = VLC_FOURCC('R','G','B','2'); break;
69     case 15:
70         i_chroma = VLC_FOURCC('R','V','1','5'); break;
71     case 16:
72         i_chroma = VLC_FOURCC('R','V','1','6'); break;
73     case 24:
74     case 32:
75         i_chroma = VLC_FOURCC('R','V','3','2');
76         win_info.depth = 32;
77         break;
78     default:
79         msg_Err( p_demux, "unknown screen depth %i", win_info.depth );
80         XCloseDisplay( p_display );
81         return VLC_EGENERIC;
82     }
83
84     es_format_Init( &p_sys->fmt, VIDEO_ES, i_chroma );
85     p_sys->fmt.video.i_width  = win_info.width;
86     p_sys->fmt.video.i_height = win_info.height;
87     p_sys->fmt.video.i_bits_per_pixel = win_info.depth;
88
89 #if 0
90     win_info.visual->red_mask;
91     win_info.visual->green_mask;
92     win_info.visual->blue_mask;
93     win_info.visual->bits_per_rgb;
94 #endif
95
96     return VLC_SUCCESS;
97 }
98
99 int screen_CloseCapture( demux_t *p_demux )
100 {
101     demux_sys_t *p_sys = p_demux->p_sys;
102     Display *p_display = (Display *)p_sys->p_data;
103
104     XCloseDisplay( p_display );
105     return VLC_SUCCESS;
106 }
107
108 block_t *screen_Capture( demux_t *p_demux )
109 {
110     demux_sys_t *p_sys = p_demux->p_sys;
111     Display *p_display = (Display *)p_sys->p_data;
112     block_t *p_block;
113     XImage *image;
114     int i_size;
115
116     image = XGetImage( p_display, DefaultRootWindow( p_display ),
117                        0, 0, p_sys->fmt.video.i_width,
118                        p_sys->fmt.video.i_height, AllPlanes, ZPixmap );
119
120     if( !image )
121     {
122         msg_Warn( p_demux, "cannot get image" );
123         return 0;
124     }
125
126     i_size = image->bytes_per_line * image->height;
127
128     if( !( p_block = block_New( p_demux, i_size ) ) )
129     {
130         msg_Warn( p_demux, "cannot get block" );
131         XDestroyImage( image );
132         return 0;
133     }
134
135     memcpy( p_block->p_buffer, image->data, i_size );
136
137     XDestroyImage( image );
138
139     return p_block;
140 }
141