]> git.sesse.net Git - vlc/blob - modules/misc/dummy/vout.c
Merge branch 1.0-bugfix
[vlc] / modules / misc / dummy / vout.c
1 /*****************************************************************************
2  * vout_dummy.c: Dummy video output display method for testing purposes
3  *****************************************************************************
4  * Copyright (C) 2000, 2001 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Samuel Hocevar <sam@zoy.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_common.h>
33 #include <vlc_vout.h>
34
35 #define DUMMY_WIDTH 16
36 #define DUMMY_HEIGHT 16
37 #define DUMMY_MAX_DIRECTBUFFERS 10
38
39 #include "dummy.h"
40
41 /*****************************************************************************
42  * Local prototypes
43  *****************************************************************************/
44 static int  Init       ( vout_thread_t * );
45 static void End        ( vout_thread_t * );
46 static int  Manage     ( vout_thread_t * );
47 static void Render     ( vout_thread_t *, picture_t * );
48 static void Display    ( vout_thread_t *, picture_t * );
49 static void SetPalette ( vout_thread_t *, uint16_t *, uint16_t *, uint16_t * );
50 static int  Control   ( vout_thread_t *, int, va_list );
51
52 /*****************************************************************************
53  * OpenVideo: activates dummy video thread output method
54  *****************************************************************************
55  * This function initializes a dummy vout method.
56  *****************************************************************************/
57 int OpenVideo ( vlc_object_t *p_this )
58 {
59     vout_thread_t * p_vout = (vout_thread_t *)p_this;
60
61     p_vout->pf_init = Init;
62     p_vout->pf_end = End;
63     p_vout->pf_manage = Manage;
64     p_vout->pf_render = Render;
65     p_vout->pf_display = Display;
66     p_vout->pf_control = Control;
67
68     return VLC_SUCCESS;
69 }
70
71 /*****************************************************************************
72  * Control: control facility for the vout
73  *****************************************************************************/
74 static int Control( vout_thread_t *p_vout, int i_query, va_list args )
75 {
76     (void) p_vout; (void) i_query; (void) args;
77     return VLC_EGENERIC;
78 }
79
80
81 /*****************************************************************************
82  * Init: initialize dummy video thread output method
83  *****************************************************************************/
84 static int Init( vout_thread_t *p_vout )
85 {
86     int i_index, i_chroma;
87     char *psz_chroma;
88     picture_t *p_pic;
89     bool b_chroma = 0;
90
91     psz_chroma = config_GetPsz( p_vout, "dummy-chroma" );
92     i_chroma = vlc_fourcc_GetCodecFromString( VIDEO_ES, psz_chroma );
93     b_chroma = i_chroma != 0;
94     free( psz_chroma );
95
96     I_OUTPUTPICTURES = 0;
97
98     /* Initialize the output structure */
99     if( b_chroma )
100     {
101         msg_Dbg( p_vout, "forcing chroma 0x%.8x (%4.4s)",
102                          i_chroma, (char*)&i_chroma );
103         p_vout->output.i_chroma = i_chroma;
104         if ( i_chroma == VLC_CODEC_RGB8 )
105         {
106             p_vout->output.pf_setpalette = SetPalette;
107         }
108         p_vout->output.i_width  = p_vout->render.i_width;
109         p_vout->output.i_height = p_vout->render.i_height;
110         p_vout->output.i_aspect = p_vout->render.i_aspect;
111     }
112     else
113     {
114         /* Use same chroma as input */
115         p_vout->output.i_chroma = p_vout->render.i_chroma;
116         p_vout->output.i_rmask  = p_vout->render.i_rmask;
117         p_vout->output.i_gmask  = p_vout->render.i_gmask;
118         p_vout->output.i_bmask  = p_vout->render.i_bmask;
119         p_vout->output.i_width  = p_vout->render.i_width;
120         p_vout->output.i_height = p_vout->render.i_height;
121         p_vout->output.i_aspect = p_vout->render.i_aspect;
122     }
123
124     /* Try to initialize DUMMY_MAX_DIRECTBUFFERS direct buffers */
125     while( I_OUTPUTPICTURES < DUMMY_MAX_DIRECTBUFFERS )
126     {
127         p_pic = NULL;
128
129         /* Find an empty picture slot */
130         for( i_index = 0 ; i_index < VOUT_MAX_PICTURES ; i_index++ )
131         {
132             if( p_vout->p_picture[ i_index ].i_status == FREE_PICTURE )
133             {
134                 p_pic = p_vout->p_picture + i_index;
135                 break;
136             }
137         }
138
139         /* Allocate the picture */
140         if( p_pic == NULL )
141         {
142             break;
143         }
144
145         vout_AllocatePicture( VLC_OBJECT(p_vout), p_pic, p_vout->output.i_chroma,
146                               p_vout->output.i_width, p_vout->output.i_height,
147                               p_vout->output.i_aspect );
148
149         if( p_pic->i_planes == 0 )
150         {
151             break;
152         }
153
154         p_pic->i_status = DESTROYED_PICTURE;
155         p_pic->i_type   = DIRECT_PICTURE;
156
157         PP_OUTPUTPICTURE[ I_OUTPUTPICTURES ] = p_pic;
158
159         I_OUTPUTPICTURES++;
160     }
161
162     return( 0 );
163 }
164
165 /*****************************************************************************
166  * End: terminate dummy video thread output method
167  *****************************************************************************/
168 static void End( vout_thread_t *p_vout )
169 {
170     int i_index;
171
172     /* Free the fake output buffers we allocated */
173     for( i_index = I_OUTPUTPICTURES ; i_index ; )
174     {
175         i_index--;
176         free( PP_OUTPUTPICTURE[ i_index ]->p_data_orig );
177     }
178 }
179
180 /*****************************************************************************
181  * Manage: handle dummy events
182  *****************************************************************************
183  * This function should be called regularly by video output thread. It manages
184  * console events. It returns a non null value on error.
185  *****************************************************************************/
186 static int Manage( vout_thread_t *p_vout )
187 {
188     VLC_UNUSED(p_vout);
189     return( 0 );
190 }
191
192 /*****************************************************************************
193  * Render: render previously calculated output
194  *****************************************************************************/
195 static void Render( vout_thread_t *p_vout, picture_t *p_pic )
196 {
197     VLC_UNUSED(p_vout); VLC_UNUSED(p_pic);
198     /* No need to do anything, the fake direct buffers stay as they are */
199 }
200
201 /*****************************************************************************
202  * Display: displays previously rendered output
203  *****************************************************************************/
204 static void Display( vout_thread_t *p_vout, picture_t *p_pic )
205 {
206     VLC_UNUSED(p_vout); VLC_UNUSED(p_pic);
207     /* No need to do anything, the fake direct buffers stay as they are */
208 }
209
210 /*****************************************************************************
211  * SetPalette: set the palette for the picture
212  *****************************************************************************/
213 static void SetPalette ( vout_thread_t *p_vout,
214                          uint16_t *red, uint16_t *green, uint16_t *blue )
215 {
216     VLC_UNUSED(p_vout); VLC_UNUSED(red); VLC_UNUSED(green); VLC_UNUSED(blue);
217     /* No need to do anything, the fake direct buffers stay as they are */
218 }