]> git.sesse.net Git - vlc/blob - src/control/video.c
A bit of headers cleanup
[vlc] / src / control / video.c
1 /*****************************************************************************
2  * video.c: libvlc new API video functions
3  *****************************************************************************
4  * Copyright (C) 2005 the VideoLAN team
5  *
6  * $Id: core.c 14187 2006-02-07 16:37:40Z courmisch $
7  *
8  * Authors: Cl�ent Stenac <zorglub@videolan.org>
9  *          Filippo Carone <littlejohn@videolan.org>
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License, or
14  * (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
24  *****************************************************************************/
25
26 #include "libvlc_internal.h"
27 #include <vlc/libvlc.h>
28 #include <vlc_input.h>
29 #include <vlc_vout.h>
30
31 /*
32  * Remember to release the returned vout_thread_t since it is locked at
33  * the end of this function.
34  */
35 static vout_thread_t *GetVout( libvlc_input_t *p_input,
36                                libvlc_exception_t *p_exception )
37 {
38     input_thread_t *p_input_thread;
39     vout_thread_t *p_vout;
40
41     if( !p_input )
42     {
43         libvlc_exception_raise( p_exception, "Input is NULL" );
44         return NULL;
45     }
46
47     p_input_thread = (input_thread_t*)vlc_object_get(
48                                  p_input->p_instance->p_libvlc_int,
49                                  p_input->i_input_id );
50     if( !p_input_thread )
51     {
52         libvlc_exception_raise( p_exception, "Input does not exist" );
53         return NULL;
54     }
55
56     p_vout = vlc_object_find( p_input_thread, VLC_OBJECT_VOUT, FIND_CHILD );
57     if( !p_vout )
58     {
59         vlc_object_release( p_input_thread );
60         libvlc_exception_raise( p_exception, "No active video output" );
61         return NULL;
62     }
63     vlc_object_release( p_input_thread );
64
65     return p_vout;
66 }
67 /**********************************************************************
68  * Exported functions
69  **********************************************************************/
70
71 void libvlc_set_fullscreen( libvlc_input_t *p_input, int b_fullscreen,
72                             libvlc_exception_t *p_e )
73 {
74     /* We only work on the first vout */
75     vout_thread_t *p_vout1 = GetVout( p_input, p_e );
76     vlc_value_t val; int i_ret;
77
78     /* GetVout will raise the exception for us */
79     if( !p_vout1 )
80     {
81         return;
82     }
83
84     if( b_fullscreen ) val.b_bool = VLC_TRUE;
85     else               val.b_bool = VLC_FALSE;
86
87     i_ret = var_Set( p_vout1, "fullscreen", val );
88     if( i_ret )
89         libvlc_exception_raise( p_e,
90                         "Unexpected error while setting fullscreen value" );
91
92     vlc_object_release( p_vout1 );
93 }
94
95 int libvlc_get_fullscreen( libvlc_input_t *p_input,
96                             libvlc_exception_t *p_e )
97 {
98     /* We only work on the first vout */
99     vout_thread_t *p_vout1 = GetVout( p_input, p_e );
100     vlc_value_t val; int i_ret;
101
102     /* GetVout will raise the exception for us */
103     if( !p_vout1 )
104         return 0;
105
106     i_ret = var_Get( p_vout1, "fullscreen", &val );
107     if( i_ret )
108         libvlc_exception_raise( p_e,
109                         "Unexpected error while looking up fullscreen value" );
110
111     return val.b_bool == VLC_TRUE ? 1 : 0;
112 }
113
114 void libvlc_toggle_fullscreen( libvlc_input_t *p_input,
115                                libvlc_exception_t *p_e )
116 {
117     /* We only work on the first vout */
118     vout_thread_t *p_vout1 = GetVout( p_input, p_e );
119     vlc_value_t val; int i_ret;
120
121     /* GetVout will raise the exception for us */
122     if( !p_vout1 )
123         return;
124
125     i_ret = var_Get( p_vout1, "fullscreen", &val );
126     if( i_ret )
127         libvlc_exception_raise( p_e,
128                         "Unexpected error while looking up fullscreen value" );
129
130     val.b_bool = !val.b_bool;
131     i_ret = var_Set( p_vout1, "fullscreen", val );
132     if( i_ret )
133         libvlc_exception_raise( p_e,
134                         "Unexpected error while setting fullscreen value" );
135
136     vlc_object_release( p_vout1 );
137 }
138
139 void
140 libvlc_video_take_snapshot( libvlc_input_t *p_input, char *psz_filepath,
141                        libvlc_exception_t *p_e )
142 {
143     vout_thread_t *p_vout = GetVout( p_input, p_e );
144     input_thread_t *p_input_thread;
145
146     char path[256];
147
148     /* GetVout will raise the exception for us */
149     if( !p_vout )
150     {
151         return;
152     }
153
154     p_input_thread = (input_thread_t*)vlc_object_get(
155                                  p_input->p_instance->p_libvlc_int,
156                                  p_input->i_input_id );
157     if( !p_input_thread )
158     {
159         libvlc_exception_raise( p_e, "Input does not exist" );
160         return;
161     }
162
163     snprintf( path, 255, "%s", psz_filepath );
164     var_SetString( p_vout, "snapshot-path", path );
165     var_SetString( p_vout, "snapshot-format", "png" );
166
167     vout_Control( p_vout, VOUT_SNAPSHOT );
168     vlc_object_release( p_vout );
169     vlc_object_release( p_input_thread );
170 }
171
172 int libvlc_video_get_height( libvlc_input_t *p_input,
173                              libvlc_exception_t *p_e ) 
174 {
175     vout_thread_t *p_vout1 = GetVout( p_input, p_e );
176     if( !p_vout1 )
177         return 0;
178
179     vlc_object_release( p_vout1 );
180
181     return p_vout1->i_window_height;
182 }
183
184 int libvlc_video_get_width( libvlc_input_t *p_input,
185                             libvlc_exception_t *p_e ) 
186 {
187     vout_thread_t *p_vout1 = GetVout( p_input, p_e );
188     if( !p_vout1 )
189         return 0;
190
191     vlc_object_release( p_vout1 );
192
193     return p_vout1->i_window_width;
194 }
195
196 vlc_bool_t libvlc_input_has_vout( libvlc_input_t *p_input,
197                                   libvlc_exception_t *p_e )
198 {
199     vout_thread_t *p_vout = GetVout( p_input, p_e );
200
201     /* GetVout will raise the exception for us */
202     if( !p_vout )
203     {
204         return VLC_FALSE;
205     }
206
207     vlc_object_release( p_vout );
208
209     return VLC_TRUE;
210 }
211
212 int libvlc_video_reparent( libvlc_input_t *p_input, libvlc_drawable_t d,
213                            libvlc_exception_t *p_e )
214 {
215     vout_thread_t *p_vout = GetVout( p_input, p_e );
216
217     if ( p_vout == NULL)
218     {
219         /// \todo: set exception
220         return 0;
221     }
222     
223     vout_Control( p_vout , VOUT_REPARENT, d);
224     vlc_object_release( p_vout );
225
226     return 0;
227 }
228
229 void libvlc_video_resize( libvlc_input_t *p_input, int width, int height, libvlc_exception_t *p_e )
230 {
231     vout_thread_t *p_vout = GetVout( p_input, p_e );
232     vout_Control( p_vout, VOUT_SET_SIZE, width, height );
233     vlc_object_release( p_vout );
234 }
235
236 /* global video settings */
237
238 void libvlc_video_set_parent( libvlc_instance_t *p_instance, libvlc_drawable_t d,
239                               libvlc_exception_t *p_e )
240 {
241     /* set as default for future vout instances */
242     var_SetInteger(p_instance->p_libvlc_int, "drawable", (int)d);
243
244     if( libvlc_playlist_isplaying(p_instance, p_e) )
245     {
246         libvlc_input_t *p_input = libvlc_playlist_get_input(p_instance, p_e);
247         if( p_input )
248         {
249             vout_thread_t *p_vout = GetVout( p_input, p_e );
250             if( p_vout )
251             {
252                 /* tell running vout to re-parent */
253                 vout_Control( p_vout , VOUT_REPARENT, d);
254                 vlc_object_release( p_vout );
255             }
256             libvlc_input_free(p_input);
257         }
258     }
259 }
260
261 void libvlc_video_set_size( libvlc_instance_t *p_instance, int width, int height,
262                            libvlc_exception_t *p_e )
263 {
264     /* set as default for future vout instances */
265     config_PutInt(p_instance->p_libvlc_int, "width", width);
266     config_PutInt(p_instance->p_libvlc_int, "height", height);
267
268     if( libvlc_playlist_isplaying(p_instance, p_e) )
269     {
270         libvlc_input_t *p_input = libvlc_playlist_get_input(p_instance, p_e);
271         if( p_input )
272         {
273             vout_thread_t *p_vout = GetVout( p_input, p_e );
274             if( p_vout )
275             {
276                 /* tell running vout to re-size */
277                 vout_Control( p_vout , VOUT_SET_SIZE, width, height);
278                 vlc_object_release( p_vout );
279             }
280             libvlc_input_free(p_input);
281         }
282     }
283 }
284
285 void libvlc_video_set_viewport( libvlc_instance_t *p_instance,
286                             const libvlc_rectangle_t *view, const libvlc_rectangle_t *clip,
287                            libvlc_exception_t *p_e )
288 {
289     if( NULL == view )
290     {
291         libvlc_exception_raise( p_e, "viewport is NULL" );
292     }
293
294     /* if clip is NULL, then use view rectangle as clip */
295     if( NULL == clip )
296         clip = view;
297
298     /* set as default for future vout instances */
299     var_SetInteger( p_instance->p_libvlc_int, "drawable-view-top", view->top );
300     var_SetInteger( p_instance->p_libvlc_int, "drawable-view-left", view->left );
301     var_SetInteger( p_instance->p_libvlc_int, "drawable-view-bottom", view->bottom );
302     var_SetInteger( p_instance->p_libvlc_int, "drawable-view-right", view->right );
303     var_SetInteger( p_instance->p_libvlc_int, "drawable-clip-top", clip->top );
304     var_SetInteger( p_instance->p_libvlc_int, "drawable-clip-left", clip->left );
305     var_SetInteger( p_instance->p_libvlc_int, "drawable-clip-bottom", clip->bottom );
306     var_SetInteger( p_instance->p_libvlc_int, "drawable-clip-right", clip->right );
307
308     if( libvlc_playlist_isplaying(p_instance, p_e) )
309     {
310         libvlc_input_t *p_input = libvlc_playlist_get_input(p_instance, p_e);
311         if( p_input )
312         {
313             vout_thread_t *p_vout = GetVout( p_input, p_e );
314             if( p_vout )
315             {
316                 /* change viewport for running vout */
317                 vout_Control( p_vout , VOUT_SET_VIEWPORT,
318                                    view->top, view->left, view->bottom, view->right,
319                                    clip->top, clip->left, clip->bottom, clip->right );
320                 vlc_object_release( p_vout );
321             }
322             libvlc_input_free(p_input);
323         }
324     }
325 }
326
327 char *libvlc_video_get_aspect_ratio( libvlc_input_t *p_input,
328                                    libvlc_exception_t *p_e )
329 {
330     char *psz_aspect = 0;
331     vout_thread_t *p_vout = GetVout( p_input, p_e );
332
333     if( !p_vout )
334         return 0;
335
336     psz_aspect = var_GetString( p_vout, "aspect-ratio" );
337     vlc_object_release( p_vout );
338     return psz_aspect;
339 }
340
341 void libvlc_video_set_aspect_ratio( libvlc_input_t *p_input,
342                                     char *psz_aspect, libvlc_exception_t *p_e )
343 {
344     vout_thread_t *p_vout = GetVout( p_input, p_e );
345     int i_ret = -1;
346
347     if( !p_vout )
348         return;
349
350     i_ret = var_SetString( p_vout, "aspect-ratio", psz_aspect );
351     if( i_ret )
352         libvlc_exception_raise( p_e,
353                         "Unexpected error while setting aspect-ratio value" );
354
355     vlc_object_release( p_vout );
356 }
357
358 int libvlc_video_destroy( libvlc_input_t *p_input,
359                           libvlc_exception_t *p_e )
360 {
361     vout_thread_t *p_vout = GetVout( p_input, p_e );
362     vlc_object_detach( p_vout ); 
363     vlc_object_release( p_vout );
364     vout_Destroy( p_vout );
365
366     return 0;
367 }