1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
|
/*
$Id: vcdplayer.h,v 1.12 2006/06/10 17:38:47 dgp85 Exp $
Copyright (C) 2002, 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ifndef _VCDPLAYER_H_
#define _VCDPLAYER_H_
#ifdef HAVE_VCDNAV
#include <libvcd/info.h>
#include <libvcd/version.h>
#else
#include "libvcd/info.h"
#endif
#ifndef _
#ifdef ENABLE_NLS
#include <locale.h>
# include <libintl.h>
# define _(String) dgettext (XINE_TEXTDOMAIN, String)
#else
/* Stubs that do something close enough. */
# define _(String) (String)
#endif
#endif
/*------------------------------------------------------------------
DEBUGGING
---------------------------------------------------------------------*/
/* Print *any* debug messages? */
#define INPUT_DEBUG 1
/* Debugging masks */
#define INPUT_DBG_META 1 /* Meta information */
#define INPUT_DBG_EVENT 2 /* input (keyboard/mouse) events */
#define INPUT_DBG_MRL 4 /* MRL parsing */
#define INPUT_DBG_EXT 8 /* Calls from external routines */
#define INPUT_DBG_CALL 16 /* routine calls */
#define INPUT_DBG_LSN 32 /* LSN changes */
#define INPUT_DBG_PBC 64 /* Playback control */
#define INPUT_DBG_CDIO 128 /* Debugging from CDIO */
#define INPUT_DBG_SEEK_SET 256 /* Seeks to set location */
#define INPUT_DBG_SEEK_CUR 512 /* Seeks to find current location */
#define INPUT_DBG_STILL 1024 /* Still-frame */
#define INPUT_DBG_VCDINFO 2048 /* Debugging from VCDINFO */
/* Current debugging setting use above masks to interpret meaning of value. */
extern unsigned long int vcdplayer_debug;
#if INPUT_DEBUG
#define dbg_print(mask, s, args...) \
if (vcdplayer_debug & mask) \
fprintf(stderr, "%s: "s, __func__ , ##args)
#else
#define dbg_print(mask, s, args...)
#endif
/*------------------------------------------------------------------
General definitions and structures.
---------------------------------------------------------------------*/
#define VCDPLAYER_IN_STILL 65535
/* Some configuration enumerations. */
typedef enum {
VCDPLAYER_SLIDER_LENGTH_AUTO,
VCDPLAYER_SLIDER_LENGTH_TRACK,
VCDPLAYER_SLIDER_LENGTH_ENTRY,
} vcdplayer_slider_length_t;
typedef enum {
VCDPLAYER_AUTOPLAY_TRACK = VCDINFO_ITEM_TYPE_TRACK,
VCDPLAYER_AUTOPLAY_ENTRY = VCDINFO_ITEM_TYPE_ENTRY,
VCDPLAYER_AUTOPLAY_SEGMENT = VCDINFO_ITEM_TYPE_SEGMENT,
VCDPLAYER_AUTOPLAY_PBC = VCDINFO_ITEM_TYPE_LID,
} vcdplayer_autoplay_t;
typedef struct {
lsn_t start_LSN; /* LSN where play item starts */
size_t size; /* size in sector units of play item. */
} vcdplayer_play_item_info_t;
typedef int (*generic_fn)();
/* The maximim wait time that can be encoded in a VCD still frame is
2,000 seconds (33.33 minutes). We'll use a number larger than this
to signal indefinite wait.
*/
#define STILL_INDEFINITE_WAIT 3000
/* Value when we have yet to finish reading blocks of a frame. */
#define STILL_READING -5
typedef struct vcdplayer_s {
void *user_data; /* environment. Passed to called routines. */
vcdinfo_obj_t *vcd; /* Pointer to libvcd structures. */
/*------------------------------------------------------------------
User-settable options
--------------------------------------------------------------*/
unsigned int i_debug; /* Debugging mask */
unsigned int i_blocks_per_read; /* number of blocks per read */
/*------------------------------------------------------------------
Callback functions - players and higher-level routines can use
this to customize their behavior when using this player-independent
code.
---------------------------------------------------------------------*/
generic_fn log_msg; /* function to log a message in the player */
generic_fn log_err; /* function to log an error in the player */
/* Function to flush any audio or video buffers */
void (*flush_buffers) (void);
/* Function to force a redisplay. */
void (*force_redisplay) (void);
/* Function to set aspect ratio. */
void (*set_aspect_ratio) (int);
/* Function to update title of selection. */
void (*update_title) ();
/*-------------------------------------------------------------
Playback control fields
--------------------------------------------------------------*/
int i_still; /* 0 if not in still,
STILL_INDEFINITE_WAIT if indefinite time,
STILL_READING if don't have full picture,
else number of seconds yet to wait */
int i_lid; /* LID that play item is in. Implies PBC is.
on. VCDPLAYER_BAD_ENTRY if not none or
not in PBC */
PsdListDescriptor pxd; /* If PBC is on, the relevant PSD/PLD */
int pdi; /* current pld index of pxd. -1 if
no index*/
vcdinfo_itemid_t play_item; /* play-item, VCDPLAYER_BAD_ENTRY if none */
vcdinfo_itemid_t loop_item; /* Where do we loop back to? Meaningful only
in a selection list */
int i_loop; /* # of times play-item has been played.
Meaningful only in a selection list.
*/
track_t i_track; /* current track number */
/*-----------------------------------
Navigation and location fields
------------------------------------*/
uint16_t next_entry; /* where to go if next is pressed,
VCDPLAYER_BAD_ENTRY if none */
uint16_t prev_entry; /* where to fo if prev is pressed,
VCDPLAYER_BAD_ENTRY if none */
uint16_t return_entry; /* Entry index to use if return is pressed */
uint16_t default_entry; /* Default selection entry. */
lsn_t i_lsn; /* LSN of where we are right now */
lsn_t end_lsn; /* LSN of end of current entry/segment/track.
entry/segment/track. This block can be read
(and is not one after the "end"). */
lsn_t origin_lsn; /* LSN of start of seek/slider position. */
lsn_t track_lsn; /* LSN of start track origin of track we are in. */
lsn_t track_end_lsn; /* LSN of end of current track (if entry). */
uint16_t max_x; /* Largest screen x coordinate */
uint16_t max_y; /* Largest screen y coordinate */
/*--------------------------------------------------------------
(S)VCD Medium information
---------------------------------------------------------------*/
char *psz_source; /* VCD device currently open */
bool b_opened; /* true if initialized */
vcd_type_t vcd_format; /* VCD 2.0, 1,1, SVCD, HQVCD? */
track_t i_tracks; /* # of playable MPEG tracks. This is
generally one less than the number
of CD tracks as the first CD track
is an ISO-9660 track and is not
playable. */
segnum_t i_segments; /* Number of segments in medium */
unsigned int i_entries; /* Number of entries in medium */
lid_t i_lids; /* Number of LIDs in medium */
/* Tracks, segment, and entry information. The number of entries for
each is given by the corresponding i_* field above. */
vcdplayer_play_item_info_t *track;
vcdplayer_play_item_info_t *segment;
vcdplayer_play_item_info_t *entry;
/*--------------------------------------------------------------
Configuration variables
---------------------------------------------------------------*/
/* What type to use on autoplay */
vcdplayer_autoplay_t default_autoplay;
/* When hitting end of entry or track do we advance automatically
to next entry/track or stop? Only valid if PBC is off. */
bool autoadvance;
/* Do next/prev wrap around? Only valid if PBC is off. */
bool wrap_next_prev;
/* Show and be able to select rejected LIDs? */
bool show_rejected;
/* Whether GUI slider is track size or entry size. */
vcdplayer_slider_length_t slider_length;
} vcdplayer_t;
/* vcdplayer_read return status */
typedef enum {
READ_BLOCK,
READ_STILL_FRAME,
READ_ERROR,
READ_END,
} vcdplayer_read_status_t;
/* ----------------------------------------------------------------------
Function Prototypes
-----------------------------------------------------------------------*/
/*!
Return true if playback control (PBC) is on
*/
bool vcdplayer_pbc_is_on(const vcdplayer_t *p_vcdplayer);
/*!
Take a format string and expand escape sequences, that is sequences that
begin with %, with information from the current VCD.
The expanded string is returned. Here is a list of escape sequences:
%A : The album information
%C : The VCD volume count - the number of CD's in the collection.
%c : The VCD volume num - the number of the CD in the collection.
%F : The VCD Format, e.g. VCD 1.0, VCD 1.1, VCD 2.0, or SVCD
%I : The current entry/segment/playback type, e.g. ENTRY, TRACK, SEGMENT...
%L : The playlist ID prefixed with " LID" if it exists
%N : The current number of the above - a decimal number
%P : The publisher ID
%p : The preparer ID
%V : The volume set ID
%v : The volume ID
A number between 1 and the volume count.
%% : a %
*/
char *
vcdplayer_format_str(vcdplayer_t *p_vcdplayer, const char format_str[]);
/*!
Update next/prev/return/default navigation buttons.
*/
void
vcdplayer_update_nav(vcdplayer_t *p_vcdplayer);
/*! Update the player title text. */
void
vcdplayer_update_title_display(vcdplayer_t *p_vcdplayer);
/*! Play title part. If part is -1, use the first title. */
void
vcdplayer_play(vcdplayer_t *p_vcdplayer, vcdinfo_itemid_t itemid);
bool
vcdplayer_open(vcdplayer_t *p_vcdplayer, char *intended_vcd_device);
/*!
Read nlen bytes into buf and return the status back.
*/
vcdplayer_read_status_t
vcdplayer_read (vcdplayer_t *p_vcdplayer, uint8_t *p_buf, const off_t nlen);
/*!
seek position, return new position
if seeking failed, -1 is returned
*/
off_t
vcdplayer_seek (vcdplayer_t *p_vcdplayer, off_t offset, int origin);
/*!
Get the number of tracks or titles of the VCD. The result is stored
in "titles".
*/
void
vcdplayer_send_button_update(vcdplayer_t *p_vcdplayer, int mode);
#endif /* _VCDPLAYER_H_ */
/*
* Local variables:
* c-file-style: "gnu"
* tab-width: 8
* indent-tabs-mode: nil
* End:
*/
|