main: compile-fix for linux 4.18+
[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 #define __MAIN_H__
28
29 #include "libdreamdvd_config.h"
30
31 // set to 1 if a start screen should be displayed
32 #define SHOW_START_SCREEN 1
33
34 #define CONVERT_TO_DVB_COMPLIANT_AC3
35 #define CONVERT_TO_DVB_COMPLIANT_DTS
36
37 #define NUM_SPU_BACKBUFFER 8
38
39 #include <fcntl.h>
40 #include <stdio.h>
41 #include <stdlib.h>
42 #include <string.h>
43 #include <unistd.h>
44 #include <signal.h>
45 #include <inttypes.h>
46 #include <sys/types.h>
47 #include <sys/stat.h>
48 #include <sys/ioctl.h>
49 #include <sys/mman.h>
50 #include <sys/time.h>
51 #include <netinet/in.h>
52 #include <byteswap.h>
53 #include <errno.h>
54 #include <poll.h>
55
56 #include <dvdnav/dvdnav.h>
57 #include "ddvdlib.h"
58
59 #if SHOW_START_SCREEN == 1
60 #include "logo.h" // startup screen 
61 #endif
62
63 #ifndef BYTE_ORDER
64 #error "no BYTE_ORDER defined!!!!"
65 #endif
66
67 #if defined(HAVE_LINUX_DVB_VERSION_H)
68 #include <linux/dvb/video.h>
69 #include <linux/dvb/audio.h>
70 #define CONFIG_API_VERSION 3
71 #elif defined(HAVE_OST_DMX_H)
72 #include <ost/video.h>
73 #include <ost/audio.h>
74 #define CONFIG_API_VERSION 1
75 #endif
76
77 #define BUFFER_SIZE 4096
78 #define AC3_BUFFER_SIZE (6*1024*16)
79
80 #if CONFIG_API_VERSION == 1
81 #define VIDEO_GET_PTS           _IOR('o', 1, unsigned int*)
82 #endif
83 #if CONFIG_API_VERSION == 3
84 #ifndef VIDEO_GET_PTS
85 #define VIDEO_GET_PTS              _IOR('o', 57, unsigned long long)
86 #endif
87 #endif
88
89 #define CLAMP(x)     ((x < 0) ? 0 : ((x > 255) ? 255 : x))
90 #define CELL_STILL       0x02
91 #define NAV_STILL        0x04
92 #define TRUE 1
93 #define FALSE 0
94 #define SAAIOSWSS      10 /* set wide screen signaling data */
95 #define SAAIOSENC       4 /* set encoder (pal/ntsc) */
96 #define SAA_WSS_43F     0
97 #define SAA_WSS_169F    7
98 #define SAA_WSS_OFF     8
99 #define SAA_NTSC        0
100 #define SAA_PAL         1
101
102 #define MAX_AUDIO       8
103 #define MAX_SPU         32
104
105 #define NO_AV_FLUSH             0
106 #define AV_FLUSH                1
107 #define AV_FLUSH_SKIP_WAIT      2
108
109 typedef struct ddvd_spudec_clut_struct {
110 #if BYTE_ORDER == BIG_ENDIAN
111         uint8_t entry0  : 4;
112         uint8_t entry1  : 4;
113         uint8_t entry2  : 4;
114         uint8_t entry3  : 4;
115 #else
116         uint8_t entry1  : 4;
117         uint8_t entry0  : 4;
118         uint8_t entry3  : 4;
119         uint8_t entry2  : 4;
120 #endif
121 } ddvd_spudec_clut_t;
122
123 enum {SPU_NOP, SPU_SHOW, SPU_HIDE, SPU_FORCE};
124 struct ddvd_spu_return {
125         int display_time;
126         int x_start;
127         int x_end;
128         int y_start;
129         int y_end;
130         int force_hide;
131 };
132
133 struct ddvd_resize_return {
134         int x_start;
135         int x_end;
136         int y_start;
137         int y_end;      
138         
139         int x_offset, y_offset, width, height;
140 };
141
142 // some global stuff 
143
144 dvdnav_t *dvdnav;
145 dvdnav_cell_change_event_t ddvd_lastCellEventInfo;
146
147 int ddvd_wait_for_user;
148 int ddvd_clear_buttons;
149 int ddvd_lpcm_count;
150 int ddvd_iframerun;
151 int ddvd_still_frame;
152 int ddvd_iframesend;
153 int ddvd_last_iframe_len;
154 int ddvd_spu_ptr,ddvd_display_time;
155 int ddvd_spu_backptr,ddvd_spu_backnr;
156 int ddvd_lbb_changed;
157
158 enum {TOFF, SLOWFW, FASTFW, SLOWBW, FASTBW};
159 int ddvd_trickmode,ddvd_trickspeed;
160
161 enum {STOP, PLAY, PAUSE};
162 int ddvd_playmode;
163
164 int ddvd_wait_timer_active;
165 uint64_t ddvd_wait_timer_end;
166
167 int ddvd_spu_timer_active;
168 uint64_t ddvd_spu_timer_end;
169
170 int ddvd_trick_timer_active;
171 uint64_t ddvd_trick_timer_end;
172
173 unsigned char *ddvd_lbb, *ddvd_lbb2;
174 int ddvd_output_fd, ddvd_fdvideo, ddvd_fdaudio, ddvd_ac3_fd;
175
176 int ddvd_screeninfo_xres, ddvd_screeninfo_yres, ddvd_screeninfo_stride;
177
178 unsigned short ddvd_rd[256],ddvd_gn[256],ddvd_bl[256],ddvd_tr[256];
179
180 struct ddvd_size_evt {
181         int width;
182         int height;
183         int aspect;
184 };
185
186 struct ddvd_framerate_evt {
187         int framerate;
188 };
189
190 struct ddvd_progressive_evt {
191         int progressive;
192 };
193
194 /* struct to maintain subtitle stream info */
195 struct spu_map_t {
196         int8_t logical_id   :  8;
197         int8_t stream_id    :  8;
198         int8_t filter       :  8;
199         int8_t trackflags   :  8;
200         int16_t lang        : 16;
201 };
202
203 /* struct to maintain audio stream info */
204 struct audio_map_t {
205         int8_t logical_id   :  8;
206         int8_t stream_id    :  8;
207         int8_t format       :  8;
208         int8_t verified     :  8;
209         int16_t lang        : 16;
210 };
211
212
213 /* struct for ddvd nav handle*/
214 struct ddvd {
215         /* config options */
216         char language[2];                               // iso code (de, en, ...)
217         int aspect;                                             // 0-> 4:3 1-> 16:9 2-> 16:10
218         int tv_mode;                                    // 0-> letterbox 1-> pan_scan 2-> justscale
219         int tv_mode2;                                   // 0-> letterbox 1-> pan_scan 2-> justscale
220         int tv_system;                                  // 0-> PAL 1-> NTSC
221         int ac3thru;                                    // 0-> internal soft decoding 1-> ac3 pass thru to optical out
222         unsigned char *lfb;                             // framebuffer to render subtitles and menus
223         int xres;                                               // x resolution of the framebuffer (normally 720, we dont scale inside libdreamdvd)
224         int yres;                                               // y resolution of the framebuffer (normally 576, we dont scale inside libdreamdvd)
225         int stride;                                             // line_length of the framebuffer (normally 720*bypp, but not always like on DM7025)
226         int bypp;                                               // the bytes per pixel only 1 (8bit framebuffer) or 4 (32bit) are supported
227         int canscale;
228         int key_pipe[2];                                // pipe for sending a command/remote control key (sizeof(int)) to the player
229         int message_pipe[2];                    // pipe for getting player status, osd time and text as well as 8bit color tables
230         char *dvd_path;                         // the path of a dvd block device ("/dev/dvd"), an iso-file ("/hdd/dvd.iso")
231                                                                         // or a dvd file structure ("/hdd/dvd/mymovie") to play 
232         /* buffer for actual states */
233         char title_string[96];
234         struct ddvd_color last_col[4];  // colortable (8Bit mode), 4 colors
235         struct ddvd_time last_time;             // last playing time for osd
236         int last_trickspeed;                    // last trickspeed for osd
237         char last_string[512];                  // last text message for frontend/osd
238         int last_audio_id;                              // active audio id
239         int last_audio_type;                    // active audio type
240         uint16_t last_audio_lang;               // active audio language
241         int last_spu_id;                                // active subtitle id
242         uint16_t last_spu_lang;                 // active subtitle language
243         struct ddvd_size_evt last_size;
244         struct ddvd_framerate_evt last_framerate;
245         struct ddvd_progressive_evt last_progressive;
246         uint64_t next_time_update;
247         
248         int in_menu;
249         int resume_title;                               // title, chapter, block for resuming dvd or
250         int resume_chapter;                             // getting actual resume position
251         uint32_t resume_block;
252         int resume_audio_id;
253         int resume_audio_lock;
254         int resume_spu_id;
255         int resume_spu_lock;
256         int should_resume;
257         struct ddvd_resize_return blit_area;
258         int angle_current;
259         int angle_num;
260
261         struct audio_map_t audio_map[MAX_AUDIO];
262         struct spu_map_t spu_map[MAX_SPU];
263 };
264
265 /* internal functions */
266 static struct           ddvd_time ddvd_get_osd_time(struct ddvd *playerconfig);
267 static int              ddvd_readpipe(int pipefd, void *dest, size_t bytes, int blocked_read);
268 static int              ddvd_check_aspect(int dvd_aspect, int dvd_scale_perm, int tv_aspect, int tv_mode);
269 static uint64_t         ddvd_get_time(void);
270 static void             ddvd_play_empty(int device_clear);
271 static void             ddvd_device_clear(void);
272 static struct           ddvd_spu_return ddvd_spu_decode_data(const uint8_t * buffer, int len);
273 static void             ddvd_blit_to_argb(void *_dst, const void *_src, int pix);
274 #if CONFIG_API_VERSION == 3
275 static void             ddvd_set_pcr_offset(void);
276 static void             ddvd_unset_pcr_offset(void);
277 #endif
278 struct                          ddvd_resize_return ddvd_resize_pixmap_xbpp(unsigned char *pixmap, int xsource, int ysource, int xdest, int ydest, int xoffset, int yoffset, int xstart, int xend, int ystart, int yend, int colors);
279 struct                          ddvd_resize_return ddvd_resize_pixmap_xbpp_smooth(unsigned char *pixmap, int xsource, int ysource, int xdest, int ydest, int xoffset, int yoffset, int xstart, int xend, int ystart, int yend, int colors);
280 struct                          ddvd_resize_return ddvd_resize_pixmap_1bpp(unsigned char *pixmap, int xsource, int ysource, int xdest, int ydest, int xoffset, int yoffset, int xstart, int xend, int ystart, int yend, int colors);
281 struct                          ddvd_resize_return (*ddvd_resize_pixmap)(unsigned char *pixmap, int xsource, int ysource, int xdest, int ydest, int xoffset, int yoffset, int xstart, int xend, int ystart, int yend, int colors);
282 struct                          ddvd_resize_return (*ddvd_resize_pixmap_spu)(unsigned char *pixmap, int xsource, int ysource, int xdest, int ydest, int xoffset, int yoffset, int xstart, int xend, int ystart, int yend, int colors);
283
284 #endif