annotate libvo/vo_fbdev2.c @ 30884:53901d222e8a

Announce SMP support for Win32. Don't hardcode dwNumberOfProcessors=1 for Win32 anymore; the mutex/event code is still far from perfect, but now good enough that I can't find any codecs that breaks with this (tested on a quad with various codecs). This tells codecs they can use more than one core if they want to (some already did, by launching multiple threads even when told there was only a single core).
author sesse
date Wed, 17 Mar 2010 23:33:26 +0000
parents 9fc9d1e788aa
children 92f88bb315c5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
ec3dac7d17a0 Warning fixes (approved by A'rpi).
rathann
parents: 11055
diff changeset
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
ec3dac7d17a0 Warning fixes (approved by A'rpi).
rathann
parents: 11055
diff changeset
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
3aee342be929 Make vo info structs const
reimar
parents: 23457
diff changeset
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;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28446
diff changeset
112
10763
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;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28446
diff changeset
116
10763
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);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28446
diff changeset
120
10763
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;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28446
diff changeset
128
10763
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;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28446
diff changeset
137
10763
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;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28446
diff changeset
147
10763
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;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28446
diff changeset
163
10763
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 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28446
diff changeset
176
10763
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
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30207
diff changeset
303 if (!(next_frame = realloc(next_frame, in_width * in_height * fb_pixel_size))) {
10763
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;
30207
6d8765b75f37 Fix fbdev2 to work with Intel framebuffer.
reimar
parents: 29263
diff changeset
322 if (ioctl(fb_dev_fd, FBIOPUT_VSCREENINFO, &fb_vinfo))
6d8765b75f37 Fix fbdev2 to work with Intel framebuffer.
reimar
parents: 29263
diff changeset
323 // Needed for Intel framebuffer with 32 bpp
6d8765b75f37 Fix fbdev2 to work with Intel framebuffer.
reimar
parents: 29263
diff changeset
324 fb_vinfo.transp.length = fb_vinfo.transp.offset = 0;
10763
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
325 if (ioctl(fb_dev_fd, FBIOPUT_VSCREENINFO, &fb_vinfo)) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
326 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
327 return 0;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
328 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
329 fb_pixel_size = fb_vinfo.bits_per_pixel / 8;
30207
6d8765b75f37 Fix fbdev2 to work with Intel framebuffer.
reimar
parents: 29263
diff changeset
330 fb_bpp = fb_vinfo.bits_per_pixel;
6d8765b75f37 Fix fbdev2 to work with Intel framebuffer.
reimar
parents: 29263
diff changeset
331 if (fb_bpp == 16)
6d8765b75f37 Fix fbdev2 to work with Intel framebuffer.
reimar
parents: 29263
diff changeset
332 fb_bpp = fb_vinfo.red.length + fb_vinfo.green.length + fb_vinfo.blue.length;
10763
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
333 if (fb_bpp == fb_target_bpp)
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
334 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
335 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
336 return 0;
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
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
339 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
340 unsigned char *srca, int stride)
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
341 {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
342 unsigned char *dst;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
343 int dstride;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
344
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
345 #ifdef USE_CONVERT2FB
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
346 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
347 dstride = fb_line_len;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
348 #else
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
349 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
350 dstride = in_width * fb_pixel_size;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
351 #endif
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
352 (*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
353 }
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 static void draw_osd(void)
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
356 {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
357 vo_draw_text(in_width, in_height, draw_alpha);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
358 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
359
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
360 // 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
361 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
362
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
363 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
364 {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
365 uint8_t *in = src[0];
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
366 #ifdef USE_CONVERT2FB
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
367 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
368 int next = fb_line_len;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
369 #else
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
370 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
371 int next = in_width * fb_pixel_size;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
372 #endif
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
373 int i;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
374
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
375 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
376 fast_memcpy(dest, in, w * fb_pixel_size);
10763
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
377 dest += next;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
378 in += stride[0];
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
379 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
380 return 0;
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 check_events(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 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
386
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
387 static void flip_page(void)
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
388 {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
389 #ifndef USE_CONVERT2FB
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
390 int i, out_offset = 0, in_offset = 0;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
391
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
392 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
393 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
394 in_width * fb_pixel_size);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
395 out_offset += fb_line_len;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
396 in_offset += in_width * fb_pixel_size;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
397 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
398 #endif
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
399 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
400
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
401 static void uninit(void)
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
402 {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
403 if (fb_cmap_changed) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
404 if (ioctl(fb_dev_fd, FBIOPUTCMAP, &fb_oldcmap))
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
405 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
406 fb_cmap_changed = 0;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
407 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
408 if(next_frame) free(next_frame);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
409 if (fb_dev_fd >= 0) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
410 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
411 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
412 close(fb_dev_fd);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
413 fb_dev_fd = -1;
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 if(frame_buffer) munmap(frame_buffer, fb_size);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
416 next_frame = frame_buffer = NULL;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
417 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
418 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
419
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
420 static int control(uint32_t request, void *data, ...)
10763
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 switch (request) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
423 case VOCTRL_QUERY_FORMAT:
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
424 return query_format(*((uint32_t*)data));
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
425 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
426 return VO_NOTIMPL;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
427 }