Mercurial > mplayer.hg
annotate libvo/vo_directfb2.c @ 28992:947ef23ba798
Test if create_vdp_decoder() might succeed by calling it from config()
with a small value for max_reference_frames.
This does not make automatic recovery by using software decoder possible,
but lets MPlayer fail more graciously on - actually existing - buggy
hardware that does not support certain H264 widths when using
hardware accelerated decoding (784, 864, 944, 1024, 1808, 1888 pixels on
NVIDIA G98) and if the user tries to hardware-decode more samples at
the same time than supported.
Might break playback of H264 Intra-Only samples on hardware with very
little video memory.
author | cehoyos |
---|---|
date | Sat, 21 Mar 2009 20:11:05 +0000 |
parents | 56eee6ffba9b |
children | 0f1b5b68af32 |
rev | line source |
---|---|
6952 | 1 /* |
27582
34d3e0c8487a
Upgrade license of LGPL 2 or later files to LGPL 2.1 or later.
diego
parents:
26755
diff
changeset
|
2 * MPlayer video driver for DirectFramebuffer device |
34d3e0c8487a
Upgrade license of LGPL 2 or later files to LGPL 2.1 or later.
diego
parents:
26755
diff
changeset
|
3 * |
34d3e0c8487a
Upgrade license of LGPL 2 or later files to LGPL 2.1 or later.
diego
parents:
26755
diff
changeset
|
4 * copyright (C) 2002 Jiri Svoboda <Jiri.Svoboda@seznam.cz> |
34d3e0c8487a
Upgrade license of LGPL 2 or later files to LGPL 2.1 or later.
diego
parents:
26755
diff
changeset
|
5 * |
34d3e0c8487a
Upgrade license of LGPL 2 or later files to LGPL 2.1 or later.
diego
parents:
26755
diff
changeset
|
6 * based on vo_directfb2.c |
34d3e0c8487a
Upgrade license of LGPL 2 or later files to LGPL 2.1 or later.
diego
parents:
26755
diff
changeset
|
7 * |
34d3e0c8487a
Upgrade license of LGPL 2 or later files to LGPL 2.1 or later.
diego
parents:
26755
diff
changeset
|
8 * This file is part of MPlayer. |
34d3e0c8487a
Upgrade license of LGPL 2 or later files to LGPL 2.1 or later.
diego
parents:
26755
diff
changeset
|
9 * |
34d3e0c8487a
Upgrade license of LGPL 2 or later files to LGPL 2.1 or later.
diego
parents:
26755
diff
changeset
|
10 * MPlayer is free software; you can redistribute it and/or |
34d3e0c8487a
Upgrade license of LGPL 2 or later files to LGPL 2.1 or later.
diego
parents:
26755
diff
changeset
|
11 * modify it under the terms of the GNU Lesser General Public |
34d3e0c8487a
Upgrade license of LGPL 2 or later files to LGPL 2.1 or later.
diego
parents:
26755
diff
changeset
|
12 * License as published by the Free Software Foundation; either |
34d3e0c8487a
Upgrade license of LGPL 2 or later files to LGPL 2.1 or later.
diego
parents:
26755
diff
changeset
|
13 * version 2.1 of the License, or (at your option) any later version. |
34d3e0c8487a
Upgrade license of LGPL 2 or later files to LGPL 2.1 or later.
diego
parents:
26755
diff
changeset
|
14 * |
34d3e0c8487a
Upgrade license of LGPL 2 or later files to LGPL 2.1 or later.
diego
parents:
26755
diff
changeset
|
15 * MPlayer is distributed in the hope that it will be useful, |
34d3e0c8487a
Upgrade license of LGPL 2 or later files to LGPL 2.1 or later.
diego
parents:
26755
diff
changeset
|
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
34d3e0c8487a
Upgrade license of LGPL 2 or later files to LGPL 2.1 or later.
diego
parents:
26755
diff
changeset
|
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
34d3e0c8487a
Upgrade license of LGPL 2 or later files to LGPL 2.1 or later.
diego
parents:
26755
diff
changeset
|
18 * Lesser General Public License for more details. |
34d3e0c8487a
Upgrade license of LGPL 2 or later files to LGPL 2.1 or later.
diego
parents:
26755
diff
changeset
|
19 * |
34d3e0c8487a
Upgrade license of LGPL 2 or later files to LGPL 2.1 or later.
diego
parents:
26755
diff
changeset
|
20 * You should have received a copy of the GNU Lesser General Public License |
34d3e0c8487a
Upgrade license of LGPL 2 or later files to LGPL 2.1 or later.
diego
parents:
26755
diff
changeset
|
21 * along with MPlayer; if not, write to the Free Software Foundation, Inc., |
34d3e0c8487a
Upgrade license of LGPL 2 or later files to LGPL 2.1 or later.
diego
parents:
26755
diff
changeset
|
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
34d3e0c8487a
Upgrade license of LGPL 2 or later files to LGPL 2.1 or later.
diego
parents:
26755
diff
changeset
|
23 */ |
6952 | 24 |
25 // directfb includes | |
26 | |
27 #include <directfb.h> | |
28 | |
20112
5deee6e61057
Fix DirectFB version check. The old code simply concatenated the
syrjala
parents:
19614
diff
changeset
|
29 #define DFB_VERSION(a,b,c) (((a)<<16)|((b)<<8)|(c)) |
5deee6e61057
Fix DirectFB version check. The old code simply concatenated the
syrjala
parents:
19614
diff
changeset
|
30 |
6952 | 31 // other things |
32 | |
33 #include <stdio.h> | |
34 #include <stdlib.h> | |
35 #include <string.h> | |
36 | |
8137
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
37 #ifdef __linux__ |
6952 | 38 #include <sys/kd.h> |
8137
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
39 #else |
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
40 #include <linux/kd.h> |
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
41 #endif |
6952 | 42 |
43 #include "config.h" | |
44 #include "video_out.h" | |
45 #include "video_out_internal.h" | |
46 #include "fastmemcpy.h" | |
47 #include "sub.h" | |
9937 | 48 #include "mp_msg.h" |
6952 | 49 #include "aspect.h" |
15750 | 50 #include "subopt-helper.h" |
22823
98eaf29b5dee
Code cleanup: don't include a .c file in mplayer.c and fix a few
rathann
parents:
20112
diff
changeset
|
51 #include "mp_fifo.h" |
6952 | 52 |
53 #ifndef min | |
54 #define min(x,y) (((x)<(y))?(x):(y)) | |
55 #endif | |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
56 |
20112
5deee6e61057
Fix DirectFB version check. The old code simply concatenated the
syrjala
parents:
19614
diff
changeset
|
57 #if DIRECTFBVERSION > DFB_VERSION(0,9,17) |
9937 | 58 // triple buffering |
59 #define TRIPLE 1 | |
60 #endif | |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
61 |
25216 | 62 static const vo_info_t info = { |
6952 | 63 "Direct Framebuffer Device", |
64 "directfb", | |
65 "Jiri Svoboda Jiri.Svoboda@seznam.cz", | |
8137
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
66 "v 2.0 (for DirectFB version >=0.9.13)" |
6952 | 67 }; |
68 | |
25220
c9e9ac2008c2
Mark the vo_functions_t definitions as const where possible.
reimar
parents:
25216
diff
changeset
|
69 const LIBVO_EXTERN(directfb) |
8148
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
8137
diff
changeset
|
70 |
6952 | 71 /****************************** |
72 * vo_directfb globals * | |
73 ******************************/ | |
74 | |
75 #define DFBCHECK(x...) \ | |
76 { \ | |
77 DFBResult err = x; \ | |
78 \ | |
79 if (err != DFB_OK) \ | |
80 { \ | |
81 fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \ | |
82 DirectFBErrorFatal( #x, err ); \ | |
83 } \ | |
84 } | |
85 | |
86 /* | |
87 * filled by preinit | |
88 */ | |
89 | |
90 // main DirectFB handle | |
91 static IDirectFB *dfb = NULL; | |
92 // keyboard handle | |
93 static IDirectFBInputDevice *keyboard = NULL; | |
94 // A buffer for input events. | |
95 static IDirectFBEventBuffer *buffer = NULL; | |
96 | |
97 /* | |
98 * filled during config | |
99 */ | |
100 | |
101 // handle of used layer | |
102 static IDirectFBDisplayLayer *layer = NULL; | |
103 // surface of used layer | |
104 static IDirectFBSurface *primary = NULL; | |
105 static int primarylocked = 0; | |
106 // handle of temporary surface (if used) | |
107 static IDirectFBSurface *frame = NULL; | |
108 static int framelocked = 0; | |
109 // flipping mode flag (layer/surface) | |
110 static int flipping = 0; | |
111 // scaling flag | |
112 static int stretch = 0; | |
24950 | 113 // picture position |
6952 | 114 static int xoffset=0,yoffset=0; |
115 // picture size | |
116 static int out_width=0,out_height=0; | |
117 // frame/primary size | |
118 static int width=0,height=0; | |
119 // frame primary format | |
120 DFBSurfacePixelFormat pixel_format; | |
121 /* | |
122 static void (*draw_alpha_p)(int w, int h, unsigned char *src, | |
123 unsigned char *srca, int stride, unsigned char *dst, | |
124 int dstride); | |
125 */ | |
126 | |
127 /****************************** | |
128 * cmd line parameteres * | |
129 ******************************/ | |
130 | |
131 /* command line/config file options */ | |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
132 static int layer_id = -1; |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
133 static int buffer_mode = 1; |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
134 static int use_input = 1; |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
135 static int field_parity = -1; |
6952 | 136 |
137 /****************************** | |
138 * implementation * | |
139 ******************************/ | |
140 | |
22886 | 141 void unlock(void) { |
6952 | 142 if (frame && framelocked) frame->Unlock(frame); |
143 if (primary && primarylocked) primary->Unlock(primary); | |
144 } | |
145 | |
15750 | 146 static int get_parity(strarg_t *arg) { |
147 if (strargcmp(arg, "top") == 0) | |
148 return 0; | |
149 if (strargcmp(arg, "bottom") == 0) | |
150 return 1; | |
151 return -1; | |
152 } | |
153 | |
154 static int check_parity(void *arg) { | |
155 return get_parity(arg) != -1; | |
156 } | |
157 | |
158 static int get_mode(strarg_t *arg) { | |
159 if (strargcmp(arg, "single") == 0) | |
160 return 1; | |
161 if (strargcmp(arg, "double") == 0) | |
162 return 2; | |
163 if (strargcmp(arg, "triple") == 0) | |
164 return 3; | |
165 return 0; | |
166 } | |
167 | |
168 static int check_mode(void *arg) { | |
169 return get_mode(arg) != 0; | |
170 } | |
6952 | 171 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15750
diff
changeset
|
172 static int preinit(const char *arg) |
6952 | 173 { |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
174 DFBResult ret; |
15750 | 175 strarg_t mode_str = {0, NULL}; |
176 strarg_t par_str = {0, NULL}; | |
177 strarg_t dfb_params = {0, NULL}; | |
28828
56eee6ffba9b
Make data related to suboption parsing const in libvo
reimar
parents:
27582
diff
changeset
|
178 const opt_t subopts[] = { |
15750 | 179 {"input", OPT_ARG_BOOL, &use_input, NULL}, |
180 {"buffermode", OPT_ARG_STR, &mode_str, check_mode}, | |
181 {"fieldparity", OPT_ARG_STR, &par_str, check_parity}, | |
182 {"layer", OPT_ARG_INT, &layer_id, NULL}, | |
183 {"dfbopts", OPT_ARG_STR, &dfb_params, NULL}, | |
184 {NULL} | |
185 }; | |
6952 | 186 |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
187 //mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Preinit entered\n"); |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
188 |
24950 | 189 if (dfb) return 0; // we are already initialized! |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
190 |
15750 | 191 // set defaults |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
192 buffer_mode = 1 + vo_doublebuffering; // honor -double switch |
15750 | 193 layer_id = -1; |
194 use_input = 1; | |
195 field_parity = -1; | |
196 if (subopt_parse(arg, subopts) != 0) { | |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
197 mp_msg( MSGT_VO, MSGL_ERR, |
11982 | 198 "\n-vo directfb command line help:\n" |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
199 "Example: mplayer -vo directfb:layer=1:buffermode=single\n" |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
200 "\nOptions (use 'no' prefix to disable):\n" |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
201 " input Use DirectFB for keyboard input\n" |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
202 "\nOther options:\n" |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
203 " layer=n\n" |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
204 " n=0..xx Use layer with id n for output (0=primary)\n" |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
205 " buffermode=(single|double|triple)\n" |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
206 " single Use single buffering\n" |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
207 " double Use double buffering\n" |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
208 " triple Use triple buffering\n" |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
209 " fieldparity=(top|bottom)\n" |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
210 " top Top field first\n" |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
211 " bottom Bottom field first\n" |
15750 | 212 " dfbopts=<str>\n" |
213 " Specify a parameter list for DirectFB\n" | |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
214 "\n" ); |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
215 return -1; |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
216 } |
15750 | 217 if (mode_str.len) |
218 buffer_mode = get_mode(&mode_str); | |
219 if (par_str.len) | |
220 field_parity = get_parity(&par_str); | |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
221 |
8137
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
222 |
15750 | 223 if (dfb_params.len > 0) |
8137
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
224 { |
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
225 int argc = 2; |
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
226 char arg0[10] = "mplayer"; |
18878 | 227 char *arg1 = malloc(dfb_params.len + 7); |
8137
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
228 char* argv[3]; |
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
229 char ** a; |
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
230 |
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
231 a = &argv[0]; |
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
232 |
15750 | 233 strcpy(arg1, "--dfb:"); |
234 strncat(arg1, dfb_params.str, dfb_params.len); | |
8137
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
235 |
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
236 argv[0]=arg0; |
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
237 argv[1]=arg1; |
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
238 argv[2]=NULL; |
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
239 |
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
240 DFBCHECK (DirectFBInit (&argc,&a)); |
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
241 |
15750 | 242 free(arg1); |
8137
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
243 } else { |
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
244 |
6952 | 245 DFBCHECK (DirectFBInit (NULL,NULL)); |
8137
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
246 } |
6952 | 247 |
248 if (((directfb_major_version <= 0) && | |
249 (directfb_minor_version <= 9) && | |
250 (directfb_micro_version < 13))) | |
251 { | |
9937 | 252 mp_msg(MSGT_VO, MSGL_ERR,"DirectFB: Unsupported DirectFB version\n"); |
6952 | 253 return 1; |
254 } | |
255 | |
256 /* | |
257 * (set options) | |
258 */ | |
259 | |
24950 | 260 // uncomment this if you do not wish to create a new VT for DirectFB |
6952 | 261 // DFBCHECK (DirectFBSetOption ("no-vt-switch","")); |
262 | |
24950 | 263 // uncomment this if you want to allow VT switching |
6952 | 264 // DFBCHECK (DirectFBSetOption ("vt-switching","")); |
265 | |
266 // uncomment this if you want to hide gfx cursor (req dfb >=0.9.9) | |
11972
cda09732375e
removed usage of fb_dev_name, imported field parity reporting from dfbmga, fixed vsync handling in triple buffering mode
zdar
parents:
11000
diff
changeset
|
267 DFBCHECK (DirectFBSetOption ("no-cursor","")); |
6952 | 268 |
269 // bg color fix | |
270 DFBCHECK (DirectFBSetOption ("bg-color","00000000")); | |
271 | |
272 /* | |
273 * (Initialize) | |
274 */ | |
275 | |
276 DFBCHECK (DirectFBCreate (&dfb)); | |
277 | |
20112
5deee6e61057
Fix DirectFB version check. The old code simply concatenated the
syrjala
parents:
19614
diff
changeset
|
278 #if DIRECTFBVERSION < DFB_VERSION(0,9,17) |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
279 if (DFB_OK != dfb->SetCooperativeLevel (dfb, DFSCL_FULLSCREEN)) { |
24951 | 280 mp_msg(MSGT_VO, MSGL_WARN,"DirectFB: Warning - cannot switch to fullscreen mode"); |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
281 }; |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
282 #endif |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
283 |
6952 | 284 /* |
285 * (Get keyboard) | |
286 */ | |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
287 |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
288 if (use_input) { |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
289 ret = dfb->GetInputDevice (dfb, DIDID_KEYBOARD, &keyboard); |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
290 if (ret==DFB_OK) { |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
291 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Keyboard init OK\n"); |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
292 } else { |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
293 keyboard = NULL; |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
294 mp_msg(MSGT_VO, MSGL_ERR,"DirectFB: Keyboard init FAILED\n"); |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
295 } |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
296 } |
6952 | 297 |
298 | |
299 /* | |
300 * Create an input buffer for the keyboard. | |
301 */ | |
302 if (keyboard) DFBCHECK (keyboard->CreateEventBuffer (keyboard, &buffer)); | |
303 | |
24950 | 304 // just to start clean ... |
6952 | 305 if (buffer) buffer->Reset(buffer); |
306 | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
307 //mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Preinit OK\n"); |
6952 | 308 |
309 return 0; | |
310 | |
311 } | |
312 | |
313 DFBSurfacePixelFormat convformat(uint32_t format) | |
314 { | |
315 // add more formats !!! | |
316 switch (format) { | |
317 case IMGFMT_RGB32: return DSPF_RGB32; break; | |
318 case IMGFMT_BGR32: return DSPF_RGB32; break; | |
319 case IMGFMT_RGB24: return DSPF_RGB24; break; | |
320 case IMGFMT_BGR24: return DSPF_RGB24; break; | |
321 case IMGFMT_RGB16: return DSPF_RGB16; break; | |
322 case IMGFMT_BGR16: return DSPF_RGB16; break; | |
20112
5deee6e61057
Fix DirectFB version check. The old code simply concatenated the
syrjala
parents:
19614
diff
changeset
|
323 #if DIRECTFBVERSION > DFB_VERSION(0,9,15) |
8640 | 324 case IMGFMT_RGB15: return DSPF_ARGB1555; break; |
325 case IMGFMT_BGR15: return DSPF_ARGB1555; break; | |
326 #else | |
6952 | 327 case IMGFMT_RGB15: return DSPF_RGB15; break; |
328 case IMGFMT_BGR15: return DSPF_RGB15; break; | |
8640 | 329 #endif |
6952 | 330 case IMGFMT_YUY2: return DSPF_YUY2; break; |
331 case IMGFMT_UYVY: return DSPF_UYVY; break; | |
332 case IMGFMT_YV12: return DSPF_YV12; break; | |
333 case IMGFMT_I420: return DSPF_I420; break; | |
334 // case IMGFMT_IYUV: return DSPF_IYUV; break; | |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
335 case IMGFMT_RGB8: return DSPF_RGB332; break; |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
336 case IMGFMT_BGR8: return DSPF_RGB332; break; |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
337 |
6952 | 338 default: return 0; |
339 } | |
340 return 0; | |
341 } | |
342 | |
343 typedef struct enum1_s { | |
344 uint32_t format; | |
345 int scale; | |
346 int result; | |
347 unsigned int id; | |
348 unsigned int width; | |
349 unsigned int height; | |
350 int setsize; | |
351 } enum1_t; | |
352 | |
353 DFBEnumerationResult test_format_callback( unsigned int id, | |
354 DFBDisplayLayerDescription desc, | |
355 void *data) | |
356 { | |
357 enum1_t *params =(enum1_t *)data; | |
358 IDirectFBDisplayLayer *layer; | |
359 DFBResult ret; | |
360 | |
8137
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
361 if ((layer_id == -1 )||(layer_id == id)) { |
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
362 |
6952 | 363 ret = dfb->GetDisplayLayer( dfb, id, &layer); |
364 if (ret) { | |
365 DirectFBError( "dfb->GetDisplayLayer failed", ret ); | |
366 return DFENUM_OK; | |
367 } else { | |
368 DFBDisplayLayerConfig dlc; | |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
369 |
6952 | 370 if (params->setsize) { |
371 dlc.flags = DLCONF_WIDTH |DLCONF_HEIGHT; | |
372 dlc.width = params->width; | |
373 dlc.height = params->height; | |
374 layer->SetConfiguration(layer,&dlc); | |
375 } | |
376 | |
377 | |
378 dlc.flags = DLCONF_PIXELFORMAT; | |
379 dlc.pixelformat = convformat(params->format); | |
9515 | 380 |
381 layer->SetOpacity(layer,0); | |
6952 | 382 |
383 ret = layer->TestConfiguration(layer,&dlc,NULL); | |
384 | |
385 layer->Release(layer); | |
386 | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
387 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Test format - layer %i scale/pos %i\n",id,(desc.caps & DLCAPS_SCREEN_LOCATION)); |
6952 | 388 |
9515 | 389 if (ret==DFB_OK) { |
6952 | 390 // printf("Test OK\n"); |
391 if (params->result) { | |
392 if ((!params->scale) && (desc.caps & DLCAPS_SCREEN_LOCATION)) { | |
393 params->scale=1; | |
394 params->id=id; | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
395 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Test format - added layer %i scale/pos %i\n",id,(desc.caps & DLCAPS_SCREEN_LOCATION)); |
6952 | 396 } |
397 } else { | |
398 params->result=1; | |
399 params->id=id; | |
400 if (desc.caps & DLCAPS_SCREEN_LOCATION) params->scale=1; | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
401 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Test format - added layer %i scale/pos %i\n",id,(desc.caps & DLCAPS_SCREEN_LOCATION)); |
6952 | 402 }; |
403 }; | |
404 }; | |
405 | |
8137
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
406 }; |
9515 | 407 |
6952 | 408 return DFENUM_OK; |
409 } | |
410 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15750
diff
changeset
|
411 static int query_format(uint32_t format) |
6952 | 412 { |
24950 | 413 int ret = VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW|VFCAP_OSD; // osd should be removed the in future -> will be handled outside... |
6952 | 414 enum1_t params; |
415 | |
416 | |
417 if (!convformat(format)) return 0; | |
24950 | 418 // temporarily disable YV12 |
6952 | 419 // if (format == IMGFMT_YV12) return 0; |
420 // if (format == IMGFMT_I420) return 0; | |
421 if (format == IMGFMT_IYUV) return 0; | |
422 | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
423 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Format query: %s\n",vo_format_name(format)); |
6952 | 424 |
425 params.format=format; | |
426 params.scale=0; | |
427 params.result=0; | |
428 params.setsize=0; | |
429 | |
430 DFBCHECK (dfb->EnumDisplayLayers(dfb,test_format_callback,¶ms)); | |
431 | |
432 if (params.result) { | |
433 if (params.scale) ret |=VFCAP_HWSCALE_UP|VFCAP_HWSCALE_DOWN; | |
434 return ret; | |
435 } | |
436 | |
437 return 0; | |
438 } | |
439 | |
440 typedef struct videomode_s { | |
441 int width; | |
442 int height; | |
443 int out_width; | |
444 int out_height; | |
445 int overx; | |
446 int overy; | |
447 int bpp; | |
448 } videomode_t; | |
449 | |
450 | |
25764 | 451 DFBEnumerationResult video_modes_callback( int width,int height,int bpp, void *data) |
6952 | 452 { |
453 videomode_t *params =(videomode_t *)data; | |
454 | |
455 int overx=0,overy=0,closer=0,over=0; | |
456 int we_are_under=0; | |
457 | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
458 //mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Validator entered %i %i %i\n",width,height,bpp); |
6952 | 459 |
460 overx=width-params->out_width; | |
461 overy=height-params->out_height; | |
462 | |
463 if (!params->width) { | |
464 params->width=width; | |
465 params->height=height; | |
466 params->overx=overx; | |
467 params->overy=overy; | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
468 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Mode added %i %i %i\n",width,height,bpp); |
6952 | 469 } |
470 | |
471 if ((params->overy<0)||(params->overx<0)) we_are_under=1; // stored mode is smaller than req mode | |
472 if (abs(overx*overy)<abs(params->overx * params->overy)) closer=1; // current mode is closer to desired res | |
473 if ((overx>=0)&&(overy>=0)) over=1; // current mode is bigger or equaul to desired res | |
474 if ((closer && (over || we_are_under)) || (we_are_under && over)) { | |
475 params->width=width; | |
476 params->height=height; | |
477 params->overx=overx; | |
478 params->overy=overy; | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
479 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Better mode added %i %i %i\n",width,height,bpp); |
6952 | 480 }; |
481 | |
482 return DFENUM_OK; | |
483 } | |
484 | |
485 #define CONFIG_ERROR -1 | |
486 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15750
diff
changeset
|
487 static int config(uint32_t s_width, uint32_t s_height, uint32_t d_width, |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13787
diff
changeset
|
488 uint32_t d_height, uint32_t flags, char *title, |
7272 | 489 uint32_t format) |
6952 | 490 { |
491 /* | |
492 * (Locals) | |
493 */ | |
494 | |
495 // decode flags | |
496 | |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13787
diff
changeset
|
497 int fs = flags & VOFLAG_FULLSCREEN; |
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13787
diff
changeset
|
498 int vm = flags & VOFLAG_MODESWITCHING; |
6952 | 499 |
500 DFBSurfaceDescription dsc; | |
501 DFBResult ret; | |
502 DFBDisplayLayerConfig dlc; | |
503 DFBSurfaceCapabilities caps; | |
504 | |
505 enum1_t params; | |
506 | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
507 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Config entered [%ix%i]\n",s_width,s_height); |
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
508 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: With requested format: %s\n",vo_format_name(format)); |
9937 | 509 |
24950 | 510 // initial cleanup |
6952 | 511 if (frame) { |
512 frame->Release(frame); | |
513 frame=NULL; | |
514 } | |
515 | |
516 if (primary) { | |
517 primary->Release(primary); | |
518 primary=NULL; | |
519 } | |
520 | |
521 if (layer) { | |
522 layer->Release(layer); | |
523 layer=NULL; | |
524 } | |
525 | |
526 | |
527 // vm things | |
528 | |
529 if (vm) { | |
530 videomode_t params; | |
531 params.out_width=d_width; | |
532 params.out_height=d_height; | |
533 params.width=0; | |
534 params.height=0; | |
535 switch (format) { | |
9515 | 536 case IMGFMT_RGB32: |
537 case IMGFMT_BGR32: | |
6952 | 538 params.bpp=32; |
539 break; | |
9515 | 540 case IMGFMT_RGB24: |
541 case IMGFMT_BGR24: | |
6952 | 542 params.bpp=24; |
543 break; | |
544 case IMGFMT_RGB16: | |
545 case IMGFMT_BGR16: | |
546 case IMGFMT_RGB15: | |
547 case IMGFMT_BGR15: | |
548 params.bpp=16; | |
549 break; | |
9515 | 550 default: params.bpp=0; |
551 | |
552 } | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
553 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Config - trying to change videomode\n"); |
6952 | 554 DFBCHECK (dfb->EnumVideoModes(dfb,video_modes_callback,¶ms)); |
555 ret=dfb->SetVideoMode(dfb,params.width,params.height,params.bpp); | |
556 if (ret) { | |
557 ret=dfb->SetVideoMode(dfb,params.width,params.height,24); | |
558 if (ret) { | |
559 ret=dfb->SetVideoMode(dfb,params.width,params.height,32); | |
560 if (ret) { | |
561 ret=dfb->SetVideoMode(dfb,params.width,params.height,16); | |
562 if (ret) { | |
563 ret=dfb->SetVideoMode(dfb,params.width,params.height,8); | |
564 } | |
565 } | |
566 } | |
567 } | |
568 } // vm end | |
569 | |
24950 | 570 // just to be sure clear primary layer |
20112
5deee6e61057
Fix DirectFB version check. The old code simply concatenated the
syrjala
parents:
19614
diff
changeset
|
571 #if DIRECTFBVERSION > DFB_VERSION(0,9,13) |
10840
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
572 ret = dfb->GetDisplayLayer( dfb, DLID_PRIMARY, &layer); |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
573 if (ret==DFB_OK) { |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
574 ret = layer->GetSurface(layer,&primary); |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
575 if (ret==DFB_OK) { |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
576 primary->Clear(primary,0,0,0,0xff); |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
577 ret = primary->Flip(primary,NULL,0); |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
578 if (ret==DFB_OK) { |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
579 primary->Clear(primary,0,0,0,0xff); |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
580 } |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
581 primary->Release(primary); |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
582 } |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
583 primary=NULL; |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
584 layer->Release(layer); |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
585 } |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
586 layer=NULL; |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
587 #endif |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
588 |
6952 | 589 // find best layer |
590 | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
591 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Config - looking for suitable layer\n"); |
6952 | 592 params.format=format; |
593 params.scale=0; | |
594 params.result=0; | |
595 params.width=s_width; | |
596 params.height=s_height; | |
597 params.setsize=1; | |
598 | |
599 DFBCHECK (dfb->EnumDisplayLayers(dfb,test_format_callback,¶ms)); | |
600 | |
601 if (!params.result) { | |
9937 | 602 mp_msg(MSGT_VO, MSGL_ERR,"DirectFB: ConfigError - no suitable layer found\n"); |
6952 | 603 params.id = DLID_PRIMARY; |
9515 | 604 } |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
605 |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
606 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Config - layer %i\n",params.id); |
6952 | 607 |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
608 // setup layer |
6952 | 609 |
610 DFBCHECK (dfb->GetDisplayLayer( dfb, params.id, &layer)); | |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
611 |
20112
5deee6e61057
Fix DirectFB version check. The old code simply concatenated the
syrjala
parents:
19614
diff
changeset
|
612 #if DIRECTFBVERSION > DFB_VERSION(0,9,16) |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
613 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Config - switching layer to exclusive mode\n"); |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
614 ret = layer->SetCooperativeLevel (layer, DLSCL_EXCLUSIVE); |
6952 | 615 |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
616 if (DFB_OK != ret) { |
24951 | 617 mp_msg(MSGT_VO, MSGL_WARN,"DirectFB: Warning - cannot switch layer to exclusive mode. This could cause\nproblems. You may need to select correct pixel format manually!\n"); |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
618 DirectFBError("MPlayer - Switch layer to exlusive mode.",ret); |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
619 }; |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
620 #endif |
6952 | 621 if (params.scale) { |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
622 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Config - changing layer configuration (size)\n"); |
6952 | 623 dlc.flags = DLCONF_WIDTH | DLCONF_HEIGHT; |
624 dlc.width = s_width; | |
625 dlc.height = s_height; | |
9515 | 626 |
6952 | 627 ret = layer->SetConfiguration(layer,&dlc); |
9515 | 628 |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
629 if (ret) { |
9937 | 630 mp_msg(MSGT_VO, MSGL_ERR,"DirectFB: ConfigError in layer configuration (size)\n"); |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
631 DirectFBError("MPlayer - Layer size change.",ret); |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
632 }; |
6952 | 633 } |
634 | |
24950 | 635 // look if we need to change the pixel format of the layer |
636 // and just to be sure also fetch all layer properties | |
9515 | 637 dlc.flags = DLCONF_PIXELFORMAT | DLCONF_WIDTH | DLCONF_HEIGHT | DLCONF_OPTIONS | DLCONF_BUFFERMODE; |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
638 |
9515 | 639 ret = layer->GetConfiguration(layer,&dlc); |
640 | |
641 dlc.flags = DLCONF_PIXELFORMAT | DLCONF_WIDTH | DLCONF_HEIGHT; | |
642 | |
643 if (ret) { | |
9937 | 644 mp_msg(MSGT_VO, MSGL_WARN,"DirectFB: Warning - could not get layer properties!\n"); |
645 } else { | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
646 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Layer reports format:%x\n",dlc.pixelformat); |
9515 | 647 } |
6952 | 648 |
9515 | 649 if ((dlc.pixelformat != convformat(params.format)) || (ret != DFB_OK)) { |
650 | |
651 dlc.flags = DLCONF_PIXELFORMAT; | |
652 dlc.pixelformat = convformat(params.format); | |
653 | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
654 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Desired pixelformat: %x\n",dlc.pixelformat); |
9515 | 655 |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
656 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Config - changing layer configuration (format)\n"); |
9515 | 657 ret = layer->SetConfiguration(layer,&dlc); |
658 | |
659 if (ret) { | |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
660 unsigned int bpp; |
9937 | 661 mp_msg(MSGT_VO, MSGL_ERR,"DirectFB: ConfigError in layer configuration (format, flags=%x)\n",dlc.flags); |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
662 DirectFBError("MPlayer - layer pixelformat change",ret); |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
663 |
24950 | 664 // ugly fbdev workaround - try to switch pixelformat via videomode change |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
665 switch (dlc.pixelformat) { |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
666 case DSPF_ARGB: |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
667 case DSPF_RGB32: bpp=32;break; |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
668 case DSPF_RGB24: bpp=24;break; |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
669 case DSPF_RGB16: bpp=16;break; |
20112
5deee6e61057
Fix DirectFB version check. The old code simply concatenated the
syrjala
parents:
19614
diff
changeset
|
670 #if DIRECTFBVERSION > DFB_VERSION(0,9,15) |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
671 case DSPF_ARGB1555: bpp=15;break; |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
672 #else |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
673 case DSPF_RGB15: bpp=15;break; |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
674 #endif |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
675 case DSPF_RGB332 : bpp=8;break; |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
676 } |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
677 |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
678 switch (dlc.pixelformat) { |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
679 case DSPF_ARGB: |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
680 case DSPF_RGB32: |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
681 case DSPF_RGB24: |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
682 case DSPF_RGB16: |
20112
5deee6e61057
Fix DirectFB version check. The old code simply concatenated the
syrjala
parents:
19614
diff
changeset
|
683 #if DIRECTFBVERSION > DFB_VERSION(0,9,15) |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
684 case DSPF_ARGB1555: |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
685 #else |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
686 case DSPF_RGB15: |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
687 #endif |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
688 case DSPF_RGB332: |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
689 mp_msg(MSGT_VO, MSGL_V,"DirectFB: Trying to recover via videomode change (VM).\n"); |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
690 // get size |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
691 dlc.flags = DLCONF_WIDTH | DLCONF_HEIGHT; |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
692 if (DFB_OK==layer->GetConfiguration(layer,&dlc)) { |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
693 // try to set videomode |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
694 mp_msg(MSGT_VO, MSGL_V,"DirectFB: Videomode %ix%i BPP %i\n",dlc.width,dlc.height,bpp); |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
695 ret = dfb->SetVideoMode(dfb,dlc.width,dlc.height,bpp); |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
696 if (ret) DirectFBError("MPlayer - VM - pixelformat change",ret); |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
697 |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
698 }; |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
699 |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
700 //get current pixel format |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
701 dlc.flags = DLCONF_PIXELFORMAT; |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
702 ret = layer->GetConfiguration(layer,&dlc); |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
703 if (ret) { |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
704 DirectFBError("MPlayer - VM - Layer->GetConfiguration",ret); |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
705 } else { |
24951 | 706 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Layer now has pixelformat [%x]\n",dlc.pixelformat); |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
707 }; |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
708 |
24950 | 709 // check if we were succesful |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
710 if ((dlc.pixelformat != convformat(params.format)) || (ret != DFB_OK)) { |
9937 | 711 mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Recovery failed!.\n"); |
9538
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
712 return CONFIG_ERROR; |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
713 } |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
714 |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
715 break; |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
716 |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
717 default: return CONFIG_ERROR; |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
718 |
7b1907aa1422
Some 10l and better layer handling (to comply with DFB 0.9.17)
zdar
parents:
9515
diff
changeset
|
719 }; |
9515 | 720 }; |
6952 | 721 }; |
722 | |
723 // flipping of layer | |
24950 | 724 // try triple, double... buffering |
6952 | 725 |
726 dlc.flags = DLCONF_BUFFERMODE; | |
9937 | 727 #ifdef TRIPLE |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
728 if (buffer_mode > 2) { |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
729 dlc.buffermode = DLBM_TRIPLE; |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
730 ret = layer->SetConfiguration( layer, &dlc ); |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
731 } else { |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
732 ret=!DFB_OK; |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
733 } |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
734 |
9937 | 735 if (ret!=DFB_OK) { |
736 #endif | |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
737 if (buffer_mode > 1) { |
9937 | 738 dlc.buffermode = DLBM_BACKVIDEO; |
739 ret = layer->SetConfiguration( layer, &dlc ); | |
740 if (ret!=DFB_OK) { | |
741 dlc.buffermode = DLBM_BACKSYSTEM; | |
742 ret = layer->SetConfiguration( layer, &dlc ); | |
6952 | 743 } |
9937 | 744 } |
745 if (ret == DFB_OK) { | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
746 mp_msg(MSGT_VO, MSGL_V,"DirectFB: Double buffering is active\n"); |
9937 | 747 } |
748 #ifdef TRIPLE | |
749 } else { | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
750 mp_msg(MSGT_VO, MSGL_V,"DirectFB: Triple buffering is active\n"); |
9937 | 751 } |
752 #endif | |
6952 | 753 |
20112
5deee6e61057
Fix DirectFB version check. The old code simply concatenated the
syrjala
parents:
19614
diff
changeset
|
754 #if DIRECTFBVERSION > DFB_VERSION(0,9,16) |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
755 if (field_parity != -1) { |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
756 dlc.flags = DLCONF_OPTIONS; |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
757 ret = layer->GetConfiguration( layer, &dlc ); |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
758 if (ret==DFB_OK) { |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
759 dlc.options |= DLOP_FIELD_PARITY; |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
760 ret = layer->SetConfiguration( layer, &dlc ); |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
761 if (ret==DFB_OK) { |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
762 layer->SetFieldParity( layer, field_parity ); |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
763 } |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
764 } |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
765 } |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
766 mp_msg( MSGT_VO, MSGL_DBG2, "DirectFB: Requested field parity: "); |
11972
cda09732375e
removed usage of fb_dev_name, imported field parity reporting from dfbmga, fixed vsync handling in triple buffering mode
zdar
parents:
11000
diff
changeset
|
767 switch (field_parity) { |
cda09732375e
removed usage of fb_dev_name, imported field parity reporting from dfbmga, fixed vsync handling in triple buffering mode
zdar
parents:
11000
diff
changeset
|
768 case -1: |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
769 mp_msg( MSGT_VO, MSGL_DBG2, "Don't care\n"); |
11972
cda09732375e
removed usage of fb_dev_name, imported field parity reporting from dfbmga, fixed vsync handling in triple buffering mode
zdar
parents:
11000
diff
changeset
|
770 break; |
cda09732375e
removed usage of fb_dev_name, imported field parity reporting from dfbmga, fixed vsync handling in triple buffering mode
zdar
parents:
11000
diff
changeset
|
771 case 0: |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
772 mp_msg( MSGT_VO, MSGL_DBG2, "Top field first\n"); |
11972
cda09732375e
removed usage of fb_dev_name, imported field parity reporting from dfbmga, fixed vsync handling in triple buffering mode
zdar
parents:
11000
diff
changeset
|
773 break; |
cda09732375e
removed usage of fb_dev_name, imported field parity reporting from dfbmga, fixed vsync handling in triple buffering mode
zdar
parents:
11000
diff
changeset
|
774 case 1: |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
775 mp_msg( MSGT_VO, MSGL_DBG2, "Bottom field first\n"); |
11972
cda09732375e
removed usage of fb_dev_name, imported field parity reporting from dfbmga, fixed vsync handling in triple buffering mode
zdar
parents:
11000
diff
changeset
|
776 break; |
cda09732375e
removed usage of fb_dev_name, imported field parity reporting from dfbmga, fixed vsync handling in triple buffering mode
zdar
parents:
11000
diff
changeset
|
777 } |
cda09732375e
removed usage of fb_dev_name, imported field parity reporting from dfbmga, fixed vsync handling in triple buffering mode
zdar
parents:
11000
diff
changeset
|
778 |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
779 #endif |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
780 |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
781 |
6952 | 782 // get layer surface |
783 | |
784 ret = layer->GetSurface(layer,&primary); | |
785 | |
786 if (ret) { | |
9937 | 787 mp_msg(MSGT_VO, MSGL_ERR,"DirectFB: ConfigError - could not get surface\n"); |
24950 | 788 return CONFIG_ERROR; // what shall we report on failure? |
6952 | 789 } |
790 | |
791 // test surface for flipping | |
792 DFBCHECK(primary->GetCapabilities(primary,&caps)); | |
20112
5deee6e61057
Fix DirectFB version check. The old code simply concatenated the
syrjala
parents:
19614
diff
changeset
|
793 #if DIRECTFBVERSION > DFB_VERSION(0,9,13) |
9937 | 794 primary->Clear(primary,0,0,0,0xff); |
8137
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
795 #endif |
6952 | 796 flipping = 0; |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
797 if (caps & (DSCAPS_FLIPPING |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
798 #ifdef TRIPLE |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
799 | DSCAPS_TRIPLE |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
800 #endif |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
801 )) { |
6952 | 802 ret = primary->Flip(primary,NULL,0); |
803 if (ret==DFB_OK) { | |
11972
cda09732375e
removed usage of fb_dev_name, imported field parity reporting from dfbmga, fixed vsync handling in triple buffering mode
zdar
parents:
11000
diff
changeset
|
804 flipping = 1; |
20112
5deee6e61057
Fix DirectFB version check. The old code simply concatenated the
syrjala
parents:
19614
diff
changeset
|
805 #if DIRECTFBVERSION > DFB_VERSION(0,9,13) |
9937 | 806 primary->Clear(primary,0,0,0,0xff); |
807 #ifdef TRIPLE | |
808 // if we have 3 buffers clean once more | |
809 if (caps & DSCAPS_TRIPLE) { | |
810 primary->Flip(primary,NULL,0); | |
811 primary->Clear(primary,0,0,0,0xff); | |
11972
cda09732375e
removed usage of fb_dev_name, imported field parity reporting from dfbmga, fixed vsync handling in triple buffering mode
zdar
parents:
11000
diff
changeset
|
812 flipping = 2; |
9937 | 813 } |
814 #endif | |
8137
530d1c5f0c78
Switch containing options for DirectFB library was renamed to dfbopts.
arpi
parents:
7272
diff
changeset
|
815 #endif |
6952 | 816 } |
817 }; | |
818 | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
819 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Config - flipping = %i\n",flipping); |
6952 | 820 |
821 // is scale needed ? Aspect ratio and layer pos/size | |
822 | |
823 | |
824 // get surface size | |
825 DFBCHECK(primary->GetSize(primary,&width,&height)); | |
826 | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
827 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Config - surface size = %ix%i\n",width,height); |
6952 | 828 |
829 aspect_save_orig(s_width,s_height); | |
830 aspect_save_prescale(d_width,d_height); | |
831 if (params.scale) { | |
832 aspect_save_screenres(10000,10000); | |
833 aspect(&out_width,&out_height,A_ZOOM); | |
834 | |
835 ret = layer->SetScreenLocation(layer,(1-(float)out_width/10000)/2,(1-(float)out_height/10000)/2,((float)out_width/10000),((float)out_height/10000)); | |
836 | |
9937 | 837 if (ret) mp_msg(MSGT_VO, MSGL_ERR,"DirectFB: ConfigError in layer configuration (position)\n"); |
6952 | 838 |
839 xoffset = 0; | |
840 yoffset = 0; | |
841 | |
842 } else { | |
843 | |
844 aspect_save_screenres(width,height); | |
845 | |
846 if(fs) /* -fs */ | |
847 aspect(&out_width,&out_height,A_ZOOM); | |
848 else | |
849 aspect(&out_width,&out_height,A_NOZOOM); | |
850 | |
851 | |
852 xoffset = (width - out_width) / 2; | |
853 yoffset = (height - out_height) / 2; | |
854 } | |
855 | |
856 if (((s_width==out_width)&&(s_height==out_height)) || (params.scale)) { | |
857 stretch = 0; | |
858 } else { | |
859 stretch = 1; | |
860 } | |
861 | |
862 | |
863 // temporary buffer in case of not flipping or scaling | |
864 if ((!flipping) || stretch) { | |
865 | |
866 DFBCHECK (primary->GetPixelFormat (primary, &dsc.pixelformat)); | |
867 | |
868 dsc.flags = DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_WIDTH; | |
869 | |
870 dsc.width = s_width; | |
871 dsc.height = s_height; | |
872 | |
873 DFBCHECK (dfb->CreateSurface( dfb, &dsc, &frame)); | |
874 DFBCHECK(frame->GetSize(frame,&width,&height)); | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
875 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Frame is active.\n"); |
6952 | 876 } |
877 | |
878 // get format for draw_alpha - should be removed soon - osd will be rendered outside vo driver | |
879 if (frame) { | |
880 DFBCHECK (frame->GetPixelFormat(frame,&pixel_format)); | |
881 } else { | |
882 DFBCHECK (primary->GetPixelFormat(primary,&pixel_format)); | |
883 }; | |
884 | |
885 // finally turn on layer | |
886 layer->SetOpacity(layer,255); | |
887 | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
888 //mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Config finished [%ix%i] - [%ix%i]\n",out_width,out_height,width,height); |
6952 | 889 |
890 return 0; | |
891 } | |
892 | |
13787
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
11982
diff
changeset
|
893 #include "osdep/keycodes.h" |
6952 | 894 |
895 static void check_events(void) | |
896 { | |
897 | |
898 if (buffer) { | |
899 | |
900 DFBInputEvent event; | |
901 | |
17969
843e0427b5b9
Change 'if(verbose)' to the more appropriate mp_msg_test.
diego
parents:
16892
diff
changeset
|
902 //if ( mp_msg_test(MSGT_VO,MSGL_V) ) printf ("DirectFB: Check events entered\n"); |
6952 | 903 if (buffer->GetEvent(buffer, DFB_EVENT (&event)) == DFB_OK) { |
904 | |
905 if (event.type == DIET_KEYPRESS) { | |
906 switch (event.key_symbol) { | |
907 case DIKS_ESCAPE: | |
16892
3470c810527b
libvo input cleanup: remove the dependency on libinput,
albeu
parents:
16171
diff
changeset
|
908 mplayer_put_key(KEY_ESC); |
6952 | 909 break; |
910 case DIKS_PAGE_UP: mplayer_put_key(KEY_PAGE_UP);break; | |
911 case DIKS_PAGE_DOWN: mplayer_put_key(KEY_PAGE_DOWN);break; | |
912 case DIKS_CURSOR_UP: mplayer_put_key(KEY_UP);break; | |
913 case DIKS_CURSOR_DOWN: mplayer_put_key(KEY_DOWN);break; | |
914 case DIKS_CURSOR_LEFT: mplayer_put_key(KEY_LEFT);break; | |
915 case DIKS_CURSOR_RIGHT: mplayer_put_key(KEY_RIGHT);break; | |
916 case DIKS_INSERT: mplayer_put_key(KEY_INSERT);break; | |
917 case DIKS_DELETE: mplayer_put_key(KEY_DELETE);break; | |
918 case DIKS_HOME: mplayer_put_key(KEY_HOME);break; | |
919 case DIKS_END: mplayer_put_key(KEY_END);break; | |
920 | |
921 default:mplayer_put_key(event.key_symbol); | |
922 }; | |
923 }; | |
924 }; | |
925 // empty buffer, because of repeating (keyboard repeat is faster than key handling | |
926 // and this causes problems during seek) | |
24950 | 927 // temporary workaround should be solved in the future |
6952 | 928 buffer->Reset(buffer); |
929 | |
930 } | |
17969
843e0427b5b9
Change 'if(verbose)' to the more appropriate mp_msg_test.
diego
parents:
16892
diff
changeset
|
931 //if ( mp_msg_test(MSGT_VO,MSGL_V) ) printf ("DirectFB: Check events finished\n"); |
6952 | 932 } |
933 | |
934 static void flip_page(void) | |
935 { | |
936 DFBSurfaceBlittingFlags flags=DSBLIT_NOFX; | |
937 | |
938 unlock(); // unlock frame & primary | |
939 | |
17969
843e0427b5b9
Change 'if(verbose)' to the more appropriate mp_msg_test.
diego
parents:
16892
diff
changeset
|
940 // if ( mp_msg_test(MSGT_VO,MSGL_V) ) printf("DirectFB: Flip page entered"); |
6952 | 941 |
942 DFBCHECK (primary->SetBlittingFlags(primary,flags)); | |
943 | |
944 if (frame) { | |
945 if (stretch) { | |
946 DFBRectangle rect; | |
947 rect.x=xoffset; | |
948 rect.y=yoffset; | |
949 rect.w=out_width; | |
950 rect.h=out_height; | |
951 | |
952 DFBCHECK (primary->StretchBlit(primary,frame,NULL,&rect)); | |
953 | |
954 } else { | |
955 | |
956 DFBCHECK (primary->Blit(primary,frame,NULL,xoffset,yoffset)); | |
957 | |
958 }; | |
959 }; | |
960 | |
961 | |
11972
cda09732375e
removed usage of fb_dev_name, imported field parity reporting from dfbmga, fixed vsync handling in triple buffering mode
zdar
parents:
11000
diff
changeset
|
962 #ifdef TRIPLE |
cda09732375e
removed usage of fb_dev_name, imported field parity reporting from dfbmga, fixed vsync handling in triple buffering mode
zdar
parents:
11000
diff
changeset
|
963 switch (flipping) { |
cda09732375e
removed usage of fb_dev_name, imported field parity reporting from dfbmga, fixed vsync handling in triple buffering mode
zdar
parents:
11000
diff
changeset
|
964 case 1: DFBCHECK (primary->Flip (primary, NULL, DSFLIP_WAIT)); |
cda09732375e
removed usage of fb_dev_name, imported field parity reporting from dfbmga, fixed vsync handling in triple buffering mode
zdar
parents:
11000
diff
changeset
|
965 break; |
cda09732375e
removed usage of fb_dev_name, imported field parity reporting from dfbmga, fixed vsync handling in triple buffering mode
zdar
parents:
11000
diff
changeset
|
966 case 2: DFBCHECK (primary->Flip (primary, NULL, DSFLIP_ONSYNC)); |
cda09732375e
removed usage of fb_dev_name, imported field parity reporting from dfbmga, fixed vsync handling in triple buffering mode
zdar
parents:
11000
diff
changeset
|
967 break; |
24950 | 968 default:; // should never be reached |
11972
cda09732375e
removed usage of fb_dev_name, imported field parity reporting from dfbmga, fixed vsync handling in triple buffering mode
zdar
parents:
11000
diff
changeset
|
969 } |
cda09732375e
removed usage of fb_dev_name, imported field parity reporting from dfbmga, fixed vsync handling in triple buffering mode
zdar
parents:
11000
diff
changeset
|
970 #else |
6952 | 971 if (flipping) { |
972 DFBCHECK (primary->Flip (primary, NULL, DSFLIP_WAITFORSYNC)); | |
973 } | |
11972
cda09732375e
removed usage of fb_dev_name, imported field parity reporting from dfbmga, fixed vsync handling in triple buffering mode
zdar
parents:
11000
diff
changeset
|
974 #endif |
6952 | 975 |
976 } | |
977 | |
978 | |
979 | |
980 static void uninit(void) | |
981 { | |
982 | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
983 //mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Uninit entered\n"); |
6952 | 984 |
985 unlock(); | |
986 | |
987 /* | |
988 * (Release) | |
989 */ | |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
990 /* |
9937 | 991 mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Releasing buffer\n"); |
6952 | 992 if (buffer) buffer->Release (buffer); |
9937 | 993 mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Releasing keyboard\n"); |
6952 | 994 if (keyboard) keyboard->Release (keyboard); |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
995 */ |
6952 | 996 if (frame) { |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
997 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Releasing frame\n"); |
6952 | 998 frame->Release (frame); |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
999 frame = NULL; |
6952 | 1000 }; |
1001 | |
1002 // switch off BES | |
1003 // if (layer) layer->SetOpacity(layer,0); | |
1004 | |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
1005 if (layer) { |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
1006 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Releasing layer\n"); |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
1007 layer->Release(layer); |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
1008 layer = NULL; |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
1009 } |
6952 | 1010 |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
1011 if (primary) { |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
1012 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Releasing primary\n"); |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
1013 primary->Release (primary); |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
1014 primary = NULL; |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
1015 } |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
1016 |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
1017 |
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
1018 /* mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Releasing DirectFB library\n"); |
6952 | 1019 |
1020 dfb->Release (dfb); | |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
1021 */ |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
1022 //mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Uninit done.\n"); |
6952 | 1023 } |
1024 | |
1025 | |
1026 static uint32_t directfb_set_video_eq(char *data, int value) //data==name | |
1027 { | |
1028 | |
1029 DFBColorAdjustment ca; | |
1030 float factor = (float)0xffff / 200.0; | |
1031 | |
1032 DFBDisplayLayerDescription desc; | |
1033 | |
1034 unlock(); | |
1035 | |
1036 if (layer) { | |
1037 | |
1038 layer->GetDescription(layer,&desc); | |
1039 | |
1040 ca.flags=DCAF_NONE; | |
1041 | |
1042 if (! strcmp( data,"brightness" )) { | |
1043 if (desc.caps & DLCAPS_BRIGHTNESS) { | |
1044 ca.brightness = value * factor +0x8000; | |
1045 ca.flags |= DCAF_BRIGHTNESS; | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
1046 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: SetVEq Brightness 0x%X %i\n",ca.brightness,value); |
6952 | 1047 } else return VO_FALSE; |
1048 } | |
1049 | |
1050 if (! strcmp( data,"contrast" )) { | |
1051 if ((desc.caps & DLCAPS_CONTRAST)) { | |
1052 ca.contrast = value * factor + 0x8000; | |
1053 ca.flags |= DCAF_CONTRAST; | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
1054 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: SetVEq Contrast 0x%X %i\n",ca.contrast,value); |
6952 | 1055 } else return VO_FALSE; |
1056 } | |
1057 | |
1058 if (! strcmp( data,"hue" )) { | |
1059 if ((desc.caps & DLCAPS_HUE)) { | |
1060 ca.hue = value * factor + 0x8000; | |
1061 ca.flags |= DCAF_HUE; | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
1062 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: SetVEq Hue 0x%X %i\n",ca.hue,value); |
6952 | 1063 } else return VO_FALSE; |
1064 } | |
1065 | |
1066 if (! strcmp( data,"saturation" )) { | |
1067 if ((desc.caps & DLCAPS_SATURATION)) { | |
1068 ca.saturation = value * factor + 0x8000; | |
1069 ca.flags |= DCAF_SATURATION; | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
1070 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: SetVEq Saturation 0x%X %i\n",ca.saturation,value); |
6952 | 1071 } else return VO_FALSE; |
1072 } | |
1073 | |
1074 if (ca.flags != DCAF_NONE) { | |
1075 layer->SetColorAdjustment(layer,&ca); | |
1076 return VO_TRUE; | |
1077 } | |
1078 } | |
1079 | |
1080 return VO_FALSE; | |
1081 | |
1082 } | |
1083 | |
1084 static uint32_t directfb_get_video_eq(char *data, int *value) // data==name | |
1085 { | |
1086 | |
1087 DFBColorAdjustment ca; | |
1088 float factor = 200.0 / (float)0xffff; | |
1089 | |
1090 DFBDisplayLayerDescription desc; | |
1091 | |
1092 if (layer) { | |
1093 | |
1094 unlock(); | |
1095 | |
1096 layer->GetDescription(layer,&desc); | |
1097 | |
1098 layer->GetColorAdjustment(layer,&ca); | |
1099 | |
1100 if (! strcmp( data,"brightness" )) { | |
1101 if (desc.caps & DLCAPS_BRIGHTNESS) { | |
1102 *value = (int) ((ca.brightness-0x8000) * factor); | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
1103 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: GetVEq Brightness 0x%X %i\n",ca.brightness,*value); |
6952 | 1104 return VO_TRUE; |
1105 } else return VO_FALSE; | |
1106 } | |
1107 | |
1108 if (! strcmp( data,"contrast" )) { | |
1109 if ((desc.caps & DLCAPS_CONTRAST)) { | |
1110 *value = (int) ((ca.contrast-0x8000) * factor); | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
1111 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: GetVEq Contrast 0x%X %i\n",ca.contrast,*value); |
6952 | 1112 return VO_TRUE; |
1113 } else return VO_FALSE; | |
1114 } | |
1115 | |
1116 if (! strcmp( data,"hue" )) { | |
1117 if ((desc.caps & DLCAPS_HUE)) { | |
1118 *value = (int) ((ca.hue-0x8000) * factor); | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
1119 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: GetVEq Hue 0x%X %i\n",ca.hue,*value); |
6952 | 1120 return VO_TRUE; |
1121 } else return VO_FALSE; | |
1122 } | |
1123 | |
1124 if (! strcmp( data,"saturation" )) { | |
1125 if ((desc.caps & DLCAPS_SATURATION)) { | |
1126 *value = (int) ((ca.saturation-0x8000) * factor); | |
24949
11d4bcd96bc3
Reduce excessive verbosity: Move debug messages to the appropriate MSGL
diego
parents:
24939
diff
changeset
|
1127 mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: GetVEq Saturation 0x%X %i\n",ca.saturation,*value); |
6952 | 1128 return VO_TRUE; |
1129 } else return VO_FALSE; | |
1130 } | |
1131 } | |
1132 return VO_FALSE; | |
1133 } | |
1134 | |
1135 static uint32_t get_image(mp_image_t *mpi) | |
1136 { | |
1137 | |
1138 int err; | |
25763 | 1139 uint8_t *dst; |
6952 | 1140 int pitch; |
1141 | |
17969
843e0427b5b9
Change 'if(verbose)' to the more appropriate mp_msg_test.
diego
parents:
16892
diff
changeset
|
1142 // if ( mp_msg_test(MSGT_VO,MSGL_V) ) printf("DirectFB: get_image() called\n"); |
9937 | 1143 if(mpi->flags&MP_IMGFLAG_READABLE) return VO_FALSE; // slow video ram |
6952 | 1144 if(mpi->type==MP_IMGTYPE_STATIC) return VO_FALSE; // it is not static |
1145 | |
1146 // printf("width=%d vs. pitch=%d, flags=0x%X \n",mpi->width,pitch,mpi->flags); | |
1147 | |
6985
6074119e09a0
Put/get_image fixed. Deleted forgotten development comments
zdar
parents:
6952
diff
changeset
|
1148 if((mpi->width==pitch) || |
6952 | 1149 (mpi->flags&(MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_ACCEPT_WIDTH))){ |
1150 // we're lucky or codec accepts stride => ok, let's go! | |
1151 | |
1152 if (frame) { | |
25763 | 1153 err = frame->Lock(frame,DSLF_WRITE|DSLF_READ,(void *)&dst,&pitch); |
6952 | 1154 framelocked=1; |
1155 } else { | |
25763 | 1156 err = primary->Lock(primary,DSLF_WRITE,(void *)&dst,&pitch); |
6952 | 1157 primarylocked=1; |
1158 } | |
1159 | |
1160 if (err) { | |
9937 | 1161 mp_msg(MSGT_VO, MSGL_ERR,"DirectFB: DR lock failed!"); |
6952 | 1162 return VO_FALSE; |
1163 }; | |
1164 | |
1165 if(mpi->flags&MP_IMGFLAG_PLANAR){ | |
1166 //YV12 format | |
1167 mpi->planes[0]=dst; | |
1168 if(mpi->flags&MP_IMGFLAG_SWAPPED){ | |
1169 mpi->planes[1]=dst + pitch*height; | |
1170 mpi->planes[2]=mpi->planes[1] + pitch*height/4; | |
1171 } else { | |
1172 mpi->planes[2]=dst + pitch*height; | |
1173 mpi->planes[1]=mpi->planes[2] + pitch*height/4; | |
1174 } | |
6985
6074119e09a0
Put/get_image fixed. Deleted forgotten development comments
zdar
parents:
6952
diff
changeset
|
1175 mpi->width=width; |
6074119e09a0
Put/get_image fixed. Deleted forgotten development comments
zdar
parents:
6952
diff
changeset
|
1176 mpi->stride[0]=pitch; |
6952 | 1177 mpi->stride[1]=mpi->stride[2]=pitch/2; |
1178 } else { | |
1179 //YUY2 and RGB formats | |
1180 mpi->planes[0]=dst; | |
1181 mpi->width=width; | |
1182 mpi->stride[0]=pitch; | |
1183 } | |
10840
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1184 |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1185 // center image |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1186 |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1187 if (!frame) { |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1188 if(mpi->flags&MP_IMGFLAG_PLANAR){ |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1189 mpi->planes[0]= dst + yoffset * pitch + xoffset; |
24939 | 1190 mpi->planes[1]+= ((yoffset * pitch) >> 2) + (xoffset >> 1); |
1191 mpi->planes[2]+= ((yoffset * pitch) >> 2) + (xoffset >> 1); | |
10840
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1192 } else { |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1193 mpi->planes[0]=dst + yoffset * pitch + xoffset * (mpi->bpp >> 3); |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1194 } |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1195 } |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1196 |
6952 | 1197 mpi->flags|=MP_IMGFLAG_DIRECT; |
17969
843e0427b5b9
Change 'if(verbose)' to the more appropriate mp_msg_test.
diego
parents:
16892
diff
changeset
|
1198 // if ( mp_msg_test(MSGT_VO,MSGL_V) ) printf("DirectFB: get_image() SUCCESS -> Direct Rendering ENABLED\n"); |
6952 | 1199 return VO_TRUE; |
1200 | |
1201 } | |
1202 return VO_FALSE; | |
1203 } | |
1204 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15750
diff
changeset
|
1205 static int draw_slice(uint8_t *src[], int stride[], int w, int h, int x, int y) |
6952 | 1206 { |
1207 int i; | |
1208 unsigned int pitch; | |
25763 | 1209 uint8_t *dst; |
1210 uint8_t *dst2; | |
1211 uint8_t *srcp; | |
6952 | 1212 unsigned int p; |
1213 | |
17969
843e0427b5b9
Change 'if(verbose)' to the more appropriate mp_msg_test.
diego
parents:
16892
diff
changeset
|
1214 // if ( mp_msg_test(MSGT_VO,MSGL_V) ) printf("DirectFB: draw_slice entered\n"); |
10840
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1215 |
6952 | 1216 unlock(); |
1217 | |
1218 if (frame) { | |
25763 | 1219 DFBCHECK (frame->Lock(frame,DSLF_WRITE|DSLF_READ,(void *)&dst,&pitch)); |
6952 | 1220 framelocked = 1; |
1221 } else { | |
25763 | 1222 DFBCHECK (primary->Lock(primary,DSLF_WRITE,(void *)&dst,&pitch)); |
6952 | 1223 primarylocked = 1; |
1224 }; | |
1225 | |
1226 p=min(w,pitch); | |
1227 | |
1228 dst += y*pitch + x; | |
1229 dst2 = dst + pitch*height - y*pitch + y*pitch/4 - x/2; | |
1230 srcp = src[0]; | |
1231 | |
1232 for (i=0;i<h;i++) { | |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
22886
diff
changeset
|
1233 fast_memcpy(dst,srcp,p); |
6952 | 1234 dst += pitch; |
1235 srcp += stride[0]; | |
1236 } | |
1237 | |
1238 if (pixel_format == DSPF_YV12) { | |
1239 | |
1240 dst = dst2; | |
1241 srcp = src[2]; | |
1242 p = p/2; | |
1243 | |
1244 for (i=0;i<h/2;i++) { | |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
22886
diff
changeset
|
1245 fast_memcpy(dst,srcp,p); |
6952 | 1246 dst += pitch/2; |
1247 srcp += stride[2]; | |
1248 } | |
1249 | |
1250 dst = dst2 + pitch*height/4; | |
1251 srcp = src[1]; | |
1252 | |
1253 for (i=0;i<h/2;i++) { | |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
22886
diff
changeset
|
1254 fast_memcpy(dst,srcp,p); |
6952 | 1255 dst += pitch/2; |
1256 srcp += stride[1]; | |
1257 } | |
1258 | |
1259 } else { | |
1260 | |
1261 dst = dst2; | |
1262 srcp = src[1]; | |
1263 p = p/2; | |
1264 | |
1265 for (i=0;i<h/2;i++) { | |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
22886
diff
changeset
|
1266 fast_memcpy(dst,srcp,p); |
6952 | 1267 dst += pitch/2; |
1268 srcp += stride[1]; | |
1269 } | |
1270 | |
1271 dst = dst2 + pitch*height/4; | |
1272 srcp = src[2]; | |
1273 | |
1274 for (i=0;i<h/2;i++) { | |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
22886
diff
changeset
|
1275 fast_memcpy(dst,srcp,p); |
6952 | 1276 dst += pitch/2; |
1277 srcp += stride[2]; | |
1278 } | |
1279 | |
1280 } | |
1281 | |
1282 unlock(); | |
1283 | |
1284 return 0; | |
1285 } | |
1286 | |
1287 | |
1288 static uint32_t put_image(mp_image_t *mpi){ | |
1289 | |
1290 | |
24166 | 1291 // static IDirectFBSurface *tmp = NULL; |
1292 // DFBSurfaceDescription dsc; | |
1293 // DFBRectangle rect; | |
6952 | 1294 |
17969
843e0427b5b9
Change 'if(verbose)' to the more appropriate mp_msg_test.
diego
parents:
16892
diff
changeset
|
1295 // if ( mp_msg_test(MSGT_VO,MSGL_V) ) printf("DirectFB: Put_image entered %i %i %i %i %i %i\n",mpi->x,mpi->y,mpi->w,mpi->h,mpi->width,mpi->height); |
6952 | 1296 |
1297 unlock(); | |
1298 | |
1299 // already out? | |
6985
6074119e09a0
Put/get_image fixed. Deleted forgotten development comments
zdar
parents:
6952
diff
changeset
|
1300 if((mpi->flags&(MP_IMGFLAG_DIRECT|MP_IMGFLAG_DRAW_CALLBACK))) { |
24951 | 1301 // if ( mp_msg_test(MSGT_VO,MSGL_V) ) printf("DirectFB: Put_image - nothing to do\n"); |
6952 | 1302 return VO_TRUE; |
1303 } | |
1304 | |
1305 if (mpi->flags&MP_IMGFLAG_PLANAR) { | |
1306 // memcpy all planes - sad but necessary | |
1307 int i; | |
1308 unsigned int pitch; | |
25763 | 1309 uint8_t *dst; |
1310 uint8_t *src; | |
6952 | 1311 unsigned int p; |
1312 | |
17969
843e0427b5b9
Change 'if(verbose)' to the more appropriate mp_msg_test.
diego
parents:
16892
diff
changeset
|
1313 // if ( mp_msg_test(MSGT_VO,MSGL_V) ) printf("DirectFB: Put_image - planar branch\n"); |
6952 | 1314 if (frame) { |
25763 | 1315 DFBCHECK (frame->Lock(frame,DSLF_WRITE|DSLF_READ,(void *)&dst,&pitch)); |
6952 | 1316 framelocked = 1; |
1317 } else { | |
25763 | 1318 DFBCHECK (primary->Lock(primary,DSLF_WRITE,(void *)&dst,&pitch)); |
6952 | 1319 primarylocked = 1; |
1320 }; | |
1321 | |
1322 p=min(mpi->w,pitch); | |
1323 | |
1324 src = mpi->planes[0]+mpi->y*mpi->stride[0]+mpi->x; | |
1325 | |
1326 for (i=0;i<mpi->h;i++) { | |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
22886
diff
changeset
|
1327 fast_memcpy(dst+i*pitch,src+i*mpi->stride[0],p); |
6952 | 1328 } |
1329 | |
10840
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1330 |
6952 | 1331 if (pixel_format == DSPF_YV12) { |
1332 | |
1333 dst += pitch*height; | |
1334 p = p/2; | |
1335 src = mpi->planes[2]+mpi->y*mpi->stride[2]+mpi->x/2; | |
1336 | |
1337 for (i=0;i<mpi->h/2;i++) { | |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
22886
diff
changeset
|
1338 fast_memcpy(dst+i*pitch/2,src+i*mpi->stride[2],p); |
6952 | 1339 } |
1340 | |
1341 dst += pitch*height/4; | |
1342 src = mpi->planes[1]+mpi->y*mpi->stride[1]+mpi->x/2; | |
1343 | |
1344 for (i=0;i<mpi->h/2;i++) { | |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
22886
diff
changeset
|
1345 fast_memcpy(dst+i*pitch/2,src+i*mpi->stride[1],p); |
6952 | 1346 } |
1347 | |
1348 } else { | |
1349 | |
1350 dst += pitch*height; | |
1351 p = p/2; | |
1352 src = mpi->planes[1]+mpi->y*mpi->stride[1]+mpi->x/2; | |
1353 | |
1354 for (i=0;i<mpi->h/2;i++) { | |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
22886
diff
changeset
|
1355 fast_memcpy(dst+i*pitch/2,src+i*mpi->stride[1],p); |
6952 | 1356 } |
1357 | |
1358 dst += pitch*height/4; | |
1359 src = mpi->planes[2]+mpi->y*mpi->stride[2]+mpi->x/2; | |
1360 | |
1361 for (i=0;i<mpi->h/2;i++) { | |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
22886
diff
changeset
|
1362 fast_memcpy(dst+i*pitch/2,src+i*mpi->stride[2],p); |
6952 | 1363 } |
1364 | |
1365 } | |
1366 unlock(); | |
1367 | |
1368 } else { | |
10840
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1369 // I had to disable native directfb blit because it wasn't working under some conditions :-( |
6952 | 1370 |
10840
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1371 /* |
6952 | 1372 dsc.flags = DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_WIDTH | DSDESC_PREALLOCATED; |
1373 dsc.preallocated[0].data = mpi->planes[0]; | |
1374 dsc.preallocated[0].pitch = mpi->stride[0]; | |
1375 dsc.width = mpi->width; | |
1376 dsc.height = mpi->height; | |
1377 dsc.pixelformat = convformat(mpi->imgfmt); | |
1378 | |
1379 DFBCHECK (dfb->CreateSurface( dfb, &dsc, &tmp)); | |
1380 | |
1381 rect.x=mpi->x; | |
1382 rect.y=mpi->y; | |
1383 rect.w=mpi->w; | |
1384 rect.h=mpi->h; | |
1385 | |
1386 if (frame) { | |
1387 DFBCHECK (tmp->Blit(tmp,frame,&rect,0,0)); | |
1388 } else { | |
1389 DFBCHECK (tmp->Blit(tmp,primary,&rect,xoffset,yoffset)); | |
1390 }; | |
1391 tmp->Release(tmp); | |
10840
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1392 */ |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1393 |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1394 unsigned int pitch; |
25763 | 1395 uint8_t *dst; |
10840
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1396 |
24951 | 1397 // if ( mp_msg_test(MSGT_VO,MSGL_V) ) printf("DirectFB: Put_image - non-planar branch\n"); |
10840
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1398 if (frame) { |
25763 | 1399 DFBCHECK (frame->Lock(frame,DSLF_WRITE,(void *)&dst,&pitch)); |
10840
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1400 framelocked = 1; |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1401 mem2agpcpy_pic(dst,mpi->planes[0] + mpi->y * mpi->stride[0] + mpi->x * (mpi->bpp >> 3) ,mpi->w * (mpi->bpp >> 3),mpi->h,pitch,mpi->stride[0]); |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1402 } else { |
25763 | 1403 DFBCHECK (primary->Lock(primary,DSLF_WRITE,(void *)&dst,&pitch)); |
10840
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1404 primarylocked = 1; |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1405 mem2agpcpy_pic(dst + yoffset * pitch + xoffset * (mpi->bpp >> 3),mpi->planes[0] + mpi->y * mpi->stride[0] + mpi->x * (mpi->bpp >> 3) ,mpi->w * (mpi->bpp >> 3),mpi->h,pitch,mpi->stride[0]); |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1406 }; |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1407 unlock(); |
10f45897d653
Config fixed, changed put_image to use memcpy instead of native blits (for compatibility reasons), always clear primary layer (to have always black background) and try to center image.
zdar
parents:
10618
diff
changeset
|
1408 |
6952 | 1409 } |
1410 return VO_TRUE; | |
1411 } | |
1412 | |
1413 | |
1414 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15750
diff
changeset
|
1415 static int control(uint32_t request, void *data, ...) |
6952 | 1416 { |
1417 switch (request) { | |
1418 case VOCTRL_QUERY_FORMAT: | |
1419 return query_format(*((uint32_t*)data)); | |
1420 case VOCTRL_GET_IMAGE: | |
1421 return get_image(data); | |
1422 case VOCTRL_DRAW_IMAGE: | |
1423 return put_image(data); | |
1424 case VOCTRL_SET_EQUALIZER: | |
1425 { | |
1426 va_list ap; | |
1427 int value; | |
1428 | |
1429 va_start(ap, data); | |
1430 value = va_arg(ap, int); | |
1431 va_end(ap); | |
1432 | |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
25764
diff
changeset
|
1433 return directfb_set_video_eq(data, value); |
6952 | 1434 } |
1435 case VOCTRL_GET_EQUALIZER: | |
1436 { | |
1437 va_list ap; | |
1438 int *value; | |
1439 | |
1440 va_start(ap, data); | |
1441 value = va_arg(ap, int*); | |
1442 va_end(ap); | |
1443 | |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
25764
diff
changeset
|
1444 return directfb_get_video_eq(data, value); |
6952 | 1445 } |
1446 }; | |
1447 return VO_NOTIMPL; | |
1448 } | |
1449 | |
1450 // unused function | |
1451 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15750
diff
changeset
|
1452 static int draw_frame(uint8_t *src[]) |
6952 | 1453 { |
1454 return -1; | |
1455 } | |
1456 | |
1457 // hopefully will be removed soon | |
1458 | |
1459 static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src, | |
1460 unsigned char *srca, int stride) | |
1461 { | |
1462 void *dst; | |
1463 int pitch; | |
1464 | |
11000 | 1465 unlock(); // isn't it silly I have to unlock surface and then lock it again :-) |
6952 | 1466 |
1467 if (frame) { | |
10004
c889e7f9391a
triple buffering support, configuration/option system changed,some minor bugs fixed
zdar
parents:
9937
diff
changeset
|
1468 DFBCHECK (frame->Lock(frame,DSLF_WRITE|DSLF_READ,&dst,&pitch)); |
6952 | 1469 framelocked = 1; |
1470 } else { | |
1471 DFBCHECK (primary->Lock(primary,DSLF_WRITE,&dst,&pitch)); | |
1472 primarylocked = 1; | |
1473 }; | |
1474 | |
1475 switch(pixel_format) { | |
1476 case DSPF_RGB32: | |
1477 case DSPF_ARGB: | |
1478 vo_draw_alpha_rgb32(w,h,src,srca,stride,((uint8_t *) dst)+pitch*y0 + 4*x0,pitch); | |
1479 break; | |
1480 | |
1481 case DSPF_RGB24: | |
1482 vo_draw_alpha_rgb24(w,h,src,srca,stride,((uint8_t *) dst)+pitch*y0 + 3*x0,pitch); | |
1483 break; | |
1484 | |
1485 case DSPF_RGB16: | |
1486 vo_draw_alpha_rgb16(w,h,src,srca,stride,((uint8_t *) dst)+pitch*y0 + 2*x0,pitch); | |
1487 break; | |
20112
5deee6e61057
Fix DirectFB version check. The old code simply concatenated the
syrjala
parents:
19614
diff
changeset
|
1488 #if DIRECTFBVERSION > DFB_VERSION(0,9,15) |
8640 | 1489 case DSPF_ARGB1555: |
1490 #else | |
6952 | 1491 case DSPF_RGB15: |
8640 | 1492 #endif |
6952 | 1493 vo_draw_alpha_rgb15(w,h,src,srca,stride,((uint8_t *) dst)+pitch*y0 + 2*x0,pitch); |
1494 break; | |
1495 | |
1496 case DSPF_YUY2: | |
1497 vo_draw_alpha_yuy2(w,h,src,srca,stride,((uint8_t *) dst) + pitch*y0 + 2*x0,pitch); | |
1498 break; | |
1499 | |
1500 case DSPF_UYVY: | |
1501 vo_draw_alpha_yuy2(w,h,src,srca,stride,((uint8_t *) dst) + pitch*y0 + 2*x0 + 1,pitch); | |
1502 break; | |
1503 | |
1504 case DSPF_I420: | |
1505 case DSPF_YV12: | |
1506 vo_draw_alpha_yv12(w,h,src,srca,stride,((uint8_t *) dst) + pitch*y0 + 1*x0,pitch); | |
1507 break; | |
1508 } | |
1509 | |
1510 unlock(); | |
1511 } | |
1512 | |
1513 static void draw_osd(void) | |
1514 { | |
1515 vo_draw_text(width,height,draw_alpha); | |
1516 } |