VLC  4.0.0-dev
player.h
Go to the documentation of this file.
1 /*****************************************************************************
2  * player.h: Player internal interface
3  *****************************************************************************
4  * Copyright © 2018-2019 VLC authors and VideoLAN
5  *
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.
10  *
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.
15  *
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  *****************************************************************************/
20 
21 #ifndef VLC_PLAYER_INTERNAL_H
22 #define VLC_PLAYER_INTERNAL_H
23 
24 #include <vlc_player.h>
25 #include <vlc_list.h>
26 #include <vlc_vector.h>
27 #include <vlc_atomic.h>
28 #include <vlc_media_library.h>
29 
30 #include "input/input_internal.h"
31 
33 {
35  vout_thread_t *vout; /* weak reference */
37  /* only valid if selected and if category is VIDEO_ES or SPU_ES */
39  /* Used to save or not the track selection */
41 };
42 
43 typedef struct VLC_VECTOR(struct vlc_player_program *)
45 
46 typedef struct VLC_VECTOR(struct vlc_player_track_priv *)
48 
50 {
52  size_t count;
53  struct vlc_player_title array[];
54 };
55 
56 struct vlc_player_input
57 {
60  bool started;
61 
63  enum vlc_player_error error;
64  float rate;
67 
68  float position;
71 
73 
74  bool recording;
75 
78  float cache;
79 
80  struct input_stats_t stats;
81 
82  vlc_tick_t cat_delays[DATA_ES];
83 
89 
91 
94 
95  struct vlc_list node;
96 
99  unsigned teletext_page;
100 
101  struct
102  {
103  vlc_tick_t time;
104  float pos;
105  bool set;
106  } abloop_state[2];
107 
108  struct
109  {
111  enum
112  {
116  } restore;
119  } ml;
120 };
121 
123 {
124  const struct vlc_player_cbs *cbs;
125  void *cbs_data;
126  struct vlc_list node;
127 };
128 
130 {
131  const struct vlc_player_vout_cbs *cbs;
132  void *cbs_data;
133  struct vlc_list node;
134 };
135 
137 {
138  const struct vlc_player_aout_cbs *cbs;
139  void *cbs_data;
140  struct vlc_list node;
141 };
142 
144 {
148 };
149 
151 {
154 
155  union
156  {
157  const struct vlc_player_timer_cbs *cbs;
159  };
160  void *data;
161 
162  struct vlc_list node;
163 };
164 
166 {
167  struct vlc_list listeners; /* list of struct vlc_player_timer_id */
168  vlc_es_id_t *es; /* weak reference */
170  union
171  {
172  struct {
173  unsigned long last_framenum;
174  unsigned frame_rate;
175  unsigned frame_rate_base;
177  unsigned df_fps;
178  int df;
180  } smpte;
181  };
182 };
183 
185 {
189 };
190 
192 {
194 
196  bool seeking;
197 
202 
204 #define best_source sources[VLC_PLAYER_TIMER_TYPE_BEST]
205 #define smpte_source sources[VLC_PLAYER_TIMER_TYPE_SMPTE]
206 };
207 
209 {
215 
216  enum vlc_player_media_stopped_action media_stopped_action;
218 
221 
223  bool corked;
224 
225  struct vlc_list listeners;
226  struct vlc_list aout_listeners;
227  struct vlc_list vout_listeners;
228 
231 
233  struct vlc_player_input *input;
234 
238 
242 
243  enum vlc_player_state global_state;
244  bool started;
245 
246  unsigned error_count;
247 
248  bool deleting;
249  struct
250  {
254  struct vlc_list inputs;
255  struct vlc_list stopping_inputs;
256  struct vlc_list joinable_inputs;
257  } destructor;
258 
259  struct vlc_player_timer timer;
260 };
261 
262 #ifndef NDEBUG
263 /*
264  * Assert that the player mutex is locked.
265  *
266  * This is exposed in this internal header because the playlist and its
267  * associated player share the lock to avoid lock-order inversion issues.
268  */
269 static inline void
271 {
272  assert(player);
273  vlc_mutex_assert(&player->lock);
274 }
275 #else
276 #define vlc_player_assert_locked(x) ((void) (0))
277 #endif
278 
279 static inline struct vlc_player_input *
281 {
282  vlc_player_assert_locked(player);
283  return player->input;
284 }
285 
286 #define vlc_player_SendEvent(player, event, ...) do { \
287  vlc_player_listener_id *listener; \
288  vlc_list_foreach(listener, &player->listeners, node) \
289  { \
290  if (listener->cbs->event) \
291  listener->cbs->event(player, ##__VA_ARGS__, listener->cbs_data); \
292  } \
293 } while(0)
294 
295 static inline const char *
297 {
298  switch (cat)
299  {
300  case VIDEO_ES: return "Video";
301  case AUDIO_ES: return "Audio";
302  case SPU_ES: return "Subtitle";
303  default: return NULL;
304  }
305 }
306 
307 /*
308  * player.c
309  */
310 
311 vlc_object_t *
313 
314 int
316 
317 void
319 
320 void
322  struct vlc_player_input *input);
323 
324 void
326  struct vlc_player_input *input);
327 
328 /*
329  * player_track.c
330  */
331 
332 struct vlc_player_program *
333 vlc_player_program_New(int id, const char *name);
334 
335 int
336 vlc_player_program_Update(struct vlc_player_program *prgm, int id,
337  const char *name);
338 
339 struct vlc_player_program *
341  size_t *idx);
342 
343 struct vlc_player_track_priv *
344 vlc_player_track_priv_New(vlc_es_id_t *id, const char *name, const es_format_t *fmt);
345 
346 void
348 
349 int
351  const char *name, const es_format_t *fmt);
352 
353 struct vlc_player_track_priv *
355  size_t *idx);
356 
357 int
359 
360 /*
361  * player_title.c
362  */
363 
364 struct vlc_player_title_list *
365 vlc_player_title_list_Create(input_title_t *const *array, size_t count,
366  int title_offset, int chapter_offset);
367 
368 /*
369  * player_input.c
370  */
371 
372 static inline vlc_player_track_vector *
373 vlc_player_input_GetTrackVector(struct vlc_player_input *input,
374  enum es_format_category_e cat)
375 {
376  switch (cat)
377  {
378  case VIDEO_ES:
379  return &input->video_track_vector;
380  case AUDIO_ES:
381  return &input->audio_track_vector;
382  case SPU_ES:
383  return &input->spu_track_vector;
384  default:
385  return NULL;
386  }
387 }
388 
389 struct vlc_player_track_priv *
390 vlc_player_input_FindTrackById(struct vlc_player_input *input, vlc_es_id_t *id,
391  size_t *idx);
392 
393 struct vlc_player_input *
395 
396 void
397 vlc_player_input_Delete(struct vlc_player_input *input);
398 
399 void
400 vlc_player_input_SelectTracksByStringIds(struct vlc_player_input *input,
401  enum es_format_category_e cat,
402  const char *str_ids);
403 
404 char *
405 vlc_player_input_GetSelectedTrackStringIds(struct vlc_player_input *input,
406  enum es_format_category_e cat);
407 
409 vlc_player_input_GetTime(struct vlc_player_input *input);
410 
411 float
412 vlc_player_input_GetPos(struct vlc_player_input *input);
413 
414 int
415 vlc_player_input_Start(struct vlc_player_input *input);
416 
417 void
418 vlc_player_input_HandleState(struct vlc_player_input *, enum vlc_player_state,
419  vlc_tick_t state_date);
420 
422 vlc_player_input_GetTimerValue(struct vlc_player_input *input);
423 
424 /*
425  * player_timer.c
426 */
427 
428 void
430 
431 void
433 
434 void
436 
437 void
441 
442 void
444  bool es_source_is_master,
445  const struct vlc_player_timer_point *point,
446  vlc_tick_t normal_time,
447  unsigned frame_rate, unsigned frame_rate_base);
448 
449 void
451 
452 int
454  vlc_tick_t *out_ts, float *out_pos);
455 
456 /*
457  * player_vout.c
458  */
459 
460 void
462 
463 void
465 
466 /*
467  * player_aout.c
468  */
469 
470 void
472 
473 void
475 
476 /*
477  * player_osd.c
478  */
479 
480 void
481 vlc_player_osd_Message(vlc_player_t *player, const char *fmt, ...);
482 
483 void
484 vlc_player_osd_Icon(vlc_player_t *player, short type);
485 
486 void
488  struct vlc_player_input *input, vlc_tick_t time,
489  float position, enum vlc_player_whence whence);
490 void
491 vlc_player_osd_Volume(vlc_player_t *player, bool mute_action);
492 
493 int
494 vlc_player_vout_OSDCallback(vlc_object_t *this, const char *var,
495  vlc_value_t oldval, vlc_value_t newval, void *data);
496 
497 void
498 vlc_player_osd_Track(vlc_player_t *player, vlc_es_id_t *id, bool select);
499 
500 void
501 vlc_player_osd_Program(vlc_player_t *player, const char *name);
502 
503 /*
504  * player/medialib.c
505  */
506 
507 void
508 vlc_player_input_RestoreMlStates(struct vlc_player_input* input, bool force_pos);
509 
510 void
511 vlc_player_UpdateMLStates(vlc_player_t *player, struct vlc_player_input* input);
512 
513 #endif
void vlc_player_osd_Position(vlc_player_t *player, struct vlc_player_input *input, vlc_tick_t time, float position, enum vlc_player_whence whence)
Definition: osd.c:119
Definition: player.h:32
bool deleting
Definition: player.h:248
Definition: resource.c:47
bool delay_restore
Definition: player.h:118
size_t chapter_selected
Definition: player.h:93
vlc_tick_t vlc_player_input_GetTime(struct vlc_player_input *input)
Definition: input.c:62
void vlc_player_destructor_AddJoinableInput(vlc_player_t *player, struct vlc_player_input *input)
Definition: player.c:180
vlc_object_t * vlc_player_GetObject(vlc_player_t *player)
Definition: player.c:2035
bool releasing_media
Definition: player.h:235
float signal_quality
Definition: player.h:76
Player timer point.
Definition: vlc_player.h:3126
struct vlc_player_input * vlc_player_input_New(vlc_player_t *player, input_item_t *item)
Definition: input.c:830
const struct vlc_player_aout_cbs * cbs
Definition: player.h:138
int vlc_player_input_Start(struct vlc_player_input *input)
Definition: input.c:94
unsigned teletext_page
Definition: player.h:99
struct vlc_player_track_priv * vlc_player_input_FindTrackById(struct vlc_player_input *input, vlc_es_id_t *id, size_t *idx)
Definition: input.c:31
char * video_string_ids
Definition: player.h:239
const struct vlc_player_cbs * cbs
Definition: player.h:124
vout_thread_t * vout
Definition: player.h:35
unsigned long last_framenum
Definition: player.h:173
Definition: vlc_es.h:604
Definition: player.h:208
int vlc_player_track_priv_Update(struct vlc_player_track_priv *trackpriv, const char *name, const es_format_t *fmt)
Definition: track.c:169
vlc_player_program_vector program_vector
Definition: player.h:84
vlc_thread_t thread
Definition: player.h:251
Definition: vlc_atomic.h:38
void vlc_player_osd_Icon(vlc_player_t *player, short type)
Definition: osd.c:108
void vlc_player_osd_Program(vlc_player_t *player, const char *name)
Definition: osd.c:203
Describes an input and is used to spawn input_thread_t objects.
Definition: vlc_input_item.h:77
vlc_tick_t last_update_date
Definition: player.h:153
vlc_mutex_t vout_listeners_lock
Definition: player.h:213
Definition: player.h:187
Player vout callbacks.
Definition: vlc_player.h:2382
static thread_local struct @77 state
struct vlc_player_program * vlc_player_program_New(int id, const char *name)
Definition: track.c:42
int vlc_player_GetFirstSelectedTrackId(const vlc_player_track_vector *tracks)
Definition: track.c:212
Definition: player.h:191
static void vlc_player_assert_locked(vlc_player_t *player)
Definition: player.h:270
VLC Player API.
vlc_cond_t wait
Definition: player.h:252
void vlc_player_PrepareNextMedia(vlc_player_t *player)
Definition: player.c:53
bool teletext_enabled
Definition: player.h:97
char * sub_string_ids
Definition: player.h:241
vlc_tick_t normal_time
Definition: player.h:70
vlc_tick_t input_normal_time
Definition: player.h:199
unsigned frame_resolution
Definition: player.h:176
vlc_tick_t delay
Definition: player.h:36
bool recording
Definition: player.h:74
vlc_tick_t system_date
System date of this record (always valid), this date can be in the future or in the past...
Definition: vlc_player.h:3142
vlc_mutex_t aout_listeners_lock
Definition: player.h:212
unsigned error_count
Definition: player.h:246
Definition: player.h:136
Player aout callbacks.
Definition: vlc_player.h:2166
bool selected_by_user
Definition: player.h:40
const struct vlc_player_media_provider * media_provider
Definition: player.h:219
void * cbs_data
Definition: player.h:125
Player smpte timer callbacks.
Definition: vlc_player.h:3211
vlc_player_track_vector audio_track_vector
Definition: player.h:86
Definition: player.h:186
void vlc_player_RemoveTimerSource(vlc_player_t *player, vlc_es_id_t *es_source)
Definition: timer.c:373
vlc_player_timer_state
Definition: player.h:184
Player track structure.
Definition: vlc_player.h:1327
struct vlc_player_program * vlc_player_program_vector_FindById(vlc_player_program_vector *vec, int id, size_t *idx)
Definition: track.c:89
int vlc_player_GetTimerPoint(vlc_player_t *player, vlc_tick_t system_now, vlc_tick_t *out_ts, float *out_pos)
Definition: timer.c:390
float signal_strength
Definition: player.h:77
void vlc_player_vout_AddCallbacks(vlc_player_t *player, vout_thread_t *vout)
Definition: vout.c:140
vlc_player_error
Error of the player.
Definition: vlc_player.h:289
float pos
Definition: player.h:104
Player timer callbacks.
Definition: vlc_player.h:3171
Definition: vlc_es.h:605
vlc_es_id_t * es
Definition: player.h:168
VLC value structure.
Definition: vlc_common.h:455
size_t title_selected
Definition: player.h:92
float position
Definition: player.h:68
void * cbs_data
Definition: player.h:132
enum vlc_vout_order vout_order
Definition: player.h:38
Definition: player.h:145
Definition: renderer_discovery.c:34
vlc_atomic_rc_t rc
Definition: player.h:51
const char var[sizeof("video")]
Definition: player.c:1744
es_format_category_e
ES Categories.
Definition: vlc_es.h:600
struct vlc_player_input * input
Definition: player.h:233
bool start_paused
Definition: player.h:217
vlc_renderer_item_t * renderer
Definition: player.h:230
This provides convenience helpers for linked lists.
struct vlc_player_title_list * vlc_player_title_list_Create(input_title_t *const *array, size_t count, int title_offset, int chapter_offset)
Definition: title.c:98
void vlc_player_input_HandleState(struct vlc_player_input *, enum vlc_player_state, vlc_tick_t state_date)
Definition: input.c:127
void vlc_player_DestroyTimer(vlc_player_t *player)
Definition: timer.c:536
char * vlc_player_input_GetSelectedTrackStringIds(struct vlc_player_input *input, enum es_format_category_e cat)
Definition: input.c:798
Player program structure.
Definition: vlc_player.h:1174
Definition: player.h:129
int64_t vlc_tick_t
High precision date or time interval.
Definition: vlc_tick.h:45
void vlc_player_UpdateMLStates(vlc_player_t *player, struct vlc_player_input *input)
Definition: medialib.c:186
struct vlc_player_track_priv * vlc_player_track_vector_FindById(vlc_player_track_vector *vec, vlc_es_id_t *id, size_t *idx)
Definition: track.c:194
static const char * es_format_category_to_string(enum es_format_category_e cat)
Definition: player.h:296
vlc_player_media_stopped_action
Action when the player is stopped.
Definition: vlc_player.h:96
void * cbs_data
Definition: player.h:139
vlc_player_whence
Player seek/delay directive.
Definition: vlc_player.h:316
Atomic operations do not require locking, but they are not very powerful.
Definition: player.h:49
input_thread_t * thread
Definition: player.h:58
struct vlc_object_marker * obj
Definition: vlc_objects.h:48
float vlc_player_input_GetPos(struct vlc_player_input *input)
Definition: input.c:74
int capabilities
Definition: player.h:65
Definition: player.h:122
bool pause_on_cork
Definition: player.h:222
Definition: vlc_es.h:603
Thread handle.
Definition: vlc_threads.h:208
vlc_tick_t period
Definition: player.h:152
Definition: vlc_es.h:617
unsigned frame_rate_base
Definition: player.h:175
vlc_tick_t time
Definition: player.h:69
Player callbacks.
Definition: vlc_player.h:2612
vlc_tick_t last_ts
Definition: player.h:200
size_t count
Definition: core.c:402
Video output thread descriptor.
Definition: vlc_vout.h:60
Definition: player.h:146
vlc_player_track_vector spu_track_vector
Definition: player.h:87
bool next_media_requested
Definition: player.h:236
Definition: player.h:165
Definition: player.h:43
void vlc_player_input_SelectTracksByStringIds(struct vlc_player_input *input, enum es_format_category_e cat, const char *str_ids)
Definition: input.c:790
Mutex.
Definition: vlc_threads.h:266
Definition: player.h:46
#define VLC_VECTOR(type)
Vector struct body.
Definition: vlc_vector.h:65
input_item_t * next_media
Definition: player.h:237
void vlc_player_UpdateTimer(vlc_player_t *player, vlc_es_id_t *es_source, bool es_source_is_master, const struct vlc_player_timer_point *point, vlc_tick_t normal_time, unsigned frame_rate, unsigned frame_rate_base)
Definition: timer.c:254
struct vlc_player_title_list * titles
Definition: player.h:90
Player title structure.
Definition: vlc_player.h:956
const struct vlc_player_timer_cbs * cbs
Definition: player.h:157
int vlc_player_OpenNextMedia(vlc_player_t *player)
Definition: player.c:69
static vlc_player_track_vector * vlc_player_input_GetTrackVector(struct vlc_player_input *input, enum es_format_category_e cat)
Definition: player.h:373
float rate
Definition: player.h:64
vlc_ml_playback_states_all states
Definition: player.h:110
Opaque structure representing an ES (Elementary Stream) track.
Definition: es_out.c:92
unsigned frame_rate
Definition: player.h:174
bool corked
Definition: player.h:223
const char name[16]
Definition: httpd.c:1269
void vlc_player_aout_DelCallbacks(vlc_player_t *player)
Definition: aout.c:210
bool started
Definition: player.h:244
vlc_player_timer_source_type
Definition: player.h:143
void vlc_player_InitTimer(vlc_player_t *player)
Definition: timer.c:522
void vlc_player_track_priv_Delete(struct vlc_player_track_priv *trackpriv)
Definition: track.c:139
bool teletext_transparent
Definition: player.h:98
bool started
Definition: player.h:60
vlc_vout_order
vout or spu_channel order
Definition: vlc_vout.h:78
vlc_tick_t input_length
Definition: player.h:198
static struct vlc_player_input * vlc_player_get_input_locked(vlc_player_t *player)
Definition: player.h:280
Condition variable.
Definition: vlc_threads.h:390
int vlc_player_vout_OSDCallback(vlc_object_t *this, const char *var, vlc_value_t oldval, vlc_value_t newval, void *data)
Definition: osd.c:239
Main structure representing an input thread.
Definition: input_internal.h:48
Definition: player.h:147
vlc_tick_t length
Definition: player.h:66
vlc_mutex_t lock
Definition: player.h:211
char * audio_string_ids
Definition: player.h:240
Definition: player.h:150
Definition: player.h:188
Definition: vlc_media_library.h:504
bool seeking
Definition: player.h:196
const struct vlc_player_timer_smpte_cbs * smpte_cbs
Definition: player.h:158
vlc_player_track_vector video_track_vector
Definition: player.h:85
void vlc_player_destructor_AddStoppingInput(vlc_player_t *player, struct vlc_player_input *input)
Definition: player.c:166
Definition: vlc_es.h:606
void vlc_player_input_Delete(struct vlc_player_input *input)
Definition: input.c:930
vlc_cond_t start_delay_cond
Definition: player.h:214
vlc_cond_t notify
Definition: player.h:253
bool restore_states
Definition: player.h:117
vlc_tick_t pause_date
Definition: player.h:72
Doubly-linked list node.
Definition: vlc_list.h:43
unsigned df_fps
Definition: player.h:177
void vlc_player_aout_AddCallbacks(vlc_player_t *player)
Definition: aout.c:196
This provides convenience helpers for vectors.
float position
Position in the range [0.0f;1.0].
Definition: vlc_player.h:3129
void vlc_player_input_RestoreMlStates(struct vlc_player_input *input, bool force_pos)
Definition: medialib.c:30
vlc_player_state
State of the player.
Definition: vlc_player.h:243
struct vlc_player_track_priv * teletext_menu
Definition: player.h:88
Definition: vlc_input_item.h:504
void vlc_player_osd_Volume(vlc_player_t *player, bool mute_action)
Definition: osd.c:169
void vlc_player_osd_Track(vlc_player_t *player, vlc_es_id_t *id, bool select)
Definition: osd.c:189
void * media_provider_data
Definition: player.h:220
void vlc_player_ResetTimer(vlc_player_t *player)
Definition: timer.c:30
int frames_per_10mins
Definition: player.h:179
size_t count
Definition: player.h:52
input_resource_t * resource
Definition: player.h:229
VLC object common members.
Definition: vlc_objects.h:43
void vlc_player_osd_Message(vlc_player_t *player, const char *fmt,...)
Definition: osd.c:88
struct vlc_player_track_priv * vlc_player_track_priv_New(vlc_es_id_t *id, const char *name, const es_format_t *fmt)
Definition: track.c:106
int vlc_player_program_Update(struct vlc_player_program *prgm, int id, const char *name)
Definition: track.c:60
void vlc_player_UpdateTimerState(vlc_player_t *player, vlc_es_id_t *es_source, enum vlc_player_timer_state state, vlc_tick_t system_date)
Definition: timer.c:175
Callbacks for the owner of the player.
Definition: vlc_player.h:117
input_item_t * media
Definition: player.h:232
Definition: vlc_input.h:94
const struct vlc_player_vout_cbs * cbs
Definition: player.h:131
float input_position
Definition: player.h:201
#define vlc_mutex_assert(m)
Asserts that a mutex is locked by the calling thread.
Definition: vlc_threads.h:369
struct vlc_player_track t
Definition: player.h:34
void vlc_player_vout_DelCallbacks(vlc_player_t *player, vout_thread_t *vout)
Definition: vout.c:150
void * data
Definition: player.h:160
vlc_player_t * player
Definition: player.h:59
vlc_mutex_t lock
Definition: player.h:193
float cache
Definition: player.h:78
int df
Definition: player.h:178