demux: adaptive: compute latency from request
[vlc.git] / include / vlc_player.h
blob0d1545df82ff09d57ac98cef57918d05069e55cc
1 /*****************************************************************************
2 * vlc_player.h: player interface
3 *****************************************************************************
4 * Copyright (C) 2018 VLC authors and VideoLAN
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published by
8 * the Free Software Foundation; either version 2.1 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
19 *****************************************************************************/
21 #ifndef VLC_PLAYER_H
22 #define VLC_PLAYER_H 1
24 #include <vlc_input.h>
25 #include <vlc_aout.h>
27 /**
28 * @defgroup vlc_player Player
29 * @ingroup input
30 * VLC Player API
31 * @brief
32 @dot
33 digraph player_states {
34 label="Player state diagram";
35 new [style="invis"];
36 started [label="Started" URL="@ref VLC_PLAYER_STATE_STARTED"];
37 playing [label="Playing" URL="@ref VLC_PLAYER_STATE_PLAYING"];
38 paused [label="Paused" URL="@ref VLC_PLAYER_STATE_PAUSED"];
39 stopping [label="Stopping" URL="@ref VLC_PLAYER_STATE_STOPPING"];
40 stopped [label="Stopped" URL="@ref VLC_PLAYER_STATE_STOPPED"];
41 new -> stopped [label="vlc_player_New()" URL="@ref vlc_player_New" fontcolor="green3"];
42 started -> playing [style="dashed" label=<<i>internal transition</i>>];
43 started -> stopping [label="vlc_player_Stop()" URL="@ref vlc_player_Stop" fontcolor="red"];
44 playing -> paused [label="vlc_player_Pause()" URL="@ref vlc_player_Pause" fontcolor="blue"];
45 paused -> playing [label="vlc_player_Resume()" URL="@ref vlc_player_Resume" fontcolor="blue3"];
46 paused -> stopping [label="vlc_player_Stop()" URL="@ref vlc_player_Stop" fontcolor="red"];
47 playing -> stopping [label="vlc_player_Stop()" URL="@ref vlc_player_Stop" fontcolor="red"];
48 stopping -> stopped [style="dashed" label=<<i>internal transition</i>>];
49 stopped -> started [label="vlc_player_Start()" URL="@ref vlc_player_Start" fontcolor="darkgreen"];
51 @enddot
52 * @{
53 * @file
54 * VLC Player API
57 /**
58 * @defgroup vlc_player__instance Player instance
59 * @{
62 /**
63 * Player opaque structure.
65 typedef struct vlc_player_t vlc_player_t;
67 /**
68 * Player lock type (normal or reentrant)
70 enum vlc_player_lock_type
72 /**
73 * Normal lock
75 * If the player is already locked, subsequent calls to vlc_player_Lock()
76 * will deadlock.
78 VLC_PLAYER_LOCK_NORMAL,
80 /**
81 * Reentrant lock
83 * If the player is already locked, subsequent calls to vlc_player_Lock()
84 * will still succeed. To unlock the player, one call to
85 * vlc_player_Unlock() per vlc_player_Lock() is necessary.
87 VLC_PLAYER_LOCK_REENTRANT,
90 /**
91 * Action when the player is stopped
93 * @see vlc_player_SetMediaStoppedAction()
95 enum vlc_player_media_stopped_action {
96 /** Continue (or stop if there is no next media), default behavior */
97 VLC_PLAYER_MEDIA_STOPPED_CONTINUE,
98 /** Pause when reaching the end of file */
99 VLC_PLAYER_MEDIA_STOPPED_PAUSE,
100 /** Stop, even if there is a next media to play */
101 VLC_PLAYER_MEDIA_STOPPED_STOP,
102 /** Exit VLC */
103 VLC_PLAYER_MEDIA_STOPPED_EXIT,
107 * Callbacks for the owner of the player.
109 * These callbacks are needed to control the player flow (via the
110 * vlc_playlist_t as a owner for example). It can only be set when creating the
111 * player via vlc_player_New().
113 * All callbacks are called with the player locked (cf. vlc_player_Lock()), and
114 * from any thread (even the current one).
116 struct vlc_player_media_provider
119 * Called when the player requires a new media
121 * @note The returned media must be already held with input_item_Hold()
123 * @param player locked player instance
124 * @param data opaque pointer set from vlc_player_New()
125 * @return the next media to play, held by the callee with input_item_Hold()
127 input_item_t *(*get_next)(vlc_player_t *player, void *data);
131 * Create a new player instance
133 * @param parent parent VLC object
134 * @param media_provider pointer to a media_provider structure or NULL, the
135 * structure must be valid during the lifetime of the player
136 * @param media_provider_data opaque data used by provider callbacks
137 * @return a pointer to a valid player instance or NULL in case of error
139 VLC_API vlc_player_t *
140 vlc_player_New(vlc_object_t *parent, enum vlc_player_lock_type lock_type,
141 const struct vlc_player_media_provider *media_provider,
142 void *media_provider_data);
145 * Delete a player instance
147 * This function stop any playback previously started and wait for their
148 * termination.
150 * @warning Blocking function if the player state is not STOPPED, don't call it
151 * from an UI thread in that case.
153 * @param player unlocked player instance created by vlc_player_New()
155 VLC_API void
156 vlc_player_Delete(vlc_player_t *player);
159 * Lock the player.
161 * All player functions (except vlc_player_Delete()) need to be called while
162 * the player lock is held.
164 * @param player unlocked player instance
166 VLC_API void
167 vlc_player_Lock(vlc_player_t *player);
170 * Unlock the player
172 * @param player locked player instance
174 VLC_API void
175 vlc_player_Unlock(vlc_player_t *player);
178 * Wait on a condition variable
180 * This call allow users to use their own condition with the player mutex.
182 * @param player locked player instance
183 * @param cond external condition
185 VLC_API void
186 vlc_player_CondWait(vlc_player_t *player, vlc_cond_t *cond);
189 * Setup an action when a media is stopped
191 * @param player locked player instance
192 * @param action action to do when a media is stopped
194 VLC_API void
195 vlc_player_SetMediaStoppedAction(vlc_player_t *player,
196 enum vlc_player_media_stopped_action action);
199 * Ask to start in a paused state
201 * This function can be used before vlc_player_Start()
203 * @param player locked player instance
204 * @param start_paused true to start in a paused state, false to cancel it
206 VLC_API void
207 vlc_player_SetStartPaused(vlc_player_t *player, bool start_paused);
210 * Enable or disable pause on cork event
212 * If enabled, the player will automatically pause and resume on cork events.
213 * In that case, cork events won't be propagated via callbacks.
214 * @see vlc_player_cbs.on_cork_changed
216 * @param player locked player instance
217 * @param enabled true to enable
219 VLC_API void
220 vlc_player_SetPauseOnCork(vlc_player_t *player, bool enabled);
222 /** @} vlc_player__instance */
225 * @defgroup vlc_player__playback Playback control
226 * @{
230 * State of the player
232 * During a normal playback (no errors), the user is expected to receive all
233 * events in the following order: STARTED, PLAYING, STOPPING, STOPPED.
235 * @note When playing more than one media in a row, the player stay at the
236 * PLAYING state when doing the transition from the current media to the next
237 * media (that can be gapless). This means that STOPPING, STOPPED states (for
238 * the current media) and STARTED, PLAYING states (for the next one) won't be
239 * sent. Nevertheless, the vlc_player_cbs.on_current_media_changed callback
240 * will be called during this transition.
242 enum vlc_player_state
245 * The player is stopped
247 * Initial state, or triggered by an internal transition from the STOPPING
248 * state.
250 VLC_PLAYER_STATE_STOPPED,
253 * The player is started
255 * Triggered by vlc_player_Start()
257 VLC_PLAYER_STATE_STARTED,
260 * The player is playing
262 * Triggered by vlc_player_Resume() or by an internal transition from the
263 * STARTED state.
265 VLC_PLAYER_STATE_PLAYING,
268 * The player is paused
270 * Triggered by vlc_player_Pause().
272 VLC_PLAYER_STATE_PAUSED,
275 * The player is stopping
277 * Triggered by vlc_player_Stop(), vlc_player_SetCurrentMedia() or by an
278 * internal transition (when the media reach the end of file for example).
280 VLC_PLAYER_STATE_STOPPING,
284 * Error of the player
286 * @see vlc_player_GetError()
288 enum vlc_player_error
290 VLC_PLAYER_ERROR_NONE,
291 VLC_PLAYER_ERROR_GENERIC,
295 * Seek speed type
297 * @see vlc_player_SeekByPos()
298 * @see vlc_player_SeekByTime()
300 enum vlc_player_seek_speed
302 /** Do a precise seek */
303 VLC_PLAYER_SEEK_PRECISE,
304 /** Do a fast seek */
305 VLC_PLAYER_SEEK_FAST,
309 * Player seek/delay directive
311 * @see vlc_player_SeekByPos()
312 * @see vlc_player_SeekByTime()
313 * @see vlc_player_SetCategoryDelay()
315 enum vlc_player_whence
317 /** Given time/position */
318 VLC_PLAYER_WHENCE_ABSOLUTE,
319 /** The current position +/- the given time/position */
320 VLC_PLAYER_WHENCE_RELATIVE,
324 * Menu (VCD/DVD/BD) and viewpoint navigations
326 * @see vlc_player_Navigate()
328 enum vlc_player_nav
330 /** Activate the navigation item selected */
331 VLC_PLAYER_NAV_ACTIVATE,
332 /** Select a navigation item above or move the viewpoint up */
333 VLC_PLAYER_NAV_UP,
334 /** Select a navigation item under or move the viewpoint down */
335 VLC_PLAYER_NAV_DOWN,
336 /** Select a navigation item on the left or move the viewpoint left */
337 VLC_PLAYER_NAV_LEFT,
338 /** Select a navigation item on the right or move the viewpoint right */
339 VLC_PLAYER_NAV_RIGHT,
340 /** Activate the popup Menu (for BD) */
341 VLC_PLAYER_NAV_POPUP,
342 /** Activate disc Root Menu */
343 VLC_PLAYER_NAV_MENU,
347 * A to B loop state
349 enum vlc_player_abloop
351 VLC_PLAYER_ABLOOP_NONE,
352 VLC_PLAYER_ABLOOP_A,
353 VLC_PLAYER_ABLOOP_B,
356 /** Player capability: can seek */
357 #define VLC_PLAYER_CAP_SEEK (1<<0)
358 /** Player capability: can pause */
359 #define VLC_PLAYER_CAP_PAUSE (1<<1)
360 /** Player capability: can change the rate */
361 #define VLC_PLAYER_CAP_CHANGE_RATE (1<<2)
362 /** Player capability: can seek back */
363 #define VLC_PLAYER_CAP_REWIND (1<<3)
365 /** Player teletext key: Red */
366 #define VLC_PLAYER_TELETEXT_KEY_RED ('r' << 16)
367 /** Player teletext key: Green */
368 #define VLC_PLAYER_TELETEXT_KEY_GREEN ('g' << 16)
369 /** Player teletext key: Yellow */
370 #define VLC_PLAYER_TELETEXT_KEY_YELLOW ('y' << 16)
371 /** Player teletext key: Blue */
372 #define VLC_PLAYER_TELETEXT_KEY_BLUE ('b' << 16)
373 /** Player teletext key: Index */
374 #define VLC_PLAYER_TELETEXT_KEY_INDEX ('i' << 16)
376 enum vlc_player_restore_playback_pos
378 VLC_PLAYER_RESTORE_PLAYBACK_POS_NEVER,
379 VLC_PLAYER_RESTORE_PLAYBACK_POS_ASK,
380 VLC_PLAYER_RESTORE_PLAYBACK_POS_ALWAYS,
384 * Set the current media
386 * This function replaces the current and next medias.
388 * @note A successful call will always result of
389 * vlc_player_cbs.on_current_media_changed being called. This function is not
390 * blocking. If a media is currently being played, this media will be stopped
391 * and the requested media will be set after.
393 * @warning This function is either synchronous (if the player state is
394 * STOPPED) or asynchronous. In the later case, vlc_player_GetCurrentMedia()
395 * will return the old media, even after this call, and until the
396 * vlc_player_cbs.on_current_media_changed is called.
398 * @param player locked player instance
399 * @param media new media to play (will be held by the player)
400 * @return VLC_SUCCESS or a VLC error code
402 VLC_API int
403 vlc_player_SetCurrentMedia(vlc_player_t *player, input_item_t *media);
406 * Get the current played media.
408 * @see vlc_player_cbs.on_current_media_changed
410 * @param player locked player instance
411 * @return a valid media or NULL (if no media is set)
413 VLC_API input_item_t *
414 vlc_player_GetCurrentMedia(vlc_player_t *player);
417 * Helper that hold the current media
419 static inline input_item_t *
420 vlc_player_HoldCurrentMedia(vlc_player_t *player)
422 input_item_t *item = vlc_player_GetCurrentMedia(player);
423 return item ? input_item_Hold(item) : NULL;
427 * Invalidate the next media.
429 * This function can be used to invalidate the media returned by the
430 * vlc_player_media_provider.get_next callback. This can be used when the next
431 * item from a playlist was changed by the user.
433 * Calling this function will trigger the
434 * vlc_player_media_provider.get_next callback to be called again.
436 * @param player locked player instance
438 VLC_API void
439 vlc_player_InvalidateNextMedia(vlc_player_t *player);
442 * Start the playback of the current media.
444 * @param player locked player instance
445 * @return VLC_SUCCESS or a VLC error code
447 VLC_API int
448 vlc_player_Start(vlc_player_t *player);
451 * Stop the playback of the current media
453 * @note This function is asynchronous. In case of success, the user should wait
454 * for the STOPPED state event to know when the stop is finished.
456 * @param player locked player instance
457 * @return VLC_SUCCESS if the player is being stopped, VLC_EGENERIC otherwise
458 * (no-op)
460 VLC_API int
461 vlc_player_Stop(vlc_player_t *player);
464 * Pause the playback
466 * @param player locked player instance
468 VLC_API void
469 vlc_player_Pause(vlc_player_t *player);
472 * Resume the playback from a pause
474 * @param player locked player instance
476 VLC_API void
477 vlc_player_Resume(vlc_player_t *player);
480 * Pause and display the next video frame
482 * @param player locked player instance
484 VLC_API void
485 vlc_player_NextVideoFrame(vlc_player_t *player);
488 * Get the state of the player
490 * @note Since all players actions are asynchronous, this function won't
491 * reflect the new state immediately. Wait for the
492 * vlc_players_cbs.on_state_changed event to be notified.
494 * @see vlc_player_state
495 * @see vlc_player_cbs.on_state_changed
497 * @param player locked player instance
498 * @return the current player state
500 VLC_API enum vlc_player_state
501 vlc_player_GetState(vlc_player_t *player);
504 * Get the error state of the player
506 * @see vlc_player_cbs.on_capabilities_changed
508 * @param player locked player instance
509 * @return the current error state
511 VLC_API enum vlc_player_error
512 vlc_player_GetError(vlc_player_t *player);
515 * Helper to get the started state
517 static inline bool
518 vlc_player_IsStarted(vlc_player_t *player)
520 switch (vlc_player_GetState(player))
522 case VLC_PLAYER_STATE_STARTED:
523 case VLC_PLAYER_STATE_PLAYING:
524 case VLC_PLAYER_STATE_PAUSED:
525 return true;
526 default:
527 return false;
532 * Helper to get the paused state
534 static inline bool
535 vlc_player_IsPaused(vlc_player_t *player)
537 return vlc_player_GetState(player) == VLC_PLAYER_STATE_PAUSED;
541 * Helper to toggle the pause state
543 static inline void
544 vlc_player_TogglePause(vlc_player_t *player)
546 if (vlc_player_IsStarted(player))
548 if (vlc_player_IsPaused(player))
549 vlc_player_Resume(player);
550 else
551 vlc_player_Pause(player);
556 * Get the player capabilities
558 * @see vlc_player_cbs.on_capabilities_changed
560 * @param player locked player instance
561 * @return the player capabilities, a bitwise mask of @ref VLC_PLAYER_CAP_SEEK,
562 * @ref VLC_PLAYER_CAP_PAUSE, @ref VLC_PLAYER_CAP_CHANGE_RATE, @ref
563 * VLC_PLAYER_CAP_REWIND
565 VLC_API int
566 vlc_player_GetCapabilities(vlc_player_t *player);
569 * Helper to get the seek capability
571 static inline bool
572 vlc_player_CanSeek(vlc_player_t *player)
574 return vlc_player_GetCapabilities(player) & VLC_PLAYER_CAP_SEEK;
578 * Helper to get the pause capability
580 static inline bool
581 vlc_player_CanPause(vlc_player_t *player)
583 return vlc_player_GetCapabilities(player) & VLC_PLAYER_CAP_PAUSE;
587 * Helper to get the change-rate capability
589 static inline bool
590 vlc_player_CanChangeRate(vlc_player_t *player)
592 return vlc_player_GetCapabilities(player) & VLC_PLAYER_CAP_CHANGE_RATE;
596 * Helper to get the rewindable capability
598 static inline bool
599 vlc_player_CanRewind(vlc_player_t *player)
601 return vlc_player_GetCapabilities(player) & VLC_PLAYER_CAP_REWIND;
605 * Get the rate of the player
607 * @see vlc_player_cbs.on_rate_changed
609 * @param player locked player instance
610 * @return rate of the player (< 1.f is slower, > 1.f is faster)
612 VLC_API float
613 vlc_player_GetRate(vlc_player_t *player);
616 * Change the rate of the player
618 * @note The rate is saved across several medias
620 * @param player locked player instance
621 * @param rate new rate (< 1.f is slower, > 1.f is faster)
623 VLC_API void
624 vlc_player_ChangeRate(vlc_player_t *player, float rate);
627 * Increment the rate of the player (faster)
629 * @param player locked player instance
631 VLC_API void
632 vlc_player_IncrementRate(vlc_player_t *player);
635 * Decrement the rate of the player (Slower)
637 * @param player locked player instance
639 VLC_API void
640 vlc_player_DecrementRate(vlc_player_t *player);
643 * Get the length of the current media
645 * @note A started and playing media doesn't have necessarily a valid length.
647 * @see vlc_player_cbs.on_length_changed
649 * @param player locked player instance
650 * @return a valid length or VLC_TICK_INVALID (if no media is set,
651 * playback is not yet started or in case of error)
653 VLC_API vlc_tick_t
654 vlc_player_GetLength(vlc_player_t *player);
657 * Get the time of the current media
659 * @note A started and playing media doesn't have necessarily a valid time.
661 * @see vlc_player_cbs.on_position_changed
663 * @param player locked player instance
664 * @return a valid time or VLC_TICK_INVALID (if no media is set, the media
665 * doesn't have any time, if playback is not yet started or in case of error)
667 VLC_API vlc_tick_t
668 vlc_player_GetTime(vlc_player_t *player);
671 * Get the position of the current media
673 * @see vlc_player_cbs.on_position_changed
675 * @param player locked player instance
676 * @return a valid position in the range [0.f;1.f] or -1.f (if no media is
677 * set,if playback is not yet started or in case of error)
679 VLC_API float
680 vlc_player_GetPosition(vlc_player_t *player);
683 * Seek the current media by position
685 * @note This function can be called before vlc_player_Start() in order to set
686 * a starting position.
688 * @param player locked player instance
689 * @param position position in the range [0.f;1.f]
690 * @param speed precise of fast
691 * @param whence absolute or relative
693 VLC_API void
694 vlc_player_SeekByPos(vlc_player_t *player, float position,
695 enum vlc_player_seek_speed speed,
696 enum vlc_player_whence whence);
699 * Seek the current media by time
701 * @note This function can be called before vlc_player_Start() in order to set
702 * a starting position.
704 * @warning This function has an effect only if the media has a valid length.
706 * @param player locked player instance
707 * @param time a time in the range [0;length]
708 * @param speed precise of fast
709 * @param whence absolute or relative
711 VLC_API void
712 vlc_player_SeekByTime(vlc_player_t *player, vlc_tick_t time,
713 enum vlc_player_seek_speed speed,
714 enum vlc_player_whence whence);
717 * Helper to set the absolute position precisely
719 static inline void
720 vlc_player_SetPosition(vlc_player_t *player, float position)
722 vlc_player_SeekByPos(player, position, VLC_PLAYER_SEEK_PRECISE,
723 VLC_PLAYER_WHENCE_ABSOLUTE);
727 * Helper to set the absolute position fast
729 static inline void
730 vlc_player_SetPositionFast(vlc_player_t *player, float position)
732 vlc_player_SeekByPos(player, position, VLC_PLAYER_SEEK_FAST,
733 VLC_PLAYER_WHENCE_ABSOLUTE);
737 * Helper to jump the position precisely
739 static inline void
740 vlc_player_JumpPos(vlc_player_t *player, float jumppos)
742 /* No fask seek for jumps. Indeed, jumps can seek to the current position
743 * if not precise enough or if the jump value is too small. */
744 vlc_player_SeekByPos(player, jumppos, VLC_PLAYER_SEEK_PRECISE,
745 VLC_PLAYER_WHENCE_RELATIVE);
749 * Helper to set the absolute time precisely
751 static inline void
752 vlc_player_SetTime(vlc_player_t *player, vlc_tick_t time)
754 vlc_player_SeekByTime(player, time, VLC_PLAYER_SEEK_PRECISE,
755 VLC_PLAYER_WHENCE_ABSOLUTE);
759 * Helper to set the absolute time fast
761 static inline void
762 vlc_player_SetTimeFast(vlc_player_t *player, vlc_tick_t time)
764 vlc_player_SeekByTime(player, time, VLC_PLAYER_SEEK_FAST,
765 VLC_PLAYER_WHENCE_ABSOLUTE);
769 * Helper to jump the time precisely
771 static inline void
772 vlc_player_JumpTime(vlc_player_t *player, vlc_tick_t jumptime)
774 /* No fask seek for jumps. Indeed, jumps can seek to the current position
775 * if not precise enough or if the jump value is too small. */
776 vlc_player_SeekByTime(player, jumptime, VLC_PLAYER_SEEK_PRECISE,
777 VLC_PLAYER_WHENCE_RELATIVE);
781 * Display the player position on the vout OSD
783 * @param player locked player instance
785 VLC_API void
786 vlc_player_DisplayPosition(vlc_player_t *player);
789 * Enable A to B loop of the current media
791 * This function need to be called 2 times with VLC_PLAYER_ABLOOP_A and
792 * VLC_PLAYER_ABLOOP_B to setup an A to B loop. It current the current
793 * time/position when called. The B time must be higher than the A time.
795 * @param player locked player instance
796 * @return VLC_SUCCESS or a VLC error code
798 VLC_API int
799 vlc_player_SetAtoBLoop(vlc_player_t *player, enum vlc_player_abloop abloop);
802 * Get the A to B loop status
804 * @note If the returned status is VLC_PLAYER_ABLOOP_A, then a_time and a_pos
805 * will be valid. If the returned status is VLC_PLAYER_ABLOOP_B, then all
806 * output parameters are valid. If the returned status is
807 * VLC_PLAYER_ABLOOP_NONE, then all output parameters are invalid.
809 * @see vlc_player_cbs.on_atobloop_changed
811 * @param player locked player instance
812 * @param a_time A time or VLC_TICK_INVALID (if the media doesn't have valid
813 * times)
814 * @param a_pos A position
815 * @param b_time B time or VLC_TICK_INVALID (if the media doesn't have valid
816 * times)
817 * @param b_pos B position
818 * @return A to B loop status
820 VLC_API enum vlc_player_abloop
821 vlc_player_GetAtoBLoop(vlc_player_t *player, vlc_tick_t *a_time, float *a_pos,
822 vlc_tick_t *b_time, float *b_pos);
825 * Navigate (for DVD/Bluray menus or viewpoint)
827 * @param player locked player instance
828 * @param nav navigation key
830 VLC_API void
831 vlc_player_Navigate(vlc_player_t *player, enum vlc_player_nav nav);
834 * Update the viewpoint
836 * @param player locked player instance
837 * @param viewpoint the viewpoint value
838 * @param whence absolute or relative
839 * @return VLC_SUCCESS or a VLC error code
841 VLC_API void
842 vlc_player_UpdateViewpoint(vlc_player_t *player,
843 const vlc_viewpoint_t *viewpoint,
844 enum vlc_player_whence whence);
847 * Check if the playing is recording
849 * @see vlc_player_cbs.on_recording_changed
851 * @param player locked player instance
852 * @return true if the player is recording
854 VLC_API bool
855 vlc_player_IsRecording(vlc_player_t *player);
858 * Enable or disable recording for the current media
860 * @note A successful call will trigger the vlc_player_cbs.on_recording_changed
861 * event.
863 * @param player locked player instance
864 * @param enabled true to enable recording
866 VLC_API void
867 vlc_player_SetRecordingEnabled(vlc_player_t *player, bool enabled);
870 * Helper to toggle the recording state
872 static inline void
873 vlc_player_ToggleRecording(vlc_player_t *player)
875 vlc_player_SetRecordingEnabled(player, !vlc_player_IsRecording(player));
879 * Add an associated (or external) media to the current media
881 * @param player locked player instance
882 * @param cat AUDIO_ES or SPU_ES
883 * @param uri absolute uri of the external media
884 * @param select true to select the track of this external media
885 * @param notify true to notify the OSD
886 * @param check_ext true to check subtitles extension
888 VLC_API int
889 vlc_player_AddAssociatedMedia(vlc_player_t *player,
890 enum es_format_category_e cat, const char *uri,
891 bool select, bool notify, bool check_ext);
894 * Get the signal quality and strength of the current media
896 * @param player locked player instance
898 VLC_API int
899 vlc_player_GetSignal(vlc_player_t *player, float *quality, float *strength);
902 * Get the statistics of the current media
904 * @warning The returned pointer becomes invalid when the player is unlocked.
905 * The referenced structure can be safely copied.
907 * @see vlc_player_cbs.on_statistics_changed
909 * @param player locked player instance
910 * @return pointer to the player stats structure or NULL
912 VLC_API const struct input_stats_t *
913 vlc_player_GetStatistics(vlc_player_t *player);
916 * Restore the previous playback position of the current media
918 VLC_API void
919 vlc_player_RestorePlaybackPos(vlc_player_t *player);
922 * Get the V4L2 object used to do controls
924 * @param player locked player instance
925 * @return the V4L2 object or NULL if not any. This object must be used with
926 * the player lock held.
928 VLC_API vlc_object_t *
929 vlc_player_GetV4l2Object(vlc_player_t *player) VLC_DEPRECATED;
931 /** @} vlc_player__playback */
934 * @defgroup vlc_player__titles Title and chapter control
935 * @{
939 * Player chapter structure
941 struct vlc_player_chapter
943 /** Chapter name, always valid */
944 const char *name;
945 /** Position of this chapter */
946 vlc_tick_t time;
949 /** vlc_player_title.flags: The title is a menu. */
950 #define VLC_PLAYER_TITLE_MENU 0x01
951 /** vlc_player_title.flags: The title is interactive. */
952 #define VLC_PLAYER_TITLE_INTERACTIVE 0x02
954 /** Player title structure */
955 struct vlc_player_title
957 /** Title name, always valid */
958 const char *name;
959 /** Length of the title */
960 vlc_tick_t length;
961 /** Bit flag of @ref VLC_PLAYER_TITLE_MENU and @ref
962 * VLC_PLAYER_TITLE_INTERACTIVE */
963 unsigned flags;
964 /** Number of chapters, can be 0 */
965 size_t chapter_count;
966 /** Array of chapters, can be NULL */
967 const struct vlc_player_chapter *chapters;
971 * Opaque structure representing a list of @ref vlc_player_title.
973 * @see vlc_player_GetTitleList()
974 * @see vlc_player_title_list_GetCount()
975 * @see vlc_player_title_list_GetAt()
977 typedef struct vlc_player_title_list vlc_player_title_list;
980 * Hold the title list of the player
982 * This function can be used to pass this title list from a callback to an
983 * other thread.
985 * @see vlc_player_cbs.on_titles_changed
987 * @return the same instance
989 VLC_API vlc_player_title_list *
990 vlc_player_title_list_Hold(vlc_player_title_list *titles);
993 * Release of previously held title list
995 VLC_API void
996 vlc_player_title_list_Release(vlc_player_title_list *titles);
999 * Get the number of title of a list
1001 VLC_API size_t
1002 vlc_player_title_list_GetCount(vlc_player_title_list *titles);
1005 * Get the title at a given index
1007 * @param idx index in the range [0; count[
1008 * @return a valid title (can't be NULL)
1010 VLC_API const struct vlc_player_title *
1011 vlc_player_title_list_GetAt(vlc_player_title_list *titles, size_t idx);
1014 * Get the title list of the current media
1016 * @see vlc_player_cbs.on_titles_changed
1018 * @param player locked player instance
1020 VLC_API vlc_player_title_list *
1021 vlc_player_GetTitleList(vlc_player_t *player);
1024 * Get the selected title index for the current media
1026 * @see vlc_player_cbs.on_title_selection_changed
1028 * @param player locked player instance
1030 VLC_API ssize_t
1031 vlc_player_GetSelectedTitleIdx(vlc_player_t *player);
1034 * Helper to get the current selected title
1036 static inline const struct vlc_player_title *
1037 vlc_player_GetSelectedTitle(vlc_player_t *player)
1039 vlc_player_title_list *titles = vlc_player_GetTitleList(player);
1040 if (!titles)
1041 return NULL;
1042 ssize_t selected_idx = vlc_player_GetSelectedTitleIdx(player);
1043 if (selected_idx < 0)
1044 return NULL;
1045 return vlc_player_title_list_GetAt(titles, selected_idx);
1049 * Select a title index for the current media
1051 * @note A successful call will trigger the
1052 * vlc_player_cbs.on_title_selection_changed event.
1054 * @see vlc_player_title_list_GetAt()
1055 * @see vlc_player_title_list_GetCount()
1057 * @param player locked player instance
1058 * @param index valid index in the range [0;count[
1060 VLC_API void
1061 vlc_player_SelectTitleIdx(vlc_player_t *player, size_t index);
1064 * Select a title for the current media
1066 * @note A successful call will trigger the
1067 * vlc_player_cbs.on_title_selection_changed event.
1069 * @see vlc_player_title_list_GetAt()
1070 * @see vlc_player_title_list_GetCount()
1072 * @param player locked player instance
1073 * @param title a valid title coming from the vlc_player_title_list
1075 VLC_API void
1076 vlc_player_SelectTitle(vlc_player_t *player,
1077 const struct vlc_player_title *title);
1080 * Select a chapter for the current media
1082 * @note A successful call will trigger the
1083 * vlc_player_cbs.on_chapter_selection_changed event.
1085 * @param player locked player instance
1086 * @param title the selected title
1087 * @param chapter_idx index from vlc_player_title.chapters
1089 VLC_API void
1090 vlc_player_SelectChapter(vlc_player_t *player,
1091 const struct vlc_player_title *title,
1092 size_t chapter_idx);
1095 * Select the next title for the current media
1097 * @see vlc_player_SelectTitleIdx()
1099 VLC_API void
1100 vlc_player_SelectNextTitle(vlc_player_t *player);
1103 * Select the previous title for the current media
1105 * @see vlc_player_SelectTitleIdx()
1107 VLC_API void
1108 vlc_player_SelectPrevTitle(vlc_player_t *player);
1111 * Get the selected chapter index for the current media
1113 * @see vlc_player_cbs.on_chapter_selection_changed
1115 * @param player locked player instance
1117 VLC_API ssize_t
1118 vlc_player_GetSelectedChapterIdx(vlc_player_t *player);
1121 * Helper to get the current selected chapter
1123 static inline const struct vlc_player_chapter *
1124 vlc_player_GetSelectedChapter(vlc_player_t *player)
1126 const struct vlc_player_title *title = vlc_player_GetSelectedTitle(player);
1127 if (!title || !title->chapter_count)
1128 return NULL;
1129 ssize_t chapter_idx = vlc_player_GetSelectedChapterIdx(player);
1130 return chapter_idx >= 0 ? &title->chapters[chapter_idx] : NULL;
1134 * Select a chapter index for the current media
1136 * @note A successful call will trigger the
1137 * vlc_player_cbs.on_chaper_selection_changed event.
1139 * @see vlc_player_title.chapters
1141 * @param player locked player instance
1142 * @param index valid index in the range [0;vlc_player_title.chapter_count[
1144 VLC_API void
1145 vlc_player_SelectChapterIdx(vlc_player_t *player, size_t index);
1148 * Select the next chapter for the current media
1150 * @see vlc_player_SelectChapterIdx()
1152 VLC_API void
1153 vlc_player_SelectNextChapter(vlc_player_t *player);
1156 * Select the previous chapter for the current media
1158 * @see vlc_player_SelectChapterIdx()
1160 VLC_API void
1161 vlc_player_SelectPrevChapter(vlc_player_t *player);
1163 /** @} vlc_player__titles */
1166 * @defgroup vlc_player__programs Program control
1167 * @{
1171 * Player program structure.
1173 struct vlc_player_program
1175 /** Id used for vlc_player_SelectProgram() */
1176 int group_id;
1177 /** Program name, always valid */
1178 const char *name;
1179 /** True if the program is selected */
1180 bool selected;
1181 /** True if the program is scrambled */
1182 bool scrambled;
1186 * Duplicate a program
1188 * This function can be used to pass a program from a callback to an other
1189 * context.
1191 * @see vlc_player_cbs.on_program_list_changed
1193 * @return a duplicated program or NULL on allocation error
1195 VLC_API struct vlc_player_program *
1196 vlc_player_program_Dup(const struct vlc_player_program *prgm);
1199 * Delete a duplicated program
1201 VLC_API void
1202 vlc_player_program_Delete(struct vlc_player_program *prgm);
1205 * Get the number of programs
1207 * @warning The returned size becomes invalid when the player is unlocked.
1209 * @param player locked player instance
1210 * @return number of programs, or 0 (in case of error, or if the media is not
1211 * started)
1213 VLC_API size_t
1214 vlc_player_GetProgramCount(vlc_player_t *player);
1217 * Get the program at a specific index
1219 * @warning The behaviour is undefined if the index is not valid.
1221 * @warning The returned pointer becomes invalid when the player is unlocked.
1222 * The referenced structure can be safely copied with vlc_player_program_Dup().
1224 * @param player locked player instance
1225 * @param index valid index in the range [0; count[
1226 * @return a valid program (can't be NULL if vlc_player_GetProgramCount()
1227 * returned a valid count)
1229 VLC_API const struct vlc_player_program *
1230 vlc_player_GetProgramAt(vlc_player_t *player, size_t index);
1233 * Get a program from an ES group identifier
1235 * @param player locked player instance
1236 * @param group_id a program ID (retrieved from
1237 * vlc_player_cbs.on_program_list_changed or vlc_player_GetProgramAt())
1238 * @return a valid program or NULL (if the program was terminated by the
1239 * playback thread)
1241 VLC_API const struct vlc_player_program *
1242 vlc_player_GetProgram(vlc_player_t *player, int group_id);
1245 * Select a program from an ES group identifier
1247 * This function can be used to pre-select a program by its id before starting
1248 * the player. It has only effect for the current media. It can also be used
1249 * when the player is already started.
1251 * @note Selecting a non-existing program will cause the player to no select
1252 * any programs. Therefore, all tracks will be disabled.
1254 * @param player locked player instance
1255 * @param group_id a program ID (retrieved from
1256 * vlc_player_cbs.on_program_list_changed or vlc_player_GetProgramAt())
1258 VLC_API void
1259 vlc_player_SelectProgram(vlc_player_t *player, int group_id);
1262 * Select the next program
1264 * @param player locked player instance
1266 VLC_API void
1267 vlc_player_SelectNextProgram(vlc_player_t *player);
1270 * Select the previous program
1272 * @param player locked player instance
1274 VLC_API void
1275 vlc_player_SelectPrevProgram(vlc_player_t *player);
1278 * Helper to get the current selected program
1280 static inline const struct vlc_player_program *
1281 vlc_player_GetSelectedProgram(vlc_player_t *player)
1283 size_t count = vlc_player_GetProgramCount(player);
1284 for (size_t i = 0; i < count; ++i)
1286 const struct vlc_player_program *program =
1287 vlc_player_GetProgramAt(player, i);
1288 assert(program);
1289 if (program->selected)
1290 return program;
1292 return NULL;
1295 /** @} vlc_player__programs */
1298 * @defgroup vlc_player__tracks Tracks control
1299 * @{
1303 * Player selection policy
1305 * @see vlc_player_SelectEsId()
1307 enum vlc_player_select_policy
1310 * Only one track per category is selected. Selecting a track with this
1311 * policy will disable all other tracks for the same category.
1313 VLC_PLAYER_SELECT_EXCLUSIVE,
1315 * Select multiple tracks for one category.
1317 * Only one audio track can be selected at a time.
1318 * Two subtitle tracks can be selected simultaneously.
1319 * Multiple video tracks can be selected simultaneously.
1321 VLC_PLAYER_SELECT_SIMULTANEOUS,
1325 * Player track structure.
1327 * A track is a representation of an ES identifier at a given time. Once the
1328 * player is unlocked, all content except the es_id pointer can be updated.
1330 * @see vlc_player_cbs.on_track_list_changed
1331 * @see vlc_player_GetTrack
1333 struct vlc_player_track
1335 /** Id used for any player actions, like vlc_player_SelectEsId() */
1336 vlc_es_id_t *es_id;
1337 /** Track name, always valid */
1338 const char *name;
1339 /** Es format */
1340 es_format_t fmt;
1341 /** True if the track is selected */
1342 bool selected;
1346 * Duplicate a track
1348 * This function can be used to pass a track from a callback to an other
1349 * context. The es_id will be held by the duplicated track.
1351 * @warning The returned track won't be updated if the original one is modified
1352 * by the player.
1354 * @see vlc_player_cbs.on_track_list_changed
1356 * @return a duplicated track or NULL on allocation error
1358 VLC_API struct vlc_player_track *
1359 vlc_player_track_Dup(const struct vlc_player_track *track);
1362 * Delete a duplicated track
1364 VLC_API void
1365 vlc_player_track_Delete(struct vlc_player_track *track);
1368 * Get the number of tracks for an ES category
1370 * @warning The returned size becomes invalid when the player is unlocked.
1372 * @param player locked player instance
1373 * @param cat VIDEO_ES, AUDIO_ES or SPU_ES
1374 * @return number of tracks, or 0 (in case of error, or if the media is not
1375 * started)
1377 VLC_API size_t
1378 vlc_player_GetTrackCount(vlc_player_t *player, enum es_format_category_e cat);
1381 * Get the track at a specific index for an ES category
1383 * @warning The behaviour is undefined if the index is not valid.
1385 * @warning The returned pointer becomes invalid when the player is unlocked.
1386 * The referenced structure can be safely copied with vlc_player_track_Dup().
1388 * @param player locked player instance
1389 * @param cat VIDEO_ES, AUDIO_ES or SPU_ES
1390 * @param index valid index in the range [0; count[
1391 * @return a valid track (can't be NULL if vlc_player_GetTrackCount() returned
1392 * a valid count)
1394 VLC_API const struct vlc_player_track *
1395 vlc_player_GetTrackAt(vlc_player_t *player, enum es_format_category_e cat,
1396 size_t index);
1399 * Helper to get the video track count
1401 static inline size_t
1402 vlc_player_GetVideoTrackCount(vlc_player_t *player)
1404 return vlc_player_GetTrackCount(player, VIDEO_ES);
1408 * Helper to get a video track at a specific index
1410 static inline const struct vlc_player_track *
1411 vlc_player_GetVideoTrackAt(vlc_player_t *player, size_t index)
1413 return vlc_player_GetTrackAt(player, VIDEO_ES, index);
1417 * Helper to get the audio track count
1419 static inline size_t
1420 vlc_player_GetAudioTrackCount(vlc_player_t *player)
1422 return vlc_player_GetTrackCount(player, AUDIO_ES);
1426 * Helper to get an audio track at a specific index
1428 static inline const struct vlc_player_track *
1429 vlc_player_GetAudioTrackAt(vlc_player_t *player, size_t index)
1431 return vlc_player_GetTrackAt(player, AUDIO_ES, index);
1435 * Helper to get the subtitle track count
1437 static inline size_t
1438 vlc_player_GetSubtitleTrackCount(vlc_player_t *player)
1440 return vlc_player_GetTrackCount(player, SPU_ES);
1444 * Helper to get a subtitle track at a specific index
1446 static inline const struct vlc_player_track *
1447 vlc_player_GetSubtitleTrackAt(vlc_player_t *player, size_t index)
1449 return vlc_player_GetTrackAt(player, SPU_ES, index);
1453 * Get a track from an ES identifier
1455 * @warning The returned pointer becomes invalid when the player is unlocked.
1456 * The referenced structure can be safely copied with vlc_player_track_Dup().
1458 * @param player locked player instance
1459 * @param id an ES ID (retrieved from vlc_player_cbs.on_track_list_changed or
1460 * vlc_player_GetTrackAt())
1461 * @return a valid player track or NULL (if the track was terminated by the
1462 * playback thread)
1464 VLC_API const struct vlc_player_track *
1465 vlc_player_GetTrack(vlc_player_t *player, vlc_es_id_t *es_id);
1468 * Get and the video output used by a ES identifier
1470 * @warning A same vout can be associated with multiple ES during the lifetime
1471 * of the player. The information returned by this function becomes invalid
1472 * when the player is unlocked. The returned vout doesn't need to be released,
1473 * but must be held with vout_Hold() if it is accessed after the player is
1474 * unlocked.
1476 * @param player locked player instance
1477 * @param id an ES ID (retrieved from vlc_player_cbs.on_track_list_changed or
1478 * vlc_player_GetTrackAt())
1479 * @param order if not null, the order of the vout
1480 * @return a valid vout or NULL (if the track is disabled, it it's not a video
1481 * or spu track, or if the vout failed to start)
1483 VLC_API vout_thread_t *
1484 vlc_player_GetEsIdVout(vlc_player_t *player, vlc_es_id_t *es_id,
1485 enum vlc_vout_order *order);
1488 * Get the ES identifier of a video output
1490 * @warning A same vout can be associated with multiple ES during the lifetime
1491 * of the player. The information returned by this function becomes invalid
1492 * when the player is unlocked. The returned es_id doesn't need to be released,
1493 * but must be held with vlc_es_id_Hold() if it accessed after the player is
1494 * unlocked.
1496 * @param player locked player instance
1497 * @param vout vout (can't be NULL)
1498 * @return a valid ES identifier or NULL (if the vout is stopped)
1500 VLC_API vlc_es_id_t *
1501 vlc_player_GetEsIdFromVout(vlc_player_t *player, vout_thread_t *vout);
1504 * Helper to get the selected track from an ES category
1506 * @warning The player can have more than one selected track for a same ES
1507 * category. This function will only return the first selected one. Use
1508 * vlc_player_GetTrackAt() and vlc_player_GetTrackCount() to iterate through
1509 * several selected tracks.
1511 static inline const struct vlc_player_track *
1512 vlc_player_GetSelectedTrack(vlc_player_t *player, enum es_format_category_e cat)
1514 size_t count = vlc_player_GetTrackCount(player, cat);
1515 for (size_t i = 0; i < count; ++i)
1517 const struct vlc_player_track *track =
1518 vlc_player_GetTrackAt(player, cat, i);
1519 assert(track);
1520 if (track->selected)
1521 return track;
1523 return NULL;
1527 * Select tracks by their string identifier
1529 * This function can be used to pre-select a list of tracks before starting the
1530 * player. It has only effect for the current media. It can also be used when
1531 * the player is already started.
1533 * 'str_ids' can contain more than one track id, delimited with ','. "" or any
1534 * invalid track id will cause the player to unselect all tracks of that
1535 * category. NULL will disable the preference for newer tracks without
1536 * unselecting any current tracks.
1538 * Example:
1539 * - (VIDEO_ES, "video/1,video/2") will select these 2 video tracks. If there
1540 * is only one video track with the id "video/0", no tracks will be selected.
1541 * - (SPU_ES, "${slave_url_md5sum}/spu/0) will select one spu added by an input
1542 * slave with the corresponding url.
1544 * @note The string identifier of a track can be found via vlc_es_id_GetStrId().
1546 * @param player locked player instance
1547 * @param cat VIDEO_ES, AUDIO_ES or SPU_ES
1548 * @param str_ids list of string identifier or NULL
1550 VLC_API void
1551 vlc_player_SelectTracksByStringIds(vlc_player_t *player,
1552 enum es_format_category_e cat,
1553 const char *str_ids);
1556 * Select a track from an ES identifier
1558 * @note A successful call will trigger the
1559 * vlc_player_cbs.on_track_selection_changed event.
1561 * @param player locked player instance
1562 * @param id an ES ID (retrieved from vlc_player_cbs.on_track_list_changed or
1563 * vlc_player_GetTrackAt())
1564 * @param policy exclusive or simultaneous
1565 * @return the number of track selected for es_id category
1567 VLC_API unsigned
1568 vlc_player_SelectEsId(vlc_player_t *player, vlc_es_id_t *es_id,
1569 enum vlc_player_select_policy policy);
1573 * Helper to select a track
1575 static inline unsigned
1576 vlc_player_SelectTrack(vlc_player_t *player,
1577 const struct vlc_player_track *track,
1578 enum vlc_player_select_policy policy)
1580 return vlc_player_SelectEsId(player, track->es_id, policy);
1584 * Select multiple tracks from a list of ES identifiers.
1586 * Any tracks of the category, not referenced in the list will be unselected.
1588 * @warning there is no guarantee all requested tracks will be selected. The
1589 * behaviour is undefined if the list is not null-terminated.
1591 * @note A successful call will trigger the
1592 * vlc_player_cbs.on_track_selection_changed event for each track that has
1593 * its selection state changed.
1595 * @see VLC_PLAYER_SELECT_SIMULTANEOUS
1597 * @param player locked player instance
1598 * @param cat VIDEO_ES, AUDIO_ES or SPU_ES
1599 * @param es_id_list a null-terminated list of ES identifiers. es_ids not
1600 * corresponding to the category will be ignored.
1601 * (ES IDs can be retrieved from vlc_player_cbs.on_track_list_changed or
1602 * vlc_player_GetTrackAt())
1603 * @return the number of track selected for that category
1605 VLC_API unsigned
1606 vlc_player_SelectEsIdList(vlc_player_t *player,
1607 enum es_format_category_e cat,
1608 vlc_es_id_t *const es_id_list[]);
1611 * Select the next track
1613 * If the last track is already selected, a call to this function will disable
1614 * this last track. And a second call will select the first track.
1616 * @warning This function has no effects if there are several tracks selected
1617 * for a same category. Therefore the default policy is
1618 * VLC_PLAYER_SELECT_EXCLUSIVE.
1620 * @param player locked player instance
1621 * @param cat VIDEO_ES, AUDIO_ES or SPU_ES
1623 VLC_API void
1624 vlc_player_SelectNextTrack(vlc_player_t *player,
1625 enum es_format_category_e cat);
1628 * Select the Previous track
1630 * If the first track is already selected, a call to this function will disable
1631 * this first track. And a second call will select the last track.
1633 * @warning This function has no effects if there are several tracks selected
1634 * for a same category. Therefore the default policy is
1635 * VLC_PLAYER_SELECT_EXCLUSIVE.
1637 * @param player locked player instance
1638 * @param cat VIDEO_ES, AUDIO_ES or SPU_ES
1640 VLC_API void
1641 vlc_player_SelectPrevTrack(vlc_player_t *player,
1642 enum es_format_category_e cat);
1645 * Unselect a track from an ES identifier
1647 * @warning Other tracks of the same category won't be touched.
1649 * @note A successful call will trigger the
1650 * vlc_player_cbs.on_track_selection_changed event.
1652 * @param player locked player instance
1653 * @param id an ES ID (retrieved from vlc_player_cbs.on_track_list_changed or
1654 * vlc_player_GetTrackAt())
1656 VLC_API void
1657 vlc_player_UnselectEsId(vlc_player_t *player, vlc_es_id_t *es_id);
1660 * Helper to unselect a track
1662 static inline void
1663 vlc_player_UnselectTrack(vlc_player_t *player,
1664 const struct vlc_player_track *track)
1666 vlc_player_UnselectEsId(player, track->es_id);
1670 * Helper to unselect all tracks from an ES category
1672 static inline void
1673 vlc_player_UnselectTrackCategory(vlc_player_t *player,
1674 enum es_format_category_e cat)
1676 size_t count = vlc_player_GetTrackCount(player, cat);
1677 for (size_t i = 0; i < count; ++i)
1679 const struct vlc_player_track *track =
1680 vlc_player_GetTrackAt(player, cat, i);
1681 assert(track);
1682 if (track->selected)
1683 vlc_player_UnselectTrack(player, track);
1688 * Restart a track from an ES identifier
1690 * @note A successful call will trigger the
1691 * vlc_player_cbs.on_track_selection_changed event.
1693 * @param player locked player instance
1694 * @param id an ES ID (retrieved from vlc_player_cbs.on_track_list_changed or
1695 * vlc_player_GetTrackAt())
1697 VLC_API void
1698 vlc_player_RestartEsId(vlc_player_t *player, vlc_es_id_t *es_id);
1701 * Helper to restart a track
1703 static inline void
1704 vlc_player_RestartTrack(vlc_player_t *player,
1705 const struct vlc_player_track *track)
1707 vlc_player_RestartEsId(player, track->es_id);
1711 * Helper to restart all selected tracks from an ES category
1713 static inline void
1714 vlc_player_RestartTrackCategory(vlc_player_t *player,
1715 enum es_format_category_e cat)
1717 size_t count = vlc_player_GetTrackCount(player, cat);
1718 for (size_t i = 0; i < count; ++i)
1720 const struct vlc_player_track *track =
1721 vlc_player_GetTrackAt(player, cat, i);
1722 assert(track);
1723 if (track->selected)
1724 vlc_player_RestartTrack(player, track);
1729 * Select the language for an ES category
1731 * @warning The language will only be set for all future played media.
1733 * @param player locked player instance
1734 * @param cat AUDIO_ES or SPU_ES
1735 * @param lang comma separated, two or three letters country code, 'any' as a
1736 * fallback or NULL to reset the default state
1738 VLC_API void
1739 vlc_player_SelectCategoryLanguage(vlc_player_t *player,
1740 enum es_format_category_e cat,
1741 const char *lang);
1744 * Get the language of an ES category
1746 * @warning This only reflects the change made by
1747 * vlc_player_SelectCategoryLanguage(). The current playing track doesn't
1748 * necessarily correspond to the returned language.
1750 * @see vlc_player_SelectCategoryLanguage
1752 * @param player locked player instance
1753 * @param cat AUDIO_ES or SPU_ES
1754 * @return valid language or NULL, need to be freed
1756 VLC_API char *
1757 vlc_player_GetCategoryLanguage(vlc_player_t *player,
1758 enum es_format_category_e cat);
1761 * Helper to select the audio language
1763 static inline void
1764 vlc_player_SelectAudioLanguage(vlc_player_t *player, const char *lang)
1766 vlc_player_SelectCategoryLanguage(player, AUDIO_ES, lang);
1770 * Helper to select the subtitle language
1772 static inline void
1773 vlc_player_SelectSubtitleLanguage(vlc_player_t *player, const char *lang)
1775 vlc_player_SelectCategoryLanguage(player, SPU_ES, lang);
1779 * Enable or disable a track category
1781 * If a track category is disabled, the player won't select any tracks of this
1782 * category automatically or via an user action (vlc_player_SelectTrack()).
1784 * @param player locked player instance
1785 * @param cat VIDEO_ES, AUDIO_ES or SPU_ES
1786 * @param enabled true to enable
1788 VLC_API void
1789 vlc_player_SetTrackCategoryEnabled(vlc_player_t *player,
1790 enum es_format_category_e cat, bool enabled);
1793 * Check if a track category is enabled
1795 * @param player locked player instance
1796 * @param cat VIDEO_ES, AUDIO_ES or SPU_ES
1798 VLC_API bool
1799 vlc_player_IsTrackCategoryEnabled(vlc_player_t *player,
1800 enum es_format_category_e cat);
1803 * Helper to enable or disable video tracks
1805 static inline void
1806 vlc_player_SetVideoEnabled(vlc_player_t *player, bool enabled)
1808 vlc_player_SetTrackCategoryEnabled(player, VIDEO_ES, enabled);
1812 * Helper to check if video tracks are enabled
1814 static inline bool
1815 vlc_player_IsVideoEnabled(vlc_player_t *player)
1817 return vlc_player_IsTrackCategoryEnabled(player, VIDEO_ES);
1821 * Helper to enable or disable audio tracks
1823 static inline void
1824 vlc_player_SetAudioEnabled(vlc_player_t *player, bool enabled)
1826 vlc_player_SetTrackCategoryEnabled(player, AUDIO_ES, enabled);
1830 * Helper to check if audio tracks are enabled
1832 static inline bool
1833 vlc_player_IsAudioEnabled(vlc_player_t *player)
1835 return vlc_player_IsTrackCategoryEnabled(player, AUDIO_ES);
1839 * Helper to enable or disable subtitle tracks
1841 static inline void
1842 vlc_player_SetSubtitleEnabled(vlc_player_t *player, bool enabled)
1844 vlc_player_SetTrackCategoryEnabled(player, SPU_ES, enabled);
1848 * Helper to check if subtitle tracks are enabled
1850 static inline bool
1851 vlc_player_IsSubtitleEnabled(vlc_player_t *player)
1853 return vlc_player_IsTrackCategoryEnabled(player, SPU_ES);
1857 * Helper to toggle subtitles
1859 static inline void
1860 vlc_player_ToggleSubtitle(vlc_player_t *player)
1862 bool enabled = !vlc_player_IsSubtitleEnabled(player);
1863 vlc_player_SetSubtitleEnabled(player, enabled);
1867 * Set the subtitle text scaling factor
1869 * @note This function have an effect only if the subtitle track is a text type.
1871 * @param player locked player instance
1872 * @param scale factor in the range [10;500] (default: 100)
1874 VLC_API void
1875 vlc_player_SetSubtitleTextScale(vlc_player_t *player, unsigned scale);
1878 * Get the subtitle text scaling factor
1880 * @param player locked player instance
1881 * @return scale factor
1883 VLC_API unsigned
1884 vlc_player_GetSubtitleTextScale(vlc_player_t *player);
1886 /** @} vlc_player__tracks */
1889 * @defgroup vlc_player__tracks_sync Tracks synchronisation (delay)
1890 * @{
1894 * Get the delay of an ES category for the current media
1896 * @see vlc_player_cbs.on_category_delay_changed
1898 * @param player locked player instance
1899 * @param cat AUDIO_ES or SPU_ES (VIDEO_ES not supported yet)
1900 * @return a valid delay or 0
1902 VLC_API vlc_tick_t
1903 vlc_player_GetCategoryDelay(vlc_player_t *player, enum es_format_category_e cat);
1906 * Set the delay of one category for the current media
1908 * @note A successful call will trigger the
1909 * vlc_player_cbs.on_category_delay_changed event.
1911 * @warning This has no effect on tracks where the delay was set by
1912 * vlc_player_SetEsIdDelay()
1914 * @param player locked player instance
1915 * @param cat AUDIO_ES or SPU_ES (VIDEO_ES not supported yet)
1916 * @param delay a valid time
1917 * @param whence absolute or relative
1918 * @return VLC_SUCCESS or VLC_EGENERIC if the category is not handled
1920 VLC_API int
1921 vlc_player_SetCategoryDelay(vlc_player_t *player, enum es_format_category_e cat,
1922 vlc_tick_t delay, enum vlc_player_whence whence);
1925 * Get the delay of a track
1927 * @see vlc_player_cbs.on_track_delay_changed
1929 * @param player locked player instance
1930 * @param id an ES ID (retrieved from vlc_player_cbs.on_track_list_changed or
1931 * vlc_player_GetTrackAt())
1932 * @return a valid delay or INT64_MAX is no delay is set for this track
1934 VLC_API vlc_tick_t
1935 vlc_player_GetEsIdDelay(vlc_player_t *player, vlc_es_id_t *es_id);
1938 * Set the delay of one track
1940 * @note A successful call will trigger the
1941 * vlc_player_cbs.on_track_delay_changed event.
1943 * @warning Setting the delay of one specific track will override previous and
1944 * future changes of delay made by vlc_player_SetCategoryDelay()
1946 * @param player locked player instance
1947 * @param id an ES ID (retrieved from vlc_player_cbs.on_track_list_changed or
1948 * vlc_player_GetTrackAt())
1949 * @param delay a valid time or INT64_MAX to use default category delay
1950 * @param whence absolute or relative
1951 * @return VLC_SUCCESS or VLC_EGENERIC if the category of the es_id is not
1952 * handled (VIDEO_ES not supported yet)
1954 VLC_API int
1955 vlc_player_SetEsIdDelay(vlc_player_t *player, vlc_es_id_t *es_id,
1956 vlc_tick_t delay, enum vlc_player_whence whence);
1959 * Helper to get the audio delay
1961 static inline vlc_tick_t
1962 vlc_player_GetAudioDelay(vlc_player_t *player)
1964 return vlc_player_GetCategoryDelay(player, AUDIO_ES);
1968 * Helper to set the audio delay
1970 static inline void
1971 vlc_player_SetAudioDelay(vlc_player_t *player, vlc_tick_t delay,
1972 enum vlc_player_whence whence)
1975 vlc_player_SetCategoryDelay(player, AUDIO_ES, delay, whence);
1979 * Helper to get the subtitle delay
1981 static inline vlc_tick_t
1982 vlc_player_GetSubtitleDelay(vlc_player_t *player)
1984 return vlc_player_GetCategoryDelay(player, SPU_ES);
1988 * Helper to set the subtitle delay
1990 static inline void
1991 vlc_player_SetSubtitleDelay(vlc_player_t *player, vlc_tick_t delay,
1992 enum vlc_player_whence whence)
1994 vlc_player_SetCategoryDelay(player, SPU_ES, delay, whence);
1998 * Set the associated subtitle FPS
2000 * In order to correct the rate of the associated media according to this FPS
2001 * and the media video FPS.
2003 * @note A successful call will trigger the
2004 * vlc_player_cbs.on_associated_subs_fps_changed event.
2006 * @warning this function will change the rate of all external subtitle files
2007 * associated with the current media.
2009 * @param player locked player instance
2010 * @param fps FPS of the subtitle file
2012 VLC_API void
2013 vlc_player_SetAssociatedSubsFPS(vlc_player_t *player, float fps);
2016 * Get the associated subtitle FPS
2018 * @param player locked player instance
2019 * @return fps
2021 VLC_API float
2022 vlc_player_GetAssociatedSubsFPS(vlc_player_t *player);
2024 /** @} vlc_player__tracks_sync */
2027 * @defgroup vlc_player__teletext Teletext control
2028 * @{
2032 * Check if the media has a teletext menu
2034 * @see vlc_player_cbs.on_teletext_menu_changed
2036 * @param player locked player instance
2037 * @return true if the media has a teletext menu
2039 VLC_API bool
2040 vlc_player_HasTeletextMenu(vlc_player_t *player);
2043 * Enable or disable teletext
2045 * This function has an effect only if the player has a teletext menu.
2047 * @note A successful call will trigger the
2048 * vlc_player_cbs.on_teletext_enabled_changed event.
2050 * @param player locked player instance
2051 * @param enabled true to enable
2053 VLC_API void
2054 vlc_player_SetTeletextEnabled(vlc_player_t *player, bool enabled);
2057 * Check if teletext is enabled
2059 * @see vlc_player_cbs.on_teletext_enabled_changed
2061 * @param player locked player instance
2063 VLC_API bool
2064 vlc_player_IsTeletextEnabled(vlc_player_t *player);
2067 * Select a teletext page or do an action from a key
2069 * This function has an effect only if the player has a teletext menu.
2071 * @note Page keys can be the following: @ref VLC_PLAYER_TELETEXT_KEY_RED,
2072 * @ref VLC_PLAYER_TELETEXT_KEY_GREEN, @ref VLC_PLAYER_TELETEXT_KEY_YELLOW,
2073 * @ref VLC_PLAYER_TELETEXT_KEY_BLUE or @ref VLC_PLAYER_TELETEXT_KEY_INDEX.
2075 * @note A successful call will trigger the
2076 * vlc_player_cbs.on_teletext_page_changed event.
2078 * @param player locked player instance
2079 * @param page a page in the range ]0;888] or a valid key
2081 VLC_API void
2082 vlc_player_SelectTeletextPage(vlc_player_t *player, unsigned page);
2085 * Get the current teletext page
2087 * @see vlc_player_cbs.on_teletext_page_changed
2089 * @param player locked player instance
2091 VLC_API unsigned
2092 vlc_player_GetTeletextPage(vlc_player_t *player);
2095 * Enable or disable teletext transparency
2097 * This function has an effect only if the player has a teletext menu.
2099 * @note A successful call will trigger the
2100 * vlc_player_cbs.on_teletext_transparency_changed event.
2102 * @param player locked player instance
2103 * @param enabled true to enable
2105 VLC_API void
2106 vlc_player_SetTeletextTransparency(vlc_player_t *player, bool enabled);
2109 * Check if teletext is transparent
2111 * @param player locked player instance
2113 VLC_API bool
2114 vlc_player_IsTeletextTransparent(vlc_player_t *player);
2116 /** @} vlc_player__teletext */
2119 * @defgroup vlc_player__renderer External renderer control
2120 * @{
2124 * Set the renderer
2126 * Valid for the current media and all future ones.
2128 * @note A successful call will trigger the vlc_player_cbs.on_renderer_changed
2129 * event.
2131 * @param player locked player instance
2132 * @param renderer a valid renderer item or NULL (to disable it), the item will
2133 * be held by the player
2135 VLC_API void
2136 vlc_player_SetRenderer(vlc_player_t *player, vlc_renderer_item_t *renderer);
2139 * Get the renderer
2141 * @see vlc_player_cbs.on_renderer_changed
2143 * @param player locked player instance
2144 * @return the renderer item set by vlc_player_SetRenderer()
2146 VLC_API vlc_renderer_item_t *
2147 vlc_player_GetRenderer(vlc_player_t *player);
2149 /** @} vlc_player__renderer */
2152 * @defgroup vlc_player__metadata Metadata callbacks
2153 * @{
2157 * Player metadata listener opaque structure.
2159 * This opaque structure is returned by vlc_player_AddMetadataListener() and
2160 * can be used to remove the listener via
2161 * vlc_player_RemoveMetadataListener().
2163 typedef struct vlc_player_metadata_listener_id vlc_player_metadata_listener_id;
2166 * Player metadata option
2168 enum vlc_player_metadata_option
2171 * Ask for momentary loudness measurement
2173 * Very low CPU usage.
2174 * @see vlc_player_metadata_cbs.on_momentary_loudness_changed
2176 VLC_PLAYER_METADATA_LOUDNESS_MOMENTARY,
2179 * Ask for all loudness measurements
2181 * High CPU usage.
2182 * @see vlc_player_metadata_cbs.on_loudness_changed
2184 VLC_PLAYER_METADATA_LOUDNESS_FULL,
2188 * Player metadata callbacks
2190 * Can be registered with vlc_player_AddMetadataListener().
2192 * @warning To avoid deadlocks, users should never call vlc_player_t functions
2193 * from these callbacks.
2195 union vlc_player_metadata_cbs
2198 * Called when the momentary loudness measurement have changed
2200 * @see VLC_PLAYER_METADATA_LOUDNESS_MOMEMTARY
2202 * Only sent when audio is playing, approximately every 400ms (but can be
2203 * higher, depending on the input sample size).
2205 * @param date Absolute date of the measurement. It is most likely in the
2206 * future (0 to 2seconds) depending on the audio output buffer size.
2207 * @param momentary_loudness Momentary loudness
2208 * @param data opaque pointer set by vlc_player_AddMetadataListener()
2210 void (*on_momentary_loudness_changed)(vlc_tick_t date,
2211 double momentary_loudness,
2212 void *data);
2215 * Called when loudness measurements have changed
2217 * @see VLC_PLAYER_METADATA_LOUDNESS_FULL
2219 * Only sent when audio is playing, approximately every 400ms (but can be
2220 * higher, depending on the input sample size).
2222 * @param date Absolute date of the measurement. It is most likely in the
2223 * future (0 to 2seconds) depending on the audio output buffer size.
2224 * @param loudness loudness measurement
2225 * @param data opaque pointer set by vlc_player_AddMetadataListener()
2227 void (*on_loudness_changed)(vlc_tick_t date,
2228 const struct vlc_audio_loudness *loudness,
2229 void *data);
2233 * Add a metadata listener
2235 * @note Every registered loudness meter need to be removed by the caller with
2236 * vlc_player_RemoveMetadataListener().
2238 * @param player locked player instance
2239 * @param cbs pointer to a vlc_player_metadata_cbs union, the
2240 * structure must be valid during the lifetime of the player
2241 * @param cbs_data opaque pointer used by the callbacks
2242 * @return a valid listener id, or NULL in case of error (plugin missing)
2244 VLC_API vlc_player_metadata_listener_id *
2245 vlc_player_AddMetadataListener(vlc_player_t *player,
2246 enum vlc_player_metadata_option option,
2247 const union vlc_player_metadata_cbs *cbs,
2248 void *cbs_data);
2251 * Remove a metadata listener
2253 * @param player player instance
2254 * @param listener_id listener id returned by vlc_player_AddMetadataListener()
2256 VLC_API void
2257 vlc_player_RemoveMetadataListener(vlc_player_t *player,
2258 vlc_player_metadata_listener_id *listener_id);
2261 /** @} vlc_player__metadata */
2264 * @defgroup vlc_player__aout Audio output control
2265 * @{
2269 * Player aout listener opaque structure.
2271 * This opaque structure is returned by vlc_player_aout_AddListener() and can
2272 * be used to remove the listener via vlc_player_aout_RemoveListener().
2274 typedef struct vlc_player_aout_listener_id vlc_player_aout_listener_id;
2277 * Player aout callbacks
2279 * Can be registered with vlc_player_aout_AddListener().
2281 * @warning To avoid deadlocks, users should never call audio_output_t and
2282 * vlc_player_t functions from these callbacks.
2284 struct vlc_player_aout_cbs
2287 * Called when the volume has changed
2289 * @see vlc_player_aout_SetVolume()
2291 * @param aout the main aout of the player
2292 * @param new_volume volume in the range [0;2.f]
2293 * @param data opaque pointer set by vlc_player_aout_AddListener()
2295 void (*on_volume_changed)(audio_output_t *aout, float new_volume,
2296 void *data);
2299 * Called when the mute state has changed
2301 * @see vlc_player_aout_Mute()
2303 * @param aout the main aout of the player
2304 * @param new_mute true if muted
2305 * @param data opaque pointer set by vlc_player_aout_AddListener()
2307 void (*on_mute_changed)(audio_output_t *aout, bool new_muted,
2308 void *data);
2311 * Called when the audio device has changed
2313 * @param aout the main aout of the player
2314 * @param device the device name
2315 * @param data opaque pointer set by vlc_player_aout_AddListener()
2317 void (*on_device_changed)(audio_output_t *aout, const char *device,
2318 void *data);
2322 * Get the audio output
2324 * @warning The returned pointer must be released with aout_Release().
2326 * @param player player instance
2327 * @return a valid audio_output_t * or NULL (if there is no aouts)
2329 VLC_API audio_output_t *
2330 vlc_player_aout_Hold(vlc_player_t *player);
2333 * Reset the main audio output
2335 * @warning The main aout can only by reset if it is not currently used by any
2336 * decoders (before any play).
2338 * @param player player instance
2340 VLC_API void
2341 vlc_player_aout_Reset(vlc_player_t *player);
2344 * Add a listener callback for audio output events
2346 * @note The player instance doesn't need to be locked for vlc_player_aout_*()
2347 * functions.
2348 * @note Every registered callbacks need to be removed by the caller with
2349 * vlc_player_aout_RemoveListener().
2351 * @param player player instance
2352 * @param cbs pointer to a vlc_player_aout_cbs structure, the structure must be
2353 * valid during the lifetime of the player
2354 * @param cbs_data opaque pointer used by the callbacks
2355 * @return a valid listener id, or NULL in case of allocation error
2357 VLC_API vlc_player_aout_listener_id *
2358 vlc_player_aout_AddListener(vlc_player_t *player,
2359 const struct vlc_player_aout_cbs *cbs,
2360 void *cbs_data);
2363 * Remove a aout listener callback
2365 * @param player player instance
2366 * @param listener_id listener id returned by vlc_player_aout_AddListener()
2368 VLC_API void
2369 vlc_player_aout_RemoveListener(vlc_player_t *player,
2370 vlc_player_aout_listener_id *listener_id);
2373 * Get the audio volume
2375 * @note The player instance doesn't need to be locked for vlc_player_aout_*()
2376 * functions.
2378 * @see vlc_player_aout_cbs.on_volume_changed
2380 * @param player player instance
2381 * @return volume in the range [0;2.f] or -1.f if there is no audio outputs
2382 * (independent of mute)
2384 VLC_API float
2385 vlc_player_aout_GetVolume(vlc_player_t *player);
2388 * Set the audio volume
2390 * @note The player instance doesn't need to be locked for vlc_player_aout_*()
2391 * functions.
2393 * @note A successful call will trigger the
2394 * vlc_player_vout_cbs.on_volume_changed event.
2396 * @param player player instance
2397 * @param volume volume in the range [0;2.f]
2398 * @return VLC_SUCCESS or VLC_EGENERIC if there is no audio outputs
2400 VLC_API int
2401 vlc_player_aout_SetVolume(vlc_player_t *player, float volume);
2404 * Increment the audio volume
2406 * @see vlc_player_aout_SetVolume()
2408 * @param player player instance
2409 * @param steps number of "volume-step"
2410 * @param result pointer to store the resulting volume (can be NULL)
2411 * @return VLC_SUCCESS or VLC_EGENERIC if there is no audio outputs
2413 VLC_API int
2414 vlc_player_aout_IncrementVolume(vlc_player_t *player, int steps, float *result);
2417 * Helper to decrement the audio volume
2419 static inline int
2420 vlc_player_aout_DecrementVolume(vlc_player_t *player, int steps, float *result)
2422 return vlc_player_aout_IncrementVolume(player, -steps, result);
2426 * Check if the audio output is muted
2428 * @note The player instance doesn't need to be locked for vlc_player_aout_*()
2429 * functions.
2431 * @see vlc_player_aout_cbs.on_mute_changed
2433 * @param player player instance
2434 * @return 0 if not muted, 1 if muted, -1 if there is no audio outputs
2436 VLC_API int
2437 vlc_player_aout_IsMuted(vlc_player_t *player);
2440 * Mute or unmute the audio output
2442 * @note The player instance doesn't need to be locked for vlc_player_aout_*()
2443 * functions.
2445 * @note A successful call will trigger the
2446 * vlc_player_aout_cbs.on_mute_changed event.
2448 * @param player player instance
2449 * @param mute true to mute
2450 * @return VLC_SUCCESS or VLC_EGENERIC if there is no audio outputs
2452 VLC_API int
2453 vlc_player_aout_Mute(vlc_player_t *player, bool mute);
2456 * Helper to toggle the mute state
2458 static inline int
2459 vlc_player_aout_ToggleMute(vlc_player_t *player)
2461 return vlc_player_aout_Mute(player,
2462 !vlc_player_aout_IsMuted(player));
2466 * Enable or disable an audio filter
2468 * @see aout_EnableFilter()
2470 * @return VLC_SUCCESS or VLC_EGENERIC if there is no audio outputs
2472 VLC_API int
2473 vlc_player_aout_EnableFilter(vlc_player_t *player, const char *name, bool add);
2475 /** @} vlc_player__aout */
2478 * @defgroup vlc_player__vout Video output control
2479 * @{
2483 * Player vout listener opaque structure.
2485 * This opaque structure is returned by vlc_player_vout_AddListener() and can
2486 * be used to remove the listener via vlc_player_vout_RemoveListener().
2488 typedef struct vlc_player_vout_listener_id vlc_player_vout_listener_id;
2491 * action of vlc_player_cbs.on_vout_changed callback
2493 enum vlc_player_vout_action
2495 VLC_PLAYER_VOUT_STARTED,
2496 VLC_PLAYER_VOUT_STOPPED,
2500 * Player vout callbacks
2502 * Can be registered with vlc_player_vout_AddListener().
2504 * @note The state changed from the callbacks can be either applied on the
2505 * player (and all future video outputs), or on a specified video output. The
2506 * state is applied on the player when the vout argument is NULL.
2508 * @warning To avoid deadlocks, users should never call vout_thread_t and
2509 * vlc_player_t functions from these callbacks.
2511 struct vlc_player_vout_cbs
2514 * Called when the player and/or vout fullscreen state has changed
2516 * @see vlc_player_vout_SetFullscreen()
2518 * @param vout cf. vlc_player_vout_cbs note
2519 * @param enabled true when fullscreen is enabled
2520 * @param data opaque pointer set by vlc_player_vout_AddListener()
2522 void (*on_fullscreen_changed)(vout_thread_t *vout, bool enabled,
2523 void *data);
2526 * Called when the player and/or vout wallpaper mode has changed
2528 * @see vlc_player_vout_SetWallpaperModeEnabled()
2530 * @param vout cf. vlc_player_vout_cbs note
2531 * @param enabled true when wallpaper mode is enabled
2532 * @param data opaque pointer set by vlc_player_vout_AddListener()
2534 void (*on_wallpaper_mode_changed)(vout_thread_t *vout, bool enabled,
2535 void *data);
2540 * Get and hold the main video output
2542 * @warning the returned vout_thread_t * must be released with vout_Release().
2543 * @see vlc_players_cbs.on_vout_changed
2545 * @note The player is guaranteed to always hold one valid vout. Only vout
2546 * variables can be changed from this instance. The vout returned before
2547 * playback is not necessarily the same one that will be used for playback.
2549 * @param player player instance
2550 * @return a valid vout_thread_t * or NULL, cf. warning
2552 VLC_API vout_thread_t *
2553 vlc_player_vout_Hold(vlc_player_t *player);
2556 * Get and hold the list of video output
2558 * @warning All vout_thread_t * element of the array must be released with
2559 * vout_Release(). The returned array must be freed.
2561 * @see vlc_players_cbs.on_vout_changed
2563 * @param player player instance
2564 * @param count valid pointer to store the array count
2565 * @return a array of vout_thread_t * or NULL, cf. warning
2567 VLC_API vout_thread_t **
2568 vlc_player_vout_HoldAll(vlc_player_t *player, size_t *count);
2571 * Add a listener callback for video output events
2573 * @note The player instance doesn't need to be locked for vlc_player_vout_*()
2574 * functions.
2575 * @note Every registered callbacks need to be removed by the caller with
2576 * vlc_player_vout_RemoveListener().
2578 * @param player player instance
2579 * @param cbs pointer to a vlc_player_vout_cbs structure, the structure must be
2580 * valid during the lifetime of the player
2581 * @param cbs_data opaque pointer used by the callbacks
2582 * @return a valid listener id, or NULL in case of allocation error
2584 VLC_API vlc_player_vout_listener_id *
2585 vlc_player_vout_AddListener(vlc_player_t *player,
2586 const struct vlc_player_vout_cbs *cbs,
2587 void *cbs_data);
2590 * Remove a vout listener callback
2592 * @param player player instance
2593 * @param listener_id listener id returned by vlc_player_vout_AddListener()
2595 VLC_API void
2596 vlc_player_vout_RemoveListener(vlc_player_t *player,
2597 vlc_player_vout_listener_id *listener_id);
2600 * Check if the player is fullscreen
2602 * @warning The fullscreen state of the player and all vouts can be different.
2604 * @note The player instance doesn't need to be locked for vlc_player_vout_*()
2605 * functions.
2607 * @see vlc_player_vout_cbs.on_fullscreen_changed
2609 * @param player player instance
2610 * @return true if the player is fullscreen
2612 VLC_API bool
2613 vlc_player_vout_IsFullscreen(vlc_player_t *player);
2616 * Enable or disable the player fullscreen state
2618 * This will have an effect on all current and future vouts.
2620 * @note The player instance doesn't need to be locked for vlc_player_vout_*()
2621 * functions.
2622 * @note A successful call will trigger the
2623 * vlc_player_vout_cbs.on_fullscreen_changed event.
2625 * @param player player instance
2626 * @param enabled true to enable fullscreen
2628 VLC_API void
2629 vlc_player_vout_SetFullscreen(vlc_player_t *player, bool enabled);
2632 * Helper to toggle the player fullscreen state
2634 static inline void
2635 vlc_player_vout_ToggleFullscreen(vlc_player_t *player)
2637 vlc_player_vout_SetFullscreen(player,
2638 !vlc_player_vout_IsFullscreen(player));
2642 * Check if the player has wallpaper-mode enaled
2644 * @warning The wallpaper-mode state of the player and all vouts can be
2645 * different.
2647 * @note The player instance doesn't need to be locked for vlc_player_vout_*()
2648 * functions.
2650 * @see vlc_player_vout_cbs.on_wallpaper_mode_changed
2652 * @param player player instance
2653 * @return true if the player is fullscreen
2655 VLC_API bool
2656 vlc_player_vout_IsWallpaperModeEnabled(vlc_player_t *player);
2659 * Enable or disable the player wallpaper-mode
2661 * This will have an effect on all current and future vouts.
2663 * @note The player instance doesn't need to be locked for vlc_player_vout_*()
2664 * functions.
2665 * @note A successful call will trigger the
2666 * vlc_player_vout_cbs.on_wallpaper_mode_changed event.
2668 * @param player player instance
2669 * @param enabled true to enable wallpaper-mode
2671 VLC_API void
2672 vlc_player_vout_SetWallpaperModeEnabled(vlc_player_t *player, bool enabled);
2675 * Helper to toggle the player wallpaper-mode state
2677 static inline void
2678 vlc_player_vout_ToggleWallpaperMode(vlc_player_t *player)
2680 vlc_player_vout_SetWallpaperModeEnabled(player,
2681 !vlc_player_vout_IsWallpaperModeEnabled(player));
2685 * Take a snapshot on all vouts
2687 * @param player player instance
2689 VLC_API void
2690 vlc_player_vout_Snapshot(vlc_player_t *player);
2693 * Display an OSD message on all vouts
2695 * @param player player instance
2696 * @param fmt format string
2698 VLC_API void
2699 vlc_player_osd_Message(vlc_player_t *player, const char *fmt, ...);
2701 /** @} vlc_player__vout */
2704 * @defgroup vlc_player__events Player events
2705 * @{
2709 * Player listener opaque structure.
2711 * This opaque structure is returned by vlc_player_AddListener() and can be
2712 * used to remove the listener via vlc_player_RemoveListener().
2714 typedef struct vlc_player_listener_id vlc_player_listener_id;
2717 * Action of vlc_player_cbs.on_track_list_changed,
2718 * vlc_player_cbs.on_program_list_changed callbacks
2720 enum vlc_player_list_action
2722 VLC_PLAYER_LIST_ADDED,
2723 VLC_PLAYER_LIST_REMOVED,
2724 VLC_PLAYER_LIST_UPDATED,
2728 * Player callbacks
2730 * Can be registered with vlc_player_AddListener().
2732 * All callbacks are called with the player locked (cf. vlc_player_Lock()) and
2733 * from any threads (and even synchronously from a vlc_player function in some
2734 * cases). It is safe to call any vlc_player functions from these callbacks
2735 * except vlc_player_Delete().
2737 * @warning To avoid deadlocks, users should never call vlc_player functions
2738 * with an external mutex locked and lock this same mutex from a player
2739 * callback.
2741 struct vlc_player_cbs
2744 * Called when the current media has changed
2746 * @note This can be called from the PLAYING state (when the player plays
2747 * the next media internally) or from the STOPPED state (from
2748 * vlc_player_SetCurrentMedia() or from an internal transition).
2750 * @see vlc_player_SetCurrentMedia()
2751 * @see vlc_player_InvalidateNextMedia()
2753 * @param player locked player instance
2754 * @param new_media new media currently played or NULL (when there is no
2755 * more media to play)
2756 * @param data opaque pointer set by vlc_player_AddListener()
2758 void (*on_current_media_changed)(vlc_player_t *player,
2759 input_item_t *new_media, void *data);
2762 * Called when the player state has changed
2764 * @see vlc_player_state
2766 * @param player locked player instance
2767 * @param new_state new player state
2768 * @param data opaque pointer set by vlc_player_AddListener()
2770 void (*on_state_changed)(vlc_player_t *player,
2771 enum vlc_player_state new_state, void *data);
2774 * Called when a media triggered an error
2776 * Can be called from any states. When it happens the player will stop
2777 * itself. It is safe to play an other media or event restart the player
2778 * (This will reset the error state).
2780 * @param player locked player instance
2781 * @param error player error
2782 * @param data opaque pointer set by vlc_player_AddListener()
2784 void (*on_error_changed)(vlc_player_t *player,
2785 enum vlc_player_error error, void *data);
2788 * Called when the player buffering (or cache) has changed
2790 * This event is always called with the 0 and 1 values before a playback
2791 * (in case of success). Values in between depends on the media type.
2793 * @param player locked player instance
2794 * @param new_buffering buffering in the range [0:1]
2795 * @param data opaque pointer set by vlc_player_AddListener()
2797 void (*on_buffering_changed)(vlc_player_t *player,
2798 float new_buffering, void *data);
2801 * Called when the player rate has changed
2803 * Triggered by vlc_player_ChangeRate(), not sent when the media starts
2804 * with the default rate (1.f)
2806 * @param player locked player instance
2807 * @param new_rate player
2808 * @param data opaque pointer set by vlc_player_AddListener()
2810 void (*on_rate_changed)(vlc_player_t *player,
2811 float new_rate, void *data);
2814 * Called when the media capabilities has changed
2816 * Always called when the media is opening. Can be called during playback.
2818 * @param player locked player instance
2819 * @param old_caps old player capabilities
2820 * @param new_caps new player capabilities
2821 * @param data opaque pointer set by vlc_player_AddListener()
2823 void (*on_capabilities_changed)(vlc_player_t *player,
2824 int old_caps, int new_caps, void *data);
2827 * Called when the player position has changed
2829 * @note A started and playing media doesn't have necessarily a valid time.
2831 * @param player locked player instance
2832 * @param new_time a valid time or VLC_TICK_INVALID
2833 * @param new_pos a valid position
2834 * @param data opaque pointer set by vlc_player_AddListener()
2836 void (*on_position_changed)(vlc_player_t *player,
2837 vlc_tick_t new_time, float new_pos, void *data);
2840 * Called when the media length has changed
2842 * May be called when the media is opening or during playback.
2844 * @note A started and playing media doesn't have necessarily a valid length.
2846 * @param player locked player instance
2847 * @param new_length a valid time or VLC_TICK_INVALID
2848 * @param data opaque pointer set by vlc_player_AddListener()
2850 void (*on_length_changed)(vlc_player_t *player,
2851 vlc_tick_t new_length, void *data);
2854 * Called when a track is added, removed, or updated
2856 * @note The track is only valid from this callback context. Users should
2857 * duplicate this track via vlc_player_track_Dup() if they want to use it
2858 * from an other context.
2860 * @param player locked player instance
2861 * @param action added, removed or updated
2862 * @param track valid track
2863 * @param data opaque pointer set by vlc_player_AddListener()
2865 void (*on_track_list_changed)(vlc_player_t *player,
2866 enum vlc_player_list_action action,
2867 const struct vlc_player_track *track, void *data);
2870 * Called when a new track is selected and/or unselected
2872 * @note This event can be called with both unselected_id and selected_id
2873 * valid. This mean that a new track is replacing the old one.
2875 * @param player locked player instance
2876 * @param unselected_id valid track id or NULL (when nothing is unselected)
2877 * @param selected_id valid track id or NULL (when nothing is selected)
2878 * @param data opaque pointer set by vlc_player_AddListener()
2880 void (*on_track_selection_changed)(vlc_player_t *player,
2881 vlc_es_id_t *unselected_id, vlc_es_id_t *selected_id, void *data);
2884 * Called when a track delay has changed
2886 * @param player locked player instance
2887 * @param es_id valid track id
2888 * @param delay a valid delay or INT64_MAX if the delay of this track is
2889 * canceled
2891 void (*on_track_delay_changed)(vlc_player_t *player,
2892 vlc_es_id_t *es_id, vlc_tick_t delay, void *data);
2895 * Called when a new program is added, removed or updated
2897 * @note The program is only valid from this callback context. Users should
2898 * duplicate this program via vlc_player_program_Dup() if they want to use
2899 * it from an other context.
2901 * @param player locked player instance
2902 * @param action added, removed or updated
2903 * @param prgm valid program
2904 * @param data opaque pointer set by vlc_player_AddListener()
2906 void (*on_program_list_changed)(vlc_player_t *player,
2907 enum vlc_player_list_action action,
2908 const struct vlc_player_program *prgm, void *data);
2911 * Called when a new program is selected and/or unselected
2913 * @note This event can be called with both unselected_id and selected_id
2914 * valid. This mean that a new program is replacing the old one.
2916 * @param player locked player instance
2917 * @param unselected_id valid program id or -1 (when nothing is unselected)
2918 * @param selected_id valid program id or -1 (when nothing is selected)
2919 * @param data opaque pointer set by vlc_player_AddListener()
2921 void (*on_program_selection_changed)(vlc_player_t *player,
2922 int unselected_id, int selected_id, void *data);
2925 * Called when the media titles has changed
2927 * This event is not called when the opening media doesn't have any titles.
2928 * This title list and all its elements are constant. If an element is to
2929 * be updated, a new list will be sent from this callback.
2931 * @note Users should hold this list with vlc_player_title_list_Hold() if
2932 * they want to use it from an other context.
2934 * @param player locked player instance
2935 * @param titles valid title list or NULL
2936 * @param data opaque pointer set by vlc_player_AddListener()
2938 void (*on_titles_changed)(vlc_player_t *player,
2939 vlc_player_title_list *titles, void *data);
2942 * Called when a new title is selected
2944 * There are no events when a title is unselected. Titles are automatically
2945 * unselected when the title list changes. Titles and indexes are always
2946 * valid inside the vlc_player_title_list sent by
2947 * vlc_player_cbs.on_titles_changed.
2949 * @param player locked player instance
2950 * @param new_title new selected title
2951 * @param new_idx index of this title
2952 * @param data opaque pointer set by vlc_player_AddListener()
2954 void (*on_title_selection_changed)(vlc_player_t *player,
2955 const struct vlc_player_title *new_title, size_t new_idx, void *data);
2958 * Called when a new chapter is selected
2960 * There are no events when a chapter is unselected. Chapters are
2961 * automatically unselected when the title list changes. Titles, chapters
2962 * and indexes are always valid inside the vlc_player_title_list sent by
2963 * vlc_player_cbs.on_titles_changed.
2965 * @param player locked player instance
2966 * @param title selected title
2967 * @param title_idx selected title index
2968 * @param chapter new selected chapter
2969 * @param chapter_idx new selected chapter index
2970 * @param data opaque pointer set by vlc_player_AddListener()
2972 void (*on_chapter_selection_changed)(vlc_player_t *player,
2973 const struct vlc_player_title *title, size_t title_idx,
2974 const struct vlc_player_chapter *new_chapter, size_t new_chapter_idx,
2975 void *data);
2978 * Called when the media has a teletext menu
2980 * @param player locked player instance
2981 * @param has_teletext_menu true if the media has a teletext menu
2982 * @param data opaque pointer set by vlc_player_AddListener()
2984 void (*on_teletext_menu_changed)(vlc_player_t *player,
2985 bool has_teletext_menu, void *data);
2988 * Called when teletext is enabled or disabled
2990 * @see vlc_player_SetTeletextEnabled()
2992 * @param player locked player instance
2993 * @param enabled true if teletext is enabled
2994 * @param data opaque pointer set by vlc_player_AddListener()
2996 void (*on_teletext_enabled_changed)(vlc_player_t *player,
2997 bool enabled, void *data);
3000 * Called when the teletext page has changed
3002 * @see vlc_player_SelectTeletextPage()
3004 * @param player locked player instance
3005 * @param new_page page in the range ]0;888]
3006 * @param data opaque pointer set by vlc_player_AddListener()
3008 void (*on_teletext_page_changed)(vlc_player_t *player,
3009 unsigned new_page, void *data);
3012 * Called when the teletext transparency has changed
3014 * @see vlc_player_SetTeletextTransparency()
3016 * @param player locked player instance
3017 * @param enabled true is the teletext overlay is transparent
3018 * @param data opaque pointer set by vlc_player_AddListener()
3020 void (*on_teletext_transparency_changed)(vlc_player_t *player,
3021 bool enabled, void *data);
3024 * Called when the player category delay has changed for the current media
3026 * @see vlc_player_SetCategoryDelay()
3028 * @param player locked player instance
3029 * @param cat AUDIO_ES or SPU_ES
3030 * @param new_delay audio delay
3031 * @param data opaque pointer set by vlc_player_AddListener()
3033 void (*on_category_delay_changed)(vlc_player_t *player,
3034 enum es_format_category_e cat, vlc_tick_t new_delay, void *data);
3037 * Called when associated subtitle has changed
3039 * @see vlc_player_SetAssociatedSubsFPS()
3041 * @param player locked player instance
3042 * @param sub_fps subtitle fps
3043 * @param data opaque pointer set by vlc_player_AddListener()
3045 void (*on_associated_subs_fps_changed)(vlc_player_t *player,
3046 float subs_fps, void *data);
3049 * Called when a new renderer item is set
3051 * @see vlc_player_SetRenderer()
3053 * @param player locked player instance
3054 * @param new_item a valid renderer item or NULL (if unset)
3055 * @param data opaque pointer set by vlc_player_AddListener()
3057 void (*on_renderer_changed)(vlc_player_t *player,
3058 vlc_renderer_item_t *new_item, void *data);
3061 * Called when the player recording state has changed
3063 * @see vlc_player_SetRecordingEnabled()
3065 * @param player locked player instance
3066 * @param recording true if recording is enabled
3067 * @param data opaque pointer set by vlc_player_AddListener()
3069 void (*on_recording_changed)(vlc_player_t *player,
3070 bool recording, void *data);
3073 * Called when the media signal has changed
3075 * @param player locked player instance
3076 * @param new_quality signal quality
3077 * @param new_strength signal strength,
3078 * @param data opaque pointer set by vlc_player_AddListener()
3080 void (*on_signal_changed)(vlc_player_t *player,
3081 float quality, float strength, void *data);
3084 * Called when the player has new statisics
3086 * @note The stats structure is only valid from this callback context. It
3087 * can be copied in order to use it from an other context.
3089 * @param player locked player instance
3090 * @param stats valid stats, only valid from this context
3091 * @param data opaque pointer set by vlc_player_AddListener()
3093 void (*on_statistics_changed)(vlc_player_t *player,
3094 const struct input_stats_t *stats, void *data);
3097 * Called when the A to B loop has changed
3099 * @see vlc_player_SetAtoBLoop()
3101 * @param player locked player instance
3102 * @param state A, when only A is set, B when both A and B are set, None by
3103 * default
3104 * @param time valid time or VLC_TICK_INVALID of the current state
3105 * @param pos valid pos of the current state
3106 * @param data opaque pointer set by vlc_player_AddListener()
3108 void (*on_atobloop_changed)(vlc_player_t *player,
3109 enum vlc_player_abloop new_state, vlc_tick_t time, float pos,
3110 void *data);
3113 * Called when media stopped action has changed
3115 * @see vlc_player_SetMediaStoppedAction()
3117 * @param player locked player instance
3118 * @param new_action action to execute when a media is stopped
3119 * @param data opaque pointer set by vlc_player_AddListener()
3121 void (*on_media_stopped_action_changed)(vlc_player_t *player,
3122 enum vlc_player_media_stopped_action new_action, void *data);
3125 * Called when the media meta has changed
3127 * @param player locked player instance
3128 * @param media current media
3129 * @param data opaque pointer set by vlc_player_AddListener()
3131 void (*on_media_meta_changed)(vlc_player_t *player,
3132 input_item_t *media, void *data);
3135 * Called when media epg has changed
3137 * @param player locked player instance
3138 * @param media current media
3139 * @param data opaque pointer set by vlc_player_AddListener()
3141 void (*on_media_epg_changed)(vlc_player_t *player,
3142 input_item_t *media, void *data);
3145 * Called when the media has new subitems
3147 * @param player locked player instance
3148 * @param media current media
3149 * @param new_subitems node representing all media subitems
3150 * @param data opaque pointer set by vlc_player_AddListener()
3152 void (*on_media_subitems_changed)(vlc_player_t *player,
3153 input_item_t *media, input_item_node_t *new_subitems, void *data);
3156 * Called when a vout is started or stopped
3158 * @note In case, several media with only one video track are played
3159 * successively, the same vout instance will be started and stopped several
3160 * time.
3162 * @param player locked player instance
3163 * @param action started or stopped
3164 * @param vout vout (can't be NULL)
3165 * @param order vout order
3166 * @param es_id the ES id associated with this vout
3167 * @param data opaque pointer set by vlc_player_AddListener()
3169 void (*on_vout_changed)(vlc_player_t *player,
3170 enum vlc_player_vout_action action, vout_thread_t *vout,
3171 enum vlc_vout_order order, vlc_es_id_t *es_id, void *data);
3174 * Called when the player is corked
3176 * The player can be corked when the audio output loose focus or when a
3177 * renderer was paused from the outside.
3179 * @note called only if pause on cork was not set to true (by
3180 * vlc_player_SetPauseOnCork())
3181 * @note a cork_count higher than 0 means the player is corked. In that
3182 * case, the user should pause the player and release all external resource
3183 * needed by the player. A value higher than 1 mean that the player was
3184 * corked more than one time (for different reasons). A value of 0 means
3185 * the player is no longer corked. In that case, the user could resume the
3186 * player.
3188 * @param player locked player instance
3189 * @param cork_count 0 for uncorked, > 0 for corked
3190 * @param data opaque pointer set by vlc_player_AddListener()
3192 void (*on_cork_changed)(vlc_player_t *player, unsigned cork_count,
3193 void *data);
3196 * Called to query the user about restoring the previous playback position
3198 * If this callback isn't provided, the user won't be asked to restore
3199 * the previous playback position, effectively causing
3200 * VLC_PLAYER_RESTORE_PLAYBACK_POS_ASK to be handled as
3201 * VLC_PLAYER_RESTORE_PLAYBACK_POS_NEVER
3203 * The implementation can react to this callback by calling
3204 * vlc_player_RestorePlaybackPos(), or by discarding the event.
3206 * @param player locked player instance
3207 * @param data opaque pointer set by vlc_player_AddListener()
3209 void (*on_playback_restore_queried)(vlc_player_t *player, void *data);
3213 * Add a listener callback
3215 * @note Every registered callbacks need to be removed by the caller with
3216 * vlc_player_RemoveListener().
3218 * @param player locked player instance
3219 * @param cbs pointer to a vlc_player_cbs structure, the structure must be
3220 * valid during the lifetime of the player
3221 * @param cbs_data opaque pointer used by the callbacks
3222 * @return a valid listener id, or NULL in case of allocation error
3224 VLC_API vlc_player_listener_id *
3225 vlc_player_AddListener(vlc_player_t *player,
3226 const struct vlc_player_cbs *cbs, void *cbs_data);
3229 * Remove a listener callback
3231 * @param player locked player instance
3232 * @param listener_id listener id returned by vlc_player_AddListener()
3234 VLC_API void
3235 vlc_player_RemoveListener(vlc_player_t *player,
3236 vlc_player_listener_id *listener_id);
3238 /** @} vlc_player__events */
3241 * @defgroup vlc_player__timer Player timer
3242 * @{
3246 * Player timer opaque structure.
3248 typedef struct vlc_player_timer_id vlc_player_timer_id;
3251 * Player timer point
3253 * @see vlc_player_timer_cbs.on_update
3255 struct vlc_player_timer_point
3257 /** Position in the range [0.0f;1.0] */
3258 float position;
3259 /** Rate of the player */
3260 double rate;
3261 /** Valid time >= VLC_TICK_0 or VLC_TICK_INVALID, subtract this time with
3262 * VLC_TICK_0 to get the original value. */
3263 vlc_tick_t ts;
3264 /** Valid length >= VLC_TICK_0 or VLC_TICK_INVALID */
3265 vlc_tick_t length;
3266 /** System date of this record (always valid), this date can be in the
3267 * future or in the past. The special value of INT64_MAX mean that the
3268 * clock was paused when this point was updated. In that case,
3269 * vlc_player_timer_point_Interpolate() will return the current ts/pos of
3270 * this point (there is nothing to interpolate). */
3271 vlc_tick_t system_date;
3275 * Player smpte timecode
3277 * @see vlc_player_timer_smpte_cbs
3279 struct vlc_player_timer_smpte_timecode
3281 /** Hours [0;n] */
3282 unsigned hours;
3283 /** Minutes [0;59] */
3284 unsigned minutes;
3285 /** Seconds [0;59] */
3286 unsigned seconds;
3287 /** Frame number [0;n] */
3288 unsigned frames;
3289 /** Maximum number of digits needed to display the frame number */
3290 unsigned frame_resolution;
3291 /** True if the source is NTSC 29.97fps or 59.94fps DF */
3292 bool drop_frame;
3296 * Player timer callbacks
3298 * @see vlc_player_AddTimer
3300 struct vlc_player_timer_cbs
3303 * Called when the state or the time changed.
3305 * Get notified when the time is updated by the input or output source. The
3306 * input source is the 'demux' or the 'access_demux'. The output source are
3307 * audio and video outputs: an update is received each time a video frame
3308 * is displayed or an audio sample is written. The delay between each
3309 * updates may depend on the input and source type (it can be every 5ms,
3310 * 30ms, 1s or 10s...). The user of this timer may need to update the
3311 * position at a higher frequency from its own mainloop via
3312 * vlc_player_timer_point_Interpolate().
3314 * @warning The player is not locked from this callback. It is forbidden
3315 * to call any player functions from here.
3317 * @param value always valid, the time corresponding to the state
3318 * @param data opaque pointer set by vlc_player_AddTimer()
3320 void (*on_update)(const struct vlc_player_timer_point *value, void *data);
3323 * The player is paused or a discontinuity occurred, likely caused by seek
3324 * from the user or because the playback is stopped. The player user should
3325 * stop its "interpolate" timer.
3327 * @param system_date system date of this event, only valid when paused. It
3328 * can be used to interpolate the last updated point to this date in order
3329 * to get the last paused ts/position.
3330 * @param data opaque pointer set by vlc_player_AddTimer()
3332 void (*on_discontinuity)(vlc_tick_t system_date, void *data);
3336 * Player smpte timer callbacks
3338 * @see vlc_player_AddSmpteTimer
3340 struct vlc_player_timer_smpte_cbs
3343 * Called when a new frame is displayed
3345 * @warning The player is not locked from this callback. It is forbidden
3346 * to call any player functions from here.
3348 * @param tc always valid, the timecode corresponding to the frame just
3349 * displayed
3350 * @param data opaque pointer set by vlc_player_AddTimer()
3352 void (*on_update)(const struct vlc_player_timer_smpte_timecode *tc,
3353 void *data);
3357 * Add a timer in order to get times updates
3359 * @param player player instance (locked or not)
3360 * @param min_period corresponds to the minimum period between each updates,
3361 * use it to avoid flood from too many source updates, set it to
3362 * VLC_TICK_INVALID to receive all updates.
3363 * @param cbs pointer to a vlc_player_timer_cbs structure, the structure must
3364 * be valid during the lifetime of the player
3365 * @param cbs_data opaque pointer used by the callbacks
3366 * @return a valid vlc_player_timer_id or NULL in case of memory allocation
3367 * error
3369 VLC_API vlc_player_timer_id *
3370 vlc_player_AddTimer(vlc_player_t *player, vlc_tick_t min_period,
3371 const struct vlc_player_timer_cbs *cbs, void *data);
3374 * Add a smpte timer in order to get accurate video frame updates
3376 * @param player player instance (locked or not)
3377 * @param cbs pointer to a vlc_player_timer_smpte_cbs structure, the structure must
3378 * be valid during the lifetime of the player
3379 * @param cbs_data opaque pointer used by the callbacks
3380 * @return a valid vlc_player_timer_id or NULL in case of memory allocation
3381 * error
3383 VLC_API vlc_player_timer_id *
3384 vlc_player_AddSmpteTimer(vlc_player_t *player,
3385 const struct vlc_player_timer_smpte_cbs *cbs,
3386 void *data);
3389 * Remove a player timer
3391 * @param player player instance (locked or not)
3392 * @param timer timer created by vlc_player_AddTimer()
3394 VLC_API void
3395 vlc_player_RemoveTimer(vlc_player_t *player, vlc_player_timer_id *timer);
3398 * Interpolate the last timer value to now
3400 * @param point time update obtained via the vlc_player_timer_cbs.on_update()
3401 * callback
3402 * @param system_now current system date
3403 * @param player_rate rate of the player
3404 * @param out_ts pointer where to set the interpolated ts, subtract this time
3405 * with VLC_TICK_0 to get the original value.
3406 * @param out_pos pointer where to set the interpolated position
3407 * @return VLC_SUCCESS in case of success, an error in the interpolated ts is
3408 * negative (could happen during the buffering step)
3410 VLC_API int
3411 vlc_player_timer_point_Interpolate(const struct vlc_player_timer_point *point,
3412 vlc_tick_t system_now,
3413 vlc_tick_t *out_ts, float *out_pos);
3416 * Get the date of the next interval
3418 * Can be used to setup an UI timer in order to update some widgets at specific
3419 * interval. A next_interval of VLC_TICK_FROM_SEC(1) can be used to update a
3420 * time widget when the media reaches a new second.
3422 * @note The media time doesn't necessarily correspond to the system time, that
3423 * is why this function is needed and use the rate of the current point.
3425 * @param point time update obtained via the vlc_player_timer_cbs.on_update()
3426 * @param system_now current system date
3427 * @param interpolated_ts ts returned by vlc_player_timer_point_Interpolate()
3428 * with the same system now
3429 * @param next_interval next interval
3430 * @return the absolute system date of the next interval
3432 VLC_API vlc_tick_t
3433 vlc_player_timer_point_GetNextIntervalDate(const struct vlc_player_timer_point *point,
3434 vlc_tick_t system_now,
3435 vlc_tick_t interpolated_ts,
3436 vlc_tick_t next_interval);
3438 /** @} vlc_player__timer */
3440 /** @} vlc_player */
3442 #endif