ALL: splitted screen module (needed as BeOS requires C++)
[vlc.git] / modules / access / screen / beos.cpp
1 /*****************************************************************************
2  * beos.cpp: Screen capture module.
3  *****************************************************************************
4  * Copyright (C) 2004 VideoLAN
5  * $Id: screen.c 8284 2004-07-26 10:27:55Z gbazin $
6  *
7  * Authors: Eric Petit <titer@m0k.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., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
22  *****************************************************************************/
23
24 #include <stdlib.h>
25
26 #include <vlc/vlc.h>
27 #include <vlc/input.h>
28
29 #include <Screen.h>
30 #include <Bitmap.h>
31
32 extern "C"
33 {
34
35 #include "screen.h"
36
37 struct screen_data_t
38 {
39     BScreen * p_screen;
40     BBitmap * p_bitmap;
41 };
42
43 int screen_InitCapture( demux_t *p_demux )
44 {
45     demux_sys_t   *p_sys = p_demux->p_sys;
46     screen_data_t *p_data;
47     BRect          rect;
48
49     p_sys->p_data = p_data =
50         (screen_data_t *)malloc( sizeof( screen_data_t ) );
51
52     p_data->p_screen = new BScreen();
53     rect = p_data->p_screen->Frame();
54
55     p_data->p_bitmap = new BBitmap( rect, p_data->p_screen->ColorSpace() );
56
57     /* FIXME */
58     es_format_Init( &p_sys->fmt, VIDEO_ES, VLC_FOURCC('R','V','3','2') );
59     p_sys->fmt.video.i_width  = (int)rect.Width();
60     p_sys->fmt.video.i_height = (int)rect.Height();
61     p_sys->fmt.video.i_bits_per_pixel = 32;
62
63     return VLC_SUCCESS;
64 }
65
66 int screen_CloseCapture( demux_t *p_demux )
67 {
68     demux_sys_t   *p_sys  = p_demux->p_sys;
69     screen_data_t *p_data = p_sys->p_data;
70
71     delete p_data->p_bitmap;
72     delete p_data->p_screen;
73     free( p_data );
74
75     return VLC_SUCCESS;
76 }
77
78 block_t *screen_Capture( demux_t *p_demux )
79 {
80     demux_sys_t   *p_sys  = p_demux->p_sys;
81     screen_data_t *p_data = p_sys->p_data;
82     block_t       *p_block;
83
84     p_block = block_New( p_demux, 4 * p_sys->fmt.video.i_width *
85                          p_sys->fmt.video.i_height );
86
87     p_data->p_screen->ReadBitmap( p_data->p_bitmap );
88
89     for( unsigned i = 0; i < p_sys->fmt.video.i_height; i++ )
90     {
91         memcpy( p_block->p_buffer + i * 4 * p_sys->fmt.video.i_width,
92                 (uint8_t *) p_data->p_bitmap->Bits() +
93                     i * p_data->p_bitmap->BytesPerRow(),
94                 p_sys->fmt.video.i_width );
95     }
96     return p_block;
97 }
98
99 } /* extern "C" */