Mercurial > mplayer.hg
annotate libvo/vo_fbdev.c @ 34817:326242b21831
Do not return void type and remove broken duplicate code.
The second copy of that code would only be run after
we already tried to use mpi pointer, which means in the
case it was supposed to handle we had already crashed.
author | reimar |
---|---|
date | Tue, 15 May 2012 21:18:39 +0000 |
parents | ddb45e9443ec |
children | b291f44d864a |
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; |
225 | 568 static size_t fb_size; |
569 static uint8_t *frame_buffer; | |
27955 | 570 static uint8_t *center; |
359 | 571 static struct fb_fix_screeninfo fb_finfo; |
572 static struct fb_var_screeninfo fb_orig_vinfo; | |
573 static struct fb_var_screeninfo fb_vinfo; | |
17637
479b64764d9e
Fix colormap save/restore for directcolor fb devices
pacman
parents:
16171
diff
changeset
|
574 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
|
575 static struct fb_cmap fb_oldcmap = { 0, 256, fb_ored, fb_ogreen, fb_oblue }; |
481 | 576 static int fb_cmap_changed = 0; |
33202 | 577 static int fb_rgb; |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
578 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
|
579 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
|
580 static int fb_bpp_we_want; // 32: 32 24: 24 16: 16 15: 15 |
950 | 581 static int fb_line_len; |
582 static int fb_xres; | |
583 static int fb_yres; | |
30816 | 584 static int fb_page; |
658 | 585 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
|
586 unsigned char *srca, int stride, |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
587 unsigned char *dst, int dstride); |
359 | 588 |
225 | 589 static int in_width; |
590 static int in_height; | |
591 static int out_width; | |
592 static int out_height; | |
950 | 593 static int first_row; |
594 static int last_row; | |
225 | 595 static uint32_t pixel_format; |
804 | 596 static int fs; |
225 | 597 |
305 | 598 /* |
599 * Note: this function is completely cut'n'pasted from | |
600 * Chris Lawrence's code. | |
311 | 601 * (modified a bit to fit in my code...) |
305 | 602 */ |
10426
c3345a8fbc57
removed yv12 support, but left some swscaler support for fast 15 vs 16bpp conversion
alex
parents:
9941
diff
changeset
|
603 static struct fb_cmap *make_directcolor_cmap(struct fb_var_screeninfo *var) |
305 | 604 { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
605 /* Hopefully any DIRECTCOLOR device will have a big enough palette |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
606 * to handle mapping the full color depth. |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
607 * e.g. 8 bpp -> 256 entry palette |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
608 * |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
609 * We could handle some sort of gamma here |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
610 */ |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
611 int i, cols, rcols, gcols, bcols; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
612 uint16_t *red, *green, *blue; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
613 struct fb_cmap *cmap; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
614 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
615 rcols = 1 << var->red.length; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
616 gcols = 1 << var->green.length; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
617 bcols = 1 << var->blue.length; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
618 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
619 /* Make our palette the length of the deepest color */ |
29354 | 620 cols = FFMAX3(rcols, gcols, bcols); |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
621 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
622 red = malloc(cols * sizeof(red[0])); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
623 if (!red) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
624 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
|
625 return NULL; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
626 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
627 for (i = 0; i < rcols; i++) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
628 red[i] = (65535 / (rcols - 1)) * i; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
629 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
630 green = malloc(cols * sizeof(green[0])); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
631 if (!green) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
632 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
|
633 free(red); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
634 return NULL; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
635 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
636 for (i = 0; i < gcols; i++) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
637 green[i] = (65535 / (gcols - 1)) * i; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
638 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
639 blue = malloc(cols * sizeof(blue[0])); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
640 if (!blue) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
641 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
|
642 free(red); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
643 free(green); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
644 return NULL; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
645 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
646 for (i = 0; i < bcols; i++) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
647 blue[i] = (65535 / (bcols - 1)) * i; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
648 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
649 cmap = malloc(sizeof(struct fb_cmap)); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
650 if (!cmap) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
651 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
|
652 free(red); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
653 free(green); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
654 free(blue); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
655 return NULL; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
656 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
657 cmap->start = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
658 cmap->transp = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
659 cmap->len = cols; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
660 cmap->red = red; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
661 cmap->blue = blue; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
662 cmap->green = green; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
663 cmap->transp = NULL; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
664 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
665 return cmap; |
305 | 666 } |
225 | 667 |
4084
e7be28567230
VIDIX expansion, Usage: -vo fbdev:vidix (-fs -zoom). Zoom is supported for VIDIX!!!
nick
parents:
2732
diff
changeset
|
668 |
10426
c3345a8fbc57
removed yv12 support, but left some swscaler support for fast 15 vs 16bpp conversion
alex
parents:
9941
diff
changeset
|
669 static int fb_preinit(int reset) |
225 | 670 { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
671 static int fb_preinit_done = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
672 static int fb_works = 0; |
950 | 673 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
674 if (reset) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
675 fb_preinit_done = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
676 return 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
677 } |
10426
c3345a8fbc57
removed yv12 support, but left some swscaler support for fast 15 vs 16bpp conversion
alex
parents:
9941
diff
changeset
|
678 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
679 if (fb_preinit_done) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
680 return fb_works; |
950 | 681 |
29355
288044ae1f9a
Use a single err_out in fb_preinit, also fixes a leak when vo_dbpp has an
reimar
parents:
29354
diff
changeset
|
682 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
|
683 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
684 if (!fb_dev_name && !(fb_dev_name = getenv("FRAMEBUFFER"))) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
685 fb_dev_name = strdup("/dev/fb0"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
686 mp_msg(MSGT_VO, MSGL_V, "using %s\n", fb_dev_name); |
225 | 687 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
688 if ((fb_dev_fd = open(fb_dev_name, O_RDWR)) == -1) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
689 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
|
690 goto err_out; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
691 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
692 if (ioctl(fb_dev_fd, FBIOGET_VSCREENINFO, &fb_vinfo)) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
693 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
|
694 goto err_out; |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
695 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
696 fb_orig_vinfo = fb_vinfo; |
393 | 697 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
698 if ((fb_tty_fd = open("/dev/tty", O_RDWR)) < 0) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
699 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
|
700 } |
2354
0e2f4c4e55d4
Applied patch to switch to graphics mode with -fs by achurch@achurch.org (Andrew Church)
atmos4
parents:
1561
diff
changeset
|
701 |
33202 | 702 fb_rgb = !fb_vinfo.red.offset; |
30206 | 703 fb_bpp = fb_vinfo.bits_per_pixel; |
704 if (fb_bpp == 16) | |
705 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
|
706 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
707 if (fb_bpp == 8 && !vo_dbpp) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
708 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
|
709 goto err_out; |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
710 } |
663 | 711 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
712 if (vo_dbpp) { |
31082
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30817
diff
changeset
|
713 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
|
714 && vo_dbpp != 24 && vo_dbpp != 32) { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
715 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
|
716 goto err_out; |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
717 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
718 fb_bpp = vo_dbpp; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
719 } |
1076 | 720 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
721 if (!fb_mode_cfgfile) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
722 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
|
723 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
724 fb_preinit_done = 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
725 fb_works = 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
726 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
|
727 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
|
728 if (fb_tty_fd != -1) |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
729 close(fb_tty_fd); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
730 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
|
731 if (fb_dev_fd != -1) |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
732 close(fb_dev_fd); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
733 fb_dev_fd = -1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
734 fb_preinit_done = 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
735 fb_works = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
736 return 0; |
393 | 737 } |
245
cb4c682746c0
disabled scrollback buffer (virtual fb size set to real screen size)
szabii
parents:
231
diff
changeset
|
738 |
950 | 739 static void vt_set_textarea(int u, int l) |
740 { | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
741 /* how can I determine the font height? |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
742 * just use 16 for now |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
743 */ |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
744 int urow = ((u + 15) / 16) + 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
745 int lrow = l / 16; |
950 | 746 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
747 mp_msg(MSGT_VO, MSGL_DBG2, "vt_set_textarea(%d,%d): %d,%d\n", u, l, urow, lrow); |
30804 | 748 if (fb_tty_fd >= 0) { |
749 char modestring[100]; | |
750 snprintf(modestring, sizeof(modestring), "\33[%d;%dr\33[%d;%dH", urow, lrow, lrow, 0); | |
751 write(fb_tty_fd, modestring, strlen(modestring)); | |
752 fsync(fb_tty_fd); | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
753 } |
950 | 754 } |
755 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
756 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
|
757 uint32_t d_height, uint32_t flags, char *title, |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
758 uint32_t format) |
393 | 759 { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
760 struct fb_cmap *cmap; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
761 int vm = flags & VOFLAG_MODESWITCHING; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
762 int zoom = flags & VOFLAG_SWSCALE; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
763 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
764 fs = flags & VOFLAG_FULLSCREEN; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
765 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
766 if (pre_init_err == -2) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
767 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
|
768 return -1; |
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 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
771 if (pre_init_err) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
772 return 1; |
418 | 773 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
774 if (fb_mode_name && !vm) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
775 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
|
776 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
777 } |
29352 | 778 if (vm && parse_fbmode_cfg(fb_mode_cfgfile) < 0) |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
779 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
780 if (d_width && (fs || vm)) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
781 out_width = d_width; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
782 out_height = d_height; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
783 } else { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
784 out_width = width; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
785 out_height = height; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
786 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
787 in_width = width; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
788 in_height = height; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
789 pixel_format = format; |
4380 | 790 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
791 if (fb_mode_name) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
792 if (!(fb_mode = find_mode_by_name(fb_mode_name))) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
793 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
|
794 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
795 } |
33202 | 796 fb_mode2fb_vinfo(fb_mode, &fb_vinfo, fb_rgb); |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
797 } else if (vm) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
798 monitor_hfreq = str2range(monitor_hfreq_str); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
799 monitor_vfreq = str2range(monitor_vfreq_str); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
800 monitor_dotclock = str2range(monitor_dotclock_str); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
801 if (!monitor_hfreq || !monitor_vfreq || !monitor_dotclock) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
802 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
|
803 " the monitor.\n"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
804 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
805 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
806 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
|
807 monitor_vfreq, monitor_dotclock))) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
808 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
|
809 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
810 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
811 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
|
812 fb_mode->yres, vsf(fb_mode)); |
33202 | 813 fb_mode2fb_vinfo(fb_mode, &fb_vinfo, fb_rgb); |
27956
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 fb_bpp_we_want = fb_bpp; |
33202 | 816 set_bpp(&fb_vinfo, fb_bpp, fb_rgb); |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
817 fb_vinfo.xres_virtual = fb_vinfo.xres; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
818 fb_vinfo.yres_virtual = fb_vinfo.yres; |
30816 | 819 fb_page = 0; |
820 if (vo_doublebuffering) { | |
821 fb_vinfo.yres_virtual <<= 1; | |
822 fb_vinfo.yoffset = 0; | |
823 fb_page = 1; // start writing into the page we don't display | |
824 } | |
245
cb4c682746c0
disabled scrollback buffer (virtual fb size set to real screen size)
szabii
parents:
231
diff
changeset
|
825 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
826 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
|
827 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
|
828 close(fb_tty_fd); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
829 fb_tty_fd = -1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
830 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
831 |
30206 | 832 if (ioctl(fb_dev_fd, FBIOPUT_VSCREENINFO, &fb_vinfo)) |
833 // Intel drivers fail if we request a transparency channel | |
834 fb_vinfo.transp.length = fb_vinfo.transp.offset = 0; | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
835 if (ioctl(fb_dev_fd, FBIOPUT_VSCREENINFO, &fb_vinfo)) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
836 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
|
837 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
|
838 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
|
839 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
840 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
841 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
842 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
843 fb_pixel_size = fb_vinfo.bits_per_pixel / 8; |
30206 | 844 fb_bpp = fb_vinfo.bits_per_pixel; |
845 if (fb_bpp == 16) | |
846 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
|
847 if (fb_bpp_we_want != fb_bpp) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
848 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
|
849 fb_bpp_we_want, fb_bpp); |
418 | 850 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
851 switch (fb_bpp) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
852 case 32: |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
853 draw_alpha_p = vo_draw_alpha_rgb32; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
854 break; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
855 case 24: |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
856 draw_alpha_p = vo_draw_alpha_rgb24; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
857 break; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
858 case 16: |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
859 draw_alpha_p = vo_draw_alpha_rgb16; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
860 break; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
861 case 15: |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
862 draw_alpha_p = vo_draw_alpha_rgb15; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
863 break; |
31082
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30817
diff
changeset
|
864 case 12: |
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30817
diff
changeset
|
865 draw_alpha_p = vo_draw_alpha_rgb12; |
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30817
diff
changeset
|
866 break; |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
867 default: |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
868 return 1; |
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 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
871 fb_xres = fb_vinfo.xres; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
872 fb_yres = fb_vinfo.yres; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
873 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
874 if (vm || fs) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
875 out_width = fb_xres; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
876 out_height = fb_yres; |
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 (out_width < in_width || out_height < in_height) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
879 mp_msg(MSGT_VO, MSGL_ERR, "screensize is smaller than video size\n"); |
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 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
882 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
883 first_row = (out_height - in_height) / 2; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
884 last_row = (out_height + in_height) / 2; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
885 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
886 if (ioctl(fb_dev_fd, FBIOGET_FSCREENINFO, &fb_finfo)) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
887 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
|
888 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
889 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
890 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
891 if (fb_finfo.type != FB_TYPE_PACKED_PIXELS) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
892 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
|
893 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
894 } |
245
cb4c682746c0
disabled scrollback buffer (virtual fb size set to real screen size)
szabii
parents:
231
diff
changeset
|
895 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
896 switch (fb_finfo.visual) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
897 case FB_VISUAL_TRUECOLOR: |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
898 break; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
899 case FB_VISUAL_DIRECTCOLOR: |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
900 mp_msg(MSGT_VO, MSGL_V, "creating cmap for directcolor\n"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
901 if (ioctl(fb_dev_fd, FBIOGETCMAP, &fb_oldcmap)) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
902 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
|
903 strerror(errno)); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
904 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
905 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
906 if (!(cmap = make_directcolor_cmap(&fb_vinfo))) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
907 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
908 if (ioctl(fb_dev_fd, FBIOPUTCMAP, cmap)) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
909 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
|
910 strerror(errno)); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
911 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
912 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
913 fb_cmap_changed = 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
914 free(cmap->red); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
915 free(cmap->green); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
916 free(cmap->blue); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
917 free(cmap); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
918 break; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
919 default: |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
920 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
|
921 fb_finfo.visual); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
922 return 1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
923 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
924 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
925 fb_line_len = fb_finfo.line_length; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
926 fb_size = fb_finfo.smem_len; |
30816 | 927 if (vo_doublebuffering && fb_size < 2 * fb_yres * fb_line_len) |
928 { | |
929 mp_msg(MSGT_VO, MSGL_WARN, "framebuffer too small for double-buffering, disabling\n"); | |
930 vo_doublebuffering = 0; | |
931 fb_page = 0; | |
932 } | |
27983
9d1894ccd09f
Remove useless setting of frame_buffer to NULL as suggested by Reimar.
diego
parents:
27982
diff
changeset
|
933 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
934 #ifdef CONFIG_VIDIX |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
935 if (vidix_name) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
936 unsigned image_width, image_height, x_offset, y_offset; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
937 if (zoom || fs) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
938 aspect_save_orig(width, height); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
939 aspect_save_prescale(d_width, d_height); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
940 aspect_save_screenres(fb_xres, fb_yres); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
941 aspect(&image_width, &image_height, fs ? A_ZOOM : A_NOZOOM); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
942 } else { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
943 image_width = width; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
944 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
|
945 } |
0e2f4c4e55d4
Applied patch to switch to graphics mode with -fs by achurch@achurch.org (Andrew Church)
atmos4
parents:
1561
diff
changeset
|
946 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
947 if (fb_xres > image_width) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
948 x_offset = (fb_xres - image_width) / 2; |
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 x_offset = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
951 if (fb_yres > image_height) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
952 y_offset = (fb_yres - image_height) / 2; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
953 else |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
954 y_offset = 0; |
618 | 955 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
956 if (vidix_init(width, height, x_offset, y_offset, image_width, |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
957 image_height, format, fb_bpp, fb_xres, fb_yres) != 0) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
958 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
|
959 vidix_name = NULL; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
960 vidix_term(); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
961 return -1; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
962 } else |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
963 mp_msg(MSGT_VO, MSGL_V, "Using VIDIX\n"); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
964 vidix_start(); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
965 if (vidix_grkey_support()) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
966 vidix_grkey_get(&gr_key); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
967 gr_key.key_op = KEYS_PUT; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
968 if (!(vo_colorkey & 0xff000000)) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
969 gr_key.ckey.op = CKEY_TRUE; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
970 gr_key.ckey.red = (vo_colorkey & 0x00ff0000) >> 16; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
971 gr_key.ckey.green = (vo_colorkey & 0x0000ff00) >> 8; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
972 gr_key.ckey.blue = vo_colorkey & 0x000000ff; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
973 } else |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
974 gr_key.ckey.op = CKEY_FALSE; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
975 vidix_grkey_set(&gr_key); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
976 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
977 } else |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
978 #endif |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
979 { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
980 int x_offset = 0, y_offset = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
981 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
|
982 |
29353 | 983 frame_buffer = mmap(0, fb_size, PROT_READ | PROT_WRITE, |
984 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
|
985 if (frame_buffer == (uint8_t *) -1) { |
27982 | 986 mp_msg(MSGT_VO, MSGL_ERR, "Can't mmap %s: %s\n", fb_dev_name, strerror(errno)); |
987 return 1; | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
988 } |
9517 | 989 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
990 center = frame_buffer + |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
991 ( (out_width - in_width) / 2 ) * fb_pixel_size + |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
992 ( (out_height - in_height) / 2 ) * fb_line_len + |
30816 | 993 x_offset * fb_pixel_size + y_offset * fb_line_len + |
994 fb_page * fb_yres * fb_line_len; | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
995 |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
996 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
|
997 mp_msg(MSGT_VO, MSGL_DBG2, "center @ %p\n", center); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
998 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
|
999 |
30816 | 1000 if (fs || vm) { |
1001 int clear_size = fb_line_len * fb_yres; | |
1002 if (vo_doublebuffering) | |
1003 clear_size <<= 1; | |
1004 memset(frame_buffer, 0, clear_size); | |
1005 } | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1006 } |
225 | 1007 |
29358 | 1008 vt_set_textarea(last_row, fb_yres); |
950 | 1009 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1010 return 0; |
225 | 1011 } |
1012 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
1013 static int query_format(uint32_t format) |
225 | 1014 { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1015 if (!fb_preinit(0)) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1016 return 0; |
6851 | 1017 #ifdef CONFIG_VIDIX |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1018 if (vidix_name) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1019 return vidix_query_fourcc(format); |
6851 | 1020 #endif |
33202 | 1021 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
|
1022 int bpp = format & 0xff; |
519 | 1023 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1024 if (bpp == fb_bpp) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1025 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
|
1026 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1027 return 0; |
225 | 1028 } |
1029 | |
1030 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
|
1031 unsigned char *srca, int stride) |
225 | 1032 { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1033 unsigned char *dst; |
4210
d43f0e4ac781
fbdev nocopy option - Jeroen Dobbelaere <jeroen.dobbelaere@acunia.com>
arpi
parents:
4198
diff
changeset
|
1034 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1035 dst = center + fb_line_len * y0 + fb_pixel_size * x0; |
359 | 1036 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1037 (*draw_alpha_p)(w, h, src, srca, stride, dst, fb_line_len); |
225 | 1038 } |
1039 | |
27954 | 1040 static int draw_frame(uint8_t *src[]) |
1041 { | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1042 return 1; |
27954 | 1043 } |
225 | 1044 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1045 static int draw_slice(uint8_t *src[], int stride[], int w, int h, int x, int y) |
225 | 1046 { |
29360 | 1047 uint8_t *d; |
10576 | 1048 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1049 d = center + fb_line_len * y + fb_pixel_size * x; |
10576 | 1050 |
29360 | 1051 memcpy_pic2(d, src[0], w * fb_pixel_size, h, fb_line_len, stride[0], 1); |
10576 | 1052 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1053 return 0; |
225 | 1054 } |
1055 | |
1056 static void check_events(void) | |
1057 { | |
1058 } | |
1059 | |
246 | 1060 static void flip_page(void) |
1061 { | |
30816 | 1062 int next_page = !fb_page; |
1063 int page_delta = next_page - fb_page; | |
1064 #ifdef CONFIG_VIDIX | |
1065 if (vidix_name) | |
1066 return; | |
1067 #endif | |
1068 if (!vo_doublebuffering) | |
1069 return; | |
1070 | |
1071 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
|
1072 ioctl(fb_dev_fd, FBIOPAN_DISPLAY, &fb_vinfo); |
30816 | 1073 |
1074 center += page_delta * fb_yres * fb_line_len; | |
1075 fb_page = next_page; | |
246 | 1076 } |
1077 | |
10576 | 1078 static void draw_osd(void) |
1079 { | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1080 vo_draw_text(in_width, in_height, draw_alpha); |
10576 | 1081 } |
1082 | |
225 | 1083 static void uninit(void) |
1084 { | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1085 if (fb_cmap_changed) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1086 if (ioctl(fb_dev_fd, FBIOPUTCMAP, &fb_oldcmap)) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1087 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
|
1088 fb_cmap_changed = 0; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1089 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1090 if (ioctl(fb_dev_fd, FBIOGET_VSCREENINFO, &fb_vinfo)) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1091 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
|
1092 fb_orig_vinfo.xoffset = fb_vinfo.xoffset; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1093 fb_orig_vinfo.yoffset = fb_vinfo.yoffset; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1094 if (ioctl(fb_dev_fd, FBIOPUT_VSCREENINFO, &fb_orig_vinfo)) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1095 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
|
1096 if (fb_tty_fd >= 0) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1097 if (ioctl(fb_tty_fd, KDSETMODE, KD_TEXT) < 0) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1098 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
|
1099 } |
29358 | 1100 vt_set_textarea(0, fb_orig_vinfo.yres); |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1101 close(fb_tty_fd); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1102 close(fb_dev_fd); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1103 if (frame_buffer) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1104 munmap(frame_buffer, fb_size); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1105 frame_buffer = NULL; |
4089 | 1106 #ifdef CONFIG_VIDIX |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1107 if (vidix_name) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1108 vidix_term(); |
4089 | 1109 #endif |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1110 fb_preinit(1); |
225 | 1111 } |
2354
0e2f4c4e55d4
Applied patch to switch to graphics mode with -fs by achurch@achurch.org (Andrew Church)
atmos4
parents:
1561
diff
changeset
|
1112 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
1113 static int preinit(const char *vo_subdevice) |
4352 | 1114 { |
4380 | 1115 pre_init_err = 0; |
11055
497104408c30
correct handling of subdevice, -fb device is obsoleted
alex
parents:
11036
diff
changeset
|
1116 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1117 if (vo_subdevice) { |
4380 | 1118 #ifdef CONFIG_VIDIX |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1119 if (memcmp(vo_subdevice, "vidix", 5) == 0) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1120 vidix_name = &vo_subdevice[5]; |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1121 if (vidix_name) |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1122 pre_init_err = vidix_preinit(vidix_name, &video_out_fbdev); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1123 else |
4380 | 1124 #endif |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1125 { |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
1126 free(fb_dev_name); |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1127 fb_dev_name = strdup(vo_subdevice); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1128 } |
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 (!pre_init_err) |
29352 | 1131 return pre_init_err = fb_preinit(0) ? 0 : -1; |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
25216
diff
changeset
|
1132 return -1; |
4352 | 1133 } |
1134 | |
10576 | 1135 static uint32_t get_image(mp_image_t *mpi) |
1136 { | |
27954 | 1137 if (!IMGFMT_IS_BGR(mpi->imgfmt) || |
29352 | 1138 IMGFMT_BGR_DEPTH(mpi->imgfmt) != fb_bpp || |
1139 (mpi->type != MP_IMGTYPE_STATIC && mpi->type != MP_IMGTYPE_TEMP) || | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1140 (mpi->flags & MP_IMGFLAG_PLANAR) || |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1141 (mpi->flags & MP_IMGFLAG_YUV) || |
29352 | 1142 mpi->width != in_width || |
1143 mpi->height != in_height | |
10576 | 1144 ) |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1145 return VO_FALSE; |
10576 | 1146 |
1147 mpi->planes[0] = center; | |
1148 mpi->stride[0] = fb_line_len; | |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1149 mpi->flags |= MP_IMGFLAG_DIRECT; |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
25216
diff
changeset
|
1150 return VO_TRUE; |
10576 | 1151 } |
1152 | |
33305
ddb45e9443ec
Remove the variable arguments from the libvo control() functions.
iive
parents:
33301
diff
changeset
|
1153 static int control(uint32_t request, void *data) |
4352 | 1154 { |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1155 switch (request) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1156 case VOCTRL_GET_IMAGE: |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1157 return get_image(data); |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1158 case VOCTRL_QUERY_FORMAT: |
29352 | 1159 return query_format(*(uint32_t*)data); |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1160 } |
11036
8e55228b6102
vidix equalizer support by Jake Page <jake@CS.Stanford.EDU>
alex
parents:
10618
diff
changeset
|
1161 |
8e55228b6102
vidix equalizer support by Jake Page <jake@CS.Stanford.EDU>
alex
parents:
10618
diff
changeset
|
1162 #ifdef CONFIG_VIDIX |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1163 if (vidix_name) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1164 switch (request) { |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1165 case VOCTRL_SET_EQUALIZER: |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1166 case VOCTRL_GET_EQUALIZER: |
33301
899d817e56fc
Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents:
33202
diff
changeset
|
1167 return vidix_control(request, data); |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1168 } |
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1169 } |
11036
8e55228b6102
vidix equalizer support by Jake Page <jake@CS.Stanford.EDU>
alex
parents:
10618
diff
changeset
|
1170 #endif |
8e55228b6102
vidix equalizer support by Jake Page <jake@CS.Stanford.EDU>
alex
parents:
10618
diff
changeset
|
1171 |
27956
95d14fb247a8
cosmetics: complete reformatting, tabs to spaces, etc.
diego
parents:
27955
diff
changeset
|
1172 return VO_NOTIMPL; |
4352 | 1173 } |