Mercurial > mplayer.hg
annotate libvo/vo_fbdev.c @ 35664:9162585304d0
Save the correct video window position.
Additionally, remove the pointless assignment of the video window
position in video.c, because that's already performed during the
ConfigureNotify event. (As a result of this pointless assignment, the
new video window position had only be saved if dragged with the left
mouse button inside the window, not if dragged by the title bar.)
author | ib |
---|---|
date | Wed, 16 Jan 2013 19:43:56 +0000 |
parents | 91a3927fd02e |
children | edd8273dc025 |
rev | line source |
---|---|
305 | 1 /* |
28446
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27983
diff
changeset
|
2 * video driver for framebuffer device |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27983
diff
changeset
|
3 * copyright (C) 2001 Szabolcs Berecz <szabi@inf.elte.hu> |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
4 * |
305 | 5 * Some idea and code borrowed from Chris Lawrence's ppmtofb-0.27 |
10576 | 6 * Some fixes and small improvements by Joey Parrish <joey@nicewarrior.org> |
28446
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27983
diff
changeset
|
7 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27983
diff
changeset
|
8 * This file is part of MPlayer. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27983
diff
changeset
|
9 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27983
diff
changeset
|
10 * MPlayer is free software; you can redistribute it and/or modify |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27983
diff
changeset
|
11 * it under the terms of the GNU General Public License as published by |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27983
diff
changeset
|
12 * the Free Software Foundation; either version 2 of the License, or |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27983
diff
changeset
|
13 * (at your option) any later version. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27983
diff
changeset
|
14 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27983
diff
changeset
|
15 * MPlayer is distributed in the hope that it will be useful, |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27983
diff
changeset
|
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27983
diff
changeset
|
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27983
diff
changeset
|
18 * GNU General Public License for more details. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27983
diff
changeset
|
19 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27983
diff
changeset
|
20 * You should have received a copy of the GNU General Public License along |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27983
diff
changeset
|
21 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27983
diff
changeset
|
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
305 | 23 */ |
24 | |
225 | 25 #include <stdio.h> |
26 #include <stdlib.h> | |
27 #include <string.h> | |
28 #include <fcntl.h> | |
29 #include <unistd.h> | |
30 #include <errno.h> | |
11412 | 31 #include <ctype.h> |
225 | 32 |
33 #include <sys/mman.h> | |
34 #include <sys/ioctl.h> | |
2354
0e2f4c4e55d4
Applied patch to switch to graphics mode with -fs by achurch@achurch.org (Andrew Church)
atmos4
parents:
1561
diff
changeset
|
35 #include <sys/kd.h> |
225 | 36 #include <linux/fb.h> |
37 | |
38 #include "config.h" | |
39 #include "video_out.h" | |
40 #include "video_out_internal.h" | |
658 | 41 #include "fastmemcpy.h" |
32467 | 42 #include "sub/sub.h" |
27443 | 43 #include "geometry.h" |
4084
e7be28567230
VIDIX expansion, Usage: -vo fbdev:vidix (-fs -zoom). Zoom is supported for VIDIX!!!
nick
parents:
2732
diff
changeset
|
44 #include "vosub_vidix.h" |
e7be28567230
VIDIX expansion, Usage: -vo fbdev:vidix (-fs -zoom). Zoom is supported for VIDIX!!!
nick
parents:
2732
diff
changeset
|
45 #include "aspect.h" |
10576 | 46 #include "mp_msg.h" |
29354 | 47 #include "libavutil/common.h" |
31379
82fce4fb5049
Add header file for externally used variables from vo_fbdev.c.
diego
parents:
31082
diff
changeset
|
48 #include "vo_fbdev.h" |
4756 | 49 |
25216 | 50 static const vo_info_t info = { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
51 "Framebuffer Device", |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
52 "fbdev", |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
53 "Szabolcs Berecz <szabi@inf.elte.hu>", |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
54 "" |
225 | 55 }; |
56 | |
8148
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
7980
diff
changeset
|
57 LIBVO_EXTERN(fbdev) |
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
7980
diff
changeset
|
58 |
4089 | 59 #ifdef CONFIG_VIDIX |
4084
e7be28567230
VIDIX expansion, Usage: -vo fbdev:vidix (-fs -zoom). Zoom is supported for VIDIX!!!
nick
parents:
2732
diff
changeset
|
60 /* Name of VIDIX driver */ |
e7be28567230
VIDIX expansion, Usage: -vo fbdev:vidix (-fs -zoom). Zoom is supported for VIDIX!!!
nick
parents:
2732
diff
changeset
|
61 static const char *vidix_name = NULL; |
11158
85f4534d1edb
Colorkeying can be disabled. Fbdev, svga and vesa vidix colorkeying support
alex
parents:
11055
diff
changeset
|
62 static vidix_grkey_t gr_key; |
4386 | 63 #endif |
6164
aee9c32349a9
applied 64bit patch from Ulrich Hecht <uli at suse dot de>
alex
parents:
4756
diff
changeset
|
64 static signed int pre_init_err = -2; |
359 | 65 /****************************** |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
66 * fb.modes support * |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
67 ******************************/ |
359 | 68 |
7069 | 69 static range_t *monitor_hfreq = NULL; |
70 static range_t *monitor_vfreq = NULL; | |
71 static range_t *monitor_dotclock = NULL; | |
72 | |
359 | 73 typedef struct { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
74 char *name; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
75 uint32_t xres, yres, vxres, vyres, depth; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
76 uint32_t pixclock, left, right, upper, lower, hslen, vslen; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
77 uint32_t sync; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
78 uint32_t vmode; |
359 | 79 } fb_mode_t; |
80 | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
81 #define MAX_NR_TOKEN 16 |
359 | 82 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
83 #define MAX_LINE_LEN 1000 |
359 | 84 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
85 #define RET_EOF -1 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
86 #define RET_EOL -2 |
359 | 87 |
88 static int validate_mode(fb_mode_t *m) | |
89 { | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
90 if (!m->xres) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
91 mp_msg(MSGT_VO, MSGL_V, "needs geometry "); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
92 return 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
93 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
94 if (!m->pixclock) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
95 mp_msg(MSGT_VO, MSGL_V, "needs timings "); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
96 return 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
97 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
98 return 1; |
359 | 99 } |
100 | |
101 static FILE *fp; | |
102 static int line_num = 0; | |
103 static char *line; | |
104 static char *token[MAX_NR_TOKEN]; | |
105 | |
106 static int get_token(int num) | |
107 { | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
108 static int read_nextline = 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
109 static int line_pos; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
110 int i; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
111 char c; |
359 | 112 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
113 if (num >= MAX_NR_TOKEN) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
114 mp_msg(MSGT_VO, MSGL_V, "get_token(): max >= MAX_NR_TOKEN!\n"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
115 goto out_eof; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
116 } |
359 | 117 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
118 if (read_nextline) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
119 if (!fgets(line, MAX_LINE_LEN, fp)) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
120 goto out_eof; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
121 line_pos = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
122 ++line_num; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
123 read_nextline = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
124 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
125 for (i = 0; i < num; i++) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
126 while (isspace(line[line_pos])) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
127 ++line_pos; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
128 if (line[line_pos] == '\0' || line[line_pos] == '#') { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
129 read_nextline = 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
130 goto out_eol; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
131 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
132 token[i] = line + line_pos; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
133 c = line[line_pos]; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
134 if (c == '"' || c == '\'') { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
135 token[i]++; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
136 while (line[++line_pos] != c && line[line_pos]) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
137 /* NOTHING */; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
138 if (!line[line_pos]) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
139 goto out_eol; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
140 line[line_pos] = ' '; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
141 } else { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
142 for (/* NOTHING */; !isspace(line[line_pos]) && |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
143 line[line_pos]; line_pos++) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
144 /* NOTHING */; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
145 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
146 if (!line[line_pos]) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
147 read_nextline = 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
148 if (i == num - 1) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
149 goto out_ok; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
150 goto out_eol; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
151 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
152 line[line_pos++] = '\0'; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
153 } |
359 | 154 out_ok: |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
155 return i; |
359 | 156 out_eof: |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
157 return RET_EOF; |
359 | 158 out_eol: |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
159 return RET_EOL; |
359 | 160 } |
161 | |
162 static fb_mode_t *fb_modes = NULL; | |
163 static int nr_modes = 0; | |
164 | |
165 static int parse_fbmode_cfg(char *cfgfile) | |
166 { | |
977 | 167 #define CHECK_IN_MODE_DEF\ |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
168 if (!in_mode_def) {\ |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
169 mp_msg(MSGT_VO, MSGL_V, "'needs 'mode' first");\ |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
170 goto err_out_print_linenum;\ |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
171 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
172 fb_mode_t *mode = NULL; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
173 char *endptr; // strtoul()... |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
174 int in_mode_def = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
175 int tmp, i; |
359 | 176 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
177 /* If called more than once, reuse parsed data */ |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
178 if (nr_modes) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
179 return nr_modes; |
17900
5075cd9bb631
Don't try to parse fb.modes more than once. Fixes playback of multiple files
pacman
parents:
17728
diff
changeset
|
180 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
181 mp_msg(MSGT_VO, MSGL_V, "Reading %s: ", cfgfile); |
359 | 182 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
183 if ((fp = fopen(cfgfile, "r")) == NULL) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
184 mp_msg(MSGT_VO, MSGL_V, "can't open '%s': %s\n", cfgfile, strerror(errno)); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
185 return -1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
186 } |
359 | 187 |
29353 | 188 if ((line = malloc(MAX_LINE_LEN + 1)) == NULL) { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
189 mp_msg(MSGT_VO, MSGL_V, "can't get memory for 'line': %s\n", strerror(errno)); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
190 return -2; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
191 } |
359 | 192 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
193 /* |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
194 * check if the cfgfile starts with 'mode' |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
195 */ |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
196 while ((tmp = get_token(1)) == RET_EOL) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
197 /* NOTHING */; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
198 if (tmp == RET_EOF) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
199 goto out; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
200 if (!strcmp(token[0], "mode")) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
201 goto loop_enter; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
202 goto err_out_parse_error; |
359 | 203 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
204 while ((tmp = get_token(1)) != RET_EOF) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
205 if (tmp == RET_EOL) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
206 continue; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
207 if (!strcmp(token[0], "mode")) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
208 if (in_mode_def) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
209 mp_msg(MSGT_VO, MSGL_V, "'endmode' required"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
210 goto err_out_print_linenum; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
211 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
212 if (!validate_mode(mode)) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
213 goto err_out_not_valid; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
214 loop_enter: |
29353 | 215 if (!(fb_modes = |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
216 realloc(fb_modes, sizeof(fb_mode_t) * (nr_modes + 1)))) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
217 mp_msg(MSGT_VO, MSGL_V, "can't realloc 'fb_modes' (nr_modes = %d):" |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
218 " %s\n", nr_modes, strerror(errno)); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
219 goto err_out; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
220 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
221 mode = fb_modes + nr_modes; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
222 ++nr_modes; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
223 memset(mode, 0, sizeof(fb_mode_t)); |
225 | 224 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
225 if (get_token(1) < 0) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
226 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
227 for (i = 0; i < nr_modes - 1; i++) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
228 if (!strcmp(token[0], fb_modes[i].name)) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
229 mp_msg(MSGT_VO, MSGL_V, "mode name '%s' isn't unique", token[0]); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
230 goto err_out_print_linenum; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
231 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
232 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
233 if (!(mode->name = strdup(token[0]))) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
234 mp_msg(MSGT_VO, MSGL_V, "can't strdup -> 'name': %s\n", strerror(errno)); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
235 goto err_out; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
236 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
237 in_mode_def = 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
238 } else if (!strcmp(token[0], "geometry")) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
239 CHECK_IN_MODE_DEF; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
240 if (get_token(5) < 0) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
241 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
242 mode->xres = strtoul(token[0], &endptr, 0); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
243 if (*endptr) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
244 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
245 mode->yres = strtoul(token[1], &endptr, 0); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
246 if (*endptr) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
247 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
248 mode->vxres = strtoul(token[2], &endptr, 0); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
249 if (*endptr) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
250 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
251 mode->vyres = strtoul(token[3], &endptr, 0); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
252 if (*endptr) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
253 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
254 mode->depth = strtoul(token[4], &endptr, 0); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
255 if (*endptr) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
256 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
257 } else if (!strcmp(token[0], "timings")) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
258 CHECK_IN_MODE_DEF; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
259 if (get_token(7) < 0) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
260 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
261 mode->pixclock = strtoul(token[0], &endptr, 0); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
262 if (*endptr) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
263 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
264 mode->left = strtoul(token[1], &endptr, 0); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
265 if (*endptr) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
266 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
267 mode->right = strtoul(token[2], &endptr, 0); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
268 if (*endptr) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
269 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
270 mode->upper = strtoul(token[3], &endptr, 0); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
271 if (*endptr) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
272 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
273 mode->lower = strtoul(token[4], &endptr, 0); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
274 if (*endptr) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
275 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
276 mode->hslen = strtoul(token[5], &endptr, 0); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
277 if (*endptr) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
278 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
279 mode->vslen = strtoul(token[6], &endptr, 0); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
280 if (*endptr) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
281 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
282 } else if (!strcmp(token[0], "endmode")) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
283 CHECK_IN_MODE_DEF; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
284 in_mode_def = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
285 } else if (!strcmp(token[0], "accel")) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
286 CHECK_IN_MODE_DEF; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
287 if (get_token(1) < 0) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
288 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
289 /* |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
290 * it's only used for text acceleration |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
291 * so we just ignore it. |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
292 */ |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
293 } else if (!strcmp(token[0], "hsync")) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
294 CHECK_IN_MODE_DEF; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
295 if (get_token(1) < 0) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
296 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
297 if (!strcmp(token[0], "low")) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
298 mode->sync &= ~FB_SYNC_HOR_HIGH_ACT; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
299 else if (!strcmp(token[0], "high")) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
300 mode->sync |= FB_SYNC_HOR_HIGH_ACT; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
301 else |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
302 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
303 } else if (!strcmp(token[0], "vsync")) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
304 CHECK_IN_MODE_DEF; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
305 if (get_token(1) < 0) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
306 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
307 if (!strcmp(token[0], "low")) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
308 mode->sync &= ~FB_SYNC_VERT_HIGH_ACT; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
309 else if (!strcmp(token[0], "high")) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
310 mode->sync |= FB_SYNC_VERT_HIGH_ACT; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
311 else |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
312 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
313 } else if (!strcmp(token[0], "csync")) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
314 CHECK_IN_MODE_DEF; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
315 if (get_token(1) < 0) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
316 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
317 if (!strcmp(token[0], "low")) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
318 mode->sync &= ~FB_SYNC_COMP_HIGH_ACT; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
319 else if (!strcmp(token[0], "high")) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
320 mode->sync |= FB_SYNC_COMP_HIGH_ACT; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
321 else |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
322 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
323 } else if (!strcmp(token[0], "extsync")) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
324 CHECK_IN_MODE_DEF; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
325 if (get_token(1) < 0) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
326 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
327 if (!strcmp(token[0], "false")) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
328 mode->sync &= ~FB_SYNC_EXT; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
329 else if (!strcmp(token[0], "true")) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
330 mode->sync |= FB_SYNC_EXT; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
331 else |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
332 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
333 } else if (!strcmp(token[0], "laced")) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
334 CHECK_IN_MODE_DEF; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
335 if (get_token(1) < 0) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
336 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
337 if (!strcmp(token[0], "false")) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
338 mode->vmode = FB_VMODE_NONINTERLACED; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
339 else if (!strcmp(token[0], "true")) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
340 mode->vmode = FB_VMODE_INTERLACED; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
341 else |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
342 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
343 } else if (!strcmp(token[0], "double")) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
344 CHECK_IN_MODE_DEF; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
345 if (get_token(1) < 0) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
346 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
347 if (!strcmp(token[0], "false")) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
348 ; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
349 else if (!strcmp(token[0], "true")) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
350 mode->vmode = FB_VMODE_DOUBLE; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
351 else |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
352 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
353 } else |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
354 goto err_out_parse_error; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
355 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
356 if (!validate_mode(mode)) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
357 goto err_out_not_valid; |
359 | 358 out: |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
359 mp_msg(MSGT_VO, MSGL_V, "%d modes\n", nr_modes); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
360 free(line); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
361 fclose(fp); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
362 return nr_modes; |
359 | 363 err_out_parse_error: |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
364 mp_msg(MSGT_VO, MSGL_V, "parse error"); |
359 | 365 err_out_print_linenum: |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
366 mp_msg(MSGT_VO, MSGL_V, " at line %d\n", line_num); |
359 | 367 err_out: |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
368 free(fb_modes); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
369 fb_modes = NULL; |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
370 nr_modes = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
371 free(line); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
372 free(fp); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
373 return -2; |
359 | 374 err_out_not_valid: |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
375 mp_msg(MSGT_VO, MSGL_V, "previous mode is not correct"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
376 goto err_out_print_linenum; |
359 | 377 } |
378 | |
379 static fb_mode_t *find_mode_by_name(char *name) | |
380 { | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
381 int i; |
359 | 382 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
383 for (i = 0; i < nr_modes; i++) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
384 if (!strcmp(name, fb_modes[i].name)) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
385 return fb_modes + i; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
386 return NULL; |
359 | 387 } |
388 | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
389 static float dcf(fb_mode_t *m) //driving clock frequency |
393 | 390 { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
391 return 1e12f / m->pixclock; |
393 | 392 } |
393 | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
394 static float hsf(fb_mode_t *m) //horizontal scan frequency |
393 | 395 { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
396 int htotal = m->left + m->xres + m->right + m->hslen; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
397 return dcf(m) / htotal; |
393 | 398 } |
399 | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
400 static float vsf(fb_mode_t *m) //vertical scan frequency |
393 | 401 { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
402 int vtotal = m->upper + m->yres + m->lower + m->vslen; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
403 return hsf(m) / vtotal; |
393 | 404 } |
405 | |
406 | |
1561 | 407 static int mode_works(fb_mode_t *m, range_t *hfreq, range_t *vfreq, |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
408 range_t *dotclock) |
1561 | 409 { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
410 float h = hsf(m); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
411 float v = vsf(m); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
412 float d = dcf(m); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
413 int ret = 1; |
1561 | 414 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
415 mp_msg(MSGT_VO, MSGL_DBG2, "mode %dx%d:", m->xres, m->yres); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
416 if (!in_range(hfreq, h)) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
417 ret = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
418 mp_msg(MSGT_VO, MSGL_DBG2, " hsync out of range."); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
419 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
420 if (!in_range(vfreq, v)) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
421 ret = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
422 mp_msg(MSGT_VO, MSGL_DBG2, " vsync out of range."); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
423 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
424 if (!in_range(dotclock, d)) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
425 ret = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
426 mp_msg(MSGT_VO, MSGL_DBG2, " dotclock out of range."); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
427 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
428 if (ret) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
429 mp_msg(MSGT_VO, MSGL_DBG2, " hsync, vsync, dotclock ok.\n"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
430 else |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
431 mp_msg(MSGT_VO, MSGL_DBG2, "\n"); |
1561 | 432 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
433 return ret; |
1561 | 434 } |
435 | |
418 | 436 static fb_mode_t *find_best_mode(int xres, int yres, range_t *hfreq, |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
437 range_t *vfreq, range_t *dotclock) |
393 | 438 { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
439 int i; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
440 fb_mode_t *best = fb_modes; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
441 fb_mode_t *curr; |
519 | 442 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
443 mp_msg(MSGT_VO, MSGL_DBG2, "Searching for first working mode\n"); |
1561 | 444 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
445 for (i = 0; i < nr_modes; i++, best++) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
446 if (mode_works(best, hfreq, vfreq, dotclock)) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
447 break; |
519 | 448 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
449 if (i == nr_modes) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
450 return NULL; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
451 if (i == nr_modes - 1) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
452 return best; |
393 | 453 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
454 mp_msg(MSGT_VO, MSGL_DBG2, "First working mode: %dx%d\n", best->xres, best->yres); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
455 mp_msg(MSGT_VO, MSGL_DBG2, "Searching for better modes\n"); |
950 | 456 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
457 for (curr = best + 1; i < nr_modes - 1; i++, curr++) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
458 if (!mode_works(curr, hfreq, vfreq, dotclock)) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
459 continue; |
1561 | 460 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
461 if (best->xres < xres || best->yres < yres) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
462 if (curr->xres > best->xres || curr->yres > best->yres) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
463 mp_msg(MSGT_VO, MSGL_DBG2, "better than %dx%d, which is too small.\n", |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
464 best->xres, best->yres); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
465 best = curr; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
466 } else |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
467 mp_msg(MSGT_VO, MSGL_DBG2, "too small.\n"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
468 } else if (curr->xres == best->xres && curr->yres == best->yres && |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
469 vsf(curr) > vsf(best)) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
470 mp_msg(MSGT_VO, MSGL_DBG2, "faster screen refresh.\n"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
471 best = curr; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
472 } else if ((curr->xres <= best->xres && curr->yres <= best->yres) && |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
473 (curr->xres >= xres && curr->yres >= yres)) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
474 mp_msg(MSGT_VO, MSGL_DBG2, "better than %dx%d, which is too large.\n", |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
475 best->xres, best->yres); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
476 best = curr; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
477 } else { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
478 if (curr->xres < xres || curr->yres < yres) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
479 mp_msg(MSGT_VO, MSGL_DBG2, "too small.\n"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
480 else if (curr->xres > best->xres || curr->yres > best->yres) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
481 mp_msg(MSGT_VO, MSGL_DBG2, "too large.\n"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
482 else |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
483 mp_msg(MSGT_VO, MSGL_DBG2, "it's worse, don't know why.\n"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
484 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
485 } |
1561 | 486 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
487 return best; |
393 | 488 } |
489 | |
33202 | 490 static void set_bpp(struct fb_var_screeninfo *p, int bpp, int rgb) |
418 | 491 { |
29354 | 492 p->bits_per_pixel = FFALIGN(bpp, 2); |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
493 p->red.msb_right = p->green.msb_right = p->blue.msb_right = p->transp.msb_right = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
494 p->transp.offset = p->transp.length = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
495 p->blue.offset = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
496 switch (bpp) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
497 case 32: |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
498 p->transp.offset = 24; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
499 p->transp.length = 8; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
500 case 24: |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
501 p->red.offset = 16; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
502 p->red.length = 8; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
503 p->green.offset = 8; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
504 p->green.length = 8; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
505 p->blue.length = 8; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
506 break; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
507 case 16: |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
508 p->red.offset = 11; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
509 p->green.length = 6; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
510 p->red.length = 5; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
511 p->green.offset = 5; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
512 p->blue.length = 5; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
513 break; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
514 case 15: |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
515 p->red.offset = 10; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
516 p->green.length = 5; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
517 p->red.length = 5; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
518 p->green.offset = 5; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
519 p->blue.length = 5; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
520 break; |
31082
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30817
diff
changeset
|
521 case 12: |
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30817
diff
changeset
|
522 p->red.offset = 8; |
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30817
diff
changeset
|
523 p->green.length = 4; |
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30817
diff
changeset
|
524 p->red.length = 4; |
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30817
diff
changeset
|
525 p->green.offset = 4; |
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30817
diff
changeset
|
526 p->blue.length = 4; |
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30817
diff
changeset
|
527 break; |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
528 } |
33202 | 529 if (rgb) { |
530 p->blue.offset = p->red.offset; | |
531 p->red.offset = 0; | |
532 } | |
418 | 533 } |
534 | |
33202 | 535 static void fb_mode2fb_vinfo(fb_mode_t *m, struct fb_var_screeninfo *v, int rgb) |
418 | 536 { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
537 v->xres = m->xres; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
538 v->yres = m->yres; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
539 v->xres_virtual = m->vxres; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
540 v->yres_virtual = m->vyres; |
33202 | 541 set_bpp(v, m->depth, rgb); |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
542 v->pixclock = m->pixclock; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
543 v->left_margin = m->left; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
544 v->right_margin = m->right; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
545 v->upper_margin = m->upper; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
546 v->lower_margin = m->lower; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
547 v->hsync_len = m->hslen; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
548 v->vsync_len = m->vslen; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
549 v->sync = m->sync; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
550 v->vmode = m->vmode; |
418 | 551 } |
552 | |
553 | |
359 | 554 /****************************** |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
555 * vo_fbdev * |
359 | 556 ******************************/ |
557 | |
658 | 558 /* command line/config file options */ |
27965 | 559 static char *fb_dev_name = NULL; |
10618
7901f7d6e0eb
4x10l fix. Vars used by the config layer must be malloc'd (strdup) as they will be freed at exit.
alex
parents:
10578
diff
changeset
|
560 char *fb_mode_cfgfile = NULL; |
393 | 561 char *fb_mode_name = NULL; |
418 | 562 |
658 | 563 static fb_mode_t *fb_mode = NULL; |
393 | 564 |
658 | 565 /* vo_fbdev related variables */ |
225 | 566 static int fb_dev_fd; |
10576 | 567 static int fb_tty_fd = -1; |
35055 | 568 static int fb_omap; |
225 | 569 static size_t fb_size; |
570 static uint8_t *frame_buffer; | |
27955 | 571 static uint8_t *center; |
359 | 572 static struct fb_fix_screeninfo fb_finfo; |
573 static struct fb_var_screeninfo fb_orig_vinfo; | |
574 static struct fb_var_screeninfo fb_vinfo; | |
17637
479b64764d9e
Fix colormap save/restore for directcolor fb devices
pacman
parents:
16171
diff
changeset
|
575 static unsigned short fb_ored[256], fb_ogreen[256], fb_oblue[256]; |
479b64764d9e
Fix colormap save/restore for directcolor fb devices
pacman
parents:
16171
diff
changeset
|
576 static struct fb_cmap fb_oldcmap = { 0, 256, fb_ored, fb_ogreen, fb_oblue }; |
481 | 577 static int fb_cmap_changed = 0; |
33202 | 578 static int fb_rgb; |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
579 static int fb_pixel_size; // 32: 4 24: 3 16: 2 15: 2 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
580 static int fb_bpp; // 32: 32 24: 24 16: 16 15: 15 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
581 static int fb_bpp_we_want; // 32: 32 24: 24 16: 16 15: 15 |
950 | 582 static int fb_line_len; |
583 static int fb_xres; | |
584 static int fb_yres; | |
30816 | 585 static int fb_page; |
658 | 586 static void (*draw_alpha_p)(int w, int h, unsigned char *src, |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
587 unsigned char *srca, int stride, |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
588 unsigned char *dst, int dstride); |
359 | 589 |
225 | 590 static int in_width; |
591 static int in_height; | |
592 static int out_width; | |
593 static int out_height; | |
950 | 594 static int first_row; |
595 static int last_row; | |
225 | 596 static uint32_t pixel_format; |
804 | 597 static int fs; |
225 | 598 |
305 | 599 /* |
600 * Note: this function is completely cut'n'pasted from | |
601 * Chris Lawrence's code. | |
311 | 602 * (modified a bit to fit in my code...) |
305 | 603 */ |
10426
c3345a8fbc57
removed yv12 support, but left some swscaler support for fast 15 vs 16bpp conversion
alex
parents:
9941
diff
changeset
|
604 static struct fb_cmap *make_directcolor_cmap(struct fb_var_screeninfo *var) |
305 | 605 { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
606 /* Hopefully any DIRECTCOLOR device will have a big enough palette |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
607 * to handle mapping the full color depth. |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
608 * e.g. 8 bpp -> 256 entry palette |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
609 * |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
610 * We could handle some sort of gamma here |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
611 */ |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
612 int i, cols, rcols, gcols, bcols; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
613 uint16_t *red, *green, *blue; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
614 struct fb_cmap *cmap; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
615 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
616 rcols = 1 << var->red.length; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
617 gcols = 1 << var->green.length; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
618 bcols = 1 << var->blue.length; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
619 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
620 /* Make our palette the length of the deepest color */ |
29354 | 621 cols = FFMAX3(rcols, gcols, bcols); |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
622 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
623 red = malloc(cols * sizeof(red[0])); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
624 if (!red) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
625 mp_msg(MSGT_VO, MSGL_V, "Can't allocate red palette with %d entries.\n", cols); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
626 return NULL; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
627 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
628 for (i = 0; i < rcols; i++) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
629 red[i] = (65535 / (rcols - 1)) * i; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
630 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
631 green = malloc(cols * sizeof(green[0])); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
632 if (!green) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
633 mp_msg(MSGT_VO, MSGL_V, "Can't allocate green palette with %d entries.\n", cols); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
634 free(red); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
635 return NULL; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
636 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
637 for (i = 0; i < gcols; i++) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
638 green[i] = (65535 / (gcols - 1)) * i; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
639 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
640 blue = malloc(cols * sizeof(blue[0])); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
641 if (!blue) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
642 mp_msg(MSGT_VO, MSGL_V, "Can't allocate blue palette with %d entries.\n", cols); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
643 free(red); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
644 free(green); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
645 return NULL; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
646 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
647 for (i = 0; i < bcols; i++) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
648 blue[i] = (65535 / (bcols - 1)) * i; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
649 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
650 cmap = malloc(sizeof(struct fb_cmap)); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
651 if (!cmap) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
652 mp_msg(MSGT_VO, MSGL_V, "Can't allocate color map\n"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
653 free(red); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
654 free(green); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
655 free(blue); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
656 return NULL; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
657 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
658 cmap->start = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
659 cmap->transp = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
660 cmap->len = cols; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
661 cmap->red = red; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
662 cmap->blue = blue; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
663 cmap->green = green; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
664 cmap->transp = NULL; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
665 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
666 return cmap; |
305 | 667 } |
225 | 668 |
4084
e7be28567230
VIDIX expansion, Usage: -vo fbdev:vidix (-fs -zoom). Zoom is supported for VIDIX!!!
nick
parents:
2732
diff
changeset
|
669 |
10426
c3345a8fbc57
removed yv12 support, but left some swscaler support for fast 15 vs 16bpp conversion
alex
parents:
9941
diff
changeset
|
670 static int fb_preinit(int reset) |
225 | 671 { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
672 static int fb_preinit_done = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
673 static int fb_works = 0; |
950 | 674 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
675 if (reset) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
676 fb_preinit_done = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
677 return 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
678 } |
10426
c3345a8fbc57
removed yv12 support, but left some swscaler support for fast 15 vs 16bpp conversion
alex
parents:
9941
diff
changeset
|
679 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
680 if (fb_preinit_done) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
681 return fb_works; |
950 | 682 |
29355
288044ae1f9a
Use a single err_out in fb_preinit, also fixes a leak when vo_dbpp has an
reimar
parents:
29354
diff
changeset
|
683 fb_dev_fd = fb_tty_fd = -1; |
288044ae1f9a
Use a single err_out in fb_preinit, also fixes a leak when vo_dbpp has an
reimar
parents:
29354
diff
changeset
|
684 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
685 if (!fb_dev_name && !(fb_dev_name = getenv("FRAMEBUFFER"))) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
686 fb_dev_name = strdup("/dev/fb0"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
687 mp_msg(MSGT_VO, MSGL_V, "using %s\n", fb_dev_name); |
225 | 688 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
689 if ((fb_dev_fd = open(fb_dev_name, O_RDWR)) == -1) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
690 mp_msg(MSGT_VO, MSGL_ERR, "Can't open %s: %s\n", fb_dev_name, strerror(errno)); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
691 goto err_out; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
692 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
693 if (ioctl(fb_dev_fd, FBIOGET_VSCREENINFO, &fb_vinfo)) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
694 mp_msg(MSGT_VO, MSGL_ERR, "Can't get VSCREENINFO: %s\n", strerror(errno)); |
29355
288044ae1f9a
Use a single err_out in fb_preinit, also fixes a leak when vo_dbpp has an
reimar
parents:
29354
diff
changeset
|
695 goto err_out; |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
696 } |
35055 | 697 // random ioctl to check if we seem to run on OMAPFB |
698 #define OMAPFB_SYNC_GFX (('O' << 8) | 37) | |
699 fb_omap = ioctl(fb_dev_fd, OMAPFB_SYNC_GFX) == 0; | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
700 fb_orig_vinfo = fb_vinfo; |
393 | 701 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
702 if ((fb_tty_fd = open("/dev/tty", O_RDWR)) < 0) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
703 mp_msg(MSGT_VO, MSGL_ERR, "notice: Can't open /dev/tty: %s\n", strerror(errno)); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
704 } |
2354
0e2f4c4e55d4
Applied patch to switch to graphics mode with -fs by achurch@achurch.org (Andrew Church)
atmos4
parents:
1561
diff
changeset
|
705 |
33202 | 706 fb_rgb = !fb_vinfo.red.offset; |
30206 | 707 fb_bpp = fb_vinfo.bits_per_pixel; |
708 if (fb_bpp == 16) | |
709 fb_bpp = fb_vinfo.red.length + fb_vinfo.green.length + fb_vinfo.blue.length; | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
710 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
711 if (fb_bpp == 8 && !vo_dbpp) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
712 mp_msg(MSGT_VO, MSGL_ERR, "8 bpp output is not supported.\n"); |
29355
288044ae1f9a
Use a single err_out in fb_preinit, also fixes a leak when vo_dbpp has an
reimar
parents:
29354
diff
changeset
|
713 goto err_out; |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
714 } |
663 | 715 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
716 if (vo_dbpp) { |
31082
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30817
diff
changeset
|
717 if (vo_dbpp != 12 && vo_dbpp != 15 && vo_dbpp != 16 |
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30817
diff
changeset
|
718 && vo_dbpp != 24 && vo_dbpp != 32) { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
719 mp_msg(MSGT_VO, MSGL_ERR, "can't switch to %d bpp\n", vo_dbpp); |
29355
288044ae1f9a
Use a single err_out in fb_preinit, also fixes a leak when vo_dbpp has an
reimar
parents:
29354
diff
changeset
|
720 goto err_out; |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
721 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
722 fb_bpp = vo_dbpp; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
723 } |
1076 | 724 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
725 if (!fb_mode_cfgfile) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
726 fb_mode_cfgfile = strdup("/etc/fb.modes"); |
245
cb4c682746c0
disabled scrollback buffer (virtual fb size set to real screen size)
szabii
parents:
231
diff
changeset
|
727 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
728 fb_preinit_done = 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
729 fb_works = 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
730 return 1; |
29355
288044ae1f9a
Use a single err_out in fb_preinit, also fixes a leak when vo_dbpp has an
reimar
parents:
29354
diff
changeset
|
731 err_out: |
288044ae1f9a
Use a single err_out in fb_preinit, also fixes a leak when vo_dbpp has an
reimar
parents:
29354
diff
changeset
|
732 if (fb_tty_fd != -1) |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
733 close(fb_tty_fd); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
734 fb_tty_fd = -1; |
29355
288044ae1f9a
Use a single err_out in fb_preinit, also fixes a leak when vo_dbpp has an
reimar
parents:
29354
diff
changeset
|
735 if (fb_dev_fd != -1) |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
736 close(fb_dev_fd); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
737 fb_dev_fd = -1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
738 fb_preinit_done = 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
739 fb_works = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
740 return 0; |
393 | 741 } |
245
cb4c682746c0
disabled scrollback buffer (virtual fb size set to real screen size)
szabii
parents:
231
diff
changeset
|
742 |
950 | 743 static void vt_set_textarea(int u, int l) |
744 { | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
745 /* how can I determine the font height? |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
746 * just use 16 for now |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
747 */ |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
748 int urow = ((u + 15) / 16) + 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
749 int lrow = l / 16; |
950 | 750 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
751 mp_msg(MSGT_VO, MSGL_DBG2, "vt_set_textarea(%d,%d): %d,%d\n", u, l, urow, lrow); |
30804 | 752 if (fb_tty_fd >= 0) { |
753 char modestring[100]; | |
754 snprintf(modestring, sizeof(modestring), "\33[%d;%dr\33[%d;%dH", urow, lrow, lrow, 0); | |
755 write(fb_tty_fd, modestring, strlen(modestring)); | |
756 fsync(fb_tty_fd); | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
757 } |
950 | 758 } |
759 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
760 static int config(uint32_t width, uint32_t height, uint32_t d_width, |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
761 uint32_t d_height, uint32_t flags, char *title, |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
762 uint32_t format) |
393 | 763 { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
764 struct fb_cmap *cmap; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
765 int vm = flags & VOFLAG_MODESWITCHING; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
766 int zoom = flags & VOFLAG_SWSCALE; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
767 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
768 fs = flags & VOFLAG_FULLSCREEN; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
769 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
770 if (pre_init_err == -2) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
771 mp_msg(MSGT_VO, MSGL_ERR, "Internal fatal error: config() was called before preinit()\n"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
772 return -1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
773 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
774 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
775 if (pre_init_err) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
776 return 1; |
418 | 777 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
778 if (fb_mode_name && !vm) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
779 mp_msg(MSGT_VO, MSGL_ERR, "-fbmode can only be used with -vm\n"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
780 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
781 } |
29352 | 782 if (vm && parse_fbmode_cfg(fb_mode_cfgfile) < 0) |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
783 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
784 if (d_width && (fs || vm)) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
785 out_width = d_width; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
786 out_height = d_height; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
787 } else { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
788 out_width = width; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
789 out_height = height; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
790 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
791 in_width = width; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
792 in_height = height; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
793 pixel_format = format; |
4380 | 794 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
795 if (fb_mode_name) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
796 if (!(fb_mode = find_mode_by_name(fb_mode_name))) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
797 mp_msg(MSGT_VO, MSGL_ERR, "can't find requested video mode\n"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
798 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
799 } |
33202 | 800 fb_mode2fb_vinfo(fb_mode, &fb_vinfo, fb_rgb); |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
801 } else if (vm) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
802 monitor_hfreq = str2range(monitor_hfreq_str); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
803 monitor_vfreq = str2range(monitor_vfreq_str); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
804 monitor_dotclock = str2range(monitor_dotclock_str); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
805 if (!monitor_hfreq || !monitor_vfreq || !monitor_dotclock) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
806 mp_msg(MSGT_VO, MSGL_ERR, "you have to specify the capabilities of" |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
807 " the monitor.\n"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
808 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
809 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
810 if (!(fb_mode = find_best_mode(out_width, out_height, monitor_hfreq, |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
811 monitor_vfreq, monitor_dotclock))) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
812 mp_msg(MSGT_VO, MSGL_ERR, "can't find best video mode\n"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
813 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
814 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
815 mp_msg(MSGT_VO, MSGL_V, "using mode %dx%d @ %.1fHz\n", fb_mode->xres, |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
816 fb_mode->yres, vsf(fb_mode)); |
33202 | 817 fb_mode2fb_vinfo(fb_mode, &fb_vinfo, fb_rgb); |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
818 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
819 fb_bpp_we_want = fb_bpp; |
33202 | 820 set_bpp(&fb_vinfo, fb_bpp, fb_rgb); |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
821 fb_vinfo.xres_virtual = fb_vinfo.xres; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
822 fb_vinfo.yres_virtual = fb_vinfo.yres; |
30816 | 823 fb_page = 0; |
824 if (vo_doublebuffering) { | |
825 fb_vinfo.yres_virtual <<= 1; | |
826 fb_vinfo.yoffset = 0; | |
827 fb_page = 1; // start writing into the page we don't display | |
828 } | |
245
cb4c682746c0
disabled scrollback buffer (virtual fb size set to real screen size)
szabii
parents:
231
diff
changeset
|
829 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
830 if (fb_tty_fd >= 0 && ioctl(fb_tty_fd, KDSETMODE, KD_GRAPHICS) < 0) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
831 mp_msg(MSGT_VO, MSGL_V, "Can't set graphics mode: %s\n", strerror(errno)); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
832 close(fb_tty_fd); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
833 fb_tty_fd = -1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
834 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
835 |
30206 | 836 if (ioctl(fb_dev_fd, FBIOPUT_VSCREENINFO, &fb_vinfo)) |
837 // Intel drivers fail if we request a transparency channel | |
838 fb_vinfo.transp.length = fb_vinfo.transp.offset = 0; | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
839 if (ioctl(fb_dev_fd, FBIOPUT_VSCREENINFO, &fb_vinfo)) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
840 mp_msg(MSGT_VO, MSGL_ERR, "Can't put VSCREENINFO: %s\n", strerror(errno)); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
841 if (fb_tty_fd >= 0 && ioctl(fb_tty_fd, KDSETMODE, KD_TEXT) < 0) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
842 mp_msg(MSGT_VO, MSGL_ERR, "Can't restore text mode: %s\n", strerror(errno)); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
843 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
844 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
845 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
846 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
847 fb_pixel_size = fb_vinfo.bits_per_pixel / 8; |
30206 | 848 fb_bpp = fb_vinfo.bits_per_pixel; |
849 if (fb_bpp == 16) | |
850 fb_bpp = fb_vinfo.red.length + fb_vinfo.green.length + fb_vinfo.blue.length; | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
851 if (fb_bpp_we_want != fb_bpp) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
852 mp_msg(MSGT_VO, MSGL_WARN, "requested %d bpp, got %d bpp!!!\n", |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
853 fb_bpp_we_want, fb_bpp); |
418 | 854 |
35050
b291f44d864a
Avoid some code duplication related to drawing the OSD.
reimar
parents:
33305
diff
changeset
|
855 draw_alpha_p = vo_get_draw_alpha(format); |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
856 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
857 fb_xres = fb_vinfo.xres; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
858 fb_yres = fb_vinfo.yres; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
859 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
860 if (vm || fs) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
861 out_width = fb_xres; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
862 out_height = fb_yres; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
863 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
864 if (out_width < in_width || out_height < in_height) { |
35117
91a3927fd02e
More helpful error message when video does not fit into frame buffer.
reimar
parents:
35055
diff
changeset
|
865 mp_msg(MSGT_VO, MSGL_ERR, "screensize %ix%i is smaller than video size %ix%i\n", |
91a3927fd02e
More helpful error message when video does not fit into frame buffer.
reimar
parents:
35055
diff
changeset
|
866 out_width, out_height, in_width, in_height); |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
867 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
868 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
869 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
870 first_row = (out_height - in_height) / 2; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
871 last_row = (out_height + in_height) / 2; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
872 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
873 if (ioctl(fb_dev_fd, FBIOGET_FSCREENINFO, &fb_finfo)) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
874 mp_msg(MSGT_VO, MSGL_ERR, "Can't get FSCREENINFO: %s\n", strerror(errno)); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
875 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
876 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
877 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
878 if (fb_finfo.type != FB_TYPE_PACKED_PIXELS) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
879 mp_msg(MSGT_VO, MSGL_ERR, "type %d not supported\n", fb_finfo.type); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
880 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
881 } |
245
cb4c682746c0
disabled scrollback buffer (virtual fb size set to real screen size)
szabii
parents:
231
diff
changeset
|
882 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
883 switch (fb_finfo.visual) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
884 case FB_VISUAL_TRUECOLOR: |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
885 break; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
886 case FB_VISUAL_DIRECTCOLOR: |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
887 mp_msg(MSGT_VO, MSGL_V, "creating cmap for directcolor\n"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
888 if (ioctl(fb_dev_fd, FBIOGETCMAP, &fb_oldcmap)) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
889 mp_msg(MSGT_VO, MSGL_ERR, "can't get cmap: %s\n", |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
890 strerror(errno)); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
891 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
892 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
893 if (!(cmap = make_directcolor_cmap(&fb_vinfo))) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
894 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
895 if (ioctl(fb_dev_fd, FBIOPUTCMAP, cmap)) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
896 mp_msg(MSGT_VO, MSGL_ERR, "can't put cmap: %s\n", |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
897 strerror(errno)); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
898 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
899 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
900 fb_cmap_changed = 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
901 free(cmap->red); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
902 free(cmap->green); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
903 free(cmap->blue); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
904 free(cmap); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
905 break; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
906 default: |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
907 mp_msg(MSGT_VO, MSGL_ERR, "visual: %d not yet supported\n", |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
908 fb_finfo.visual); |
35055 | 909 break; |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
910 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
911 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
912 fb_line_len = fb_finfo.line_length; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
913 fb_size = fb_finfo.smem_len; |
30816 | 914 if (vo_doublebuffering && fb_size < 2 * fb_yres * fb_line_len) |
915 { | |
916 mp_msg(MSGT_VO, MSGL_WARN, "framebuffer too small for double-buffering, disabling\n"); | |
917 vo_doublebuffering = 0; | |
918 fb_page = 0; | |
919 } | |
27983
9d1894ccd09f
Remove useless setting of frame_buffer to NULL as suggested by Reimar.
diego
parents:
27982
diff
changeset
|
920 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
921 #ifdef CONFIG_VIDIX |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
922 if (vidix_name) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
923 unsigned image_width, image_height, x_offset, y_offset; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
924 if (zoom || fs) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
925 aspect_save_orig(width, height); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
926 aspect_save_prescale(d_width, d_height); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
927 aspect_save_screenres(fb_xres, fb_yres); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
928 aspect(&image_width, &image_height, fs ? A_ZOOM : A_NOZOOM); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
929 } else { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
930 image_width = width; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
931 image_height = height; |
2354
0e2f4c4e55d4
Applied patch to switch to graphics mode with -fs by achurch@achurch.org (Andrew Church)
atmos4
parents:
1561
diff
changeset
|
932 } |
0e2f4c4e55d4
Applied patch to switch to graphics mode with -fs by achurch@achurch.org (Andrew Church)
atmos4
parents:
1561
diff
changeset
|
933 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
934 if (fb_xres > image_width) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
935 x_offset = (fb_xres - image_width) / 2; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
936 else |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
937 x_offset = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
938 if (fb_yres > image_height) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
939 y_offset = (fb_yres - image_height) / 2; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
940 else |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
941 y_offset = 0; |
618 | 942 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
943 if (vidix_init(width, height, x_offset, y_offset, image_width, |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
944 image_height, format, fb_bpp, fb_xres, fb_yres) != 0) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
945 mp_msg(MSGT_VO, MSGL_ERR, "Can't initialize VIDIX driver\n"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
946 vidix_name = NULL; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
947 vidix_term(); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
948 return -1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
949 } else |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
950 mp_msg(MSGT_VO, MSGL_V, "Using VIDIX\n"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
951 vidix_start(); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
952 if (vidix_grkey_support()) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
953 vidix_grkey_get(&gr_key); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
954 gr_key.key_op = KEYS_PUT; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
955 if (!(vo_colorkey & 0xff000000)) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
956 gr_key.ckey.op = CKEY_TRUE; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
957 gr_key.ckey.red = (vo_colorkey & 0x00ff0000) >> 16; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
958 gr_key.ckey.green = (vo_colorkey & 0x0000ff00) >> 8; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
959 gr_key.ckey.blue = vo_colorkey & 0x000000ff; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
960 } else |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
961 gr_key.ckey.op = CKEY_FALSE; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
962 vidix_grkey_set(&gr_key); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
963 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
964 } else |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
965 #endif |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
966 { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
967 int x_offset = 0, y_offset = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
968 geometry(&x_offset, &y_offset, &out_width, &out_height, fb_xres, fb_yres); |
27981
53912f852a86
Move setting of frame_buffer variable out of 'if', as preferred by Reimar.
diego
parents:
27965
diff
changeset
|
969 |
29353 | 970 frame_buffer = mmap(0, fb_size, PROT_READ | PROT_WRITE, |
971 MAP_SHARED, fb_dev_fd, 0); | |
27981
53912f852a86
Move setting of frame_buffer variable out of 'if', as preferred by Reimar.
diego
parents:
27965
diff
changeset
|
972 if (frame_buffer == (uint8_t *) -1) { |
27982 | 973 mp_msg(MSGT_VO, MSGL_ERR, "Can't mmap %s: %s\n", fb_dev_name, strerror(errno)); |
974 return 1; | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
975 } |
9517 | 976 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
977 center = frame_buffer + |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
978 ( (out_width - in_width) / 2 ) * fb_pixel_size + |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
979 ( (out_height - in_height) / 2 ) * fb_line_len + |
30816 | 980 x_offset * fb_pixel_size + y_offset * fb_line_len + |
981 fb_page * fb_yres * fb_line_len; | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
982 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
983 mp_msg(MSGT_VO, MSGL_DBG2, "frame_buffer @ %p\n", frame_buffer); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
984 mp_msg(MSGT_VO, MSGL_DBG2, "center @ %p\n", center); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
985 mp_msg(MSGT_VO, MSGL_V, "pixel per line: %d\n", fb_line_len / fb_pixel_size); |
7866
732a8bfc7681
Added the -geometry option (supports fbdev and tdfxfb drivers)
mark
parents:
7863
diff
changeset
|
986 |
30816 | 987 if (fs || vm) { |
988 int clear_size = fb_line_len * fb_yres; | |
35055 | 989 int i; |
30816 | 990 if (vo_doublebuffering) |
991 clear_size <<= 1; | |
35055 | 992 switch (format) { |
993 case IMGFMT_YUY2: | |
994 for (i = 0; i < clear_size - 3;) { | |
995 frame_buffer[i++] = 0; | |
996 frame_buffer[i++] = 0x80; | |
997 frame_buffer[i++] = 0; | |
998 frame_buffer[i++] = 0x80; | |
999 } | |
1000 break; | |
1001 case IMGFMT_UYVY: | |
1002 for (i = 0; i < clear_size - 3;) { | |
1003 frame_buffer[i++] = 0x80; | |
1004 frame_buffer[i++] = 0; | |
1005 frame_buffer[i++] = 0x80; | |
1006 frame_buffer[i++] = 0; | |
1007 } | |
1008 break; | |
1009 default: | |
1010 memset(frame_buffer, 0, clear_size); | |
1011 } | |
30816 | 1012 } |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1013 } |
225 | 1014 |
29358 | 1015 vt_set_textarea(last_row, fb_yres); |
950 | 1016 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1017 return 0; |
225 | 1018 } |
1019 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
1020 static int query_format(uint32_t format) |
225 | 1021 { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1022 if (!fb_preinit(0)) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1023 return 0; |
6851 | 1024 #ifdef CONFIG_VIDIX |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1025 if (vidix_name) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1026 return vidix_query_fourcc(format); |
6851 | 1027 #endif |
35055 | 1028 if (fb_omap && fb_vinfo.nonstd) { |
1029 if ((fb_vinfo.nonstd == 1 && format == IMGFMT_UYVY) || | |
1030 (fb_vinfo.nonstd == 8 && format == IMGFMT_YUY2)) | |
1031 return VFCAP_ACCEPT_STRIDE | VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW; | |
1032 return 0; | |
1033 } | |
33202 | 1034 if ((format & IMGFMT_BGR_MASK) == (fb_rgb ? IMGFMT_RGB : IMGFMT_BGR)) { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1035 int bpp = format & 0xff; |
519 | 1036 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1037 if (bpp == fb_bpp) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1038 return VFCAP_ACCEPT_STRIDE | VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1039 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1040 return 0; |
225 | 1041 } |
1042 | |
1043 static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src, | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1044 unsigned char *srca, int stride) |
225 | 1045 { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1046 unsigned char *dst; |
4210
d43f0e4ac781
fbdev nocopy option - Jeroen Dobbelaere <jeroen.dobbelaere@acunia.com>
arpi
parents:
4198
diff
changeset
|
1047 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1048 dst = center + fb_line_len * y0 + fb_pixel_size * x0; |
359 | 1049 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1050 (*draw_alpha_p)(w, h, src, srca, stride, dst, fb_line_len); |
225 | 1051 } |
1052 | |
27954 | 1053 static int draw_frame(uint8_t *src[]) |
1054 { | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1055 return 1; |
27954 | 1056 } |
225 | 1057 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1058 static int draw_slice(uint8_t *src[], int stride[], int w, int h, int x, int y) |
225 | 1059 { |
29360 | 1060 uint8_t *d; |
10576 | 1061 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1062 d = center + fb_line_len * y + fb_pixel_size * x; |
10576 | 1063 |
29360 | 1064 memcpy_pic2(d, src[0], w * fb_pixel_size, h, fb_line_len, stride[0], 1); |
10576 | 1065 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1066 return 0; |
225 | 1067 } |
1068 | |
1069 static void check_events(void) | |
1070 { | |
1071 } | |
1072 | |
246 | 1073 static void flip_page(void) |
1074 { | |
30816 | 1075 int next_page = !fb_page; |
1076 int page_delta = next_page - fb_page; | |
1077 #ifdef CONFIG_VIDIX | |
1078 if (vidix_name) | |
1079 return; | |
1080 #endif | |
1081 if (!vo_doublebuffering) | |
1082 return; | |
1083 | |
1084 fb_vinfo.yoffset = fb_page * fb_yres; | |
30817
e2285e7da27a
Use FBIOPAN_DISPLAY for switching between pages, seems to work for more
reimar
parents:
30816
diff
changeset
|
1085 ioctl(fb_dev_fd, FBIOPAN_DISPLAY, &fb_vinfo); |
30816 | 1086 |
1087 center += page_delta * fb_yres * fb_line_len; | |
1088 fb_page = next_page; | |
246 | 1089 } |
1090 | |
10576 | 1091 static void draw_osd(void) |
1092 { | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1093 vo_draw_text(in_width, in_height, draw_alpha); |
10576 | 1094 } |
1095 | |
225 | 1096 static void uninit(void) |
1097 { | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1098 if (fb_cmap_changed) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1099 if (ioctl(fb_dev_fd, FBIOPUTCMAP, &fb_oldcmap)) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1100 mp_msg(MSGT_VO, MSGL_WARN, "Can't restore original cmap\n"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1101 fb_cmap_changed = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1102 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1103 if (ioctl(fb_dev_fd, FBIOGET_VSCREENINFO, &fb_vinfo)) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1104 mp_msg(MSGT_VO, MSGL_WARN, "ioctl FBIOGET_VSCREENINFO: %s\n", strerror(errno)); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1105 fb_orig_vinfo.xoffset = fb_vinfo.xoffset; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1106 fb_orig_vinfo.yoffset = fb_vinfo.yoffset; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1107 if (ioctl(fb_dev_fd, FBIOPUT_VSCREENINFO, &fb_orig_vinfo)) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1108 mp_msg(MSGT_VO, MSGL_WARN, "Can't reset original fb_var_screeninfo: %s\n", strerror(errno)); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1109 if (fb_tty_fd >= 0) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1110 if (ioctl(fb_tty_fd, KDSETMODE, KD_TEXT) < 0) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1111 mp_msg(MSGT_VO, MSGL_WARN, "Can't restore text mode: %s\n", strerror(errno)); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1112 } |
29358 | 1113 vt_set_textarea(0, fb_orig_vinfo.yres); |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1114 close(fb_tty_fd); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1115 close(fb_dev_fd); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1116 if (frame_buffer) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1117 munmap(frame_buffer, fb_size); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1118 frame_buffer = NULL; |
4089 | 1119 #ifdef CONFIG_VIDIX |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1120 if (vidix_name) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1121 vidix_term(); |
4089 | 1122 #endif |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1123 fb_preinit(1); |
225 | 1124 } |
2354
0e2f4c4e55d4
Applied patch to switch to graphics mode with -fs by achurch@achurch.org (Andrew Church)
atmos4
parents:
1561
diff
changeset
|
1125 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
1126 static int preinit(const char *vo_subdevice) |
4352 | 1127 { |
4380 | 1128 pre_init_err = 0; |
11055
497104408c30
correct handling of subdevice, -fb device is obsoleted
alex
parents:
11036
diff
changeset
|
1129 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1130 if (vo_subdevice) { |
4380 | 1131 #ifdef CONFIG_VIDIX |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1132 if (memcmp(vo_subdevice, "vidix", 5) == 0) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1133 vidix_name = &vo_subdevice[5]; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1134 if (vidix_name) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1135 pre_init_err = vidix_preinit(vidix_name, &video_out_fbdev); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1136 else |
4380 | 1137 #endif |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1138 { |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
1139 free(fb_dev_name); |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1140 fb_dev_name = strdup(vo_subdevice); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1141 } |
11055
497104408c30
correct handling of subdevice, -fb device is obsoleted
alex
parents:
11036
diff
changeset
|
1142 } |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1143 if (!pre_init_err) |
29352 | 1144 return pre_init_err = fb_preinit(0) ? 0 : -1; |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
25216
diff
changeset
|
1145 return -1; |
4352 | 1146 } |
1147 | |
10576 | 1148 static uint32_t get_image(mp_image_t *mpi) |
1149 { | |
27954 | 1150 if (!IMGFMT_IS_BGR(mpi->imgfmt) || |
29352 | 1151 IMGFMT_BGR_DEPTH(mpi->imgfmt) != fb_bpp || |
1152 (mpi->type != MP_IMGTYPE_STATIC && mpi->type != MP_IMGTYPE_TEMP) || | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1153 (mpi->flags & MP_IMGFLAG_PLANAR) || |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1154 (mpi->flags & MP_IMGFLAG_YUV) || |
29352 | 1155 mpi->width != in_width || |
1156 mpi->height != in_height | |
10576 | 1157 ) |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1158 return VO_FALSE; |
10576 | 1159 |
1160 mpi->planes[0] = center; | |
1161 mpi->stride[0] = fb_line_len; | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1162 mpi->flags |= MP_IMGFLAG_DIRECT; |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
25216
diff
changeset
|
1163 return VO_TRUE; |
10576 | 1164 } |
1165 | |
33305
ddb45e9443ec
Remove the variable arguments from the libvo control() functions.
iive
parents:
33301
diff
changeset
|
1166 static int control(uint32_t request, void *data) |
4352 | 1167 { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1168 switch (request) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1169 case VOCTRL_GET_IMAGE: |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1170 return get_image(data); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1171 case VOCTRL_QUERY_FORMAT: |
29352 | 1172 return query_format(*(uint32_t*)data); |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1173 } |
11036
8e55228b6102
vidix equalizer support by Jake Page <jake@CS.Stanford.EDU>
alex
parents:
10618
diff
changeset
|
1174 |
8e55228b6102
vidix equalizer support by Jake Page <jake@CS.Stanford.EDU>
alex
parents:
10618
diff
changeset
|
1175 #ifdef CONFIG_VIDIX |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1176 if (vidix_name) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1177 switch (request) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1178 case VOCTRL_SET_EQUALIZER: |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1179 case VOCTRL_GET_EQUALIZER: |
33301
899d817e56fc
Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents:
33202
diff
changeset
|
1180 return vidix_control(request, data); |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1181 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1182 } |
11036
8e55228b6102
vidix equalizer support by Jake Page <jake@CS.Stanford.EDU>
alex
parents:
10618
diff
changeset
|
1183 #endif |
8e55228b6102
vidix equalizer support by Jake Page <jake@CS.Stanford.EDU>
alex
parents:
10618
diff
changeset
|
1184 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1185 return VO_NOTIMPL; |
4352 | 1186 } |