Mercurial > mplayer.hg
annotate libvo/vo_fbdev2.c @ 34309:119af6360b00
Discard frames where the size does not match the AVCodecContext width/height.
This avoids possible crashes on video size changes. The problem
is that we reinitialize the vo on get_buffer but due to codec
delay libavcodec might still return frames with the old size
afterwards, which the vo might no longer be able to handle.
Ideally libavcodec should not show this behaviour, since it
requires that any application using DR1 can handle frames of
different sizes simultaneously - which seems a bit extreme.
author | reimar |
---|---|
date | Mon, 05 Dec 2011 18:08:29 +0000 |
parents | ddb45e9443ec |
children | b291f44d864a |
rev | line source |
---|---|
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
1 /* |
28446
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
2 * video driver for framebuffer device |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
3 * copyright (C) 2003 Joey Parrish <joey@nicewarrior.org> |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
4 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
5 * This file is part of MPlayer. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
6 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
7 * MPlayer is free software; you can redistribute it and/or modify |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
8 * it under the terms of the GNU General Public License as published by |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
9 * the Free Software Foundation; either version 2 of the License, or |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
10 * (at your option) any later version. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
11 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
12 * MPlayer is distributed in the hope that it will be useful, |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
15 * GNU General Public License for more details. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
16 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
17 * You should have received a copy of the GNU General Public License along |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
18 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
25220
diff
changeset
|
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
20 */ |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
21 |
11412 | 22 #include <stdio.h> |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
23 #include <stdlib.h> |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
24 #include <string.h> |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
25 #include <fcntl.h> |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
26 #include <unistd.h> |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
27 #include <errno.h> |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
28 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
29 #include <sys/mman.h> |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
30 #include <sys/ioctl.h> |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
31 #include <linux/fb.h> |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
32 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
33 #include "config.h" |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
34 #include "video_out.h" |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
35 #include "video_out_internal.h" |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
36 #include "fastmemcpy.h" |
32467 | 37 #include "sub/sub.h" |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
38 #include "mp_msg.h" |
33211
77a9d13fa30e
Add -geometry support reusing common code to fbdev2.
reimar
parents:
32537
diff
changeset
|
39 #include "aspect.h" |
33212 | 40 #include "libavutil/common.h" |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
41 |
25216 | 42 static const vo_info_t info = { |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
43 "Framebuffer Device", |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
44 "fbdev2", |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
45 "Joey Parrish <joey@nicewarrior.org>", |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
46 "" |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
47 }; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
48 |
25220
c9e9ac2008c2
Mark the vo_functions_t definitions as const where possible.
reimar
parents:
25216
diff
changeset
|
49 const LIBVO_EXTERN(fbdev2) |
10763
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 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
|
52 { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
53 p->bits_per_pixel = (bpp + 1) & ~1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
54 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
|
55 p->transp.offset = p->transp.length = 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
56 p->blue.offset = 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
57 switch (bpp) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
58 case 32: |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
59 p->transp.offset = 24; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
60 p->transp.length = 8; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
61 case 24: |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
62 p->red.offset = 16; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
63 p->red.length = 8; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
64 p->green.offset = 8; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
65 p->green.length = 8; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
66 p->blue.length = 8; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
67 break; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
68 case 16: |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
69 p->red.offset = 11; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
70 p->green.length = 6; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
71 p->red.length = 5; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
72 p->green.offset = 5; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
73 p->blue.length = 5; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
74 break; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
75 case 15: |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
76 p->red.offset = 10; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
77 p->green.length = 5; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
78 p->red.length = 5; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
79 p->green.offset = 5; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
80 p->blue.length = 5; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
81 break; |
31082
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30702
diff
changeset
|
82 case 12: |
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30702
diff
changeset
|
83 p->red.offset = 8; |
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30702
diff
changeset
|
84 p->green.length = 4; |
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30702
diff
changeset
|
85 p->red.length = 4; |
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30702
diff
changeset
|
86 p->green.offset = 4; |
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30702
diff
changeset
|
87 p->blue.length = 4; |
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30702
diff
changeset
|
88 break; |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
89 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
90 } |
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 char *fb_dev_name = NULL; // such as /dev/fb0 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
93 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
|
94 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
|
95 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
|
96 static struct fb_fix_screeninfo fb_finfo; // fixed info |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
97 static struct fb_var_screeninfo fb_vinfo; // variable info |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
98 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
|
99 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
|
100 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
|
101 static int fb_cmap_changed = 0; // to restore map |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
102 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
|
103 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
|
104 static size_t fb_size; // size of frame_buffer |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
105 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
|
106 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
|
107 unsigned char *srca, int stride, unsigned char *dst, |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
108 int dstride); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
109 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
110 static uint8_t *next_frame = NULL; // for double buffering |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
111 static int in_width; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
112 static int in_height; |
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 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
|
115 { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
116 int i, cols, rcols, gcols, bcols; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
117 uint16_t *red, *green, *blue; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
118 struct fb_cmap *cmap; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28446
diff
changeset
|
119 |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
120 rcols = 1 << var->red.length; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
121 gcols = 1 << var->green.length; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
122 bcols = 1 << var->blue.length; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28446
diff
changeset
|
123 |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
124 /* Make our palette the length of the deepest color */ |
33213 | 125 cols = FFMAX3(rcols, gcols, bcols); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28446
diff
changeset
|
126 |
33215
4c7b564719e0
Simplify colormap generation code, avoid some mallocs and add frees
reimar
parents:
33213
diff
changeset
|
127 red = malloc(3 * cols * sizeof(red[0])); |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
128 if(!red) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
129 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
|
130 return NULL; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
131 } |
33215
4c7b564719e0
Simplify colormap generation code, avoid some mallocs and add frees
reimar
parents:
33213
diff
changeset
|
132 green = red + cols; |
4c7b564719e0
Simplify colormap generation code, avoid some mallocs and add frees
reimar
parents:
33213
diff
changeset
|
133 blue = green + cols; |
4c7b564719e0
Simplify colormap generation code, avoid some mallocs and add frees
reimar
parents:
33213
diff
changeset
|
134 for (i = 0; i < cols; i++) { |
4c7b564719e0
Simplify colormap generation code, avoid some mallocs and add frees
reimar
parents:
33213
diff
changeset
|
135 red[i] = (65535/(rcols-1)) * i; |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
136 green[i] = (65535/(gcols-1)) * i; |
33215
4c7b564719e0
Simplify colormap generation code, avoid some mallocs and add frees
reimar
parents:
33213
diff
changeset
|
137 blue[i] = (65535/(bcols-1)) * i; |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
138 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28446
diff
changeset
|
139 |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
140 cmap = malloc(sizeof(struct fb_cmap)); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
141 if(!cmap) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
142 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
|
143 free(red); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
144 return NULL; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
145 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
146 cmap->start = 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
147 cmap->transp = 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
148 cmap->len = cols; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
149 cmap->red = red; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
150 cmap->blue = blue; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
151 cmap->green = green; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
152 cmap->transp = NULL; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28446
diff
changeset
|
153 |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
154 return cmap; |
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 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
157 static int fb_preinit(int reset) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
158 { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
159 static int fb_preinit_done = 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
160 static int fb_err = -1; |
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 (reset) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
163 fb_preinit_done = 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
164 return 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
165 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28446
diff
changeset
|
166 |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
167 if (fb_preinit_done) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
168 return fb_err; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
169 fb_preinit_done = 1; |
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_name && !(fb_dev_name = getenv("FRAMEBUFFER"))) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
172 fb_dev_name = strdup("/dev/fb0"); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
173 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
174 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
|
175 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
176 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
|
177 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
|
178 goto err_out; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
179 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
180 if (ioctl(fb_dev_fd, FBIOGET_VSCREENINFO, &fb_vinfo)) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
181 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
|
182 goto err_out; |
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 fb_orig_vinfo = fb_vinfo; |
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 fb_bpp = fb_vinfo.bits_per_pixel; |
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 /* 16 and 15 bpp is reported as 16 bpp */ |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
189 if (fb_bpp == 16) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
190 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
|
191 fb_vinfo.blue.length; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
192 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
193 fb_err = 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
194 return 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
195 err_out: |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
196 if (fb_dev_fd >= 0) close(fb_dev_fd); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
197 fb_dev_fd = -1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
198 fb_err = -1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
199 return -1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
200 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
201 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
202 static int preinit(const char *subdevice) |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
203 { |
11055
497104408c30
correct handling of subdevice, -fb device is obsoleted
alex
parents:
10763
diff
changeset
|
204 if (subdevice) |
497104408c30
correct handling of subdevice, -fb device is obsoleted
alex
parents:
10763
diff
changeset
|
205 { |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
206 free(fb_dev_name); |
11055
497104408c30
correct handling of subdevice, -fb device is obsoleted
alex
parents:
10763
diff
changeset
|
207 fb_dev_name = strdup(subdevice); |
497104408c30
correct handling of subdevice, -fb device is obsoleted
alex
parents:
10763
diff
changeset
|
208 } |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
209 return fb_preinit(0); |
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 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
|
213 uint32_t d_height, uint32_t flags, char *title, |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
214 uint32_t format) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
215 { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
216 struct fb_cmap *cmap; |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
14094
diff
changeset
|
217 int fs = flags & VOFLAG_FULLSCREEN; |
33212 | 218 int x_offset = vo_dx + (d_width - width ) / 2; |
219 int y_offset = vo_dy + (d_height - height) / 2; | |
220 x_offset = av_clip(x_offset, 0, fb_vinfo.xres - width); | |
221 y_offset = av_clip(y_offset, 0, fb_vinfo.yres - height); | |
10763
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 in_width = width; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
224 in_height = height; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
225 |
33211
77a9d13fa30e
Add -geometry support reusing common code to fbdev2.
reimar
parents:
32537
diff
changeset
|
226 if (fb_vinfo.xres < in_width || fb_vinfo.yres < in_height) { |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
227 mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] Screensize is smaller than video size (%dx%d < %dx%d)\n", |
33211
77a9d13fa30e
Add -geometry support reusing common code to fbdev2.
reimar
parents:
32537
diff
changeset
|
228 fb_vinfo.xres, fb_vinfo.yres, in_width, in_height); |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
229 return 1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
230 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
231 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
232 switch (fb_bpp) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
233 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
|
234 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
|
235 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
|
236 case 15: draw_alpha_p = vo_draw_alpha_rgb15; break; |
31082
92f88bb315c5
Add support for 12-bit color mode on framebuffer devices.
cehoyos
parents:
30702
diff
changeset
|
237 case 12: draw_alpha_p = vo_draw_alpha_rgb12; break; |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
238 default: return 1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
239 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
240 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
241 if (vo_config_count == 0) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
242 if (ioctl(fb_dev_fd, FBIOGET_FSCREENINFO, &fb_finfo)) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
243 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
|
244 return 1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
245 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
246 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
247 if (fb_finfo.type != FB_TYPE_PACKED_PIXELS) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
248 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
|
249 return 1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
250 } |
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 switch (fb_finfo.visual) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
253 case FB_VISUAL_TRUECOLOR: |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
254 break; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
255 case FB_VISUAL_DIRECTCOLOR: |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
256 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
|
257 if (ioctl(fb_dev_fd, FBIOGETCMAP, &fb_oldcmap)) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
258 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
|
259 return 1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
260 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
261 if (!(cmap = make_directcolor_cmap(&fb_vinfo))) |
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 if (ioctl(fb_dev_fd, FBIOPUTCMAP, cmap)) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
264 mp_msg(MSGT_VO, MSGL_ERR, "[fbdev2] can't put cmap: %s\n", strerror(errno)); |
33215
4c7b564719e0
Simplify colormap generation code, avoid some mallocs and add frees
reimar
parents:
33213
diff
changeset
|
265 free(cmap->red); |
4c7b564719e0
Simplify colormap generation code, avoid some mallocs and add frees
reimar
parents:
33213
diff
changeset
|
266 free(cmap); |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
267 return 1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
268 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
269 fb_cmap_changed = 1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
270 free(cmap->red); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
271 free(cmap); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
272 break; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
273 default: |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
274 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
|
275 return 1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
276 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
277 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
278 fb_size = fb_finfo.smem_len; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
279 fb_line_len = fb_finfo.line_length; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
280 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
|
281 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
|
282 return 1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
283 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
284 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
285 |
17728
fe2520f6039e
When centering a video with odd width, be sure to start on a pixel boundary.
pacman
parents:
17637
diff
changeset
|
286 center = frame_buffer + |
33212 | 287 x_offset * fb_pixel_size + |
288 y_offset * fb_line_len; | |
10763
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 #ifndef USE_CONVERT2FB |
30702 | 291 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
|
292 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
|
293 return 1; |
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 #endif |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
296 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
|
297 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
298 return 0; |
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 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
301 static int query_format(uint32_t format) |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
302 { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
303 // open the device, etc. |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
304 if (fb_preinit(0)) return 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
305 if ((format & IMGFMT_BGR_MASK) == IMGFMT_BGR) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
306 int fb_target_bpp = format & 0xff; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
307 set_bpp(&fb_vinfo, fb_target_bpp); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
308 fb_vinfo.xres_virtual = fb_vinfo.xres; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
309 fb_vinfo.yres_virtual = fb_vinfo.yres; |
30207 | 310 if (ioctl(fb_dev_fd, FBIOPUT_VSCREENINFO, &fb_vinfo)) |
311 // Needed for Intel framebuffer with 32 bpp | |
312 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
|
313 if (ioctl(fb_dev_fd, FBIOPUT_VSCREENINFO, &fb_vinfo)) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
314 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
|
315 return 0; |
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 fb_pixel_size = fb_vinfo.bits_per_pixel / 8; |
30207 | 318 fb_bpp = fb_vinfo.bits_per_pixel; |
319 if (fb_bpp == 16) | |
320 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
|
321 if (fb_bpp == fb_target_bpp) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
322 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
|
323 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
324 return 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
325 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
326 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
327 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
|
328 unsigned char *srca, int stride) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
329 { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
330 unsigned char *dst; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
331 int dstride; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
332 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
333 #ifdef USE_CONVERT2FB |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
334 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
|
335 dstride = fb_line_len; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
336 #else |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
337 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
|
338 dstride = in_width * fb_pixel_size; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
339 #endif |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
340 (*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
|
341 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
342 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
343 static void draw_osd(void) |
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 vo_draw_text(in_width, in_height, draw_alpha); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
346 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
347 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
348 // 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
|
349 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
|
350 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
351 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
|
352 { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
353 uint8_t *in = src[0]; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
354 #ifdef USE_CONVERT2FB |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
355 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
|
356 int next = fb_line_len; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
357 #else |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
358 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
|
359 int next = in_width * fb_pixel_size; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
360 #endif |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
361 |
33216 | 362 memcpy_pic(dest, in, w * fb_pixel_size, h, next, stride[0]); |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
363 return 0; |
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 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
366 static void check_events(void) |
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 } |
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 static void flip_page(void) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
371 { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
372 #ifndef USE_CONVERT2FB |
33216 | 373 int out_offset = 0, in_offset = 0; |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
374 |
33216 | 375 memcpy_pic(center + out_offset, next_frame + in_offset, |
376 in_width * fb_pixel_size, in_height, | |
377 fb_line_len, in_width * fb_pixel_size); | |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
378 #endif |
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 |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
381 static void uninit(void) |
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 if (fb_cmap_changed) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
384 if (ioctl(fb_dev_fd, FBIOPUTCMAP, &fb_oldcmap)) |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
385 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
|
386 fb_cmap_changed = 0; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
387 } |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
388 free(next_frame); |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
389 if (fb_dev_fd >= 0) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
390 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
|
391 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
|
392 close(fb_dev_fd); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
393 fb_dev_fd = -1; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
394 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
395 if(frame_buffer) munmap(frame_buffer, fb_size); |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
396 next_frame = frame_buffer = NULL; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
397 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
|
398 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
399 |
33305
ddb45e9443ec
Remove the variable arguments from the libvo control() functions.
iive
parents:
33216
diff
changeset
|
400 static int control(uint32_t request, void *data) |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
401 { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
402 switch (request) { |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
403 case VOCTRL_QUERY_FORMAT: |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
404 return query_format(*((uint32_t*)data)); |
33211
77a9d13fa30e
Add -geometry support reusing common code to fbdev2.
reimar
parents:
32537
diff
changeset
|
405 case VOCTRL_UPDATE_SCREENINFO: |
77a9d13fa30e
Add -geometry support reusing common code to fbdev2.
reimar
parents:
32537
diff
changeset
|
406 vo_screenwidth = fb_vinfo.xres; |
77a9d13fa30e
Add -geometry support reusing common code to fbdev2.
reimar
parents:
32537
diff
changeset
|
407 vo_screenheight = fb_vinfo.yres; |
77a9d13fa30e
Add -geometry support reusing common code to fbdev2.
reimar
parents:
32537
diff
changeset
|
408 aspect_save_screenres(vo_screenwidth, vo_screenheight); |
77a9d13fa30e
Add -geometry support reusing common code to fbdev2.
reimar
parents:
32537
diff
changeset
|
409 return VO_TRUE; |
10763
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
410 } |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
411 return VO_NOTIMPL; |
7436a53876b0
vo_fbdev2 written by Joey Parrish with some minor modifications
alex
parents:
diff
changeset
|
412 } |