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