1 /*****************************************************************************
2 * video.c: libvlc new API video functions
3 *****************************************************************************
4 * Copyright (C) 2005-2010 VLC authors and VideoLAN
8 * Authors: Clément Stenac <zorglub@videolan.org>
9 * Filippo Carone <littlejohn@videolan.org>
10 * Jean-Paul Saman <jpsaman _at_ m2x _dot_ nl>
11 * Damien Fouilleul <damienf a_t videolan dot org>
13 * This program is free software; you can redistribute it and/or modify it
14 * under the terms of the GNU Lesser General Public License as published by
15 * the Free Software Foundation; either version 2.1 of the License, or
16 * (at your option) any later version.
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License for more details.
23 * You should have received a copy of the GNU Lesser General Public License
24 * along with this program; if not, write to the Free Software Foundation,
25 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
26 *****************************************************************************/
32 #include <vlc/libvlc.h>
33 #include <vlc/libvlc_media.h>
34 #include <vlc/libvlc_media_player.h>
36 #include <vlc_common.h>
37 #include <vlc_input.h>
40 #include "media_player_internal.h"
44 * Remember to release the returned vout_thread_t.
46 static vout_thread_t
**GetVouts( libvlc_media_player_t
*p_mi
, size_t *n
)
48 input_thread_t
*p_input
= libvlc_get_input_thread( p_mi
);
55 vout_thread_t
**pp_vouts
;
56 if (input_Control( p_input
, INPUT_GET_VOUTS
, &pp_vouts
, n
))
61 vlc_object_release (p_input
);
65 static vout_thread_t
*GetVout (libvlc_media_player_t
*mp
, size_t num
)
67 vout_thread_t
*p_vout
= NULL
;
69 vout_thread_t
**pp_vouts
= GetVouts (mp
, &n
);
74 p_vout
= pp_vouts
[num
];
76 for (size_t i
= 0; i
< n
; i
++)
78 vlc_object_release (pp_vouts
[i
]);
83 libvlc_printerr ("Video output not active");
87 /**********************************************************************
89 **********************************************************************/
91 void libvlc_set_fullscreen( libvlc_media_player_t
*p_mi
, int b_fullscreen
)
93 /* This will work even if the video is not currently active */
94 var_SetBool (p_mi
, "fullscreen", !!b_fullscreen
);
96 /* Apply to current video outputs (if any) */
98 vout_thread_t
**pp_vouts
= GetVouts (p_mi
, &n
);
99 for (size_t i
= 0; i
< n
; i
++)
101 var_SetBool (pp_vouts
[i
], "fullscreen", b_fullscreen
);
102 vlc_object_release (pp_vouts
[i
]);
107 int libvlc_get_fullscreen( libvlc_media_player_t
*p_mi
)
109 return var_GetBool (p_mi
, "fullscreen");
112 void libvlc_toggle_fullscreen( libvlc_media_player_t
*p_mi
)
114 bool b_fullscreen
= var_ToggleBool (p_mi
, "fullscreen");
116 /* Apply to current video outputs (if any) */
118 vout_thread_t
**pp_vouts
= GetVouts (p_mi
, &n
);
119 for (size_t i
= 0; i
< n
; i
++)
121 vout_thread_t
*p_vout
= pp_vouts
[i
];
123 var_SetBool (p_vout
, "fullscreen", b_fullscreen
);
124 vlc_object_release (p_vout
);
129 void libvlc_video_set_key_input( libvlc_media_player_t
*p_mi
, unsigned on
)
131 var_SetBool (p_mi
, "keyboard-events", !!on
);
134 void libvlc_video_set_mouse_input( libvlc_media_player_t
*p_mi
, unsigned on
)
136 var_SetBool (p_mi
, "mouse-events", !!on
);
140 libvlc_video_take_snapshot( libvlc_media_player_t
*p_mi
, unsigned num
,
141 const char *psz_filepath
,
142 unsigned int i_width
, unsigned int i_height
)
144 assert( psz_filepath
);
146 vout_thread_t
*p_vout
= GetVout (p_mi
, num
);
150 /* FIXME: This is not atomic. Someone else could change the values,
151 * at least in theory. */
152 var_SetInteger( p_vout
, "snapshot-width", i_width
);
153 var_SetInteger( p_vout
, "snapshot-height", i_height
);
154 var_SetString( p_vout
, "snapshot-path", psz_filepath
);
155 var_SetString( p_vout
, "snapshot-format", "png" );
156 var_TriggerCallback( p_vout
, "video-snapshot" );
157 vlc_object_release( p_vout
);
161 int libvlc_video_get_size( libvlc_media_player_t
*p_mi
, unsigned num
,
162 unsigned *restrict px
, unsigned *restrict py
)
164 libvlc_media_track_info_t
*info
;
168 int infos
= libvlc_media_get_tracks_info(p_mi
->p_md
, &info
);
172 for (int i
= 0; i
< infos
; i
++)
173 if (info
[i
].i_type
== libvlc_track_video
&& num
-- == 0) {
174 *px
= info
[i
].u
.video
.i_width
;
175 *py
= info
[i
].u
.video
.i_height
;
184 int libvlc_video_get_height( libvlc_media_player_t
*p_mi
)
186 unsigned width
, height
;
188 if (libvlc_video_get_size (p_mi
, 0, &width
, &height
))
193 int libvlc_video_get_width( libvlc_media_player_t
*p_mi
)
195 unsigned width
, height
;
197 if (libvlc_video_get_size (p_mi
, 0, &width
, &height
))
202 int libvlc_video_get_cursor( libvlc_media_player_t
*mp
, unsigned num
,
203 int *restrict px
, int *restrict py
)
205 vout_thread_t
*p_vout
= GetVout (mp
, num
);
209 var_GetCoords (p_vout
, "mouse-moved", px
, py
);
210 vlc_object_release (p_vout
);
214 unsigned libvlc_media_player_has_vout( libvlc_media_player_t
*p_mi
)
217 vout_thread_t
**pp_vouts
= GetVouts (p_mi
, &n
);
218 for (size_t i
= 0; i
< n
; i
++)
219 vlc_object_release (pp_vouts
[i
]);
224 float libvlc_video_get_scale( libvlc_media_player_t
*mp
)
226 float f_scale
= var_GetFloat (mp
, "scale");
227 if (var_GetBool (mp
, "autoscale"))
232 void libvlc_video_set_scale( libvlc_media_player_t
*p_mp
, float f_scale
)
235 var_SetFloat (p_mp
, "scale", f_scale
);
236 var_SetBool (p_mp
, "autoscale", f_scale
== 0.);
238 /* Apply to current video outputs (if any) */
240 vout_thread_t
**pp_vouts
= GetVouts (p_mp
, &n
);
241 for (size_t i
= 0; i
< n
; i
++)
243 vout_thread_t
*p_vout
= pp_vouts
[i
];
246 var_SetFloat (p_vout
, "scale", f_scale
);
247 var_SetBool (p_vout
, "autoscale", f_scale
== 0.);
248 vlc_object_release (p_vout
);
253 char *libvlc_video_get_aspect_ratio( libvlc_media_player_t
*p_mi
)
255 return var_GetNonEmptyString (p_mi
, "aspect-ratio");
258 void libvlc_video_set_aspect_ratio( libvlc_media_player_t
*p_mi
,
259 const char *psz_aspect
)
261 if (psz_aspect
== NULL
)
263 var_SetString (p_mi
, "aspect-ratio", psz_aspect
);
266 vout_thread_t
**pp_vouts
= GetVouts (p_mi
, &n
);
267 for (size_t i
= 0; i
< n
; i
++)
269 vout_thread_t
*p_vout
= pp_vouts
[i
];
271 var_SetString (p_vout
, "aspect-ratio", psz_aspect
);
272 vlc_object_release (p_vout
);
277 int libvlc_video_get_spu( libvlc_media_player_t
*p_mi
)
279 input_thread_t
*p_input_thread
= libvlc_get_input_thread( p_mi
);
280 vlc_value_t val_list
;
286 if( !p_input_thread
)
288 libvlc_printerr( "No active input" );
292 i_ret
= var_Get( p_input_thread
, "spu-es", &val
);
295 vlc_object_release( p_input_thread
);
296 libvlc_printerr( "Subtitle information not found" );
300 var_Change( p_input_thread
, "spu-es", VLC_VAR_GETCHOICES
, &val_list
, NULL
);
301 for( i
= 0; i
< val_list
.p_list
->i_count
; i
++ )
303 if( val
.i_int
== val_list
.p_list
->p_values
[i
].i_int
)
309 var_FreeList( &val_list
, NULL
);
310 vlc_object_release( p_input_thread
);
314 int libvlc_video_get_spu_count( libvlc_media_player_t
*p_mi
)
316 input_thread_t
*p_input_thread
= libvlc_get_input_thread( p_mi
);
319 if( !p_input_thread
)
322 i_spu_count
= var_CountChoices( p_input_thread
, "spu-es" );
323 vlc_object_release( p_input_thread
);
327 libvlc_track_description_t
*
328 libvlc_video_get_spu_description( libvlc_media_player_t
*p_mi
)
330 return libvlc_get_track_description( p_mi
, "spu-es" );
333 int libvlc_video_set_spu( libvlc_media_player_t
*p_mi
, unsigned i_spu
)
335 input_thread_t
*p_input_thread
= libvlc_get_input_thread( p_mi
);
339 if( !p_input_thread
)
342 var_Change (p_input_thread
, "spu-es", VLC_VAR_GETCHOICES
, &list
, NULL
);
344 if (i_spu
> (unsigned)list
.p_list
->i_count
)
346 libvlc_printerr( "Subtitle number out of range (%u/%u)",
347 i_spu
, list
.p_list
->i_count
);
351 var_SetInteger (p_input_thread
, "spu-es",
352 list
.p_list
->p_values
[i_spu
].i_int
);
354 vlc_object_release (p_input_thread
);
355 var_FreeList (&list
, NULL
);
359 int libvlc_video_set_subtitle_file( libvlc_media_player_t
*p_mi
,
360 const char *psz_subtitle
)
362 input_thread_t
*p_input_thread
= libvlc_get_input_thread ( p_mi
);
367 if( !input_AddSubtitle( p_input_thread
, psz_subtitle
, true ) )
369 vlc_object_release( p_input_thread
);
374 int64_t libvlc_video_get_spu_delay( libvlc_media_player_t
*p_mi
)
376 input_thread_t
*p_input_thread
= libvlc_get_input_thread( p_mi
);
381 val
= var_GetTime( p_input_thread
, "spu-delay" );
382 vlc_object_release( p_input_thread
);
386 libvlc_printerr( "No active input" );
392 int libvlc_video_set_spu_delay( libvlc_media_player_t
*p_mi
,
395 input_thread_t
*p_input_thread
= libvlc_get_input_thread( p_mi
);
400 var_SetTime( p_input_thread
, "spu-delay", i_delay
);
401 vlc_object_release( p_input_thread
);
406 libvlc_printerr( "No active input" );
412 libvlc_track_description_t
*
413 libvlc_video_get_title_description( libvlc_media_player_t
*p_mi
)
415 return libvlc_get_track_description( p_mi
, "title" );
418 libvlc_track_description_t
*
419 libvlc_video_get_chapter_description( libvlc_media_player_t
*p_mi
,
423 sprintf( psz_title
, "title %2i", i_title
);
424 return libvlc_get_track_description( p_mi
, psz_title
);
427 char *libvlc_video_get_crop_geometry (libvlc_media_player_t
*p_mi
)
429 return var_GetNonEmptyString (p_mi
, "crop");
432 void libvlc_video_set_crop_geometry( libvlc_media_player_t
*p_mi
,
433 const char *psz_geometry
)
435 if (psz_geometry
== NULL
)
438 var_SetString (p_mi
, "crop", psz_geometry
);
441 vout_thread_t
**pp_vouts
= GetVouts (p_mi
, &n
);
443 for (size_t i
= 0; i
< n
; i
++)
445 vout_thread_t
*p_vout
= pp_vouts
[i
];
448 /* Make sure the geometry is in the choice list */
449 /* Earlier choices are removed to not grow a long list over time. */
450 /* FIXME: not atomic - lock? */
451 val
.psz_string
= (char *)psz_geometry
;
452 var_Change (p_vout
, "crop", VLC_VAR_CLEARCHOICES
, NULL
, NULL
);
453 var_Change (p_vout
, "crop", VLC_VAR_ADDCHOICE
, &val
, &val
);
454 var_SetString (p_vout
, "crop", psz_geometry
);
455 vlc_object_release (p_vout
);
460 int libvlc_video_get_teletext( libvlc_media_player_t
*p_mi
)
462 return var_GetInteger (p_mi
, "vbi-page");
465 void libvlc_video_set_teletext( libvlc_media_player_t
*p_mi
, int i_page
)
467 input_thread_t
*p_input_thread
;
468 vlc_object_t
*p_zvbi
= NULL
;
471 var_SetInteger (p_mi
, "vbi-page", i_page
);
473 p_input_thread
= libvlc_get_input_thread( p_mi
);
474 if( !p_input_thread
) return;
476 if( var_CountChoices( p_input_thread
, "teletext-es" ) <= 0 )
478 vlc_object_release( p_input_thread
);
482 telx
= var_GetInteger( p_input_thread
, "teletext-es" );
483 if( input_GetEsObjects( p_input_thread
, telx
, &p_zvbi
, NULL
, NULL
)
486 var_SetInteger( p_zvbi
, "vbi-page", i_page
);
487 vlc_object_release( p_zvbi
);
489 vlc_object_release( p_input_thread
);
492 void libvlc_toggle_teletext( libvlc_media_player_t
*p_mi
)
494 input_thread_t
*p_input_thread
;
496 p_input_thread
= libvlc_get_input_thread(p_mi
);
497 if( !p_input_thread
) return;
499 if( var_CountChoices( p_input_thread
, "teletext-es" ) <= 0 )
501 vlc_object_release( p_input_thread
);
504 const bool b_selected
= var_GetInteger( p_input_thread
, "teletext-es" ) >= 0;
507 var_SetInteger( p_input_thread
, "spu-es", -1 );
512 if( !var_Change( p_input_thread
, "teletext-es", VLC_VAR_GETLIST
, &list
, NULL
) )
514 if( list
.p_list
->i_count
> 0 )
515 var_SetInteger( p_input_thread
, "spu-es", list
.p_list
->p_values
[0].i_int
);
517 var_FreeList( &list
, NULL
);
520 vlc_object_release( p_input_thread
);
523 int libvlc_video_get_track_count( libvlc_media_player_t
*p_mi
)
525 input_thread_t
*p_input_thread
= libvlc_get_input_thread( p_mi
);
528 if( !p_input_thread
)
531 i_track_count
= var_CountChoices( p_input_thread
, "video-es" );
533 vlc_object_release( p_input_thread
);
534 return i_track_count
;
537 libvlc_track_description_t
*
538 libvlc_video_get_track_description( libvlc_media_player_t
*p_mi
)
540 return libvlc_get_track_description( p_mi
, "video-es" );
543 int libvlc_video_get_track( libvlc_media_player_t
*p_mi
)
545 input_thread_t
*p_input_thread
= libvlc_get_input_thread( p_mi
);
546 vlc_value_t val_list
;
550 if( !p_input_thread
)
553 if( var_Get( p_input_thread
, "video-es", &val
) < 0 )
555 libvlc_printerr( "Video track information not found" );
556 vlc_object_release( p_input_thread
);
560 var_Change( p_input_thread
, "video-es", VLC_VAR_GETCHOICES
, &val_list
, NULL
);
561 for( int i
= 0; i
< val_list
.p_list
->i_count
; i
++ )
563 if( val_list
.p_list
->p_values
[i
].i_int
== val
.i_int
)
569 var_FreeList( &val_list
, NULL
);
570 vlc_object_release( p_input_thread
);
574 int libvlc_video_set_track( libvlc_media_player_t
*p_mi
, int i_track
)
576 input_thread_t
*p_input_thread
= libvlc_get_input_thread( p_mi
);
577 vlc_value_t val_list
;
580 if( !p_input_thread
)
583 var_Change( p_input_thread
, "video-es", VLC_VAR_GETCHOICES
, &val_list
, NULL
);
584 for( int i
= 0; i
< val_list
.p_list
->i_count
; i
++ )
586 if( i_track
== val_list
.p_list
->p_values
[i
].i_int
)
588 if( var_SetInteger( p_input_thread
, "video-es", i_track
) < 0 )
594 libvlc_printerr( "Video track number out of range" );
596 var_FreeList( &val_list
, NULL
);
597 vlc_object_release( p_input_thread
);
601 /******************************************************************************
602 * libvlc_video_set_deinterlace : enable deinterlace
603 *****************************************************************************/
604 void libvlc_video_set_deinterlace( libvlc_media_player_t
*p_mi
,
605 const char *psz_mode
)
607 if (psz_mode
== NULL
)
610 && strcmp (psz_mode
, "blend") && strcmp (psz_mode
, "bob")
611 && strcmp (psz_mode
, "discard") && strcmp (psz_mode
, "linear")
612 && strcmp (psz_mode
, "mean") && strcmp (psz_mode
, "x")
613 && strcmp (psz_mode
, "yadif") && strcmp (psz_mode
, "yadif2x")
614 && strcmp (psz_mode
, "phosphor") && strcmp (psz_mode
, "ivtc"))
619 var_SetString (p_mi
, "deinterlace-mode", psz_mode
);
620 var_SetInteger (p_mi
, "deinterlace", 1);
623 var_SetInteger (p_mi
, "deinterlace", 0);
626 vout_thread_t
**pp_vouts
= GetVouts (p_mi
, &n
);
627 for (size_t i
= 0; i
< n
; i
++)
629 vout_thread_t
*p_vout
= pp_vouts
[i
];
633 var_SetString (p_vout
, "deinterlace-mode", psz_mode
);
634 var_SetInteger (p_vout
, "deinterlace", 1);
637 var_SetInteger (p_vout
, "deinterlace", 0);
638 vlc_object_release (p_vout
);
648 static vlc_object_t
*get_object( libvlc_media_player_t
* p_mi
,
651 vlc_object_t
*object
;
652 vout_thread_t
*vout
= GetVout( p_mi
, 0 );
656 object
= vlc_object_find_name( vout
, name
);
657 vlc_object_release(vout
);
663 libvlc_printerr( "%s not enabled", name
);
668 typedef const struct {
675 set_int( libvlc_media_player_t
*p_mi
, const char *restrict name
,
676 const opt_t
*restrict opt
, int value
)
680 if( !opt
->type
) /* the enabler */
682 vout_thread_t
*vout
= GetVout( p_mi
, 0 );
685 vout_EnableFilter( vout
, opt
->name
, value
, false );
686 vlc_object_release( vout
);
691 if( opt
->type
!= VLC_VAR_INTEGER
)
693 libvlc_printerr( "Invalid argument to %s in %s", name
, "set int" );
697 var_SetInteger(p_mi
, opt
->name
, value
);
698 vlc_object_t
*object
= get_object( p_mi
, name
);
701 var_SetInteger(object
, opt
->name
, value
);
702 vlc_object_release( object
);
708 get_int( libvlc_media_player_t
*p_mi
, const char *restrict name
,
709 const opt_t
*restrict opt
)
715 case 0: /* the enabler */
717 vlc_object_t
*object
= get_object( p_mi
, name
);
718 vlc_object_release( object
);
719 return object
!= NULL
;
721 case VLC_VAR_INTEGER
:
722 return var_GetInteger(p_mi
, opt
->name
);
724 libvlc_printerr( "Invalid argument to %s in %s", name
, "get int" );
731 set_float( libvlc_media_player_t
*p_mi
, const char *restrict name
,
732 const opt_t
*restrict opt
, float value
)
736 if( opt
->type
!= VLC_VAR_FLOAT
)
738 libvlc_printerr( "Invalid argument to %s in %s", name
, "set float" );
742 var_SetFloat( p_mi
, opt
->name
, value
);
744 vlc_object_t
*object
= get_object( p_mi
, name
);
747 var_SetFloat(object
, opt
->name
, value
);
748 vlc_object_release( object
);
754 get_float( libvlc_media_player_t
*p_mi
, const char *restrict name
,
755 const opt_t
*restrict opt
)
757 if( !opt
) return 0.0;
760 if( opt
->type
!= VLC_VAR_FLOAT
)
762 libvlc_printerr( "Invalid argument to %s in %s", name
, "get float" );
766 return var_GetFloat( p_mi
, opt
->name
);
771 set_string( libvlc_media_player_t
*p_mi
, const char *restrict name
,
772 const opt_t
*restrict opt
, const char *restrict psz_value
)
776 if( opt
->type
!= VLC_VAR_STRING
)
778 libvlc_printerr( "Invalid argument to %s in %s", name
, "set string" );
782 var_SetString( p_mi
, opt
->name
, psz_value
);
784 vlc_object_t
*object
= get_object( p_mi
, name
);
787 var_SetString(object
, opt
->name
, psz_value
);
788 vlc_object_release( object
);
794 get_string( libvlc_media_player_t
*p_mi
, const char *restrict name
,
795 const opt_t
*restrict opt
)
797 if( !opt
) return NULL
;
799 if( opt
->type
!= VLC_VAR_STRING
)
801 libvlc_printerr( "Invalid argument to %s in %s", name
, "get string" );
805 return var_GetString( p_mi
, opt
->name
);
810 marq_option_bynumber(unsigned option
)
812 static const opt_t optlist
[] =
815 { "marq-marquee", VLC_VAR_STRING
},
816 { "marq-color", VLC_VAR_INTEGER
},
817 { "marq-opacity", VLC_VAR_INTEGER
},
818 { "marq-position", VLC_VAR_INTEGER
},
819 { "marq-refresh", VLC_VAR_INTEGER
},
820 { "marq-size", VLC_VAR_INTEGER
},
821 { "marq-timeout", VLC_VAR_INTEGER
},
822 { "marq-x", VLC_VAR_INTEGER
},
823 { "marq-y", VLC_VAR_INTEGER
},
825 enum { num_opts
= sizeof(optlist
) / sizeof(*optlist
) };
827 const opt_t
*r
= option
< num_opts
? optlist
+option
: NULL
;
829 libvlc_printerr( "Unknown marquee option" );
833 static vlc_object_t
*get_object( libvlc_media_player_t
*, const char *);
835 /*****************************************************************************
836 * libvlc_video_get_marquee_int : get a marq option value
837 *****************************************************************************/
838 int libvlc_video_get_marquee_int( libvlc_media_player_t
*p_mi
,
841 return get_int( p_mi
, "marq", marq_option_bynumber(option
) );
844 /*****************************************************************************
845 * libvlc_video_get_marquee_string : get a marq option value
846 *****************************************************************************/
847 char * libvlc_video_get_marquee_string( libvlc_media_player_t
*p_mi
,
850 return get_string( p_mi
, "marq", marq_option_bynumber(option
) );
853 /*****************************************************************************
854 * libvlc_video_set_marquee_int: enable, disable or set an int option
855 *****************************************************************************/
856 void libvlc_video_set_marquee_int( libvlc_media_player_t
*p_mi
,
857 unsigned option
, int value
)
859 set_int( p_mi
, "marq", marq_option_bynumber(option
), value
);
862 /*****************************************************************************
863 * libvlc_video_set_marquee_string: set a string option
864 *****************************************************************************/
865 void libvlc_video_set_marquee_string( libvlc_media_player_t
*p_mi
,
866 unsigned option
, const char * value
)
868 set_string( p_mi
, "marq", marq_option_bynumber(option
), value
);
872 /* logo module support */
876 logo_option_bynumber( unsigned option
)
878 static const opt_t vlogo_optlist
[] =
879 /* depends on libvlc_video_logo_option_t */
882 { "logo-file", VLC_VAR_STRING
},
883 { "logo-x", VLC_VAR_INTEGER
},
884 { "logo-y", VLC_VAR_INTEGER
},
885 { "logo-delay", VLC_VAR_INTEGER
},
886 { "logo-repeat", VLC_VAR_INTEGER
},
887 { "logo-opacity", VLC_VAR_INTEGER
},
888 { "logo-position", VLC_VAR_INTEGER
},
890 enum { num_vlogo_opts
= sizeof(vlogo_optlist
) / sizeof(*vlogo_optlist
) };
892 const opt_t
*r
= option
< num_vlogo_opts
? vlogo_optlist
+option
: NULL
;
894 libvlc_printerr( "Unknown logo option" );
899 void libvlc_video_set_logo_string( libvlc_media_player_t
*p_mi
,
900 unsigned option
, const char *psz_value
)
902 set_string( p_mi
,"logo",logo_option_bynumber(option
),psz_value
);
906 void libvlc_video_set_logo_int( libvlc_media_player_t
*p_mi
,
907 unsigned option
, int value
)
909 set_int( p_mi
, "logo", logo_option_bynumber(option
), value
);
913 int libvlc_video_get_logo_int( libvlc_media_player_t
*p_mi
,
916 return get_int( p_mi
, "logo", logo_option_bynumber(option
) );
920 /* adjust module support */
924 adjust_option_bynumber( unsigned option
)
926 static const opt_t optlist
[] =
929 { "contrast", VLC_VAR_FLOAT
},
930 { "brightness", VLC_VAR_FLOAT
},
931 { "hue", VLC_VAR_INTEGER
},
932 { "saturation", VLC_VAR_FLOAT
},
933 { "gamma", VLC_VAR_FLOAT
},
935 enum { num_opts
= sizeof(optlist
) / sizeof(*optlist
) };
937 const opt_t
*r
= option
< num_opts
? optlist
+option
: NULL
;
939 libvlc_printerr( "Unknown adjust option" );
944 void libvlc_video_set_adjust_int( libvlc_media_player_t
*p_mi
,
945 unsigned option
, int value
)
947 set_int( p_mi
, "adjust", adjust_option_bynumber(option
), value
);
951 int libvlc_video_get_adjust_int( libvlc_media_player_t
*p_mi
,
954 return get_int( p_mi
, "adjust", adjust_option_bynumber(option
) );
958 void libvlc_video_set_adjust_float( libvlc_media_player_t
*p_mi
,
959 unsigned option
, float value
)
961 set_float( p_mi
, "adjust", adjust_option_bynumber(option
), value
);
965 float libvlc_video_get_adjust_float( libvlc_media_player_t
*p_mi
,
968 return get_float( p_mi
, "adjust", adjust_option_bynumber(option
) );