1 /*****************************************************************************
3 *****************************************************************************
4 * Copyright (C) 2007-2008 the VideoLAN team
6 * Authors: Antoine Cellerier <dionoea at videolan tod org>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
21 *****************************************************************************/
23 /*****************************************************************************
25 *****************************************************************************/
34 #include <vlc_common.h>
38 #include <vlc_playlist.h>
39 #include <vlc_player.h>
46 #include "../extension.h"
48 vout_thread_t
*vlclua_get_vout_internal(lua_State
*L
)
50 vlc_player_t
*player
= vlclua_get_player_internal(L
);
51 return vlc_player_vout_Hold(player
);
54 audio_output_t
*vlclua_get_aout_internal(lua_State
*L
)
56 vlc_player_t
*player
= vlclua_get_player_internal(L
);
57 return vlc_player_aout_Hold(player
);
60 static input_item_t
* vlclua_input_item_get_internal( lua_State
*L
);
62 static int vlclua_input_item_info( lua_State
*L
)
64 input_item_t
*p_item
= vlclua_input_item_get_internal( L
);
67 i_cat
= p_item
->i_categories
;
68 lua_createtable( L
, 0, i_cat
);
69 for( i
= 0; i
< i_cat
; i
++ )
71 info_category_t
*p_category
= p_item
->pp_categories
[i
];
74 lua_pushstring( L
, p_category
->psz_name
);
76 info_foreach(p_info
, &p_category
->infos
)
78 lua_pushstring( L
, p_info
->psz_name
);
79 lua_pushstring( L
, p_info
->psz_value
);
80 lua_settable( L
, -3 );
82 lua_settable( L
, -3 );
87 static int vlclua_input_is_playing( lua_State
*L
)
89 vlc_player_t
*player
= vlclua_get_player_internal(L
);
91 vlc_player_Lock(player
);
92 bool started
= vlc_player_IsStarted(player
);
93 vlc_player_Unlock(player
);
94 lua_pushboolean(L
, started
);
98 static int vlclua_player_get_title_index(lua_State
*L
)
100 vlc_player_t
*player
= vlclua_get_player_internal(L
);
102 vlc_player_Lock(player
);
103 ssize_t idx
= vlc_player_GetSelectedTitleIdx(player
);
104 vlc_player_Unlock(player
);
106 lua_pushinteger(L
, idx
);
110 static int vlclua_player_get_titles_count(lua_State
*L
)
112 vlc_player_t
*player
= vlclua_get_player_internal(L
);
114 vlc_player_Lock(player
);
115 struct vlc_player_title_list
*titles
= vlc_player_GetTitleList(player
);
116 size_t count
= titles
? vlc_player_title_list_GetCount(titles
) : 0;
117 vlc_player_Unlock(player
);
119 lua_pushinteger(L
, count
);
123 static int vlclua_player_title_next(lua_State
*L
)
125 vlc_player_t
*player
= vlclua_get_player_internal(L
);
127 vlc_player_Lock(player
);
128 vlc_player_SelectNextTitle(player
);
129 vlc_player_Unlock(player
);
134 static int vlclua_player_title_prev(lua_State
*L
)
136 vlc_player_t
*player
= vlclua_get_player_internal(L
);
138 vlc_player_Lock(player
);
139 vlc_player_SelectPrevTitle(player
);
140 vlc_player_Unlock(player
);
145 static int vlclua_player_title_goto(lua_State
*L
)
147 int idx
= luaL_checkinteger(L
, 1);
149 vlc_player_t
*player
= vlclua_get_player_internal(L
);
151 vlc_player_Lock(player
);
152 vlc_player_SelectTitleIdx(player
, idx
);
153 vlc_player_Unlock(player
);
158 static int vlclua_player_get_chapter_index(lua_State
*L
)
160 vlc_player_t
*player
= vlclua_get_player_internal(L
);
162 vlc_player_Lock(player
);
163 ssize_t idx
= vlc_player_GetSelectedChapterIdx(player
);
164 vlc_player_Unlock(player
);
166 lua_pushinteger(L
, idx
);
170 static int vlclua_player_get_chapters_count(lua_State
*L
)
172 vlc_player_t
*player
= vlclua_get_player_internal(L
);
174 vlc_player_Lock(player
);
175 const struct vlc_player_title
*current_title
=
176 vlc_player_GetSelectedTitle(player
);
178 size_t count
= current_title
? current_title
->chapter_count
: 0;
179 vlc_player_Unlock(player
);
181 lua_pushinteger(L
, count
);
185 static int vlclua_player_chapter_next(lua_State
*L
)
187 vlc_player_t
*player
= vlclua_get_player_internal(L
);
189 vlc_player_Lock(player
);
190 vlc_player_SelectNextChapter(player
);
191 vlc_player_Unlock(player
);
196 static int vlclua_player_chapter_prev(lua_State
*L
)
198 vlc_player_t
*player
= vlclua_get_player_internal(L
);
200 vlc_player_Lock(player
);
201 vlc_player_SelectPrevChapter(player
);
202 vlc_player_Unlock(player
);
207 static int vlclua_player_chapter_goto(lua_State
*L
)
209 int idx
= luaL_checkinteger(L
, 1);
211 vlc_player_t
*player
= vlclua_get_player_internal(L
);
213 vlc_player_Lock(player
);
214 vlc_player_SelectChapterIdx(player
, idx
);
215 vlc_player_Unlock(player
);
220 static int vlclua_player_get_time(lua_State
*L
)
222 vlc_player_t
*player
= vlclua_get_player_internal(L
);
224 vlc_player_Lock(player
);
225 vlc_tick_t time
= vlc_player_GetTime(player
);
226 vlc_player_Unlock(player
);
228 lua_pushinteger(L
, US_FROM_VLC_TICK(time
));
232 static int vlclua_player_get_position(lua_State
*L
)
234 vlc_player_t
*player
= vlclua_get_player_internal(L
);
236 vlc_player_Lock(player
);
237 float pos
= vlc_player_GetPosition(player
);
238 vlc_player_Unlock(player
);
240 lua_pushnumber(L
, pos
);
244 static int vlclua_player_get_rate(lua_State
*L
)
246 vlc_player_t
*player
= vlclua_get_player_internal(L
);
248 vlc_player_Lock(player
);
249 float rate
= vlc_player_GetRate(player
);
250 vlc_player_Unlock(player
);
252 lua_pushnumber(L
, rate
);
256 static int vlclua_player_set_rate(lua_State
*L
)
258 vlc_player_t
*player
= vlclua_get_player_internal(L
);
260 float rate
= luaL_checknumber(L
, 1);
262 vlc_player_Lock(player
);
263 vlc_player_ChangeRate(player
, rate
);
264 vlc_player_Unlock(player
);
269 static int vlclua_player_increment_rate(lua_State
*L
)
271 vlc_player_t
*player
= vlclua_get_player_internal(L
);
273 vlc_player_Lock(player
);
274 vlc_player_IncrementRate(player
);
275 vlc_player_Unlock(player
);
280 static int vlclua_player_decrement_rate(lua_State
*L
)
282 vlc_player_t
*player
= vlclua_get_player_internal(L
);
284 vlc_player_Lock(player
);
285 vlc_player_DecrementRate(player
);
286 vlc_player_Unlock(player
);
291 static int vlclua_player_get_tracks_(lua_State
*L
,
292 enum es_format_category_e cat
)
294 vlc_player_t
*player
= vlclua_get_player_internal(L
);
296 vlc_player_Lock(player
);
298 size_t count
= vlc_player_GetTrackCount(player
, cat
);
299 lua_createtable(L
, count
, 0);
301 for (size_t i
= 0; i
< count
; ++i
)
303 const struct vlc_player_track
*track
=
304 vlc_player_GetTrackAt(player
, cat
, i
);
311 lua_pushinteger(L
, vlc_es_id_GetInputId(track
->es_id
));
312 lua_setfield(L
, -2, "id");
314 lua_pushstring(L
, track
->name
);
315 lua_setfield(L
, -2, "name");
317 lua_pushboolean(L
, track
->selected
);
318 lua_setfield(L
, -2, "selected");
320 lua_rawseti(L
, -2, i
+ 1);
323 vlc_player_Unlock(player
);
328 static int vlclua_player_get_video_tracks(lua_State
*L
)
330 return vlclua_player_get_tracks_(L
, VIDEO_ES
);
333 static int vlclua_player_get_audio_tracks(lua_State
*L
)
335 return vlclua_player_get_tracks_(L
, AUDIO_ES
);
338 static int vlclua_player_get_spu_tracks(lua_State
*L
)
340 return vlclua_player_get_tracks_(L
, SPU_ES
);
343 static const struct vlc_player_track
*
344 FindTrack(vlc_player_t
*player
, enum es_format_category_e cat
, int id
)
346 size_t count
= vlc_player_GetTrackCount(player
, cat
);
347 for (size_t i
= 0; i
< count
; ++i
)
349 const struct vlc_player_track
*track
=
350 vlc_player_GetTrackAt(player
, cat
, i
);
351 if (id
== vlc_es_id_GetInputId(track
->es_id
))
357 static int vlclua_player_toggle_track_(lua_State
*L
,
358 enum es_format_category_e cat
,
361 vlc_player_t
*player
= vlclua_get_player_internal(L
);
363 vlc_player_Lock(player
);
365 const struct vlc_player_track
*track
= FindTrack(player
, cat
, id
);
368 vlc_player_UnselectTrack(player
, track
);
370 vlc_player_SelectTrack(player
, track
, VLC_PLAYER_SELECT_EXCLUSIVE
);
373 vlc_player_Unlock(player
);
378 static int vlclua_player_toggle_video_track(lua_State
*L
)
380 int id
= luaL_checkinteger(L
, 1);
381 return vlclua_player_toggle_track_(L
, VIDEO_ES
, id
);
384 static int vlclua_player_toggle_audio_track(lua_State
*L
)
386 int id
= luaL_checkinteger(L
, 1);
387 return vlclua_player_toggle_track_(L
, AUDIO_ES
, id
);
390 static int vlclua_player_toggle_spu_track(lua_State
*L
)
392 int id
= luaL_checkinteger(L
, 1);
393 return vlclua_player_toggle_track_(L
, SPU_ES
, id
);
396 static int vlclua_player_next_video_frame(lua_State
*L
)
398 vlc_player_t
*player
= vlclua_get_player_internal(L
);
400 vlc_player_Lock(player
);
401 vlc_player_NextVideoFrame(player
);
402 vlc_player_Unlock(player
);
407 static int vlclua_player_seek_by_pos_(lua_State
*L
,
408 enum vlc_player_whence whence
)
410 float position
= luaL_checknumber(L
, 1);
412 vlc_player_t
*player
= vlclua_get_player_internal(L
);
414 vlc_player_Lock(player
);
415 vlc_player_SeekByPos(player
, position
, VLC_PLAYER_SEEK_PRECISE
, whence
);
416 vlc_player_Unlock(player
);
421 static int vlclua_player_seek_by_pos_absolute(lua_State
*L
)
423 return vlclua_player_seek_by_pos_(L
, VLC_PLAYER_WHENCE_ABSOLUTE
);
426 static int vlclua_player_seek_by_pos_relative(lua_State
*L
)
428 return vlclua_player_seek_by_pos_(L
, VLC_PLAYER_WHENCE_RELATIVE
);
431 static int vlclua_player_seek_by_time_(lua_State
*L
,
432 enum vlc_player_whence whence
)
434 int usec
= luaL_checkinteger(L
, 1);
435 vlc_tick_t time
= VLC_TICK_FROM_US(usec
);
437 vlc_player_t
*player
= vlclua_get_player_internal(L
);
439 vlc_player_Lock(player
);
440 vlc_player_SeekByTime(player
, time
, VLC_PLAYER_SEEK_PRECISE
, whence
);
441 vlc_player_Unlock(player
);
446 static int vlclua_player_seek_by_time_absolute(lua_State
*L
)
448 return vlclua_player_seek_by_time_(L
, VLC_PLAYER_WHENCE_ABSOLUTE
);
451 static int vlclua_player_seek_by_time_relative(lua_State
*L
)
453 return vlclua_player_seek_by_time_(L
, VLC_PLAYER_WHENCE_RELATIVE
);
456 static int vlclua_player_get_audio_delay(lua_State
*L
)
458 vlc_player_t
*player
= vlclua_get_player_internal(L
);
460 vlc_player_Lock(player
);
461 vlc_tick_t delay
= vlc_player_GetAudioDelay(player
);
462 vlc_player_Unlock(player
);
464 double delay_sec
= secf_from_vlc_tick(delay
);
466 lua_pushnumber(L
, delay_sec
);
470 static int vlclua_player_set_audio_delay(lua_State
*L
)
472 vlc_player_t
*player
= vlclua_get_player_internal(L
);
474 double delay_sec
= luaL_checknumber(L
, 1);
475 vlc_tick_t delay
= vlc_tick_from_sec(delay_sec
);
477 vlc_player_Lock(player
);
478 vlc_player_SetAudioDelay(player
, delay
, VLC_PLAYER_WHENCE_ABSOLUTE
);
479 vlc_player_Unlock(player
);
484 static int vlclua_player_get_subtitle_delay(lua_State
*L
)
486 vlc_player_t
*player
= vlclua_get_player_internal(L
);
488 vlc_player_Lock(player
);
489 vlc_tick_t delay
= vlc_player_GetSubtitleDelay(player
);
490 vlc_player_Unlock(player
);
492 double delay_sec
= secf_from_vlc_tick(delay
);
494 lua_pushnumber(L
, delay_sec
);
498 static int vlclua_player_set_subtitle_delay(lua_State
*L
)
500 vlc_player_t
*player
= vlclua_get_player_internal(L
);
502 double delay_sec
= luaL_checknumber(L
, 1);
503 vlc_tick_t delay
= vlc_tick_from_sec(delay_sec
);
505 vlc_player_Lock(player
);
506 vlc_player_SetSubtitleDelay(player
, delay
, VLC_PLAYER_WHENCE_ABSOLUTE
);
507 vlc_player_Unlock(player
);
512 static int vlclua_input_metas_internal( lua_State
*L
, input_item_t
*p_item
)
521 const char *psz_meta
;
523 char* psz_uri
= input_item_GetURI( p_item
);
524 char* psz_filename
= psz_uri
? strrchr( psz_uri
, '/' ) : NULL
;
526 if( psz_filename
&& psz_filename
[1] == '\0' )
528 /* trailing slash, get the preceeding data */
529 psz_filename
[0] = '\0';
530 psz_filename
= strrchr( psz_uri
, '/' );
535 /* url decode, without leading slash */
536 psz_filename
= vlc_uri_decode( psz_filename
+ 1 );
539 lua_pushstring( L
, psz_filename
);
540 lua_setfield( L
, -2, "filename" );
544 #define PUSH_META( n, m ) \
545 psz_meta = vlc_meta_Get( p_item->p_meta, vlc_meta_ ## n ); \
546 lua_pushstring( L, psz_meta ); \
547 lua_setfield( L, -2, m )
549 vlc_mutex_lock(&p_item
->lock
);
553 PUSH_META( Title
, "title" );
554 PUSH_META( Artist
, "artist" );
555 PUSH_META( Genre
, "genre" );
556 PUSH_META( Copyright
, "copyright" );
557 PUSH_META( Album
, "album" );
558 PUSH_META( TrackNumber
, "track_number" );
559 PUSH_META( Description
, "description" );
560 PUSH_META( Rating
, "rating" );
561 PUSH_META( Date
, "date" );
562 PUSH_META( Setting
, "setting" );
563 PUSH_META( URL
, "url" );
564 PUSH_META( Language
, "language" );
565 PUSH_META( NowPlaying
, "now_playing" );
566 PUSH_META( Publisher
, "publisher" );
567 PUSH_META( EncodedBy
, "encoded_by" );
568 PUSH_META( ArtworkURL
, "artwork_url" );
569 PUSH_META( TrackID
, "track_id" );
570 PUSH_META( TrackTotal
, "track_total" );
571 PUSH_META( Director
, "director" );
572 PUSH_META( Season
, "season" );
573 PUSH_META( Episode
, "episode" );
574 PUSH_META( ShowName
, "show_name" );
575 PUSH_META( Actors
, "actors" );
579 char **names
= vlc_meta_CopyExtraNames(p_item
->p_meta
);
580 for(int i
= 0; names
[i
]; i
++)
582 const char *meta
= vlc_meta_GetExtra(p_item
->p_meta
, names
[i
]);
583 lua_pushstring( L
, meta
);
584 lua_setfield( L
, -2, names
[i
] );
589 vlc_mutex_unlock(&p_item
->lock
);
594 static int vlclua_input_item_stats( lua_State
*L
)
596 input_item_t
*p_item
= vlclua_input_item_get_internal( L
);
601 vlc_mutex_lock( &p_item
->lock
);
602 input_stats_t
*p_stats
= p_item
->p_stats
;
603 if( p_stats
!= NULL
)
605 #define STATS_INT( n ) lua_pushinteger( L, p_item->p_stats->i_ ## n ); \
606 lua_setfield( L, -2, #n );
607 #define STATS_FLOAT( n ) lua_pushnumber( L, p_item->p_stats->f_ ## n ); \
608 lua_setfield( L, -2, #n );
609 STATS_INT( read_packets
)
610 STATS_INT( read_bytes
)
611 STATS_FLOAT( input_bitrate
)
612 STATS_INT( demux_read_packets
)
613 STATS_INT( demux_read_bytes
)
614 STATS_FLOAT( demux_bitrate
)
615 STATS_INT( demux_corrupted
)
616 STATS_INT( demux_discontinuity
)
617 STATS_INT( decoded_audio
)
618 STATS_INT( decoded_video
)
619 STATS_INT( displayed_pictures
)
620 STATS_INT( late_pictures
)
621 STATS_INT( lost_pictures
)
622 STATS_INT( played_abuffers
)
623 STATS_INT( lost_abuffers
)
627 vlc_mutex_unlock( &p_item
->lock
);
631 static int vlclua_input_add_subtitle(lua_State
*L
, bool b_path
)
633 vlc_player_t
*player
= vlclua_get_player_internal(L
);
635 if (!lua_isstring(L
, 1))
636 return luaL_error( L
, "vlc.player.add_subtitle() usage: (path, autoselect=false)" );
638 bool autoselect
= false;
639 if (lua_gettop(L
) >= 2)
640 autoselect
= lua_toboolean(L
, 2);
642 const char *sub
= luaL_checkstring(L
, 1);
645 mrl
= vlc_path2uri(sub
, NULL
);
647 const char *uri
= b_path
? mrl
: sub
;
648 vlc_player_Lock(player
);
649 vlc_player_AddAssociatedMedia(player
, SPU_ES
, uri
, autoselect
, true, false);
650 vlc_player_Unlock(player
);
657 static int vlclua_input_add_subtitle_path( lua_State
*L
)
659 return vlclua_input_add_subtitle( L
, true );
662 static int vlclua_input_add_subtitle_mrl( lua_State
*L
)
664 return vlclua_input_add_subtitle( L
, false );
667 /*****************************************************************************
669 *****************************************************************************/
671 static input_item_t
* vlclua_input_item_get_internal( lua_State
*L
)
673 input_item_t
**pp_item
= luaL_checkudata( L
, 1, "input_item" );
674 input_item_t
*p_item
= *pp_item
;
677 luaL_error( L
, "script went completely foobar" );
682 /* Garbage collection of an input_item_t */
683 static int vlclua_input_item_delete( lua_State
*L
)
685 input_item_t
**pp_item
= luaL_checkudata( L
, 1, "input_item" );
686 input_item_t
*p_item
= *pp_item
;
689 return luaL_error( L
, "script went completely foobar" );
692 input_item_Release( p_item
);
697 static int vlclua_input_item_get_current( lua_State
*L
)
699 vlc_player_t
*player
= vlclua_get_player_internal(L
);
701 vlc_player_Lock(player
);
702 input_item_t
*media
= vlc_player_GetCurrentMedia(player
);
704 vlclua_input_item_get(L
, media
);
707 vlc_player_Unlock(player
);
712 static int vlclua_input_item_metas( lua_State
*L
)
714 vlclua_input_metas_internal( L
, vlclua_input_item_get_internal( L
) );
718 static int vlclua_input_item_is_preparsed( lua_State
*L
)
720 lua_pushboolean( L
, input_item_IsPreparsed( vlclua_input_item_get_internal( L
) ) );
724 static int vlclua_input_item_uri( lua_State
*L
)
726 char *uri
= input_item_GetURI( vlclua_input_item_get_internal( L
) );
727 lua_pushstring( L
, uri
);
732 static int vlclua_input_item_name( lua_State
*L
)
734 char *name
= input_item_GetName( vlclua_input_item_get_internal( L
) );
735 lua_pushstring( L
, name
);
740 static int vlclua_input_item_duration( lua_State
*L
)
742 vlc_tick_t duration
= input_item_GetDuration( vlclua_input_item_get_internal( L
) );
743 lua_pushnumber( L
, secf_from_vlc_tick(duration
) );
747 static int vlclua_input_item_set_meta( lua_State
*L
)
749 input_item_t
*p_item
= vlclua_input_item_get_internal( L
);
750 lua_settop( L
, 1 + 2 ); // two arguments
751 const char *psz_name
= luaL_checkstring( L
, 2 ),
752 *psz_value
= luaL_checkstring( L
, 3 );
754 #define META_TYPE( n, s ) { s, vlc_meta_ ## n },
757 const char psz_name
[15];
759 } pp_meta_types
[] = {
760 META_TYPE( Title
, "title" )
761 META_TYPE( Artist
, "artist" )
762 META_TYPE( Genre
, "genre" )
763 META_TYPE( Copyright
, "copyright" )
764 META_TYPE( Album
, "album" )
765 META_TYPE( TrackNumber
, "track_number" )
766 META_TYPE( Description
, "description" )
767 META_TYPE( Rating
, "rating" )
768 META_TYPE( Date
, "date" )
769 META_TYPE( Setting
, "setting" )
770 META_TYPE( URL
, "url" )
771 META_TYPE( Language
, "language" )
772 META_TYPE( NowPlaying
, "now_playing" )
773 META_TYPE( ESNowPlaying
, "now_playing" )
774 META_TYPE( Publisher
, "publisher" )
775 META_TYPE( EncodedBy
, "encoded_by" )
776 META_TYPE( ArtworkURL
, "artwork_url" )
777 META_TYPE( TrackID
, "track_id" )
778 META_TYPE( TrackTotal
, "track_total" )
779 META_TYPE( Director
, "director" )
780 META_TYPE( Season
, "season" )
781 META_TYPE( Episode
, "episode" )
782 META_TYPE( ShowName
, "show_name" )
783 META_TYPE( Actors
, "actors" )
784 META_TYPE( AlbumArtist
, "album_artist" )
785 META_TYPE( DiscNumber
, "disc_number" )
786 META_TYPE( DiscTotal
, "disc_total" )
790 static_assert( sizeof(pp_meta_types
)
791 == VLC_META_TYPE_COUNT
* sizeof(pp_meta_types
[0]),
792 "Inconsistent meta data types" );
793 vlc_meta_type_t type
= vlc_meta_Title
;
794 for( unsigned i
= 0; i
< VLC_META_TYPE_COUNT
; i
++ )
796 if( !strcasecmp( pp_meta_types
[i
].psz_name
, psz_name
) )
798 type
= pp_meta_types
[i
].type
;
799 input_item_SetMeta( p_item
, type
, psz_value
);
804 vlc_meta_AddExtra( p_item
->p_meta
, psz_name
, psz_value
);
808 /*****************************************************************************
810 *****************************************************************************/
811 static const luaL_Reg vlclua_input_reg
[] = {
812 { "is_playing", vlclua_input_is_playing
},
813 { "item", vlclua_input_item_get_current
},
814 { "add_subtitle", vlclua_input_add_subtitle_path
},
815 { "add_subtitle_mrl", vlclua_input_add_subtitle_mrl
},
816 { "get_title_index", vlclua_player_get_title_index
},
817 { "get_titles_count", vlclua_player_get_titles_count
},
818 { "title_next", vlclua_player_title_next
},
819 { "title_prev", vlclua_player_title_prev
},
820 { "title_goto", vlclua_player_title_goto
},
821 { "get_chapter_index", vlclua_player_get_chapter_index
},
822 { "get_chapters_count", vlclua_player_get_chapters_count
},
823 { "chapter_next", vlclua_player_chapter_next
},
824 { "chapter_prev", vlclua_player_chapter_prev
},
825 { "chapter_goto", vlclua_player_chapter_goto
},
826 { "get_time", vlclua_player_get_time
},
827 { "get_position", vlclua_player_get_position
},
828 { "get_rate", vlclua_player_get_rate
},
829 { "set_rate", vlclua_player_set_rate
},
830 { "increment_rate", vlclua_player_increment_rate
},
831 { "decrement_rate", vlclua_player_decrement_rate
},
832 { "get_video_tracks", vlclua_player_get_video_tracks
},
833 { "get_audio_tracks", vlclua_player_get_audio_tracks
},
834 { "get_spu_tracks", vlclua_player_get_spu_tracks
},
835 { "toggle_video_track", vlclua_player_toggle_video_track
},
836 { "toggle_audio_track", vlclua_player_toggle_audio_track
},
837 { "toggle_spu_track", vlclua_player_toggle_spu_track
},
838 { "next_video_frame", vlclua_player_next_video_frame
},
839 { "seek_by_pos_absolute", vlclua_player_seek_by_pos_absolute
},
840 { "seek_by_pos_relative", vlclua_player_seek_by_pos_relative
},
841 { "seek_by_time_absolute", vlclua_player_seek_by_time_absolute
},
842 { "seek_by_time_relative", vlclua_player_seek_by_time_relative
},
843 { "get_audio_delay", vlclua_player_get_audio_delay
},
844 { "set_audio_delay", vlclua_player_set_audio_delay
},
845 { "get_subtitle_delay", vlclua_player_get_subtitle_delay
},
846 { "set_subtitle_delay", vlclua_player_set_subtitle_delay
},
850 void luaopen_input( lua_State
*L
)
853 luaL_register( L
, NULL
, vlclua_input_reg
);
854 lua_setfield( L
, -2, "player" );
857 static const luaL_Reg vlclua_input_item_reg
[] = {
858 { "is_preparsed", vlclua_input_item_is_preparsed
},
859 { "metas", vlclua_input_item_metas
},
860 { "set_meta", vlclua_input_item_set_meta
},
861 { "uri", vlclua_input_item_uri
},
862 { "name", vlclua_input_item_name
},
863 { "duration", vlclua_input_item_duration
},
864 { "stats", vlclua_input_item_stats
},
865 { "info", vlclua_input_item_info
},
869 int vlclua_input_item_get( lua_State
*L
, input_item_t
*p_item
)
871 input_item_Hold( p_item
);
872 input_item_t
**pp
= lua_newuserdata( L
, sizeof( input_item_t
* ) );
875 if( luaL_newmetatable( L
, "input_item" ) )
878 luaL_register( L
, NULL
, vlclua_input_item_reg
);
879 lua_setfield( L
, -2, "__index" );
880 lua_pushcfunction( L
, vlclua_input_item_delete
);
881 lua_setfield( L
, -2, "__gc" );
884 lua_setmetatable(L
, -2);
890 void luaopen_input_item( lua_State
*L
, input_item_t
*item
)
893 vlclua_input_item_get( L
, item
);
894 lua_setfield( L
, -2, "item" );