annotate libvo/Attic/SHIT/video_out_x11.c.OLD @ 485:dfafa47d751d

Tons of code rewrites.
author se7encode
date Tue, 17 Apr 2001 17:35:27 +0000
parents 3b5f5d1c5041
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1 #define DISP
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
2
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
3 /*
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
4 * video_out_x11.c, X11 interface
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
5 *
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
6 *
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
7 * Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
8 *
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
9 * Hacked into mpeg2dec by
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
10 *
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
11 * Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
12 *
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
13 * 15 & 16 bpp support added by Franck Sicard <Franck.Sicard@solsoft.fr>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
14 *
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
15 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
16
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
17 #include <stdio.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
18 #include <stdlib.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
19 #include <string.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
20
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
21 #include "config.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
22 #include "video_out.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
23 #include "video_out_internal.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
24
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
25 LIBVO_EXTERN(x11)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
26
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
27 #include <X11/Xlib.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
28 #include <X11/Xutil.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
29 #include <X11/extensions/XShm.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
30 #include <errno.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
31 #include "yuv2rgb.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
32
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
33 static vo_info_t vo_info =
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
34 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
35 "X11 (XImage/Shm)",
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
36 "x11",
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
37 "Aaron Holtzman <aholtzma@ess.engr.uvic.ca>",
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
38 ""
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
39 };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
40
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
41 /* private prototypes */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
42 static void Display_Image (XImage * myximage, unsigned char *ImageData);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
43
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
44 /* since it doesn't seem to be defined on some platforms */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
45 int XShmGetEventBase(Display*);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
46
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
47 /* local data */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
48 static unsigned char *ImageData;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
49
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
50 /* X11 related variables */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
51 static Display *mydisplay;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
52 static Window mywindow;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
53 static GC mygc;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
54 static XImage *myximage;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
55 static int depth, bpp, mode;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
56 static XWindowAttributes attribs;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
57 static int X_already_started = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
58
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
59 #define SH_MEM
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
60
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
61 #ifdef SH_MEM
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
62
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
63 #include <sys/ipc.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
64 #include <sys/shm.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
65 #include <X11/extensions/XShm.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
66
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
67 //static int HandleXError _ANSI_ARGS_((Display * dpy, XErrorEvent * event));
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
68 static void InstallXErrorHandler (void);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
69 static void DeInstallXErrorHandler (void);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
70
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
71 static int Shmem_Flag;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
72 static int Quiet_Flag;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
73 static XShmSegmentInfo Shminfo[1];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
74 static int gXErrorFlag;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
75 static int CompletionType = -1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
76
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
77 static void InstallXErrorHandler()
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
78 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
79 //XSetErrorHandler(HandleXError);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
80 XFlush(mydisplay);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
81 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
82
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
83 static void DeInstallXErrorHandler()
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
84 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
85 XSetErrorHandler(NULL);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
86 XFlush(mydisplay);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
87 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
88
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
89 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
90
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
91 static uint32_t image_width;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
92 static uint32_t image_height;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
93 static uint32_t image_format;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
94
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
95 extern void vo_decoration( Display * vo_Display,Window w,int d );
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
96
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
97 /* connect to server, create and map window,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
98 * allocate colors and (shared) memory
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
99 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
100 static uint32_t
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
101 init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t fullscreen, char *title, uint32_t format)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
102 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
103 int screen;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
104 unsigned int fg, bg;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
105 char *hello = (title == NULL) ? "I hate X11" : title;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
106 char *name = ":0.0";
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
107 XSizeHints hint;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
108 XVisualInfo vinfo;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
109 XEvent xev;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
110 XGCValues xgcv;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
111 Colormap theCmap;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
112 XSetWindowAttributes xswa;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
113 unsigned long xswamask;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
114
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
115 image_height = height;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
116 image_width = width;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
117 image_format=format;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
118
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
119 if (X_already_started) return -1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
120 if(!vo_init()) return 0; // Can't open X11
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
121
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
122 if(getenv("DISPLAY")) name = getenv("DISPLAY");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
123
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
124 mydisplay = XOpenDisplay(name);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
125
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
126 if (mydisplay == NULL)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
127 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
128 fprintf(stderr,"Can not open display\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
129 return -1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
130 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
131
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
132 screen = DefaultScreen(mydisplay);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
133
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
134 hint.x = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
135 hint.y = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
136 hint.width = image_width;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
137 hint.height = image_height;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
138 hint.flags = PPosition | PSize;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
139
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
140 /* Get some colors */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
141
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
142 bg = WhitePixel(mydisplay, screen);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
143 fg = BlackPixel(mydisplay, screen);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
144
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
145 XGetWindowAttributes(mydisplay, DefaultRootWindow(mydisplay), &attribs);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
146 depth = attribs.depth;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
147 // depth = vo_depthonscreen;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
148
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
149 if (depth != 15 && depth != 16 && depth != 24 && depth != 32)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
150 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
151 /* The root window may be 8bit but there might still be
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
152 * visuals with other bit depths. For example this is the
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
153 * case on Sun/Solaris machines.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
154 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
155 depth = 24;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
156 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
157 //BEGIN HACK
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
158 //mywindow = XCreateSimpleWindow(mydisplay, DefaultRootWindow(mydisplay),
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
159 //hint.x, hint.y, hint.width, hint.height, 4, fg, bg);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
160 //
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
161 XMatchVisualInfo(mydisplay, screen, depth, TrueColor, &vinfo);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
162
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
163 theCmap = XCreateColormap(mydisplay, RootWindow(mydisplay,screen),
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
164 vinfo.visual, AllocNone);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
165
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
166 xswa.background_pixel = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
167 xswa.border_pixel = 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
168 xswa.colormap = theCmap;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
169 xswamask = CWBackPixel | CWBorderPixel |CWColormap;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
170
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
171
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
172 mywindow = XCreateWindow(mydisplay, RootWindow(mydisplay,screen),
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
173 hint.x, hint.y, hint.width, hint.height, 4, depth,CopyFromParent,vinfo.visual,xswamask,&xswa);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
174
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
175 if ( fullscreen ) vo_decoration( mydisplay,mywindow,0 );
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
176
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
177 XSelectInput(mydisplay, mywindow, StructureNotifyMask);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
178
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
179 /* Tell other applications about this window */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
180
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
181 XSetStandardProperties(mydisplay, mywindow, hello, hello, None, NULL, 0, &hint);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
182
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
183 /* Map window. */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
184
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
185 XMapWindow(mydisplay, mywindow);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
186
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
187 /* Wait for map. */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
188 do
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
189 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
190 XNextEvent(mydisplay, &xev);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
191 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
192 while (xev.type != MapNotify || xev.xmap.event != mywindow);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
193
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
194 XSelectInput(mydisplay, mywindow, NoEventMask);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
195
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
196 XFlush(mydisplay);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
197 XSync(mydisplay, False);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
198
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
199 mygc = XCreateGC(mydisplay, mywindow, 0L, &xgcv);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
200
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
201 #ifdef SH_MEM
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
202 if (XShmQueryExtension(mydisplay))
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
203 Shmem_Flag = 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
204 else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
205 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
206 Shmem_Flag = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
207 if (!Quiet_Flag)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
208 fprintf(stderr, "Shared memory not supported\nReverting to normal Xlib\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
209 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
210 if (Shmem_Flag)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
211 CompletionType = XShmGetEventBase(mydisplay) + ShmCompletion;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
212
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
213 InstallXErrorHandler();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
214
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
215 if (Shmem_Flag)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
216 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
217 myximage = XShmCreateImage(mydisplay, vinfo.visual,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
218 depth, ZPixmap, NULL, &Shminfo[0], width, image_height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
219
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
220 /* If no go, then revert to normal Xlib calls. */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
221
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
222 if (myximage == NULL )
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
223 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
224 if (myximage != NULL)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
225 XDestroyImage(myximage);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
226 if (!Quiet_Flag)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
227 fprintf(stderr, "Shared memory error, disabling (Ximage error)\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
228
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
229 goto shmemerror;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
230 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
231 /* Success here, continue. */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
232
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
233 Shminfo[0].shmid = shmget(IPC_PRIVATE,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
234 myximage->bytes_per_line * myximage->height ,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
235 IPC_CREAT | 0777);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
236 if (Shminfo[0].shmid < 0 )
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
237 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
238 XDestroyImage(myximage);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
239 if (!Quiet_Flag)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
240 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
241 printf("%s\n",strerror(errno));
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
242 perror(strerror(errno));
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
243 fprintf(stderr, "Shared memory error, disabling (seg id error)\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
244 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
245 goto shmemerror;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
246 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
247 Shminfo[0].shmaddr = (char *) shmat(Shminfo[0].shmid, 0, 0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
248
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
249 if (Shminfo[0].shmaddr == ((char *) -1))
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
250 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
251 XDestroyImage(myximage);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
252 if (Shminfo[0].shmaddr != ((char *) -1))
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
253 shmdt(Shminfo[0].shmaddr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
254 if (!Quiet_Flag)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
255 fprintf(stderr, "Shared memory error, disabling (address error)\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
256 goto shmemerror;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
257 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
258 myximage->data = Shminfo[0].shmaddr;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
259 ImageData = (unsigned char *) myximage->data;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
260 Shminfo[0].readOnly = False;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
261 XShmAttach(mydisplay, &Shminfo[0]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
262
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
263 XSync(mydisplay, False);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
264
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
265 if (gXErrorFlag)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
266 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
267 /* Ultimate failure here. */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
268 XDestroyImage(myximage);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
269 shmdt(Shminfo[0].shmaddr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
270 if (!Quiet_Flag)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
271 fprintf(stderr, "Shared memory error, disabling.\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
272 gXErrorFlag = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
273 goto shmemerror;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
274 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
275 else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
276 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
277 shmctl(Shminfo[0].shmid, IPC_RMID, 0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
278 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
279
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
280 if (!Quiet_Flag)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
281 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
282 fprintf(stderr, "Sharing memory.\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
283 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
284 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
285 else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
286 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
287 shmemerror:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
288 Shmem_Flag = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
289 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
290 myximage = XGetImage(mydisplay, mywindow, 0, 0,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
291 width, image_height, AllPlanes, ZPixmap);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
292 ImageData = myximage->data;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
293 #ifdef SH_MEM
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
294 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
295
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
296 DeInstallXErrorHandler();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
297 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
298
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
299 bpp = myximage->bits_per_pixel;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
300
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
301 printf("X11 color mask: R:%X G:%X B:%X\n",
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
302 myximage->red_mask,myximage->green_mask,myximage->blue_mask);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
303
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
304 // If we have blue in the lowest bit then obviously RGB
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
305 mode = ((myximage->blue_mask & 0x01) != 0) ? MODE_RGB : MODE_BGR;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
306 // mode = ((myximage->blue_mask & 0x01) == 0) ? MODE_RGB : MODE_BGR;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
307 #ifdef WORDS_BIGENDIAN
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
308 if (myximage->byte_order != MSBFirst)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
309 #else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
310 if (myximage->byte_order != LSBFirst)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
311 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
312 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
313 fprintf( stderr, "No support fon non-native XImage byte order!\n" );
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
314 return -1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
315 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
316
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
317 /*
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
318 * If depth is 24 then it may either be a 3 or 4 byte per pixel
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
319 * format. We can't use bpp because then we would lose the
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
320 * distinction between 15/16bit depth (2 byte formate assumed).
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
321 *
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
322 * FIXME - change yuv2rgb_init to take both depth and bpp
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
323 * parameters
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
324 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
325 if(format==IMGFMT_YV12) yuv2rgb_init((depth == 24) ? bpp : depth, mode);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
326
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
327 XSelectInput(mydisplay, mywindow, StructureNotifyMask | KeyPressMask );
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
328 X_already_started++;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
329 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
330 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
331
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
332 static const vo_info_t*
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
333 get_info(void)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
334 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
335 return &vo_info;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
336 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
337
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
338
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
339 static void
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
340 Terminate_Display_Process(void)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
341 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
342 getchar(); /* wait for enter to remove window */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
343 #ifdef SH_MEM
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
344 if (Shmem_Flag)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
345 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
346 XShmDetach(mydisplay, &Shminfo[0]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
347 XDestroyImage(myximage);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
348 shmdt(Shminfo[0].shmaddr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
349 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
350 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
351 XDestroyWindow(mydisplay, mywindow);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
352 XCloseDisplay(mydisplay);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
353 X_already_started = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
354 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
355
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
356 static void
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
357 Display_Image(XImage *myximage, uint8_t *ImageData)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
358 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
359 #ifdef DISP
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
360 #ifdef SH_MEM
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
361 if (Shmem_Flag)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
362 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
363 XShmPutImage(mydisplay, mywindow, mygc, myximage,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
364 0, 0, 0, 0, myximage->width, myximage->height, True);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
365 XFlush(mydisplay);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
366 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
367 else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
368 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
369 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
370 XPutImage(mydisplay, mywindow, mygc, myximage, 0, 0, 0, 0,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
371 myximage->width, myximage->height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
372 XFlush(mydisplay);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
373 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
374 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
375 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
376
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
377
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
378 static void
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
379 flip_page(void)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
380 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
381
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
382 int i;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
383 XEvent Event;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
384 char buf[100];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
385 KeySym keySym;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
386 XComposeStatus stat;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
387 unsigned long vo_KeyTable[512];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
388
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
389 while ( XPending( mydisplay ) )
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
390 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
391 XNextEvent( mydisplay,&Event );
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
392 switch( Event.type )
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
393 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
394 case ConfigureNotify:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
395 // windowwidth = Event.xconfigure.width;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
396 // windowheight = Event.xconfigure.height;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
397 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
398 case KeyPress:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
399 XLookupString( &Event.xkey,buf,sizeof(buf),&keySym,&stat );
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
400 vo_keyboard( ( (keySym&0xff00) != 0?( (keySym&0x00ff) + 256 ):( keySym ) ) );
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
401 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
402 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
403 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
404
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
405 Display_Image(myximage, ImageData);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
406 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
407
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
408
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
409 static uint32_t
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
410 draw_slice(uint8_t *src[], uint32_t slice_num)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
411 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
412 uint8_t *dst;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
413
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
414 dst = ImageData + image_width * 16 * (bpp/8) * slice_num;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
415
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
416 yuv2rgb(dst , src[0], src[1], src[2],
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
417 image_width, 16,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
418 image_width*(bpp/8), image_width, image_width/2 );
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
419 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
420 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
421
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
422 void rgb15to16_mmx(char* s0,char* d0,int count);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
423
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
424 #if 1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
425 static uint32_t
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
426 draw_frame(uint8_t *src[])
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
427 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
428 if(image_format==IMGFMT_YV12){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
429 yuv2rgb(ImageData, src[0], src[1], src[2],
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
430 image_width, image_height,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
431 image_width*(bpp/8), image_width, image_width/2 );
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
432 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
433 int sbpp=((image_format&0xFF)+7)/8;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
434 int dbpp=(bpp+7)/8;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
435 char *d=ImageData;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
436 char *s=src[0];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
437 //printf("sbpp=%d dbpp=%d depth=%d bpp=%d\n",sbpp,dbpp,depth,bpp);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
438 #if 0
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
439 // flipped BGR
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
440 int i;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
441 // printf("Rendering flipped BGR frame bpp=%d src=%d dst=%d\n",bpp,sbpp,dbpp);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
442 s+=sbpp*image_width*image_height;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
443 for(i=0;i<image_height;i++){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
444 s-=sbpp*image_width;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
445 if(sbpp==dbpp)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
446 memcpy(d,s,sbpp*image_width);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
447 else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
448 char *s2=s;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
449 char *d2=d;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
450 char *e=s2+sbpp*image_width;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
451 while(s2<e){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
452 d2[0]=s2[0];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
453 d2[1]=s2[1];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
454 d2[2]=s2[2];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
455 s2+=sbpp;d2+=dbpp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
456 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
457 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
458 d+=dbpp*image_width;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
459 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
460 #else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
461 // memcpy(ImageData,src[0],image_width*image_height*bpp);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
462 if(sbpp==dbpp){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
463 //Display_Image(myximage, s);return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
464 #if 1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
465 if(depth==16 && image_format==(IMGFMT_BGR|15)){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
466 // do 15bpp->16bpp
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
467 #ifdef HAVE_MMX
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
468 rgb15to16_mmx(s,d,2*image_width*image_height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
469 #else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
470 unsigned short *s1=(unsigned short *)s;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
471 unsigned short *d1=(unsigned short *)d;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
472 unsigned short *e=s1+image_width*image_height;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
473 while(s1<e){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
474 register int x=*(s1++);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
475 // rrrrrggggggbbbbb
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
476 // 0rrrrrgggggbbbbb
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
477 // 0111 1111 1110 0000 = 0x7FE0
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
478 // 00000000000001 1111 = 0x001F
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
479 *(d1++)=(x&0x001F)|((x&0x7FE0)<<1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
480 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
481 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
482 } else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
483 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
484 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
485 memcpy(d,s,sbpp*image_width*image_height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
486 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
487 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
488 char *e=s+sbpp*image_width*image_height;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
489 //printf("libvo: using C 24->32bpp conversion\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
490 while(s<e){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
491 d[0]=s[0];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
492 d[1]=s[1];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
493 d[2]=s[2];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
494 s+=sbpp;d+=dbpp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
495 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
496 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
497 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
498 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
499 //Display_Image(myximage, ImageData);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
500 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
501 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
502 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
503
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
504
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
505
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
506 static uint32_t
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
507 query_format(uint32_t format)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
508 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
509 if(!vo_init()) return 0; // Can't open X11
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
510
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
511 if((format&IMGFMT_BGR_MASK)==IMGFMT_BGR && (format&0xFF)==vo_depthonscreen) return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
512
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
513 switch(format){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
514 case IMGFMT_YV12:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
515 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
516 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
517 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
518 }