Mercurial > mplayer.hg
annotate libvo/vo_x11.c @ 35833:dbfedb331095
Keep GUI history untouched upon file select "Cancel".
Currently, when "Cancel" is selected in the file select menu, the
GUI history can be modified nevertheless. Presuming that "Cancel"
shall discard changes, the history should be kept unchanged, too.
Patch by Hans-Dieter Kosch, hdkosch kabelbw de.
author | ib |
---|---|
date | Thu, 28 Feb 2013 11:19:59 +0000 |
parents | 6b08a8332561 |
children | 5d3f93051de9 |
rev | line source |
---|---|
28446
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28149
diff
changeset
|
1 /* |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28149
diff
changeset
|
2 * This file is part of MPlayer. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28149
diff
changeset
|
3 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28149
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28149
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28149
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28149
diff
changeset
|
7 * (at your option) any later version. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28149
diff
changeset
|
8 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28149
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28149
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28149
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28149
diff
changeset
|
12 * GNU General Public License for more details. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28149
diff
changeset
|
13 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28149
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28149
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28149
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28149
diff
changeset
|
17 */ |
1 | 18 |
19 #include <stdio.h> | |
20 #include <stdlib.h> | |
21 #include <string.h> | |
22 | |
23 #include "config.h" | |
24 #include "video_out.h" | |
25 #include "video_out_internal.h" | |
33301
899d817e56fc
Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents:
32467
diff
changeset
|
26 #include "libmpcodecs/vf.h" |
27972
f7b92cea7436
Use aspect.c code in vo_x11.c. Removes some inconsistencies in -wid handling.
reimar
parents:
27943
diff
changeset
|
27 #include "aspect.h" |
1 | 28 |
29 | |
30 #include <X11/Xlib.h> | |
31 #include <X11/Xutil.h> | |
4036 | 32 |
1 | 33 #include <errno.h> |
34 | |
31 | 35 #include "x11_common.h" |
36 | |
11690
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
37 #ifdef HAVE_SHM |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
38 #include <sys/ipc.h> |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
39 #include <sys/shm.h> |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
40 #include <X11/extensions/XShm.h> |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
41 |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
42 static int Shmem_Flag; |
12582 | 43 |
25962 | 44 //static int Quiet_Flag; Here also what is this for. It's used but isn't initialized? |
11690
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
45 static XShmSegmentInfo Shminfo[1]; |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
46 static int gXErrorFlag; |
12582 | 47 static int CompletionType = -1; |
11690
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
48 #endif |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
49 |
32467 | 50 #include "sub/sub.h" |
350 | 51 |
18861 | 52 #include "libswscale/swscale.h" |
13787
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
13056
diff
changeset
|
53 #include "libmpcodecs/vf_scale.h" |
18746 | 54 #define MODE_RGB 0x1 |
55 #define MODE_BGR 0x2 | |
2218 | 56 |
13787
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
13056
diff
changeset
|
57 #include "mp_msg.h" |
18234
a107276371a8
Part 5 and final of otvos attila's oattila AT chello-hu mp_msg changes, with lots of corrections
reynaldo
parents:
18116
diff
changeset
|
58 #include "help_mp.h" |
4734 | 59 |
25216 | 60 static const vo_info_t info = { |
12582 | 61 "X11 ( XImage/Shm )", |
62 "x11", | |
63 "Aaron Holtzman <aholtzma@ess.engr.uvic.ca>", | |
64 "" | |
1 | 65 }; |
66 | |
25220
c9e9ac2008c2
Mark the vo_functions_t definitions as const where possible.
reimar
parents:
25216
diff
changeset
|
67 const LIBVO_EXTERN(x11) |
1 | 68 /* private prototypes */ |
35227
6b08a8332561
Fix variable declarations I stupidly forgot to make "static".
reimar
parents:
35050
diff
changeset
|
69 static vo_draw_alpha_func draw_alpha_func; |
1 | 70 |
71 /* local data */ | |
72 static unsigned char *ImageData; | |
21585
e54f539c9b5d
Align image data pointer, this is also in preparation of an upcoming patch
reimar
parents:
21584
diff
changeset
|
73 //! original unaligned pointer for free |
e54f539c9b5d
Align image data pointer, this is also in preparation of an upcoming patch
reimar
parents:
21584
diff
changeset
|
74 static unsigned char *ImageDataOrig; |
1 | 75 |
76 /* X11 related variables */ | |
7764 | 77 static XImage *myximage = NULL; |
23381
300e9b7c499f
Remove some unused variables, patch by timwoj ieee org.
diego
parents:
23376
diff
changeset
|
78 static int depth, bpp; |
1 | 79 static XWindowAttributes attribs; |
80 | |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10728
diff
changeset
|
81 static int int_pause; |
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10728
diff
changeset
|
82 |
2969 | 83 static int Flip_Flag; |
4661
4df2400b0527
-fs and or -vm default is nozoom, -zoom does the expected thing
michael
parents:
4658
diff
changeset
|
84 static int zoomFlag; |
2969 | 85 |
1 | 86 |
87 static uint32_t image_width; | |
88 static uint32_t image_height; | |
4641 | 89 static uint32_t in_format; |
12582 | 90 static uint32_t out_format = 0; |
21586
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
91 static int out_offset; |
12582 | 92 static int srcW = -1; |
93 static int srcH = -1; | |
1 | 94 |
12582 | 95 static int old_vo_dwidth = -1; |
96 static int old_vo_dheight = -1; | |
97 | |
22886 | 98 static void check_events(void) |
12582 | 99 { |
100 int ret = vo_x11_check_events(mDisplay); | |
6013
7f6e02a16ac4
some bugfix, x[11|mga|v] ( fullscreen with more files )
pontscho
parents:
5999
diff
changeset
|
101 |
27977
452231ce45b9
Clear the whole window on resize in vo_x11 since we do not
reimar
parents:
27976
diff
changeset
|
102 if (ret & VO_EVENT_RESIZE) |
452231ce45b9
Clear the whole window on resize in vo_x11 since we do not
reimar
parents:
27976
diff
changeset
|
103 vo_x11_clearwindow(mDisplay, vo_window); |
452231ce45b9
Clear the whole window on resize in vo_x11 since we do not
reimar
parents:
27976
diff
changeset
|
104 else if (ret & VO_EVENT_EXPOSE) |
12582 | 105 vo_x11_clearwindow_part(mDisplay, vo_window, myximage->width, |
33420 | 106 myximage->height, vo_fs); |
27976 | 107 if (ret & VO_EVENT_EXPOSE && int_pause) |
12582 | 108 flip_page(); |
109 } | |
110 | |
35050
b291f44d864a
Avoid some code duplication related to drawing the OSD.
reimar
parents:
34571
diff
changeset
|
111 static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src, |
b291f44d864a
Avoid some code duplication related to drawing the OSD.
reimar
parents:
34571
diff
changeset
|
112 unsigned char *srca, int stride) |
12582 | 113 { |
35050
b291f44d864a
Avoid some code duplication related to drawing the OSD.
reimar
parents:
34571
diff
changeset
|
114 int bpp = pixel_stride(out_format); |
b291f44d864a
Avoid some code duplication related to drawing the OSD.
reimar
parents:
34571
diff
changeset
|
115 draw_alpha_func(w, h, src, srca, stride, |
b291f44d864a
Avoid some code duplication related to drawing the OSD.
reimar
parents:
34571
diff
changeset
|
116 ImageData + bpp * (y0 * image_width + x0), |
b291f44d864a
Avoid some code duplication related to drawing the OSD.
reimar
parents:
34571
diff
changeset
|
117 bpp * image_width); |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
118 } |
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
119 |
18746 | 120 static struct SwsContext *swsContext = NULL; |
121 static int dst_width; | |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
122 |
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
123 static XVisualInfo vinfo; |
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
124 |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
16171
diff
changeset
|
125 static void getMyXImage(void) |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
126 { |
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
127 #ifdef HAVE_SHM |
12582 | 128 if (mLocalDisplay && XShmQueryExtension(mDisplay)) |
129 Shmem_Flag = 1; | |
130 else | |
131 { | |
132 Shmem_Flag = 0; | |
133 mp_msg(MSGT_VO, MSGL_WARN, | |
134 "Shared memory not supported\nReverting to normal Xlib\n"); | |
135 } | |
136 if (Shmem_Flag) | |
137 CompletionType = XShmGetEventBase(mDisplay) + ShmCompletion; | |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
138 |
12582 | 139 if (Shmem_Flag) |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
140 { |
12582 | 141 myximage = |
142 XShmCreateImage(mDisplay, vinfo.visual, depth, ZPixmap, NULL, | |
143 &Shminfo[0], image_width, image_height); | |
144 if (myximage == NULL) | |
145 { | |
146 mp_msg(MSGT_VO, MSGL_WARN, | |
147 "Shared memory error,disabling ( Ximage error )\n"); | |
148 goto shmemerror; | |
149 } | |
150 Shminfo[0].shmid = shmget(IPC_PRIVATE, | |
151 myximage->bytes_per_line * | |
152 myximage->height, IPC_CREAT | 0777); | |
153 if (Shminfo[0].shmid < 0) | |
154 { | |
155 XDestroyImage(myximage); | |
156 mp_msg(MSGT_VO, MSGL_V, "%s\n", strerror(errno)); | |
157 //perror( strerror( errno ) ); | |
158 mp_msg(MSGT_VO, MSGL_WARN, | |
159 "Shared memory error,disabling ( seg id error )\n"); | |
160 goto shmemerror; | |
161 } | |
162 Shminfo[0].shmaddr = (char *) shmat(Shminfo[0].shmid, 0, 0); | |
3209 | 163 |
12582 | 164 if (Shminfo[0].shmaddr == ((char *) -1)) |
165 { | |
166 XDestroyImage(myximage); | |
167 if (Shminfo[0].shmaddr != ((char *) -1)) | |
168 shmdt(Shminfo[0].shmaddr); | |
169 mp_msg(MSGT_VO, MSGL_WARN, | |
170 "Shared memory error,disabling ( address error )\n"); | |
171 goto shmemerror; | |
172 } | |
173 myximage->data = Shminfo[0].shmaddr; | |
174 ImageData = (unsigned char *) myximage->data; | |
175 Shminfo[0].readOnly = False; | |
176 XShmAttach(mDisplay, &Shminfo[0]); | |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
177 |
12582 | 178 XSync(mDisplay, False); |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
179 |
12582 | 180 if (gXErrorFlag) |
181 { | |
182 XDestroyImage(myximage); | |
183 shmdt(Shminfo[0].shmaddr); | |
184 mp_msg(MSGT_VO, MSGL_WARN, "Shared memory error,disabling.\n"); | |
185 gXErrorFlag = 0; | |
186 goto shmemerror; | |
187 } else | |
188 shmctl(Shminfo[0].shmid, IPC_RMID, 0); | |
189 | |
190 { | |
191 static int firstTime = 1; | |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
192 |
12582 | 193 if (firstTime) |
194 { | |
195 mp_msg(MSGT_VO, MSGL_V, "Sharing memory.\n"); | |
196 firstTime = 0; | |
197 } | |
198 } | |
199 } else | |
200 { | |
201 shmemerror: | |
202 Shmem_Flag = 0; | |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
203 #endif |
21584
3ddf91e141a3
Use XCreateImage instead of XGetImage, this is not only more correct and
reimar
parents:
20399
diff
changeset
|
204 myximage = XCreateImage(mDisplay, vinfo.visual, depth, ZPixmap, |
3ddf91e141a3
Use XCreateImage instead of XGetImage, this is not only more correct and
reimar
parents:
20399
diff
changeset
|
205 0, NULL, image_width, image_height, 8, 0); |
21585
e54f539c9b5d
Align image data pointer, this is also in preparation of an upcoming patch
reimar
parents:
21584
diff
changeset
|
206 ImageDataOrig = malloc(myximage->bytes_per_line * image_height + 32); |
e54f539c9b5d
Align image data pointer, this is also in preparation of an upcoming patch
reimar
parents:
21584
diff
changeset
|
207 myximage->data = ImageDataOrig + 16 - ((long)ImageDataOrig & 15); |
21584
3ddf91e141a3
Use XCreateImage instead of XGetImage, this is not only more correct and
reimar
parents:
20399
diff
changeset
|
208 memset(myximage->data, 0, myximage->bytes_per_line * image_height); |
12582 | 209 ImageData = myximage->data; |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
210 #ifdef HAVE_SHM |
12582 | 211 } |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
212 #endif |
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
213 } |
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
214 |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
16171
diff
changeset
|
215 static void freeMyXImage(void) |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
216 { |
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
217 #ifdef HAVE_SHM |
12582 | 218 if (Shmem_Flag) |
219 { | |
220 XShmDetach(mDisplay, &Shminfo[0]); | |
221 XDestroyImage(myximage); | |
222 shmdt(Shminfo[0].shmaddr); | |
223 } else | |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
224 #endif |
12582 | 225 { |
21585
e54f539c9b5d
Align image data pointer, this is also in preparation of an upcoming patch
reimar
parents:
21584
diff
changeset
|
226 myximage->data = ImageDataOrig; |
12582 | 227 XDestroyImage(myximage); |
21585
e54f539c9b5d
Align image data pointer, this is also in preparation of an upcoming patch
reimar
parents:
21584
diff
changeset
|
228 ImageDataOrig = NULL; |
12582 | 229 } |
230 myximage = NULL; | |
21584
3ddf91e141a3
Use XCreateImage instead of XGetImage, this is not only more correct and
reimar
parents:
20399
diff
changeset
|
231 ImageData = NULL; |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
232 } |
2218 | 233 |
29401
f01023c524c3
Replace WORDS_BIGENDIAN by HAVE_BIGENDIAN in all internal code.
diego
parents:
29263
diff
changeset
|
234 #if HAVE_BIGENDIAN |
20399
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
235 #define BO_NATIVE MSBFirst |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
236 #define BO_NONNATIVE LSBFirst |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
237 #else |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
238 #define BO_NATIVE LSBFirst |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
239 #define BO_NONNATIVE MSBFirst |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
240 #endif |
25239 | 241 const struct fmt2Xfmtentry_s { |
20399
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
242 uint32_t mpfmt; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
243 int byte_order; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
244 unsigned red_mask; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
245 unsigned green_mask; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
246 unsigned blue_mask; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
247 } fmt2Xfmt[] = { |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
248 {IMGFMT_RGB8, BO_NATIVE, 0x00000007, 0x00000038, 0x000000C0}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
249 {IMGFMT_RGB8, BO_NONNATIVE, 0x00000007, 0x00000038, 0x000000C0}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
250 {IMGFMT_BGR8, BO_NATIVE, 0x000000E0, 0x0000001C, 0x00000003}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
251 {IMGFMT_BGR8, BO_NONNATIVE, 0x000000E0, 0x0000001C, 0x00000003}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
252 {IMGFMT_RGB15, BO_NATIVE, 0x0000001F, 0x000003E0, 0x00007C00}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
253 {IMGFMT_BGR15, BO_NATIVE, 0x00007C00, 0x000003E0, 0x0000001F}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
254 {IMGFMT_RGB16, BO_NATIVE, 0x0000001F, 0x000007E0, 0x0000F800}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
255 {IMGFMT_BGR16, BO_NATIVE, 0x0000F800, 0x000007E0, 0x0000001F}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
256 {IMGFMT_RGB24, MSBFirst, 0x00FF0000, 0x0000FF00, 0x000000FF}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
257 {IMGFMT_RGB24, LSBFirst, 0x000000FF, 0x0000FF00, 0x00FF0000}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
258 {IMGFMT_BGR24, MSBFirst, 0x000000FF, 0x0000FF00, 0x00FF0000}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
259 {IMGFMT_BGR24, LSBFirst, 0x00FF0000, 0x0000FF00, 0x000000FF}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
260 {IMGFMT_RGB32, BO_NATIVE, 0x000000FF, 0x0000FF00, 0x00FF0000}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
261 {IMGFMT_RGB32, BO_NONNATIVE, 0xFF000000, 0x00FF0000, 0x0000FF00}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
262 {IMGFMT_BGR32, BO_NATIVE, 0x00FF0000, 0x0000FF00, 0x000000FF}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
263 {IMGFMT_BGR32, BO_NONNATIVE, 0x0000FF00, 0x00FF0000, 0xFF000000}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
264 {IMGFMT_ARGB, MSBFirst, 0x00FF0000, 0x0000FF00, 0x000000FF}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
265 {IMGFMT_ARGB, LSBFirst, 0x0000FF00, 0x00FF0000, 0xFF000000}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
266 {IMGFMT_ABGR, MSBFirst, 0x000000FF, 0x0000FF00, 0x00FF0000}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
267 {IMGFMT_ABGR, LSBFirst, 0xFF000000, 0x00FF0000, 0x0000FF00}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
268 {IMGFMT_RGBA, MSBFirst, 0xFF000000, 0x00FF0000, 0x0000FF00}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
269 {IMGFMT_RGBA, LSBFirst, 0x000000FF, 0x0000FF00, 0x00FF0000}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
270 {IMGFMT_BGRA, MSBFirst, 0x0000FF00, 0x00FF0000, 0xFF000000}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
271 {IMGFMT_BGRA, LSBFirst, 0x00FF0000, 0x0000FF00, 0x000000FF}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
272 {0, 0, 0, 0, 0} |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
273 }; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
274 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15540
diff
changeset
|
275 static int config(uint32_t width, uint32_t height, uint32_t d_width, |
12582 | 276 uint32_t d_height, uint32_t flags, char *title, |
277 uint32_t format) | |
1 | 278 { |
1110 | 279 // int screen; |
12582 | 280 |
1110 | 281 // int interval, prefer_blank, allow_exp, nothing; |
12582 | 282 Colormap theCmap; |
25239 | 283 const struct fmt2Xfmtentry_s *fmte = fmt2Xfmt; |
12582 | 284 |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
285 #ifdef CONFIG_XF86VM |
27943 | 286 int vm = flags & VOFLAG_MODESWITCHING; |
4426
1ceadec3ea67
using the common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4420
diff
changeset
|
287 #endif |
27943 | 288 Flip_Flag = flags & VOFLAG_FLIPPING; |
289 zoomFlag = flags & VOFLAG_SWSCALE; | |
1 | 290 |
12582 | 291 old_vo_dwidth = -1; |
292 old_vo_dheight = -1; | |
6013
7f6e02a16ac4
some bugfix, x[11|mga|v] ( fullscreen with more files )
pontscho
parents:
5999
diff
changeset
|
293 |
27880
a28ca0971d9a
Cosmetic changes to vo_x11 to reduce diff to vo_xv for future refactoring.
reimar
parents:
27879
diff
changeset
|
294 int_pause = 0; |
12582 | 295 if (!title) |
17787 | 296 title = "MPlayer X11 (XImage/Shm) render"; |
4813 | 297 |
12582 | 298 in_format = format; |
299 srcW = width; | |
300 srcH = height; | |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10728
diff
changeset
|
301 |
12582 | 302 XGetWindowAttributes(mDisplay, mRootWin, &attribs); |
303 depth = attribs.depth; | |
304 | |
305 if (depth != 15 && depth != 16 && depth != 24 && depth != 32) | |
306 { | |
307 Visual *visual; | |
1746 | 308 |
12582 | 309 depth = vo_find_depth_from_visuals(mDisplay, mScreen, &visual); |
310 } | |
311 if (!XMatchVisualInfo(mDisplay, mScreen, depth, DirectColor, &vinfo) || | |
312 (WinID > 0 | |
313 && vinfo.visualid != XVisualIDFromVisual(attribs.visual))) | |
314 XMatchVisualInfo(mDisplay, mScreen, depth, TrueColor, &vinfo); | |
1746 | 315 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29062
diff
changeset
|
316 /* set image size (which is indeed neither the input nor output size), |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29062
diff
changeset
|
317 if zoom is on it will be changed during draw_slice anyway so we don't duplicate the aspect code here |
12582 | 318 */ |
319 image_width = (width + 7) & (~7); | |
320 image_height = height; | |
4661
4df2400b0527
-fs and or -vm default is nozoom, -zoom does the expected thing
michael
parents:
4658
diff
changeset
|
321 |
12582 | 322 { |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
323 #ifdef CONFIG_XF86VM |
12582 | 324 if (vm) |
325 { | |
27890
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
326 vo_vm_switch(); |
12582 | 327 } |
2094
dc11de07b5e7
grabs mouse with -vm - patch by Uwe Reder <Uwe.Reder@3SOFT.de>
arpi
parents:
1924
diff
changeset
|
328 #endif |
1 | 329 |
12582 | 330 theCmap = vo_x11_create_colormap(&vinfo); |
1 | 331 |
27891
8742bcad99b5
Use vo_dwidth/vo_dheight for creating the windows instead of d_width/d_height.
reimar
parents:
27890
diff
changeset
|
332 vo_x11_create_vo_window(&vinfo, vo_dx, vo_dy, vo_dwidth, vo_dheight, |
23655
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23381
diff
changeset
|
333 flags, theCmap, "x11", title); |
27927
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27903
diff
changeset
|
334 if (WinID > 0) |
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27903
diff
changeset
|
335 depth = vo_x11_update_geometry(); |
1 | 336 |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
337 #ifdef CONFIG_XF86VM |
12582 | 338 if (vm) |
339 { | |
340 /* Grab the mouse pointer in our window */ | |
341 if (vo_grabpointer) | |
342 XGrabPointer(mDisplay, vo_window, True, 0, | |
343 GrabModeAsync, GrabModeAsync, | |
344 vo_window, None, CurrentTime); | |
345 XSetInputFocus(mDisplay, vo_window, RevertToNone, CurrentTime); | |
346 } | |
2094
dc11de07b5e7
grabs mouse with -vm - patch by Uwe Reder <Uwe.Reder@3SOFT.de>
arpi
parents:
1924
diff
changeset
|
347 #endif |
12582 | 348 } |
1 | 349 |
12582 | 350 if (myximage) |
351 { | |
352 freeMyXImage(); | |
353 sws_freeContext(swsContext); | |
354 } | |
355 getMyXImage(); | |
356 | |
20399
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
357 while (fmte->mpfmt) { |
27762
7efce8fe3a04
fixed image format detection for 15 bit color depths
faust3
parents:
27412
diff
changeset
|
358 int depth = IMGFMT_RGB_DEPTH(fmte->mpfmt); |
7efce8fe3a04
fixed image format detection for 15 bit color depths
faust3
parents:
27412
diff
changeset
|
359 /* bits_per_pixel in X seems to be set to 16 for 15 bit formats |
7efce8fe3a04
fixed image format detection for 15 bit color depths
faust3
parents:
27412
diff
changeset
|
360 => force depth to 16 so that only the color masks are used for the format check */ |
7efce8fe3a04
fixed image format detection for 15 bit color depths
faust3
parents:
27412
diff
changeset
|
361 if (depth == 15) |
7efce8fe3a04
fixed image format detection for 15 bit color depths
faust3
parents:
27412
diff
changeset
|
362 depth = 16; |
7efce8fe3a04
fixed image format detection for 15 bit color depths
faust3
parents:
27412
diff
changeset
|
363 |
7efce8fe3a04
fixed image format detection for 15 bit color depths
faust3
parents:
27412
diff
changeset
|
364 if (depth == myximage->bits_per_pixel && |
20399
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
365 fmte->byte_order == myximage->byte_order && |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
366 fmte->red_mask == myximage->red_mask && |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
367 fmte->green_mask == myximage->green_mask && |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
368 fmte->blue_mask == myximage->blue_mask) |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
369 break; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
370 fmte++; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
371 } |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
372 if (!fmte->mpfmt) { |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
373 mp_msg(MSGT_VO, MSGL_ERR, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
374 "X server image format not supported, please contact the developers\n"); |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
375 return -1; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
376 } |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
377 out_format = fmte->mpfmt; |
35050
b291f44d864a
Avoid some code duplication related to drawing the OSD.
reimar
parents:
34571
diff
changeset
|
378 draw_alpha_func = vo_get_draw_alpha(out_format); |
b291f44d864a
Avoid some code duplication related to drawing the OSD.
reimar
parents:
34571
diff
changeset
|
379 |
b291f44d864a
Avoid some code duplication related to drawing the OSD.
reimar
parents:
34571
diff
changeset
|
380 bpp = myximage->bits_per_pixel; |
21586
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
381 out_offset = 0; |
34570
26a20c12a5fc
X11 non-native RGB/BGR "emulation" only works for 32bit.
cehoyos
parents:
33420
diff
changeset
|
382 // We can easily "emulate" non-native RGB32 and BGR32 |
34571
463e0da69743
Use 128 instead of 64 to define non-native RGB image formats.
cehoyos
parents:
34570
diff
changeset
|
383 if (out_format == (IMGFMT_BGR32 | 128) || out_format == (IMGFMT_RGB32 | 128)) { |
463e0da69743
Use 128 instead of 64 to define non-native RGB image formats.
cehoyos
parents:
34570
diff
changeset
|
384 out_format &= ~128; |
29401
f01023c524c3
Replace WORDS_BIGENDIAN by HAVE_BIGENDIAN in all internal code.
diego
parents:
29263
diff
changeset
|
385 #if HAVE_BIGENDIAN |
21586
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
386 out_offset = 1; |
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
387 #else |
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
388 out_offset = -1; |
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
389 #endif |
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
390 } |
1 | 391 |
12582 | 392 /* always allocate swsContext as size could change between frames */ |
393 swsContext = | |
394 sws_getContextFromCmdLine(width, height, in_format, width, height, | |
395 out_format); | |
396 if (!swsContext) | |
397 return -1; | |
1 | 398 |
18746 | 399 dst_width = width; |
12582 | 400 //printf( "X11 bpp: %d color mask: R:%lX G:%lX B:%lX\n",bpp,myximage->red_mask,myximage->green_mask,myximage->blue_mask ); |
1 | 401 |
12582 | 402 return 0; |
1 | 403 } |
404 | |
12582 | 405 static void Display_Image(XImage * myximage, uint8_t * ImageData) |
1 | 406 { |
27901
88fad4f51a94
respect -vf dsize etc. also for -rootwin, just like vo_xv does.
reimar
parents:
27892
diff
changeset
|
407 int x = (vo_dwidth - dst_width) / 2; |
88fad4f51a94
respect -vf dsize etc. also for -rootwin, just like vo_xv does.
reimar
parents:
27892
diff
changeset
|
408 int y = (vo_dheight - myximage->height) / 2; |
27975
806c541d03dd
Do not draw in window if our image has not yet been adjusted to the new window size.
reimar
parents:
27974
diff
changeset
|
409 |
806c541d03dd
Do not draw in window if our image has not yet been adjusted to the new window size.
reimar
parents:
27974
diff
changeset
|
410 // do not draw if the image needs rescaling |
806c541d03dd
Do not draw in window if our image has not yet been adjusted to the new window size.
reimar
parents:
27974
diff
changeset
|
411 if ((old_vo_dwidth != vo_dwidth || old_vo_dheight != vo_dheight) && zoomFlag) |
806c541d03dd
Do not draw in window if our image has not yet been adjusted to the new window size.
reimar
parents:
27974
diff
changeset
|
412 return; |
806c541d03dd
Do not draw in window if our image has not yet been adjusted to the new window size.
reimar
parents:
27974
diff
changeset
|
413 |
27901
88fad4f51a94
respect -vf dsize etc. also for -rootwin, just like vo_xv does.
reimar
parents:
27892
diff
changeset
|
414 if (WinID == 0) { |
88fad4f51a94
respect -vf dsize etc. also for -rootwin, just like vo_xv does.
reimar
parents:
27892
diff
changeset
|
415 x = vo_dx; |
88fad4f51a94
respect -vf dsize etc. also for -rootwin, just like vo_xv does.
reimar
parents:
27892
diff
changeset
|
416 y = vo_dy; |
88fad4f51a94
respect -vf dsize etc. also for -rootwin, just like vo_xv does.
reimar
parents:
27892
diff
changeset
|
417 } |
21586
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
418 myximage->data += out_offset; |
3003 | 419 #ifdef HAVE_SHM |
12582 | 420 if (Shmem_Flag) |
421 { | |
422 XShmPutImage(mDisplay, vo_window, vo_gc, myximage, | |
423 0, 0, | |
27901
88fad4f51a94
respect -vf dsize etc. also for -rootwin, just like vo_xv does.
reimar
parents:
27892
diff
changeset
|
424 x, y, dst_width, |
12582 | 425 myximage->height, True); |
426 } else | |
1 | 427 #endif |
12582 | 428 { |
429 XPutImage(mDisplay, vo_window, vo_gc, myximage, | |
430 0, 0, | |
27901
88fad4f51a94
respect -vf dsize etc. also for -rootwin, just like vo_xv does.
reimar
parents:
27892
diff
changeset
|
431 x, y, dst_width, |
12582 | 432 myximage->height); |
433 } | |
21586
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
434 myximage->data -= out_offset; |
1 | 435 } |
436 | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1137
diff
changeset
|
437 static void draw_osd(void) |
12582 | 438 { |
35050
b291f44d864a
Avoid some code duplication related to drawing the OSD.
reimar
parents:
34571
diff
changeset
|
439 if (draw_alpha_func) |
b291f44d864a
Avoid some code duplication related to drawing the OSD.
reimar
parents:
34571
diff
changeset
|
440 vo_draw_text(image_width, image_height, draw_alpha); |
12582 | 441 } |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1137
diff
changeset
|
442 |
12582 | 443 static void flip_page(void) |
444 { | |
445 Display_Image(myximage, ImageData); | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1137
diff
changeset
|
446 XSync(mDisplay, False); |
31 | 447 } |
1 | 448 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15540
diff
changeset
|
449 static int draw_slice(uint8_t * src[], int stride[], int w, int h, |
12582 | 450 int x, int y) |
1 | 451 { |
29062
6a0a30aa2b4a
Consistently use MP_MAX_PLANES as size for plane pointer/stride arrays in libvo.
reimar
parents:
28446
diff
changeset
|
452 uint8_t *dst[MP_MAX_PLANES] = {NULL}; |
6a0a30aa2b4a
Consistently use MP_MAX_PLANES as size for plane pointer/stride arrays in libvo.
reimar
parents:
28446
diff
changeset
|
453 int dstStride[MP_MAX_PLANES] = {0}; |
6059 | 454 |
12582 | 455 if ((old_vo_dwidth != vo_dwidth |
456 || old_vo_dheight != vo_dheight) /*&& y==0 */ && zoomFlag) | |
457 { | |
458 int newW = vo_dwidth; | |
459 int newH = vo_dheight; | |
18746 | 460 struct SwsContext *oldContext = swsContext; |
4641 | 461 |
12582 | 462 old_vo_dwidth = vo_dwidth; |
463 old_vo_dheight = vo_dheight; | |
464 | |
27972
f7b92cea7436
Use aspect.c code in vo_x11.c. Removes some inconsistencies in -wid handling.
reimar
parents:
27943
diff
changeset
|
465 if (vo_fs) |
f7b92cea7436
Use aspect.c code in vo_x11.c. Removes some inconsistencies in -wid handling.
reimar
parents:
27943
diff
changeset
|
466 aspect(&newW, &newH, A_ZOOM); |
12582 | 467 if (sws_flags == 0) |
468 newW &= (~31); // not needed but, if the user wants the FAST_BILINEAR SCALER, then its needed | |
4627 | 469 |
12582 | 470 swsContext = sws_getContextFromCmdLine(srcW, srcH, in_format, |
471 newW, newH, out_format); | |
472 if (swsContext) | |
473 { | |
474 image_width = (newW + 7) & (~7); | |
475 image_height = newH; | |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
476 |
12582 | 477 freeMyXImage(); |
478 getMyXImage(); | |
479 sws_freeContext(oldContext); | |
480 } else | |
481 { | |
482 swsContext = oldContext; | |
483 } | |
18746 | 484 dst_width = newW; |
12582 | 485 } |
486 | |
23284 | 487 dstStride[0] = image_width * ((bpp + 7) / 8); |
488 dst[0] = ImageData; | |
12582 | 489 if (Flip_Flag) |
490 { | |
23284 | 491 dst[0] += dstStride[0] * (image_height - 1); |
492 dstStride[0] = -dstStride[0]; | |
12582 | 493 } |
30150
16c71b965952
Replace deprecated sws_scale_ordered usages by sws_scale (which does the same).
reimar
parents:
29401
diff
changeset
|
494 sws_scale(swsContext, src, stride, y, h, dst, dstStride); |
12582 | 495 return 0; |
1 | 496 } |
497 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15540
diff
changeset
|
498 static int draw_frame(uint8_t * src[]) |
12582 | 499 { |
27883
96831cf06109
Remove code from unused and since ages deprecated draw_frame function.
reimar
parents:
27881
diff
changeset
|
500 return VO_ERROR; |
7683 | 501 } |
502 | |
12582 | 503 static uint32_t get_image(mp_image_t * mpi) |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
504 { |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
505 if (zoomFlag || |
12582 | 506 !IMGFMT_IS_BGR(mpi->imgfmt) || |
507 (IMGFMT_BGR_DEPTH(mpi->imgfmt) != vo_depthonscreen) || | |
508 ((mpi->type != MP_IMGTYPE_STATIC) | |
509 && (mpi->type != MP_IMGTYPE_TEMP)) | |
510 || (mpi->flags & MP_IMGFLAG_PLANAR) | |
511 || (mpi->flags & MP_IMGFLAG_YUV) || (mpi->width != image_width) | |
512 || (mpi->height != image_height)) | |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
25962
diff
changeset
|
513 return VO_FALSE; |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
514 |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
515 if (Flip_Flag) |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
516 { |
12582 | 517 mpi->stride[0] = -image_width * ((bpp + 7) / 8); |
518 mpi->planes[0] = ImageData - mpi->stride[0] * (image_height - 1); | |
519 } else | |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
520 { |
12582 | 521 mpi->stride[0] = image_width * ((bpp + 7) / 8); |
522 mpi->planes[0] = ImageData; | |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
523 } |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
524 mpi->flags |= MP_IMGFLAG_DIRECT; |
12582 | 525 |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
25962
diff
changeset
|
526 return VO_TRUE; |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
527 } |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
528 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15540
diff
changeset
|
529 static int query_format(uint32_t format) |
1 | 530 { |
12582 | 531 mp_msg(MSGT_VO, MSGL_DBG2, |
532 "vo_x11: query_format was called: %x (%s)\n", format, | |
533 vo_format_name(format)); | |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
534 if (IMGFMT_IS_BGR(format)) |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
535 { |
12582 | 536 if (IMGFMT_BGR_DEPTH(format) <= 8) |
537 return 0; // TODO 8bpp not yet fully implemented | |
538 if (IMGFMT_BGR_DEPTH(format) == vo_depthonscreen) | |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13787
diff
changeset
|
539 return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_OSD | VFCAP_SWSCALE | VFCAP_FLIP | |
12582 | 540 VFCAP_ACCEPT_STRIDE; |
541 else | |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13787
diff
changeset
|
542 return VFCAP_CSP_SUPPORTED | VFCAP_OSD | VFCAP_SWSCALE | VFCAP_FLIP | |
12582 | 543 VFCAP_ACCEPT_STRIDE; |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
544 } |
325 | 545 |
12582 | 546 switch (format) |
547 { | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29062
diff
changeset
|
548 // case IMGFMT_BGR8: |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
549 // case IMGFMT_BGR15: |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
550 // case IMGFMT_BGR16: |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
551 // case IMGFMT_BGR24: |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
552 // case IMGFMT_BGR32: |
6694
9291268a3603
1000l, back out hack-n-slay 8bpp code from my local tree.
atmos4
parents:
6693
diff
changeset
|
553 // return 0x2; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29062
diff
changeset
|
554 // case IMGFMT_YUY2: |
12582 | 555 case IMGFMT_I420: |
556 case IMGFMT_IYUV: | |
557 case IMGFMT_YV12: | |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13787
diff
changeset
|
558 return VFCAP_CSP_SUPPORTED | VFCAP_OSD | VFCAP_SWSCALE | VFCAP_ACCEPT_STRIDE; |
12582 | 559 } |
560 return 0; | |
1 | 561 } |
562 | |
563 | |
7683 | 564 static void uninit(void) |
1 | 565 { |
12582 | 566 if (!myximage) |
567 return; | |
568 | |
569 freeMyXImage(); | |
4426
1ceadec3ea67
using the common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4420
diff
changeset
|
570 |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
571 #ifdef CONFIG_XF86VM |
27890
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
572 vo_vm_close(); |
206
82b5ae8ceaf4
adds XF86VidMode support to vo_x11.c to do "pseudo-scaling"
mgraffam
parents:
202
diff
changeset
|
573 #endif |
4426
1ceadec3ea67
using the common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4420
diff
changeset
|
574 |
12582 | 575 zoomFlag = 0; |
576 vo_x11_uninit(); | |
4677
305a0c20bde4
default is allways nozoom again (specify -zoom if u want the sane behavior)
michael
parents:
4662
diff
changeset
|
577 |
12582 | 578 sws_freeContext(swsContext); |
1 | 579 } |
580 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15540
diff
changeset
|
581 static int preinit(const char *arg) |
4352 | 582 { |
12582 | 583 if (arg) |
4737
32e1f5042f65
I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents:
4734
diff
changeset
|
584 { |
12582 | 585 mp_msg(MSGT_VO, MSGL_ERR, "vo_x11: Unknown subdevice: %s\n", arg); |
586 return ENOSYS; | |
4737
32e1f5042f65
I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents:
4734
diff
changeset
|
587 } |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
588 |
12582 | 589 if (!vo_init()) |
590 return -1; // Can't open X11 | |
4737
32e1f5042f65
I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents:
4734
diff
changeset
|
591 return 0; |
4352 | 592 } |
1 | 593 |
33305
ddb45e9443ec
Remove the variable arguments from the libvo control() functions.
iive
parents:
33301
diff
changeset
|
594 static int control(uint32_t request, void *data) |
4352 | 595 { |
12582 | 596 switch (request) |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7765
diff
changeset
|
597 { |
12582 | 598 case VOCTRL_PAUSE: |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
25962
diff
changeset
|
599 return int_pause = 1; |
12582 | 600 case VOCTRL_RESUME: |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
25962
diff
changeset
|
601 return int_pause = 0; |
12582 | 602 case VOCTRL_QUERY_FORMAT: |
603 return query_format(*((uint32_t *) data)); | |
27879
514afc9b920e
Cosmetics for vo_x11 control() to make it more similar to vo_xv.c
reimar
parents:
27762
diff
changeset
|
604 case VOCTRL_GET_IMAGE: |
514afc9b920e
Cosmetics for vo_x11 control() to make it more similar to vo_xv.c
reimar
parents:
27762
diff
changeset
|
605 return get_image(data); |
12582 | 606 case VOCTRL_GUISUPPORT: |
607 return VO_TRUE; | |
27879
514afc9b920e
Cosmetics for vo_x11 control() to make it more similar to vo_xv.c
reimar
parents:
27762
diff
changeset
|
608 case VOCTRL_FULLSCREEN: |
514afc9b920e
Cosmetics for vo_x11 control() to make it more similar to vo_xv.c
reimar
parents:
27762
diff
changeset
|
609 vo_x11_fullscreen(); |
514afc9b920e
Cosmetics for vo_x11 control() to make it more similar to vo_xv.c
reimar
parents:
27762
diff
changeset
|
610 vo_x11_clearwindow(mDisplay, vo_window); |
514afc9b920e
Cosmetics for vo_x11 control() to make it more similar to vo_xv.c
reimar
parents:
27762
diff
changeset
|
611 return VO_TRUE; |
12582 | 612 case VOCTRL_SET_EQUALIZER: |
613 { | |
33301
899d817e56fc
Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents:
32467
diff
changeset
|
614 vf_equalizer_t *eq=data; |
33326
a25fcd61e0c9
Fix vo_x11_set_equalizer argument, must be the raw value to set, not a pointer!
reimar
parents:
33325
diff
changeset
|
615 return vo_x11_set_equalizer(eq->item, eq->value); |
12582 | 616 } |
617 case VOCTRL_GET_EQUALIZER: | |
618 { | |
33301
899d817e56fc
Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents:
32467
diff
changeset
|
619 vf_equalizer_t *eq=data; |
899d817e56fc
Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents:
32467
diff
changeset
|
620 return vo_x11_get_equalizer(eq->item, &eq->value); |
12582 | 621 } |
622 case VOCTRL_ONTOP: | |
623 vo_x11_ontop(); | |
624 return VO_TRUE; | |
22232 | 625 case VOCTRL_UPDATE_SCREENINFO: |
626 update_xinerama_info(); | |
627 return VO_TRUE; | |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7765
diff
changeset
|
628 } |
12582 | 629 return VO_NOTIMPL; |
4352 | 630 } |