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