annotate libvo/vo_fbdev2.c @ 25317:7f3cb5408f28

Fixed VIDIX color bug that was introduced when Radeon VIDIX driver was synchronized with vidix.sf.net. The red color was saturating. Corrected value fixes the issue and restore the color to the level it used to have before synchronization. Meaning of the value remains unknow but was retrieved from register's value of a Radeon 9000 card, so it may need further testing. Patch by Guillaume Lecerf (foxcore at gmail dot com)
author ben
date Mon, 10 Dec 2007 19:27:46 +0000
parents c9e9ac2008c2
children 7681eab10aea
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 /*
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
2 * Video driver for Framebuffer device
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
3 * by Joey Parrish <joey@nicewarrior.org>
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
4 * (C) 2003
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
5 */
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
6
11412
ec3dac7d17a0 Warning fixes (approved by A'rpi).
rathann
parents: 11055
diff changeset
7 #include <stdio.h>
10763
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
8 #include <stdlib.h>
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
9 #include <string.h>
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
10 #include <fcntl.h>
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
11 #include <unistd.h>
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
12 #include <errno.h>
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
13
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
14 #include <sys/mman.h>
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
15 #include <sys/ioctl.h>
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
16 #include <linux/fb.h>
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
17
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
18 #include "config.h"
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
19 #include "video_out.h"
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
20 #include "video_out_internal.h"
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
21 #include "fastmemcpy.h"
11412
ec3dac7d17a0 Warning fixes (approved by A'rpi).
rathann
parents: 11055
diff changeset
22 #include "sub.h"
10763
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
23 #include "mp_msg.h"
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
24
25216
3aee342be929 Make vo info structs const
reimar
parents: 23457
diff changeset
25 static const vo_info_t info = {
10763
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
26 "Framebuffer Device",
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
27 "fbdev2",
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
28 "Joey Parrish <joey@nicewarrior.org>",
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
29 ""
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
30 };
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
31
25220
c9e9ac2008c2 Mark the vo_functions_t definitions as const where possible.
reimar
parents: 25216
diff changeset
32 const LIBVO_EXTERN(fbdev2)
10763
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
33
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
34 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
35 {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
36 p->bits_per_pixel = (bpp + 1) & ~1;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
37 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
38 p->transp.offset = p->transp.length = 0;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
39 p->blue.offset = 0;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
40 switch (bpp) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
41 case 32:
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
42 p->transp.offset = 24;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
43 p->transp.length = 8;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
44 case 24:
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
45 p->red.offset = 16;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
46 p->red.length = 8;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
47 p->green.offset = 8;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
48 p->green.length = 8;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
49 p->blue.length = 8;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
50 break;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
51 case 16:
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
52 p->red.offset = 11;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
53 p->green.length = 6;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
54 p->red.length = 5;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
55 p->green.offset = 5;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
56 p->blue.length = 5;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
57 break;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
58 case 15:
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
59 p->red.offset = 10;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
60 p->green.length = 5;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
61 p->red.length = 5;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
62 p->green.offset = 5;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
63 p->blue.length = 5;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
64 break;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
65 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
66 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
67
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
68 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
69 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
70 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
71 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
72 static struct fb_fix_screeninfo fb_finfo; // fixed info
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
73 static struct fb_var_screeninfo fb_vinfo; // variable info
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
74 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
75 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
76 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
77 static int fb_cmap_changed = 0; // to restore map
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
78 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
79 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
80 static size_t fb_size; // size of frame_buffer
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
81 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
82 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
83 unsigned char *srca, int stride, unsigned char *dst,
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
84 int dstride);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
85
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
86 static uint8_t *next_frame = NULL; // for double buffering
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
87 static int in_width;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
88 static int in_height;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
89 static int out_width;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
90 static int out_height;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
91
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
92 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
93 {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
94 int i, cols, rcols, gcols, bcols;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
95 uint16_t *red, *green, *blue;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
96 struct fb_cmap *cmap;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
97
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
98 rcols = 1 << var->red.length;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
99 gcols = 1 << var->green.length;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
100 bcols = 1 << var->blue.length;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
101
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
102 /* Make our palette the length of the deepest color */
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
103 cols = (rcols > gcols ? rcols : gcols);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
104 cols = (cols > bcols ? cols : bcols);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
105
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
106 red = malloc(cols * sizeof(red[0]));
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
107 if(!red) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
108 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
109 return NULL;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
110 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
111 for(i=0; i< rcols; i++)
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
112 red[i] = (65535/(rcols-1)) * i;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
113
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
114 green = malloc(cols * sizeof(green[0]));
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
115 if(!green) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
116 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
117 free(red);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
118 return NULL;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
119 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
120 for(i=0; i< gcols; i++)
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
121 green[i] = (65535/(gcols-1)) * i;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
122
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
123 blue = malloc(cols * sizeof(blue[0]));
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
124 if(!blue) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
125 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
126 free(red);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
127 free(green);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
128 return NULL;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
129 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
130 for(i=0; i< bcols; i++)
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
131 blue[i] = (65535/(bcols-1)) * i;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
132
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
133 cmap = malloc(sizeof(struct fb_cmap));
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
134 if(!cmap) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
135 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
136 free(red);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
137 free(green);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
138 free(blue);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
139 return NULL;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
140 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
141 cmap->start = 0;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
142 cmap->transp = 0;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
143 cmap->len = cols;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
144 cmap->red = red;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
145 cmap->blue = blue;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
146 cmap->green = green;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
147 cmap->transp = NULL;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
148
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
149 return cmap;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
150 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
151
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
152 static int fb_preinit(int reset)
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
153 {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
154 static int fb_preinit_done = 0;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
155 static int fb_err = -1;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
156
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
157 if (reset) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
158 fb_preinit_done = 0;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
159 return 0;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
160 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
161
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
162 if (fb_preinit_done)
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
163 return fb_err;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
164 fb_preinit_done = 1;
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 if (!fb_dev_name && !(fb_dev_name = getenv("FRAMEBUFFER")))
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
167 fb_dev_name = strdup("/dev/fb0");
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 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
170
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
171 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
172 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
173 goto err_out;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
174 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
175 if (ioctl(fb_dev_fd, FBIOGET_VSCREENINFO, &fb_vinfo)) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
176 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
177 goto err_out;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
178 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
179 fb_orig_vinfo = fb_vinfo;
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 fb_bpp = fb_vinfo.bits_per_pixel;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
182
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
183 /* 16 and 15 bpp is reported as 16 bpp */
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
184 if (fb_bpp == 16)
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
185 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
186 fb_vinfo.blue.length;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
187
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
188 fb_err = 0;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
189 return 0;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
190 err_out:
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
191 if (fb_dev_fd >= 0) close(fb_dev_fd);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
192 fb_dev_fd = -1;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
193 fb_err = -1;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
194 return -1;
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
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
197 static int preinit(const char *subdevice)
10763
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
198 {
11055
497104408c30 correct handling of subdevice, -fb device is obsoleted
alex
parents: 10763
diff changeset
199 if (subdevice)
497104408c30 correct handling of subdevice, -fb device is obsoleted
alex
parents: 10763
diff changeset
200 {
497104408c30 correct handling of subdevice, -fb device is obsoleted
alex
parents: 10763
diff changeset
201 if (fb_dev_name) free(fb_dev_name);
497104408c30 correct handling of subdevice, -fb device is obsoleted
alex
parents: 10763
diff changeset
202 fb_dev_name = strdup(subdevice);
497104408c30 correct handling of subdevice, -fb device is obsoleted
alex
parents: 10763
diff changeset
203 }
10763
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
204 return fb_preinit(0);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
205 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
206
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
207 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
208 uint32_t d_height, uint32_t flags, char *title,
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
209 uint32_t format)
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 struct fb_cmap *cmap;
15212
05aa13cdf92f replace VO and VF numeric flags with #defined identifiers
henry
parents: 14094
diff changeset
212 int fs = flags & VOFLAG_FULLSCREEN;
10763
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
213
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
214 out_width = width;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
215 out_height = height;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
216 in_width = width;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
217 in_height = height;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
218
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
219 if (fs) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
220 out_width = fb_vinfo.xres;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
221 out_height = fb_vinfo.yres;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
222 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
223
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
224 if (out_width < in_width || out_height < in_height) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
225 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
226 out_width, out_height, in_width, in_height);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
227 return 1;
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
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
230 switch (fb_bpp) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
231 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
232 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
233 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
234 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
235 default: return 1;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
236 }
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 if (vo_config_count == 0) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
239 if (ioctl(fb_dev_fd, FBIOGET_FSCREENINFO, &fb_finfo)) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
240 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
241 return 1;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
242 }
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 if (fb_finfo.type != FB_TYPE_PACKED_PIXELS) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
245 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
246 return 1;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
247 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
248
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
249 switch (fb_finfo.visual) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
250 case FB_VISUAL_TRUECOLOR:
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
251 break;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
252 case FB_VISUAL_DIRECTCOLOR:
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
253 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
254 if (ioctl(fb_dev_fd, FBIOGETCMAP, &fb_oldcmap)) {
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 cmap: %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 if (!(cmap = make_directcolor_cmap(&fb_vinfo)))
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
259 return 1;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
260 if (ioctl(fb_dev_fd, FBIOPUTCMAP, cmap)) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
261 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
262 return 1;
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 fb_cmap_changed = 1;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
265 free(cmap->red);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
266 free(cmap->green);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
267 free(cmap->blue);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
268 free(cmap);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
269 break;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
270 default:
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
271 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
272 return 1;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
273 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
274
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
275 fb_size = fb_finfo.smem_len;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
276 fb_line_len = fb_finfo.line_length;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
277 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
278 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
279 return 1;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
280 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
281 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
282
17728
fe2520f6039e When centering a video with odd width, be sure to start on a pixel boundary.
pacman
parents: 17637
diff changeset
283 center = frame_buffer +
fe2520f6039e When centering a video with odd width, be sure to start on a pixel boundary.
pacman
parents: 17637
diff changeset
284 ( (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
285 ( (out_height - in_height) / 2 ) * fb_line_len;
10763
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
286
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
287 #ifndef USE_CONVERT2FB
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
288 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
289 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
290 return 1;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
291 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
292 #endif
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
293 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
294
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
295 return 0;
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
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
298 static int query_format(uint32_t format)
10763
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
299 {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
300 // open the device, etc.
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
301 if (fb_preinit(0)) return 0;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
302 if ((format & IMGFMT_BGR_MASK) == IMGFMT_BGR) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
303 int fb_target_bpp = format & 0xff;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
304 set_bpp(&fb_vinfo, fb_target_bpp);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
305 fb_vinfo.xres_virtual = fb_vinfo.xres;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
306 fb_vinfo.yres_virtual = fb_vinfo.yres;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
307 if (ioctl(fb_dev_fd, FBIOPUT_VSCREENINFO, &fb_vinfo)) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
308 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
309 return 0;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
310 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
311 fb_pixel_size = fb_vinfo.bits_per_pixel / 8;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
312 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
313 fb_vinfo.blue.length + fb_vinfo.transp.length;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
314 if (fb_bpp == fb_target_bpp)
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
315 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
316 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
317 return 0;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
318 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
319
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
320 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
321 unsigned char *srca, int stride)
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
322 {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
323 unsigned char *dst;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
324 int dstride;
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 #ifdef USE_CONVERT2FB
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
327 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
328 dstride = fb_line_len;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
329 #else
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
330 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
331 dstride = in_width * fb_pixel_size;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
332 #endif
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
333 (*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
334 }
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 static void draw_osd(void)
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 vo_draw_text(in_width, in_height, draw_alpha);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
339 }
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 // 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
342 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
343
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
344 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
345 {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
346 uint8_t *in = src[0];
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
347 #ifdef USE_CONVERT2FB
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
348 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
349 int next = fb_line_len;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
350 #else
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
351 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
352 int next = in_width * fb_pixel_size;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
353 #endif
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
354 int i;
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 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
357 fast_memcpy(dest, in, w * fb_pixel_size);
10763
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
358 dest += next;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
359 in += stride[0];
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 return 0;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
362 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
363
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
364 static void check_events(void)
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
365 {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
366 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
367
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
368 static void flip_page(void)
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
369 {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
370 #ifndef USE_CONVERT2FB
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
371 int i, out_offset = 0, in_offset = 0;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
372
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
373 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
374 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
375 in_width * fb_pixel_size);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
376 out_offset += fb_line_len;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
377 in_offset += in_width * fb_pixel_size;
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 #endif
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 static void uninit(void)
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
383 {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
384 if (fb_cmap_changed) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
385 if (ioctl(fb_dev_fd, FBIOPUTCMAP, &fb_oldcmap))
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
386 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
387 fb_cmap_changed = 0;
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 if(next_frame) free(next_frame);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
390 if (fb_dev_fd >= 0) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
391 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
392 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
393 close(fb_dev_fd);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
394 fb_dev_fd = -1;
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 if(frame_buffer) munmap(frame_buffer, fb_size);
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
397 next_frame = frame_buffer = NULL;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
398 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
399 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
400
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
401 static int control(uint32_t request, void *data, ...)
10763
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 switch (request) {
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
404 case VOCTRL_QUERY_FORMAT:
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
405 return query_format(*((uint32_t*)data));
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
406 }
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
407 return VO_NOTIMPL;
7436a53876b0 vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff changeset
408 }