Mercurial > mplayer.hg
annotate libvo/vo_fbdev2.c @ 28605:65e49c604b25
Set samplerate in reset also for AC3, and set it before the format in that
case (no idea why, but it is done this way in init, so it is consistent).
author | reimar |
---|---|
date | Tue, 17 Feb 2009 21:08:22 +0000 |
parents | 7681eab10aea |
children | 0f1b5b68af32 |
rev | line source |
---|---|
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
1 /* |
28446
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
2 * video driver for framebuffer device |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
3 * copyright (C) 2003 Joey Parrish <joey@nicewarrior.org> |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
4 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
5 * This file is part of MPlayer. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
6 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
7 * MPlayer is free software; you can redistribute it and/or modify |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
8 * it under the terms of the GNU General Public License as published by |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
9 * the Free Software Foundation; either version 2 of the License, or |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
10 * (at your option) any later version. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
11 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
12 * MPlayer is distributed in the hope that it will be useful, |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
15 * GNU General Public License for more details. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
16 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
17 * You should have received a copy of the GNU General Public License along |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
18 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
20 */ |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
21 |
11412 | 22 #include <stdio.h> |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
23 #include <stdlib.h> |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
24 #include <string.h> |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
25 #include <fcntl.h> |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
26 #include <unistd.h> |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
27 #include <errno.h> |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
28 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
29 #include <sys/mman.h> |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
30 #include <sys/ioctl.h> |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
31 #include <linux/fb.h> |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
32 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
33 #include "config.h" |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
34 #include "video_out.h" |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
35 #include "video_out_internal.h" |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
36 #include "fastmemcpy.h" |
11412 | 37 #include "sub.h" |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
38 #include "mp_msg.h" |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
39 |
25216 | 40 static const vo_info_t info = { |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
41 "Framebuffer Device", |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
42 "fbdev2", |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
43 "Joey Parrish <joey@nicewarrior.org>", |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
44 "" |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
45 }; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
46 |
25220
c9e9ac2008c2
Mark the vo_functions_t definitions as const where possible.
reimar
parents:
25216
diff
changeset
|
47 const LIBVO_EXTERN(fbdev2) |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
48 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
49 static void set_bpp(struct fb_var_screeninfo *p, int bpp) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
50 { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
51 p->bits_per_pixel = (bpp + 1) & ~1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
52 p->red.msb_right = p->green.msb_right = p->blue.msb_right = p->transp.msb_right = 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
53 p->transp.offset = p->transp.length = 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
54 p->blue.offset = 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
55 switch (bpp) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
56 case 32: |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
57 p->transp.offset = 24; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
58 p->transp.length = 8; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
59 case 24: |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
60 p->red.offset = 16; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
61 p->red.length = 8; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
62 p->green.offset = 8; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
63 p->green.length = 8; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
64 p->blue.length = 8; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
65 break; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
66 case 16: |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
67 p->red.offset = 11; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
68 p->green.length = 6; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
69 p->red.length = 5; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
70 p->green.offset = 5; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
71 p->blue.length = 5; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
72 break; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
73 case 15: |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
74 p->red.offset = 10; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
75 p->green.length = 5; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
76 p->red.length = 5; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
77 p->green.offset = 5; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
78 p->blue.length = 5; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
79 break; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
80 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
81 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
82 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
83 static char *fb_dev_name = NULL; // such as /dev/fb0 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
84 static int fb_dev_fd; // handle for fb_dev_name |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
85 static uint8_t *frame_buffer = NULL; // mmap'd access to fbdev |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
86 static uint8_t *center = NULL; // where to begin writing our image (centered?) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
87 static struct fb_fix_screeninfo fb_finfo; // fixed info |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
88 static struct fb_var_screeninfo fb_vinfo; // variable info |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
89 static struct fb_var_screeninfo fb_orig_vinfo; // variable info to restore later |
17637
479b64764d9e
Fix colormap save/restore for directcolor fb devices
pacman
parents:
16171
diff
changeset
|
90 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
|
91 static struct fb_cmap fb_oldcmap = { 0, 256, fb_ored, fb_ogreen, fb_oblue }; |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
92 static int fb_cmap_changed = 0; // to restore map |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
93 static int fb_pixel_size; // 32: 4 24: 3 16: 2 15: 2 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
94 static int fb_bpp; // 32: 32 24: 24 16: 16 15: 15 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
95 static size_t fb_size; // size of frame_buffer |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
96 static int fb_line_len; // length of one line in bytes |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
97 static void (*draw_alpha_p)(int w, int h, unsigned char *src, |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
98 unsigned char *srca, int stride, unsigned char *dst, |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
99 int dstride); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
100 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
101 static uint8_t *next_frame = NULL; // for double buffering |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
102 static int in_width; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
103 static int in_height; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
104 static int out_width; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
105 static int out_height; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
106 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
107 static struct fb_cmap *make_directcolor_cmap(struct fb_var_screeninfo *var) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
108 { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
109 int i, cols, rcols, gcols, bcols; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
110 uint16_t *red, *green, *blue; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
111 struct fb_cmap *cmap; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
112 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
113 rcols = 1 << var->red.length; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
114 gcols = 1 << var->green.length; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
115 bcols = 1 << var->blue.length; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
116 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
117 /* Make our palette the length of the deepest color */ |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
118 cols = (rcols > gcols ? rcols : gcols); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
119 cols = (cols > bcols ? cols : bcols); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
120 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
121 red = malloc(cols * sizeof(red[0])); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
122 if(!red) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
123 mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] Can't allocate red palette with %d entries.\n", cols); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
124 return NULL; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
125 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
126 for(i=0; i< rcols; i++) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
127 red[i] = (65535/(rcols-1)) * i; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
128 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
129 green = malloc(cols * sizeof(green[0])); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
130 if(!green) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
131 mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] Can't allocate green palette with %d entries.\n", cols); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
132 free(red); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
133 return NULL; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
134 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
135 for(i=0; i< gcols; i++) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
136 green[i] = (65535/(gcols-1)) * i; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
137 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
138 blue = malloc(cols * sizeof(blue[0])); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
139 if(!blue) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
140 mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] Can't allocate blue palette with %d entries.\n", cols); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
141 free(red); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
142 free(green); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
143 return NULL; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
144 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
145 for(i=0; i< bcols; i++) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
146 blue[i] = (65535/(bcols-1)) * i; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
147 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
148 cmap = malloc(sizeof(struct fb_cmap)); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
149 if(!cmap) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
150 mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] Can't allocate color map\n"); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
151 free(red); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
152 free(green); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
153 free(blue); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
154 return NULL; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
155 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
156 cmap->start = 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
157 cmap->transp = 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
158 cmap->len = cols; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
159 cmap->red = red; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
160 cmap->blue = blue; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
161 cmap->green = green; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
162 cmap->transp = NULL; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
163 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
164 return cmap; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
165 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
166 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
167 static int fb_preinit(int reset) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
168 { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
169 static int fb_preinit_done = 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
170 static int fb_err = -1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
171 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
172 if (reset) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
173 fb_preinit_done = 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
174 return 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
175 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
176 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
177 if (fb_preinit_done) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
178 return fb_err; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
179 fb_preinit_done = 1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
180 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
181 if (!fb_dev_name && !(fb_dev_name = getenv("FRAMEBUFFER"))) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
182 fb_dev_name = strdup("/dev/fb0"); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
183 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
184 mp_msg(MSGT_VO, MSGL_V, "[fbdev2] Using device %s\n", fb_dev_name); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
185 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
186 if ((fb_dev_fd = open(fb_dev_name, O_RDWR)) == -1) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
187 mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] Can't open %s: %s\n", fb_dev_name, strerror(errno)); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
188 goto err_out; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
189 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
190 if (ioctl(fb_dev_fd, FBIOGET_VSCREENINFO, &fb_vinfo)) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
191 mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] Can't get VSCREENINFO: %s\n", strerror(errno)); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
192 goto err_out; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
193 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
194 fb_orig_vinfo = fb_vinfo; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
195 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
196 fb_bpp = fb_vinfo.bits_per_pixel; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
197 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
198 /* 16 and 15 bpp is reported as 16 bpp */ |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
199 if (fb_bpp == 16) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
200 fb_bpp = fb_vinfo.red.length + fb_vinfo.green.length + |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
201 fb_vinfo.blue.length; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
202 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
203 fb_err = 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
204 return 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
205 err_out: |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
206 if (fb_dev_fd >= 0) close(fb_dev_fd); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
207 fb_dev_fd = -1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
208 fb_err = -1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
209 return -1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
210 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
211 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
212 static int preinit(const char *subdevice) |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
213 { |
11055
497104408c30
correct handling of subdevice, -fb device is obsoleted
alex
parents:
10763
diff
changeset
|
214 if (subdevice) |
497104408c30
correct handling of subdevice, -fb device is obsoleted
alex
parents:
10763
diff
changeset
|
215 { |
497104408c30
correct handling of subdevice, -fb device is obsoleted
alex
parents:
10763
diff
changeset
|
216 if (fb_dev_name) free(fb_dev_name); |
497104408c30
correct handling of subdevice, -fb device is obsoleted
alex
parents:
10763
diff
changeset
|
217 fb_dev_name = strdup(subdevice); |
497104408c30
correct handling of subdevice, -fb device is obsoleted
alex
parents:
10763
diff
changeset
|
218 } |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
219 return fb_preinit(0); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
220 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
221 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
222 static int config(uint32_t width, uint32_t height, uint32_t d_width, |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
223 uint32_t d_height, uint32_t flags, char *title, |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
224 uint32_t format) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
225 { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
226 struct fb_cmap *cmap; |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
14094
diff
changeset
|
227 int fs = flags & VOFLAG_FULLSCREEN; |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
228 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
229 out_width = width; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
230 out_height = height; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
231 in_width = width; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
232 in_height = height; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
233 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
234 if (fs) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
235 out_width = fb_vinfo.xres; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
236 out_height = fb_vinfo.yres; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
237 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
238 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
239 if (out_width < in_width || out_height < in_height) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
240 mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] Screensize is smaller than video size (%dx%d < %dx%d)\n", |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
241 out_width, out_height, in_width, in_height); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
242 return 1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
243 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
244 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
245 switch (fb_bpp) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
246 case 32: draw_alpha_p = vo_draw_alpha_rgb32; break; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
247 case 24: draw_alpha_p = vo_draw_alpha_rgb24; break; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
248 case 16: draw_alpha_p = vo_draw_alpha_rgb16; break; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
249 case 15: draw_alpha_p = vo_draw_alpha_rgb15; break; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
250 default: return 1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
251 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
252 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
253 if (vo_config_count == 0) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
254 if (ioctl(fb_dev_fd, FBIOGET_FSCREENINFO, &fb_finfo)) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
255 mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] Can't get FSCREENINFO: %s\n", strerror(errno)); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
256 return 1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
257 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
258 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
259 if (fb_finfo.type != FB_TYPE_PACKED_PIXELS) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
260 mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] type %d not supported\n", fb_finfo.type); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
261 return 1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
262 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
263 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
264 switch (fb_finfo.visual) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
265 case FB_VISUAL_TRUECOLOR: |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
266 break; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
267 case FB_VISUAL_DIRECTCOLOR: |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
268 mp_msg(MSGT_VO, MSGL_V, "[fbdev2] creating cmap for directcolor\n"); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
269 if (ioctl(fb_dev_fd, FBIOGETCMAP, &fb_oldcmap)) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
270 mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] can't get cmap: %s\n", strerror(errno)); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
271 return 1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
272 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
273 if (!(cmap = make_directcolor_cmap(&fb_vinfo))) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
274 return 1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
275 if (ioctl(fb_dev_fd, FBIOPUTCMAP, cmap)) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
276 mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] can't put cmap: %s\n", strerror(errno)); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
277 return 1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
278 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
279 fb_cmap_changed = 1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
280 free(cmap->red); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
281 free(cmap->green); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
282 free(cmap->blue); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
283 free(cmap); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
284 break; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
285 default: |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
286 mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] visual: %d not yet supported\n", fb_finfo.visual); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
287 return 1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
288 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
289 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
290 fb_size = fb_finfo.smem_len; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
291 fb_line_len = fb_finfo.line_length; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
292 if ((frame_buffer = (uint8_t *) mmap(0, fb_size, PROT_READ | PROT_WRITE, MAP_SHARED, fb_dev_fd, 0)) == (uint8_t *) -1) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
293 mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] Can't mmap %s: %s\n", fb_dev_name, strerror(errno)); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
294 return 1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
295 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
296 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
297 |
17728
fe2520f6039e
When centering a video with odd width, be sure to start on a pixel boundary.
pacman
parents:
17637
diff
changeset
|
298 center = frame_buffer + |
fe2520f6039e
When centering a video with odd width, be sure to start on a pixel boundary.
pacman
parents:
17637
diff
changeset
|
299 ( (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
|
300 ( (out_height - in_height) / 2 ) * fb_line_len; |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
301 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
302 #ifndef USE_CONVERT2FB |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
303 if (!(next_frame = (uint8_t *) realloc(next_frame, in_width * in_height * fb_pixel_size))) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
304 mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] Can't malloc next_frame: %s\n", strerror(errno)); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
305 return 1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
306 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
307 #endif |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
308 if (fs) memset(frame_buffer, '\0', fb_line_len * fb_vinfo.yres); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
309 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
310 return 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
311 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
312 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
313 static int query_format(uint32_t format) |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
314 { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
315 // open the device, etc. |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
316 if (fb_preinit(0)) return 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
317 if ((format & IMGFMT_BGR_MASK) == IMGFMT_BGR) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
318 int fb_target_bpp = format & 0xff; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
319 set_bpp(&fb_vinfo, fb_target_bpp); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
320 fb_vinfo.xres_virtual = fb_vinfo.xres; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
321 fb_vinfo.yres_virtual = fb_vinfo.yres; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
322 if (ioctl(fb_dev_fd, FBIOPUT_VSCREENINFO, &fb_vinfo)) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
323 mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] Can't put VSCREENINFO: %s\n", strerror(errno)); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
324 return 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
325 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
326 fb_pixel_size = fb_vinfo.bits_per_pixel / 8; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
327 fb_bpp = fb_vinfo.red.length + fb_vinfo.green.length + |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
328 fb_vinfo.blue.length + fb_vinfo.transp.length; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
329 if (fb_bpp == fb_target_bpp) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
330 return VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW|VFCAP_ACCEPT_STRIDE; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
331 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
332 return 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
333 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
334 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
335 static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src, |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
336 unsigned char *srca, int stride) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
337 { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
338 unsigned char *dst; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
339 int dstride; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
340 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
341 #ifdef USE_CONVERT2FB |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
342 dst = center + (fb_line_len * y0) + (x0 * fb_pixel_size); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
343 dstride = fb_line_len; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
344 #else |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
345 dst = next_frame + (in_width * y0 + x0) * fb_pixel_size; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
346 dstride = in_width * fb_pixel_size; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
347 #endif |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
348 (*draw_alpha_p)(w, h, src, srca, stride, dst, dstride); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
349 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
350 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
351 static void draw_osd(void) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
352 { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
353 vo_draw_text(in_width, in_height, draw_alpha); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
354 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
355 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
356 // all csp support stride |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
357 static int draw_frame(uint8_t *src[]) { return 1; } |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
358 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
359 static int draw_slice(uint8_t *src[], int stride[], int w, int h, int x, int y) |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
360 { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
361 uint8_t *in = src[0]; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
362 #ifdef USE_CONVERT2FB |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
363 uint8_t *dest = center + (fb_line_len * y) + (x * fb_pixel_size); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
364 int next = fb_line_len; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
365 #else |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
366 uint8_t *dest = next_frame + (in_width * y + x) * fb_pixel_size; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
367 int next = in_width * fb_pixel_size; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
368 #endif |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
369 int i; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
370 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
371 for (i = 0; i < h; i++) { |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
17728
diff
changeset
|
372 fast_memcpy(dest, in, w * fb_pixel_size); |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
373 dest += next; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
374 in += stride[0]; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
375 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
376 return 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
377 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
378 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
379 static void check_events(void) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
380 { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
381 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
382 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
383 static void flip_page(void) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
384 { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
385 #ifndef USE_CONVERT2FB |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
386 int i, out_offset = 0, in_offset = 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
387 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
388 for (i = 0; i < in_height; i++) { |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
17728
diff
changeset
|
389 fast_memcpy(center + out_offset, next_frame + in_offset, |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
390 in_width * fb_pixel_size); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
391 out_offset += fb_line_len; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
392 in_offset += in_width * fb_pixel_size; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
393 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
394 #endif |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
395 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
396 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
397 static void uninit(void) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
398 { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
399 if (fb_cmap_changed) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
400 if (ioctl(fb_dev_fd, FBIOPUTCMAP, &fb_oldcmap)) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
401 mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] Can't restore original cmap\n"); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
402 fb_cmap_changed = 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
403 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
404 if(next_frame) free(next_frame); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
405 if (fb_dev_fd >= 0) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
406 if (ioctl(fb_dev_fd, FBIOPUT_VSCREENINFO, &fb_orig_vinfo)) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
407 mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] Can't reset original fb_var_screeninfo: %s\n", strerror(errno)); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
408 close(fb_dev_fd); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
409 fb_dev_fd = -1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
410 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
411 if(frame_buffer) munmap(frame_buffer, fb_size); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
412 next_frame = frame_buffer = NULL; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
413 fb_preinit(1); // so that later calls to preinit don't fail |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
414 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
415 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
416 static int control(uint32_t request, void *data, ...) |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
417 { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
418 switch (request) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
419 case VOCTRL_QUERY_FORMAT: |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
420 return query_format(*((uint32_t*)data)); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
421 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
422 return VO_NOTIMPL; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
423 } |