xbmc
dvdnav.h
1 /*
2  * Copyright (C) 2001 Rich Wareham <richwareham@users.sourceforge.net>
3  *
4  * This file is part of libdvdnav, a DVD navigation library.
5  *
6  * libdvdnav is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * libdvdnav 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 General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with libdvdnav; if not, write to the Free Software Foundation, Inc.,
18  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19  */
20 
21 /*
22  * This is the main header file applications should include if they want
23  * to access dvdnav functionality.
24  */
25 
26 #pragma once
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31 
32 #include "dvd_reader.h"
33 #include "dvd_types.h"
34 #include "dvdnav_events.h"
35 #include "nav_types.h"
36 #include "version.h"
37 
38 #include <stdarg.h>
39 
40  /*********************************************************************
41  * dvdnav data types *
42  *********************************************************************/
43 
44  /*
45  * Opaque data-type can be viewed as a 'DVD handle'. You should get
46  * a pointer to a dvdnav_t from the dvdnav_open() function.
47  * Never call free() on the pointer, you have to give it back with
48  * dvdnav_close().
49  */
50  typedef struct dvdnav_s dvdnav_t;
51 
52  /* Status as reported by most of libdvdnav's functions */
53  typedef int32_t dvdnav_status_t;
54 
56 
57 /*
58  * Unless otherwise stated, all functions return DVDNAV_STATUS_OK if
59  * they succeeded, otherwise DVDNAV_STATUS_ERR is returned and the error may
60  * be obtained by calling dvdnav_err_to_string().
61  */
62 #define DVDNAV_STATUS_ERR 0
63 #define DVDNAV_STATUS_OK 1
64 
65 /*********************************************************************
66  * initialisation & housekeeping functions *
67  *********************************************************************/
68 
69 /*
70  * Logger callback definition
71  */
72 typedef enum
73 {
74  DVDNAV_LOGGER_LEVEL_INFO,
75  DVDNAV_LOGGER_LEVEL_ERROR,
76  DVDNAV_LOGGER_LEVEL_WARN,
77  DVDNAV_LOGGER_LEVEL_DEBUG,
78 } dvdnav_logger_level_t;
79 
80 typedef struct
81 {
82  void (*pf_log)(void*, dvdnav_logger_level_t, const char*, va_list);
84 
85 /*
86  * These functions allow you to open a DVD device and associate it
87  * with a dvdnav_t.
88  */
89 
90 /*
91  * Attempts to open the DVD drive at the specified path or using external
92  * seek/read functions (dvdnav_open_stream) and pre-cache the CSS-keys.
93  * libdvdread is used to access the DVD, so any source supported by libdvdread
94  * can be given with "path" or "stream_cb". Currently, using dvdnav_open,
95  * libdvdread can access : DVD drives, DVD image files, DVD file-by-file
96  * copies. Using dvdnav_open_stream, libdvdread can access any kind of DVD
97  * storage via custom implementation of seek/read functions.
98  *
99  * The resulting dvdnav_t handle will be written to *dest.
100  */
101 dvdnav_status_t dvdnav_open(dvdnav_t **dest, const char *path);
102 dvdnav_status_t dvdnav_open_stream(dvdnav_t** dest, void* priv, dvdnav_stream_cb* stream_cb);
103 
104 dvdnav_status_t dvdnav_open2(dvdnav_t** dest, void*, const dvdnav_logger_cb*, const char* path);
105 dvdnav_status_t dvdnav_open_stream2(dvdnav_t** dest,
106  void* priv,
107  const dvdnav_logger_cb*,
108  dvdnav_stream_cb* stream_cb);
109 
110 dvdnav_status_t dvdnav_dup(dvdnav_t** dest, dvdnav_t* src);
111 dvdnav_status_t dvdnav_free_dup(dvdnav_t* _this);
112 
113 /*
114  * Closes a dvdnav_t previously opened with dvdnav_open(), freeing any
115  * memory associated with it.
116  */
117 dvdnav_status_t dvdnav_close(dvdnav_t *self);
118 
119 /*
120  * Resets the DVD virtual machine and cache buffers.
121  */
122 dvdnav_status_t dvdnav_reset(dvdnav_t *self);
123 
124 /*
125  * Fills a pointer with a value pointing to a string describing
126  * the path associated with an open dvdnav_t. It assigns *path to NULL
127  * on error.
128  */
129 dvdnav_status_t dvdnav_path(dvdnav_t *self, const char **path);
130 
131 /*
132  * Returns a human-readable string describing the last error.
133  */
134 const char* dvdnav_err_to_string(dvdnav_t *self);
135 
136 const char* dvdnav_version(void);
137 
138 /*********************************************************************
139  * changing and reading DVD player characteristics *
140  *********************************************************************/
141 
142 /*
143  * These functions allow you to manipulate the various global characteristics
144  * of the DVD playback engine.
145  */
146 
147 /*
148  * Sets the region mask (bit 0 set implies region 1, bit 1 set implies
149  * region 2, etc) of the virtual machine. Generally you will only need to set
150  * this if you are playing RCE discs which query the virtual machine as to its
151  * region setting.
152  *
153  * This has _nothing_ to do with the region setting of the DVD drive.
154  */
155 dvdnav_status_t dvdnav_set_region_mask(dvdnav_t *self, int32_t region_mask);
156 
157 /*
158  * Returns the region mask (bit 0 set implies region 1, bit 1 set implies
159  * region 2, etc) of the virtual machine.
160  *
161  * This has _nothing_ to do with the region setting of the DVD drive.
162  */
163 dvdnav_status_t dvdnav_get_region_mask(dvdnav_t *self, int32_t *region_mask);
164 
165 /*
166  * Specify whether read-ahead caching should be used. You may not want this if your
167  * decoding engine does its own buffering.
168  *
169  * The default read-ahead cache does not use an additional thread for the reading
170  * (see read_cache.c for a threaded cache, but note that this code is currently
171  * unmaintained). It prebuffers on VOBU level by reading ahead several buffers
172  * on every read request. The speed of this prebuffering has been optimized to
173  * also work on slow DVD drives.
174  *
175  * If in addition you want to prevent memcpy's to improve performance, have a look
176  * at dvdnav_get_next_cache_block().
177  */
178 dvdnav_status_t dvdnav_set_readahead_flag(dvdnav_t *self, int32_t read_ahead_flag);
179 
180 /*
181  * Query whether read-ahead caching/buffering will be used.
182  */
183 dvdnav_status_t dvdnav_get_readahead_flag(dvdnav_t *self, int32_t *read_ahead_flag);
184 
185 /*
186  * Specify whether the positioning works PGC or PG based.
187  * Programs (PGs) on DVDs are similar to Chapters and a program chain (PGC)
188  * usually covers a whole feature. This affects the behaviour of the
189  * functions dvdnav_get_position() and dvdnav_sector_search(). See there.
190  * Default is PG based positioning.
191  */
192 dvdnav_status_t dvdnav_set_PGC_positioning_flag(dvdnav_t *self, int32_t pgc_based_flag);
193 
194 /*
195  * Query whether positioning is PG or PGC based.
196  */
197 dvdnav_status_t dvdnav_get_PGC_positioning_flag(dvdnav_t *self, int32_t *pgc_based_flag);
198 
199 
200 /*********************************************************************
201  * reading data *
202  *********************************************************************/
203 
204 /*
205  * These functions are used to poll the playback engine and actually get data
206  * off the DVD.
207  */
208 
209 /*
210  * Attempts to get the next block off the DVD and copies it into the buffer 'buf'.
211  * If there is any special actions that may need to be performed, the value
212  * pointed to by 'event' gets set accordingly.
213  *
214  * If 'event' is DVDNAV_BLOCK_OK then 'buf' is filled with the next block
215  * (note that means it has to be at /least/ 2048 bytes big). 'len' is
216  * then set to 2048.
217  *
218  * Otherwise, buf is filled with an appropriate event structure and
219  * len is set to the length of that structure.
220  *
221  * See the dvdnav_events.h header for information on the various events.
222  */
223 dvdnav_status_t dvdnav_get_next_block(dvdnav_t* self, uint8_t* buf, int32_t* event, int32_t* len);
224 
225 /*
226  * This basically does the same as dvdnav_get_next_block. The only difference is
227  * that it avoids a memcopy, when the requested block was found in the cache.
228  * In such a case (cache hit) this function will return a different pointer than
229  * the one handed in, pointing directly into the relevant block in the cache.
230  * Those pointers must _never_ be freed but instead returned to the library via
231  * dvdnav_free_cache_block().
232  */
233 dvdnav_status_t dvdnav_get_next_cache_block(dvdnav_t* self,
234  uint8_t** buf,
235  int32_t* event,
236  int32_t* len);
237 
238 /*
239  * All buffers which came from the internal cache (when dvdnav_get_next_cache_block()
240  * returned a buffer different from the one handed in) have to be freed with this
241  * function. Although handing in other buffers not from the cache doesn't cause any harm.
242  */
243 dvdnav_status_t dvdnav_free_cache_block(dvdnav_t *self, unsigned char *buf);
244 
245 /*
246  * If we are currently in a still-frame this function skips it.
247  *
248  * See also the DVDNAV_STILL_FRAME event.
249  */
250 dvdnav_status_t dvdnav_still_skip(dvdnav_t *self);
251 
252 /*
253  * If we are currently in WAIT state, that is: the application is required to
254  * wait for its fifos to become empty, calling this signals libdvdnav that this
255  * is achieved and that it can continue.
256  *
257  * See also the DVDNAV_WAIT event.
258  */
259 dvdnav_status_t dvdnav_wait_skip(dvdnav_t *self);
260 
261 /*
262  * Returns the still time from the currently playing cell.
263  * The still time is given in seconds with 0xff meaning an indefinite still.
264  *
265  * This function can be used to detect still frames before they are reached.
266  * Some players might need this to prepare for a frame to be shown for a
267  * longer time than usual.
268  */
269 uint32_t dvdnav_get_next_still_flag(dvdnav_t *self);
270 
271 /*
272  * Stops playback. The next event obtained with one of the get_next_block
273  * functions will be a DVDNAV_STOP event.
274  *
275  * It is not required to call this before dvdnav_close().
276  */
277 dvdnav_status_t dvdnav_stop(dvdnav_t *self);
278 
279 /*
280  * Returns the region mask (bit 0 set implies region 1, bit 1 set implies
281  * region 2, etc) reported by the dvd disc being played.
282  *
283  * Note this has no relation with the region setting of the DVD drive.
284  * Old DVD drives (RPC-I) used to delegate most of the RCE handling to the CPU and
285  * will actually call the virtual machine (VM) for its region setting. In those cases,
286  * changing the VM region mask via dvdnav_set_region_mask() will circunvent
287  * the region protection scheme. This is no longer the case with more recent (RPC-II) drives
288  * as RCE is handled internally by the drive firmware.
289  *
290  */
291 dvdnav_status_t dvdnav_get_disk_region_mask(dvdnav_t* self, int32_t* region_mask);
292 
293 /*********************************************************************
294  * title/part navigation *
295  *********************************************************************/
296 
297 /*
298  * Returns the number of titles on the disk.
299  */
300 dvdnav_status_t dvdnav_get_number_of_titles(dvdnav_t *self, int32_t *titles);
301 
302 /*
303  * Returns the number of parts within the given title.
304  */
305 dvdnav_status_t dvdnav_get_number_of_parts(dvdnav_t *self, int32_t title, int32_t *parts);
306 
307 /*
308  * Returns the number of angles for the given title.
309  */
310 dvdnav_status_t dvdnav_get_number_of_angles(dvdnav_t* self, int32_t title, int32_t* angles);
311 
312 /*
313  * Plays the specified title of the DVD from its beginning (that is: part 1).
314  */
315 dvdnav_status_t dvdnav_title_play(dvdnav_t *self, int32_t title);
316 
317 /*
318  * Plays the specified title, starting from the specified part.
319  */
320 dvdnav_status_t dvdnav_part_play(dvdnav_t *self, int32_t title, int32_t part);
321 
322 /*
323  * Plays the specified title, starting from the specified program
324  */
325 dvdnav_status_t dvdnav_program_play(dvdnav_t *self, int32_t title, int32_t pgcn, int32_t pgn);
326 
327 /*
328  * Stores in *times an array (that the application *must* free) of
329  * dvdtimes corresponding to the chapter times for the chosen title.
330  * *duration will have the duration of the title
331  * The number of entries in *times is the result of the function.
332  * On error *times is NULL and the output is 0
333  */
334 uint32_t dvdnav_describe_title_chapters(dvdnav_t *self, int32_t title, uint64_t **times, uint64_t *duration);
335 
336 /*
337  * Play the specified amount of parts of the specified title of
338  * the DVD then STOP.
339  *
340  * Currently unimplemented!
341  */
342 dvdnav_status_t dvdnav_part_play_auto_stop(dvdnav_t* self,
343  int32_t title,
344  int32_t part,
345  int32_t parts_to_play);
346 
347 /*
348  * Play the specified title starting from the specified time.
349  *
350  * Currently unimplemented!
351  */
352 dvdnav_status_t dvdnav_time_play(dvdnav_t* self, int32_t title, uint64_t time);
353 
354 /*
355  * Stop playing the current position and jump to the specified menu.
356  *
357  * See also DVDMenuID_t from libdvdread
358  */
359 dvdnav_status_t dvdnav_menu_call(dvdnav_t *self, DVDMenuID_t menu);
360 
361 /*
362  * Return the title number and part currently being played.
363  * A title of 0 indicates we are in a menu. In this case, part
364  * is set to the current menu's ID.
365  */
366 dvdnav_status_t dvdnav_current_title_info(dvdnav_t* self, int32_t* title, int32_t* part);
367 
368 /*
369  * Return the title number, pgcn and pgn currently being played.
370  * A title of 0 indicates, we are in a menu.
371  */
372 dvdnav_status_t dvdnav_current_title_program(dvdnav_t* self,
373  int32_t* title,
374  int32_t* pgcn,
375  int32_t* pgn);
376 
377 /*
378  * Return the current position (in blocks) within the current
379  * title and the length (in blocks) of said title.
380  *
381  * Current implementation is wrong and likely to behave unpredictably!
382  * Use is discouraged!
383  */
384 dvdnav_status_t dvdnav_get_position_in_title(dvdnav_t* self, uint32_t* pos, uint32_t* len);
385 
386 /*
387  * This function is only available for compatibility reasons.
388  *
389  * Stop playing the current position and start playback of the current title
390  * from the specified part.
391  */
392 dvdnav_status_t dvdnav_part_search(dvdnav_t *self, int32_t part);
393 
394 
395 /*********************************************************************
396  * program chain/program navigation *
397  *********************************************************************/
398 
399 /*
400  * Stop playing the current position and start playback from the last
401  * VOBU boundary before the given sector. The sector number is not
402  * meant to be an absolute physical DVD sector, but a relative sector
403  * in the current program. This function cannot leave the current
404  * program and will fail if asked to do so.
405  *
406  * If program chain based positioning is enabled
407  * (see dvdnav_set_PGC_positioning_flag()), this will seek to the relative
408  * sector inside the current program chain.
409  *
410  * 'origin' can be one of SEEK_SET, SEEK_CUR, SEEK_END as defined in
411  * fcntl.h.
412  */
413 dvdnav_status_t dvdnav_sector_search(dvdnav_t* self, int64_t offset, int32_t origin);
414 
415 /*
416  returns the current stream time in PTS ticks as reported by the IFO structures
417  divide it by 90000 to get the current play time in seconds
418  */
419 int64_t dvdnav_get_current_time(dvdnav_t *self);
420 
421 /*
422  * Stop playing the current position and start playback of the title
423  * from the specified timecode.
424  *
425  * Currently implemented using interpolation. That interpolation is slightly
426  * inaccurate.
427  */
428 dvdnav_status_t dvdnav_time_search(dvdnav_t* self, uint64_t time);
429 
430 /*
431  * Find the nearest vobu and jump to it
432  *
433  * Alternative to dvdnav_time_search (see full documentation on searching.jump_to_time.readme)
434  * Jumps to the provided PTS (which is defined as time_in_ms * 90). mode means the navigation mode,
435  * currently only the Default (0) is implemented:
436  * 0: Default. Jump to a time which may be either <> time_in_pts_ticks
437  * 1: After. Always jump to a time that is > time_in_pts_ticks
438  * -1: Before. Always jump to a time that is < time_in_pts_ticks
439  */
440 dvdnav_status_t dvdnav_jump_to_sector_by_time(dvdnav_t* self,
441  uint64_t time_in_pts_ticks,
442  int32_t mode);
443 
444 /*
445  * Stop playing current position and play the "GoUp"-program chain.
446  * (which generally leads to the title menu or a higher-level menu).
447  */
448 dvdnav_status_t dvdnav_go_up(dvdnav_t *self);
449 
450 /*
451  * Stop playing the current position and start playback at the
452  * previous program (if it exists).
453  */
454 dvdnav_status_t dvdnav_prev_pg_search(dvdnav_t *self);
455 
456 /*
457  * Stop playing the current position and start playback at the
458  * first program.
459  */
460 dvdnav_status_t dvdnav_top_pg_search(dvdnav_t *self);
461 
462 /*
463  * Stop playing the current position and start playback at the
464  * next program (if it exists).
465  */
466 dvdnav_status_t dvdnav_next_pg_search(dvdnav_t *self);
467 
468 /*
469  * Return the current position (in blocks) within the current
470  * program and the length (in blocks) of current program.
471  *
472  * If program chain based positioning is enabled
473  * (see dvdnav_set_PGC_positioning_flag()), this will return the
474  * relative position in and the length of the current program chain.
475  */
476 dvdnav_status_t dvdnav_get_position(dvdnav_t* self, uint32_t* pos, uint32_t* len);
477 
478 /*********************************************************************
479  * menu highlights *
480  *********************************************************************/
481 
482 /*
483  * Most functions related to highlights take a NAV PCI packet as a parameter.
484  * While you can get such a packet from libdvdnav, this will result in
485  * errors for players with internal FIFOs because due to the FIFO length,
486  * libdvdnav will be ahead in the stream compared to what the user is
487  * seeing on screen. Therefore, player applications who have a NAV
488  * packet available, which is better in sync with the actual playback,
489  * should always pass this one to these functions.
490  */
491 
492 /*
493  * Get the currently highlighted button
494  * number (1..36) or 0 if no button is highlighted.
495  */
496 dvdnav_status_t dvdnav_get_current_highlight(dvdnav_t *self, int32_t *button);
497 
498 /*
499  * Returns the Presentation Control Information (PCI) structure associated
500  * with the current position.
501  *
502  * Read the general notes above.
503  * See also libdvdreads nav_types.h for definition of pci_t.
504  */
505 pci_t* dvdnav_get_current_nav_pci(dvdnav_t *self);
506 
507 /*
508  * Returns the DSI (data search information) structure associated
509  * with the current position.
510  *
511  * Read the general notes above.
512  * See also libdvdreads nav_types.h for definition of dsi_t.
513  */
514 dsi_t* dvdnav_get_current_nav_dsi(dvdnav_t *self);
515 
516 /*
517  * Get the area associated with a certain button.
518  */
519 dvdnav_status_t dvdnav_get_highlight_area(pci_t* nav_pci,
520  int32_t button,
521  int32_t mode,
522  dvdnav_highlight_area_t* highlight);
523 
524 /*
525  * Move button highlight around as suggested by function name (e.g. with arrow keys).
526  */
527 dvdnav_status_t dvdnav_upper_button_select(dvdnav_t *self, pci_t *pci);
528 dvdnav_status_t dvdnav_lower_button_select(dvdnav_t *self, pci_t *pci);
529 dvdnav_status_t dvdnav_right_button_select(dvdnav_t *self, pci_t *pci);
530 dvdnav_status_t dvdnav_left_button_select(dvdnav_t *self, pci_t *pci);
531 
532 /*
533  * Activate ("press") the currently highlighted button.
534  */
535 dvdnav_status_t dvdnav_button_activate(dvdnav_t *self, pci_t *pci);
536 
537 /*
538  * Highlight a specific button.
539  */
540 dvdnav_status_t dvdnav_button_select(dvdnav_t *self, pci_t *pci, int32_t button);
541 
542 /*
543  * Activate ("press") specified button.
544  */
545 dvdnav_status_t dvdnav_button_select_and_activate(dvdnav_t *self, pci_t *pci, int32_t button);
546 
547 /*
548  * Activate ("press") a button and execute specified command.
549  */
550 dvdnav_status_t dvdnav_button_activate_cmd(dvdnav_t *self, int32_t button, vm_cmd_t *cmd);
551 
552 /*
553  * Select button at specified video frame coordinates.
554  */
555 dvdnav_status_t dvdnav_mouse_select(dvdnav_t *self, pci_t *pci, int32_t x, int32_t y);
556 
557 /*
558  * Activate ("press") button at specified video frame coordinates.
559  */
560 dvdnav_status_t dvdnav_mouse_activate(dvdnav_t *self, pci_t *pci, int32_t x, int32_t y);
561 
562 
563 /*********************************************************************
564  * languages *
565  *********************************************************************/
566 
567 /*
568  * The language codes expected by these functions are two character
569  * codes as defined in ISO639.
570  */
571 
572 /*
573  * Set which menu language we should use per default.
574  */
575 dvdnav_status_t dvdnav_menu_language_select(dvdnav_t* self, char* code);
576 
577 /*
578  * Set which audio language we should use per default.
579  */
580 dvdnav_status_t dvdnav_audio_language_select(dvdnav_t* self, char* code);
581 
582 /*
583  * Set which spu language we should use per default.
584  */
585 dvdnav_status_t dvdnav_spu_language_select(dvdnav_t* self, char* code);
586 
587 /*********************************************************************
588  * obtaining stream attributes *
589  *********************************************************************/
590 
591 /*
592  * Return a string describing the title of the DVD.
593  * This is an ID string encoded on the disc by the author. In many cases
594  * this is a descriptive string such as `THE_MATRIX' but sometimes is singularly
595  * uninformative such as `PDVD-011421'. Some DVD authors even forget to set this,
596  * so you may also read the default of the authoring software they used, like
597  * `DVDVolume'.
598  */
599 dvdnav_status_t dvdnav_get_title_string(dvdnav_t *self, const char **title_str);
600 
601 /*
602  * Returns a string containing the serial number of the DVD.
603  * This has a max of 15 characters and should be more unique than the
604  * title string.
605  */
606 dvdnav_status_t dvdnav_get_serial_string(dvdnav_t *self, const char **serial_str);
607 
608 /*
609  * Returns the VolumeIdentifier of the disc or NULL if it could
610  * not be obtained. The VolumeIdentifier might be latin-1 encoded
611  * (8bit unicode) null terminated and max 32 bytes (including '\0');
612  * or coded with '0-9','A-Z','_' null terminated and max 33 bytes
613  * (including '\0').
614  * See also dvdnav_get_title_string
615  *
616  * Note: The string is malloc'd so caller has to free() the returned
617  * string when done with it.
618  */
619 const char* dvdnav_get_volid_string(dvdnav_t* self);
620 
621 /*
622  * Get video aspect code.
623  * The aspect code does only change on VTS boundaries.
624  * See the DVDNAV_VTS_CHANGE event.
625  *
626  * 0 -- 4:3, 2 -- 16:9
627  */
628 uint8_t dvdnav_get_video_aspect(dvdnav_t *self);
629 
630 /*
631  * Get video resolution.
632  */
633 dvdnav_status_t dvdnav_get_video_resolution(dvdnav_t* self, uint32_t* width, uint32_t* height);
634 
635 /*
636  * Get video scaling permissions.
637  * The scaling permission does only change on VTS boundaries.
638  * See the DVDNAV_VTS_CHANGE event.
639  *
640  * bit0 set = deny letterboxing, bit1 set = deny pan&scan
641  */
642 uint8_t dvdnav_get_video_scale_permission(dvdnav_t *self);
643 
644 /*
645  * Converts a *logical* audio stream id into language code
646  * (returns 0xffff if no such stream).
647  */
648 uint16_t dvdnav_audio_stream_to_lang(dvdnav_t *self, uint8_t stream);
649 
650 /*
651  * Returns the format of *logical* audio stream 'stream'
652  * (returns 0xffff if no such stream).
653  */
654 uint16_t dvdnav_audio_stream_format(dvdnav_t *self, uint8_t stream);
655 
656 /*
657  * Returns number of channels in *logical* audio stream 'stream'
658  * (returns 0xffff if no such stream).
659  */
660 uint16_t dvdnav_audio_stream_channels(dvdnav_t *self, uint8_t stream);
661 
662 /*
663  * Converts a *logical* subpicture stream id into country code
664  * (returns 0xffff if no such stream).
665  */
666 uint16_t dvdnav_spu_stream_to_lang(dvdnav_t *self, uint8_t stream);
667 
668 /*
669  * Converts a *physical* (MPEG) audio stream id into a logical stream number.
670  */
671 int8_t dvdnav_get_audio_logical_stream(dvdnav_t *self, uint8_t audio_num);
672 
673 #define HAVE_GET_AUDIO_ATTR
674 /*
675  * Get audio attr
676  */
677 dvdnav_status_t dvdnav_get_audio_attr(dvdnav_t *self, uint8_t audio_mum, audio_attr_t *audio_attr);
678 
679 /*
680  * Converts a *physical* (MPEG) subpicture stream id into a logical stream number.
681  */
682 int8_t dvdnav_get_spu_logical_stream(dvdnav_t *self, uint8_t subp_num);
683 
684 #define HAVE_GET_SPU_ATTR
685 /*
686  * Get spu attr
687  */
688 dvdnav_status_t dvdnav_get_spu_attr(dvdnav_t *self, uint8_t audio_mum, subp_attr_t *subp_attr);
689 
690 /*
691  * Get active audio stream.
692  */
693 int8_t dvdnav_get_active_audio_stream(dvdnav_t *self);
694 
695 /*
696  * Get active spu stream.
697  */
698 int8_t dvdnav_get_active_spu_stream(dvdnav_t *self);
699 
700 /*
701  * Get the set of user operations that are currently prohibited.
702  * There are potentially new restrictions right after
703  * DVDNAV_CHANNEL_HOP and DVDNAV_NAV_PACKET.
704  */
705 user_ops_t dvdnav_get_restrictions(dvdnav_t *self);
706 
707 /*
708  * Returns the number of streams provided its type (e.g. subtitles, audio, etc)
709  */
710 int8_t dvdnav_get_number_of_streams(dvdnav_t* self, dvdnav_stream_type_t stream_type);
711 
712 /*********************************************************************
713  * setting stream attributes *
714  *********************************************************************/
715 
716 /*
717  * Set the visible (enable) status of the current spu stream
718  * (to enable/disable subtitles)
719  * visibility defines if the spu stream should be enabled/visible (1) or disabled (0)
720  */
721 dvdnav_status_t dvdnav_toggle_spu_stream(dvdnav_t* self, uint8_t visibility);
722 
723 /*
724  * Set the given stream id and stream type as active
725  * stream_num - the physical index of the stream
726  * stream_type - the stream type (audio or subtitles)
727  */
728 dvdnav_status_t dvdnav_set_active_stream(dvdnav_t* self,
729  uint8_t stream_num,
730  dvdnav_stream_type_t stream_type);
731 
732 /*********************************************************************
733  * multiple angles *
734  *********************************************************************/
735 
736 /*
737  * The libdvdnav library abstracts away the difference between seamless and
738  * non-seamless angles. From the point of view of the programmer you just set the
739  * angle number and all is well in the world. You will always see only the
740  * selected angle coming from the get_next_block functions.
741  *
742  * Note:
743  * It is quite possible that some tremendously strange DVD feature might change the
744  * angle number from under you. Generally you should always view the results from
745  * dvdnav_get_angle_info() as definitive only up to the next time you call
746  * dvdnav_get_next_block().
747  */
748 
749 /*
750  * Sets the current angle. If you try to follow a non existent angle
751  * the call fails.
752  */
753 dvdnav_status_t dvdnav_angle_change(dvdnav_t *self, int32_t angle);
754 
755 /*
756  * Returns the current angle and number of angles present.
757  */
758 dvdnav_status_t dvdnav_get_angle_info(dvdnav_t* self,
759  int32_t* current_angle,
760  int32_t* number_of_angles);
761 
762 /*********************************************************************
763  * domain queries *
764  *********************************************************************/
765 
766 /*
767  * Are we in the First Play domain?
768  */
769 int8_t dvdnav_is_domain_fp(dvdnav_t *self);
770 
771 /*
772  * Are we in the Video management Menu domain?
773  */
774 int8_t dvdnav_is_domain_vmgm(dvdnav_t *self);
775 
776 /*
777  * Are we in the Video Title Menu domain?
778  */
779 int8_t dvdnav_is_domain_vtsm(dvdnav_t *self);
780 
781 /*
782  * Are we in the Video Title Set domain?
783  */
784 int8_t dvdnav_is_domain_vts(dvdnav_t *self);
785 
786 
787 #ifdef __cplusplus
788 }
789 #endif
Definition: dvdnav.h:80
Definition: dvd_types.h:69
Definition: LibInputPointer.h:13
Definition: inftrees.h:24
Definition: dvd_reader.h:81