1 /*****************************************************************************
2 * player.h: Player internal interface
3 *****************************************************************************
4 * Copyright © 2018-2019 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_INTERNAL_H
22 #define VLC_PLAYER_INTERNAL_H
24 #include <vlc_player.h>
26 #include <vlc_vector.h>
27 #include <vlc_atomic.h>
28 #include <vlc_media_library.h>
30 #include "input/input_internal.h"
32 struct vlc_player_track_priv
34 struct vlc_player_track t
;
35 vout_thread_t
*vout
; /* weak reference */
37 /* only valid if selected and if category is VIDEO_ES or SPU_ES */
38 enum vlc_vout_order vout_order
;
39 /* Used to save or not the track selection */
40 bool selected_by_user
;
43 typedef struct VLC_VECTOR(struct vlc_player_program
*)
44 vlc_player_program_vector
;
46 typedef struct VLC_VECTOR(struct vlc_player_track_priv
*)
47 vlc_player_track_vector
;
49 struct vlc_player_title_list
53 struct vlc_player_title array
[];
56 struct vlc_player_input
58 input_thread_t
*thread
;
62 enum vlc_player_state state
;
63 enum vlc_player_error error
;
70 vlc_tick_t normal_time
;
72 vlc_tick_t pause_date
;
77 float signal_strength
;
80 struct input_stats_t stats
;
82 vlc_tick_t cat_delays
[DATA_ES
];
84 vlc_player_program_vector program_vector
;
85 vlc_player_track_vector video_track_vector
;
86 vlc_player_track_vector audio_track_vector
;
87 vlc_player_track_vector spu_track_vector
;
88 const struct vlc_player_track_priv
*teletext_source
;
90 struct vlc_player_title_list
*titles
;
92 size_t title_selected
;
93 size_t chapter_selected
;
97 bool teletext_enabled
;
98 bool teletext_transparent
;
99 unsigned teletext_page
;
110 vlc_ml_playback_states_all states
;
113 VLC_RESTOREPOINT_TITLE
,
114 VLC_RESTOREPOINT_POSITION
,
115 VLC_RESTOREPOINT_NONE
,
120 /* Keep a trace of tracks as they appear since they won't be available
121 * for probing when the input gets stopped
123 bool has_video_tracks
;
124 bool has_audio_tracks
;
128 struct vlc_player_listener_id
130 const struct vlc_player_cbs
*cbs
;
132 struct vlc_list node
;
135 struct vlc_player_metadata_listener_id
137 const union vlc_player_metadata_cbs
*cbs
;
140 enum vlc_player_metadata_option option
;
143 vlc_audio_meter_plugin
*audio_meter
;
145 struct vlc_list node
;
148 struct vlc_player_vout_listener_id
150 const struct vlc_player_vout_cbs
*cbs
;
152 struct vlc_list node
;
155 struct vlc_player_aout_listener_id
157 const struct vlc_player_aout_cbs
*cbs
;
159 struct vlc_list node
;
162 enum vlc_player_timer_source_type
164 VLC_PLAYER_TIMER_TYPE_BEST
,
165 VLC_PLAYER_TIMER_TYPE_SMPTE
,
166 VLC_PLAYER_TIMER_TYPE_COUNT
169 struct vlc_player_timer_id
172 vlc_tick_t last_update_date
;
176 const struct vlc_player_timer_cbs
*cbs
;
177 const struct vlc_player_timer_smpte_cbs
*smpte_cbs
;
181 struct vlc_list node
;
184 struct vlc_player_timer_source
186 struct vlc_list listeners
; /* list of struct vlc_player_timer_id */
187 vlc_es_id_t
*es
; /* weak reference */
188 struct vlc_player_timer_point point
;
192 unsigned long last_framenum
;
194 unsigned frame_rate_base
;
195 unsigned frame_resolution
;
198 int frames_per_10mins
;
203 enum vlc_player_timer_state
205 VLC_PLAYER_TIMER_STATE_PLAYING
,
206 VLC_PLAYER_TIMER_STATE_PAUSED
,
207 VLC_PLAYER_TIMER_STATE_DISCONTINUITY
,
210 struct vlc_player_timer
214 enum vlc_player_timer_state state
;
217 vlc_tick_t input_length
;
218 vlc_tick_t input_normal_time
;
220 float input_position
;
222 struct vlc_player_timer_source sources
[VLC_PLAYER_TIMER_TYPE_COUNT
];
223 #define best_source sources[VLC_PLAYER_TIMER_TYPE_BEST]
224 #define smpte_source sources[VLC_PLAYER_TIMER_TYPE_SMPTE]
229 struct vlc_object_t obj
;
231 vlc_mutex_t metadata_listeners_lock
;
232 vlc_mutex_t aout_listeners_lock
;
233 vlc_mutex_t vout_listeners_lock
;
234 vlc_cond_t start_delay_cond
;
236 enum vlc_player_media_stopped_action media_stopped_action
;
239 const struct vlc_player_media_provider
*media_provider
;
240 void *media_provider_data
;
245 struct vlc_list listeners
;
246 struct vlc_list metadata_listeners
;
247 struct vlc_list aout_listeners
;
248 struct vlc_list vout_listeners
;
250 input_resource_t
*resource
;
251 vlc_renderer_item_t
*renderer
;
254 struct vlc_player_input
*input
;
256 bool releasing_media
;
257 bool next_media_requested
;
258 input_item_t
*next_media
;
260 char *video_string_ids
;
261 char *audio_string_ids
;
262 char *sub_string_ids
;
264 enum vlc_player_state global_state
;
267 unsigned error_count
;
275 struct vlc_list inputs
;
276 struct vlc_list stopping_inputs
;
277 struct vlc_list joinable_inputs
;
280 struct vlc_player_timer timer
;
285 * Assert that the player mutex is locked.
287 * This is exposed in this internal header because the playlist and its
288 * associated player share the lock to avoid lock-order inversion issues.
291 vlc_player_assert_locked(vlc_player_t
*player
)
294 vlc_mutex_assert(&player
->lock
);
297 #define vlc_player_assert_locked(x) ((void) (0))
300 static inline struct vlc_player_input
*
301 vlc_player_get_input_locked(vlc_player_t
*player
)
303 vlc_player_assert_locked(player
);
304 return player
->input
;
307 #define vlc_player_SendEvent(player, event, ...) do { \
308 vlc_player_listener_id *listener; \
309 vlc_list_foreach(listener, &player->listeners, node) \
311 if (listener->cbs->event) \
312 listener->cbs->event(player, ##__VA_ARGS__, listener->cbs_data); \
316 static inline const char *
317 es_format_category_to_string(enum es_format_category_e cat
)
321 case VIDEO_ES
: return "Video";
322 case AUDIO_ES
: return "Audio";
323 case SPU_ES
: return "Subtitle";
324 default: return NULL
;
333 vlc_player_GetObject(vlc_player_t
*player
);
336 vlc_player_OpenNextMedia(vlc_player_t
*player
);
339 vlc_player_PrepareNextMedia(vlc_player_t
*player
);
342 vlc_player_destructor_AddStoppingInput(vlc_player_t
*player
,
343 struct vlc_player_input
*input
);
346 vlc_player_destructor_AddJoinableInput(vlc_player_t
*player
,
347 struct vlc_player_input
*input
);
353 struct vlc_player_program
*
354 vlc_player_program_New(int id
, const char *name
);
357 vlc_player_program_Update(struct vlc_player_program
*prgm
, int id
,
360 struct vlc_player_program
*
361 vlc_player_program_vector_FindById(vlc_player_program_vector
*vec
, int id
,
364 struct vlc_player_track_priv
*
365 vlc_player_track_priv_New(vlc_es_id_t
*id
, const char *name
, const es_format_t
*fmt
);
368 vlc_player_track_priv_Delete(struct vlc_player_track_priv
*trackpriv
);
371 vlc_player_track_priv_Update(struct vlc_player_track_priv
*trackpriv
,
372 const char *name
, const es_format_t
*fmt
);
374 struct vlc_player_track_priv
*
375 vlc_player_track_vector_FindById(vlc_player_track_vector
*vec
, vlc_es_id_t
*id
,
379 vlc_player_GetFirstSelectedTrackId(const vlc_player_track_vector
* tracks
);
385 struct vlc_player_title_list
*
386 vlc_player_title_list_Create(input_title_t
*const *array
, size_t count
,
387 int title_offset
, int chapter_offset
);
393 static inline vlc_player_track_vector
*
394 vlc_player_input_GetTrackVector(struct vlc_player_input
*input
,
395 enum es_format_category_e cat
)
400 return &input
->video_track_vector
;
402 return &input
->audio_track_vector
;
404 return &input
->spu_track_vector
;
410 struct vlc_player_track_priv
*
411 vlc_player_input_FindTrackById(struct vlc_player_input
*input
, vlc_es_id_t
*id
,
414 struct vlc_player_input
*
415 vlc_player_input_New(vlc_player_t
*player
, input_item_t
*item
);
418 vlc_player_input_Delete(struct vlc_player_input
*input
);
421 vlc_player_input_SelectTracksByStringIds(struct vlc_player_input
*input
,
422 enum es_format_category_e cat
,
423 const char *str_ids
);
426 vlc_player_input_GetSelectedTrackStringIds(struct vlc_player_input
*input
,
427 enum es_format_category_e cat
);
430 vlc_player_input_GetTime(struct vlc_player_input
*input
);
433 vlc_player_input_GetPos(struct vlc_player_input
*input
);
436 vlc_player_input_Start(struct vlc_player_input
*input
);
439 vlc_player_input_HandleState(struct vlc_player_input
*, enum vlc_player_state
,
440 vlc_tick_t state_date
);
442 struct vlc_player_timer_point
443 vlc_player_input_GetTimerValue(struct vlc_player_input
*input
);
450 vlc_player_InitTimer(vlc_player_t
*player
);
453 vlc_player_DestroyTimer(vlc_player_t
*player
);
456 vlc_player_ResetTimer(vlc_player_t
*player
);
459 vlc_player_UpdateTimerState(vlc_player_t
*player
, vlc_es_id_t
*es_source
,
460 enum vlc_player_timer_state state
,
461 vlc_tick_t system_date
);
464 vlc_player_UpdateTimer(vlc_player_t
*player
, vlc_es_id_t
*es_source
,
465 bool es_source_is_master
,
466 const struct vlc_player_timer_point
*point
,
467 vlc_tick_t normal_time
,
468 unsigned frame_rate
, unsigned frame_rate_base
);
471 vlc_player_RemoveTimerSource(vlc_player_t
*player
, vlc_es_id_t
*es_source
);
474 vlc_player_GetTimerPoint(vlc_player_t
*player
, vlc_tick_t system_now
,
475 vlc_tick_t
*out_ts
, float *out_pos
);
482 vlc_player_vout_AddCallbacks(vlc_player_t
*player
, vout_thread_t
*vout
);
485 vlc_player_vout_DelCallbacks(vlc_player_t
*player
, vout_thread_t
*vout
);
492 vlc_player_aout_Init(vlc_player_t
*player
);
495 vlc_player_aout_Deinit(vlc_player_t
*player
);
502 vlc_player_osd_Message(vlc_player_t
*player
, const char *fmt
, ...);
505 vlc_player_osd_Icon(vlc_player_t
*player
, short type
);
508 vlc_player_osd_Position(vlc_player_t
*player
,
509 struct vlc_player_input
*input
, vlc_tick_t time
,
510 float position
, enum vlc_player_whence whence
);
512 vlc_player_osd_Volume(vlc_player_t
*player
, bool mute_action
);
515 vlc_player_vout_OSDCallback(vlc_object_t
*this, const char *var
,
516 vlc_value_t oldval
, vlc_value_t newval
, void *data
);
519 vlc_player_osd_Track(vlc_player_t
*player
, vlc_es_id_t
*id
, bool select
);
522 vlc_player_osd_Tracks(vlc_player_t
*player
, vlc_es_id_t
* const*selected
, vlc_es_id_t
*unselect
);
525 vlc_player_osd_Program(vlc_player_t
*player
, const char *name
);
532 vlc_player_input_RestoreMlStates(struct vlc_player_input
* input
, bool force_pos
);
535 vlc_player_UpdateMLStates(vlc_player_t
*player
, struct vlc_player_input
* input
);