-implement angle reporting and switching, needs an updated e2 plugin (coming soon)
[libdreamdvd.git] / ddvdlib.h
1 /* 
2  * DreamDVD V0.9 - DVD-Player for Dreambox
3  * Copyright (C) 2007 by Seddi
4  * 
5  * This DVD Player is based upon the great work from the libdvdnav project,
6  * a52dec library, ffmpeg and the knowledge from all the people who made 
7  * watching DVD within linux possible.
8  * 
9  * DreamDVD is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  * 
14  * DreamDVD is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  * 
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
22  *
23  * part of libdreamdvd
24  */
25
26
27 /*
28  * main struct for ddvd handle
29  */
30 struct ddvd; 
31
32 struct ddvd_resume {
33         int title;
34         int chapter;
35         unsigned long int block;
36         int audio_id;
37         int audio_lock;
38         int spu_id;
39         int spu_lock;
40 };
41
42 enum ddvd_result {
43         DDVD_OK = 0,
44         DDVD_INVAL,
45         DDVD_NOMEM,
46         DDVD_BUSY,
47         DDVD_FAIL_OPEN,
48         DDVD_FAIL_PREFS,
49         DDVD_FAIL_READ,
50         DDVD_RESULT_MAX,
51 };
52
53 /* 
54  * functions for initialization and setting options DONT USE THIS FUNCTIONS AFTER STARTING WITH ddvd_run !!!
55  */
56
57 // create a ddvd handle with default options PAL, 4:3 LB, EN, AC3 decoding internal (if liba52 is available)
58 struct ddvd *ddvd_create(void);
59
60 // get message_pipe fd to make polling possible
61 int ddvd_get_messagepipe_fd(struct ddvd *pconfig);
62
63 // set framebuffer and options libdreamdvd should render buttons and subtitles
64 // until this option ist set, ddvd_run will not start playing
65 // lfb-> needs a pointer to the real framebuffer or to a backbuffer
66 // xres, yres-> screen resolution, normally 720x576 libdreamdvd will scale inside to the given resolution
67 // bypp-> bytes per pixel, only 1 (8bit) or 4 (32bit argb) is supported
68 // stride-> line length in bytes, normally xres*bypp but not always like on the DM7025 framebuffer
69 void ddvd_set_lfb(struct ddvd *pconfig, unsigned char *lfb, int xres, int yres, int bypp, int stride);
70
71 // set path to a dvd block device, a dvd file structure or an dvd iso-file ("/dev/dvd" ...)
72 void ddvd_set_dvd_path(struct ddvd *pconfig, const char *path);
73
74 // set preferred dvd language in 2 letter iso code (en,de, ...)
75 void ddvd_set_language(struct ddvd *pconfig, const char lang[2]);
76
77 // set external/internal AC3 decoding 0-> external 1-> internal
78 // internal decoding needs liba52 which will be loaded dynamically if available
79 // if set to "internal" and liba52 will not be found, the AC3 data will be passed thru 
80 void ddvd_set_ac3thru(struct ddvd *pconfig, int ac3thru);
81
82 // set video options for aspect and the tv system, see enums for possible options
83 void ddvd_set_video(struct ddvd *pconfig, int aspect, int tv_mode, int tv_system);
84
85 // set resume postion for dvd start
86 void ddvd_set_resume_pos(struct ddvd *pconfig, struct ddvd_resume resume_info);
87
88 /* 
89  * functions for starting the dvd player
90  */
91
92 // starting playback, this function should be started inside a thread, because it only comes back after
93 // stopping the dvd player
94 enum ddvd_result ddvd_run(struct ddvd *pconfig);
95
96
97 /* 
98  * functions for controlling the player while running, these functions are THREAD SAFE (or lets say I hope so ;-)
99  */
100
101 // send a remote control key or command to the player, see send_key enum for possible commands
102 void ddvd_send_key(struct ddvd *pconfig, int key);
103
104 // skip n seconds in playing n>0 forward - n<0 backward
105 void ddvd_skip_seconds(struct ddvd *pconfig, int seconds);
106
107 // jump to beginning of given title
108 void ddvd_set_title(struct ddvd *pconfig, int title);
109
110 // jump to beginning of given chapter
111 void ddvd_set_chapter(struct ddvd *pconfig, int chapter);
112
113 // get and process the next message from the main player
114 // use blocked=1 if the function should wait till a message has received, blocked=0 will return
115 // immediatly and give you DDVD_NULL if there was no messag in the pipe
116 // blocked=0 will be usefull if the main programm runs a loop, blocked=1 if you use fd-polling 
117 int ddvd_get_next_message(struct ddvd*pconfig, int blocked);
118
119 // get last colortable for 8bit mode (4 colors)
120 // will give you 4 color structs as array, remember to use the offset (see state enum)
121 // struct ddvd_color colortable[4] 
122 void ddvd_get_last_colortable(struct ddvd*pconfig, void *colortable);
123
124 // get last area to update overlay after DDVD_SCREEN_UPDATE
125 void ddvd_get_last_blit_area(struct ddvd *pconfig, int *x_start, int *x_end, int *y_start, int *y_end);
126
127 // get last received playing time
128 // struct ddvd_time timestamp
129 void ddvd_get_last_time(struct ddvd*pconfig, void *timestamp);
130
131 // get actual angle info after DDVD_SHOWOSD_ANGLE
132 void ddvd_get_angle_info(struct ddvd*pconfig, int *current, int *num);
133
134 // get the actual trickspeed (2-64x) when in trickmode
135 // int trickspeed
136 void ddvd_get_last_trickspeed(struct ddvd*pconfig, void *trickspeed);
137
138 // get last text message from player
139 // char text[512]
140 void ddvd_get_last_string(struct ddvd*pconfig, void *text);
141
142 // get the active audio track
143 // int id -> logical track number
144 // uint16_t lang -> audio language in 2 letter iso code
145 // int type -> audio type, see audio type enum (ac3,mpeg,...)
146 void ddvd_get_last_audio(struct ddvd*pconfig, void *id, void *lang, void *type);
147
148 // get the active subtitle track
149 // int id -> logical track number
150 // uint16_t lang -> subtitle language in 2 letter iso code
151 // id=-1 means no subtitle track active
152 void ddvd_get_last_spu(struct ddvd*pconfig, void *id, void *lang);
153
154 // get dvd title string
155 void ddvd_get_title_string(struct ddvd*pconfig, char *title_string);
156
157 // get last received position for resume
158 void ddvd_get_resume_pos(struct ddvd *pconfig, struct ddvd_resume *resume_info);
159
160 /* 
161  * functions for clean up AFTER the player had stopped
162  */
163
164 // destroy ddvd handle, do NOT call this while the player is still running
165 // to stop the player you can send the DDVD_KEY_EXIT command via ddvd_send_key
166 void ddvd_close(struct ddvd *pconfig);
167
168
169 /* 
170  * messages recieved from ddvd_get_next_message
171  */
172
173 enum { // state
174         DDVD_NULL,                                      // nothing to do
175         DDVD_COLORTABLE_UPDATE,         // if we are in 8bit graphics mode we have to renew the color table, the color table can be grabbed with
176                                                                 // ddvd_get_last_colortable function, we need an offset of 252d, means the first struct in the array should be set to 252d in 
177                                                                 // the real colortable, the second struct to 253d and so on, this message will never been send in 32bit mode 
178                                                                 // ATTENTION to clear screen, libdreamdvd uses color 0, so be sure to set color 0 in the host-application to full transparency
179         DDVD_SCREEN_UPDATE,                     // libdreamdvd rendered something to the given framebuffer, so if we are working with a backbuffer in the host app,
180                                                                 // we have to update our screen. can be ignored if libdreamdvd renders directly to the real framebuffer
181                                                                 // the rect that have to be updated can be fetched with ddvd_get_last_blit_area
182         DDVD_SHOWOSD_STATE_PLAY,        // we should display a state icon or text (play, pause, ...) on osd 
183         DDVD_SHOWOSD_STATE_PAUSE,
184         DDVD_SHOWOSD_TIME,                      // we should display the playing time on osd you can get the time with ddvd_get_last_time
185         DDVD_SHOWOSD_STATE_FFWD,        // we should display FFWD/FBWD trickmode on osd you can grab the actual time with ddvd_get_last_time
186         DDVD_SHOWOSD_STATE_FBWD,        // and the trickspeed with ddvd_get_last_trickspeed
187         DDVD_SHOWOSD_STRING,            // we should display a text on osd (errors, ...) the text can be read with ddvd_get_last_string
188         DDVD_SHOWOSD_AUDIO,                     // new audio track selected you can get the audio id, language, type with ddvd_get_last_audio
189         DDVD_SHOWOSD_SUBTITLE,          // new subtitle track selected you can get the spu id, language with ddvd_get_last_spu
190         DDVD_SHOWOSD_TITLESTRING,       
191         DDVD_EOF_REACHED,
192         DDVD_SOF_REACHED,
193         DDVD_MENU_OPENED,
194         DDVD_MENU_CLOSED,
195         DDVD_SHOWOSD_ANGLE,                     // show angle info, you can get it with ddvd_get_angle_info     
196 };
197
198
199 /* 
200  * key/commands to send with ddvd_send_key
201  */
202
203 enum { // send_key
204         DDVD_KEY_NULL,                          // will be ignored
205         DDVD_KEY_EXIT,                          // stop end exit the player as fast as possible
206         
207                                                                 /* menus*/
208         DDVD_KEY_LEFT,                          // cursor control
209         DDVD_KEY_RIGHT,
210         DDVD_KEY_UP,
211         DDVD_KEY_DOWN,
212         DDVD_KEY_OK,                            // activate button
213
214                                                                 /* inside movie */
215         DDVD_KEY_PLAY,                          // resume playing if we are "paused" or used any ffwd/fbwd before
216         DDVD_KEY_PAUSE,                         // pause playing (still picture)
217         DDVD_KEY_NEXT_CHAPTER,                  // jump to next chapter
218         DDVD_KEY_PREV_CHAPTER,                  // jump to previous chapter
219         DDVD_KEY_NEXT_TITLE,                    // jump to next title
220         DDVD_KEY_PREV_TITLE,                    // jump to previous title
221         DDVD_KEY_FFWD,                          // start or speed up fast forward mode 
222         DDVD_KEY_FBWD,                          // start or speed up fast backward mode 
223         DDVD_KEY_MENU,                          // jump into the dvd menu 
224         DDVD_KEY_AUDIOMENU,                     // jump into the dvd audio menu
225         DDVD_KEY_AUDIO,                         // change audio track on the fly 
226         DDVD_KEY_SUBTITLE,                      // change subtitle track on the fly 
227         DDVD_GET_TIME,                          // get actual playing time (see struct ddvd_time) 
228         DDVD_SKIP_FWD,                          // jump forward in playing SHOULD NOT BE USED DIRECTLY, USE ddvd_skip_seconds FOR SKIPPING
229         DDVD_SKIP_BWD,                          // jump backward in playing SHOULD NOT BE USED DIRECTLY, USE ddvd_skip_seconds FOR SKIPPING 
230         DDVD_SET_TITLE,                         // jump to given title
231         DDVD_SET_CHAPTER,                       // jump to given chapter
232         DDVD_SEEK_ABS,                          // seek to given absolute seconds (from beginning of current title)
233         DDVD_SET_MUTE,                          // just telling dreamdvd that the sound has been muted, libdreamdvd does not mute for you, but has to know
234                                                                 // the mute state for sound handling on ffwd/fbwd trick mode
235         DDVD_UNSET_MUTE,                        // sound is not muted any more (see DDVD_SET_MUTE)
236         DDVD_KEY_ANGLE,                         // change angle on the fly      
237         DDVD_GET_ANGLE,                         // get actual angle info        
238 };
239
240 // if you use the same keys for different functions in different contexts (menu/movie) just send both commands, the player will 
241 // choose the right one and ignore the other. For example you want to use the right cursor key for "right" in menu and "next chapter" in movie,
242 // so you have to send both when you received the key event for your "right cursor key": DDVD_KEY_RIGHT and DDVD_KEY_NEXT_CHAPTER
243
244
245 /* 
246  * config and state enums
247  */
248
249 enum { // audio types
250         DDVD_AC3,
251         DDVD_MPEG,
252         DDVD_DTS,
253         DDVD_LPCM,
254 };
255
256 enum { // tv system
257         DDVD_PAL,
258         DDVD_NTSC,
259 };
260
261 enum { // aspect
262         DDVD_4_3,
263         DDVD_16_9,
264         DDVD_16_10,
265 };
266
267 enum { // tv mode
268         DDVD_LETTERBOX,
269         DDVD_PAN_SCAN,
270         DDVD_JUSTSCALE,
271 };
272
273
274 /* 
275  * structs for color palette and osd time and resume info
276  */
277
278 struct ddvd_color { 
279         unsigned short red;     
280         unsigned short green;
281         unsigned short blue;
282         unsigned short trans;
283 };
284
285 struct ddvd_time {
286         int pos_hours;                          // pos_hours:pos_minutes:pos_seconds -> time already played
287         int pos_minutes;                        // end_hours:end_minutes:end_seconds -> total time of the playing programm
288         int pos_seconds;                        // pos_chapter -> chapter no. we are just playing
289         int pos_chapter;                        // end_chapter -> total chapters of the playing programm
290         int pos_title;
291         int end_hours;
292         int end_minutes;
293         int end_seconds;
294         int end_chapter;
295         int end_title;
296 };