initial checkin of libdreamdvd files
[libdreamdvd.git] / main.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 #ifndef __MAIN_H__
27
28 #define __MAIN_H__
29
30 // set to 1 if a start screen should be displayed
31 #define SHOW_START_SCREEN 1
32
33 #include <fcntl.h>
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include <string.h>
37 #include <unistd.h>
38 #include <signal.h>
39 #include <inttypes.h>
40 #include <sys/types.h>
41 #include <sys/stat.h>
42 #include <sys/ioctl.h>
43 #include <sys/mman.h>
44 #include <sys/time.h>
45 #include <netinet/in.h>
46 #include <byteswap.h>
47 #include <errno.h>
48
49 #include <dvdnav/dvdnav.h>
50 #include "ddvdlib.h"
51
52 #if SHOW_START_SCREEN == 1
53 #include "logo.h" // startup screen 
54 #endif
55
56 #ifndef BYTE_ORDER
57 #error "no BYTE_ORDER defined!!!!"
58 #endif
59
60 #if BYTE_ORDER == BIG_ENDIAN
61 #warning "assume api v1 when byte order is big endian !!"
62 #define CONFIG_API_VERSION 1
63 #else
64 #warning "assume api v3 when byte order is little endian !!"
65 #define CONFIG_API_VERSION 3
66 #endif
67
68 #if CONFIG_API_VERSION == 1
69 #include <ost/video.h>
70 #include <ost/audio.h>
71 #elif CONFIG_API_VERSION == 3
72 #include <linux/dvb/video.h>
73 #include <linux/dvb/audio.h>
74 #endif
75
76 #define BUFFER_SIZE 4096
77 #define AC3_BUFFER_SIZE (6*1024*16)
78
79 #if CONFIG_API_VERSION == 1
80 #define VIDEO_GET_PTS           _IOR('o', 1, unsigned int*)
81 #endif
82 #if CONFIG_API_VERSION == 3
83 #define VIDEO_GET_PTS              _IOR('o', 57, unsigned long long)
84 #endif
85
86 #define CLAMP(x)     ((x < 0) ? 0 : ((x > 255) ? 255 : x))
87 #define CELL_STILL       0x02
88 #define NAV_STILL        0x04
89 #define TRUE 1
90 #define FALSE 0
91 #define SAAIOSWSS      10 /* set wide screen signaling data */
92 #define SAAIOSENC       4 /* set encoder (pal/ntsc) */
93 #define SAA_WSS_43F     0
94 #define SAA_WSS_169F    7
95 #define SAA_WSS_OFF     8
96 #define SAA_NTSC        0
97 #define SAA_PAL         1
98
99 typedef struct ddvd_spudec_clut_struct {
100 #if BYTE_ORDER == BIG_ENDIAN
101         uint8_t entry0  : 4;
102         uint8_t entry1  : 4;
103         uint8_t entry2  : 4;
104         uint8_t entry3  : 4;
105 #else
106         uint8_t entry1  : 4;
107         uint8_t entry0  : 4;
108         uint8_t entry3  : 4;
109         uint8_t entry2  : 4;
110 #endif
111 } ddvd_spudec_clut_t;
112
113 // some global stuff 
114
115 dvdnav_t *dvdnav;
116 dvdnav_cell_change_event_t ddvd_lastCellEventInfo;
117
118 int ddvd_wait_for_user;
119 int ddvd_clear_buttons;
120 int ddvd_lpcm_count;
121 int ddvd_iframerun;
122 int ddvd_still_frame;
123 int ddvd_iframesend;
124 int ddvd_last_iframe_len;
125 int ddvd_spu_ptr,ddvd_display_time;
126 int ddvd_spu_backptr,ddvd_spu_backnr;
127 int ddvd_lbb_changed;
128
129 enum {TOFF, SLOWFW, FASTFW, SLOWBW, FASTBW};
130 int ddvd_trickmode,ddvd_trickspeed;
131
132 enum {STOP, PLAY, PAUSE};
133 int ddvd_playmode;
134
135 int ddvd_wait_timer_active;
136 uint64_t ddvd_wait_timer_end;
137
138 int ddvd_spu_timer_active;
139 uint64_t ddvd_spu_timer_end;
140
141 int ddvd_trick_timer_active;
142 uint64_t ddvd_trick_timer_end;
143
144 unsigned char *ddvd_lbb;
145 int ddvd_output_fd, ddvd_fdvideo, ddvd_fdaudio, ddvd_ac3_fd;
146
147 int ddvd_screeninfo_xres, ddvd_screeninfo_yres, ddvd_screeninfo_stride;
148
149 unsigned short ddvd_rd[256],ddvd_gn[256],ddvd_bl[256],ddvd_tr[256];
150
151 /* struct for ddvd nav handle*/
152 struct ddvd {
153         /* config options */
154         char language[2];                               // iso code (de, en, ...)
155         int aspect;                                             // 0-> 4:3 lb 1-> 4:3 ps 2-> 16:9 3-> always 16:9
156         int tv_system;                                  // 0-> PAL 1-> NTSC
157         int ac3thru;                                    // 0-> internal soft decoding 1-> ac3 pass thru to optical out
158         unsigned char *lfb;                             // framebuffer to render subtitles and menus
159         int lfb_set;                                    // flag if framebuffer has been set
160         int xres;                                               // x resolution of the framebuffer (normally 720, we dont scale inside libdreamdvd)
161         int yres;                                               // y resolution of the framebuffer (normally 576, we dont scale inside libdreamdvd)
162         int stride;                                             // line_length of the framebuffer (normally 720*bypp, but not always like on DM7025)
163         int bypp;                                               // the bytes per pixel only 1 (8bit framebuffer) or 4 (32bit) are supported
164         int key_pipe[2];                                // pipe for sending a command/remote control key (sizeof(int)) to the player
165         int message_pipe[2];                    // pipe for getting player status, osd time and text as well as 8bit color tables
166         char dvd_path[256];                             // the path of a dvd block device ("/dev/dvd"), an iso-file ("/hdd/dvd.iso")
167                                                                         // or a dvd file structure ("/hdd/dvd/mymovie") to play 
168         /* buffer for actual states */
169         char title_string[96];
170         struct ddvd_color last_col[4];  // colortable (8Bit mode), 4 colors
171         struct ddvd_time last_time;             // last playing time for osd
172         int last_trickspeed;                    // last trickspeed for osd
173         char last_string[512];                  // last text message for frontend/osd
174         int last_audio_id;                              // active audio id
175         int last_audio_type;                    // active audio type
176         uint16_t last_audio_lang;               // active audio language
177         int last_spu_id;                                // active subtitle id
178         uint16_t last_spu_lang;                 // active subtitle language
179         uint64_t next_time_update;
180         int in_menu;
181 };
182
183 /* internal functions */
184 struct          ddvd_time ddvd_get_osd_time();
185 int             ddvd_readpipe(int pipefd, void *dest, int bytes, int blocked_read);
186 int             ddvd_check_aspect(int dvd_aspect, int dvd_scale_perm, int tv_aspect);
187 uint64_t        ddvd_get_time(void);
188 void            ddvd_play_empty (int device_clear);
189 void            ddvd_device_clear (void);
190 int             ddvd_spu_decode_data( uint8_t * buffer, int len );
191 void            ddvd_blit_to_argb(void *_dst, void *_src, int pix);
192 #if CONFIG_API_VERSION == 3
193 void            ddvd_set_pcr_offset();
194 void            ddvd_unset_pcr_offset();
195 #endif
196
197 #endif