Mercurial > libavformat.hg
annotate x11grab.c @ 1571:1db03d7eebe1 libavformat
Original X11 device demuxer patch from Clemens Fruhwirth
- Build system integration is equivalent to RFC #6 patch
- Same rule applies to ffmpeg.c/allformats.[c|h]
- x11grab.c is from Clemens Fruhwirth except the x11 grab
structure for libavformat registration is renamed to
match build system integration.
author | gpoirier |
---|---|
date | Tue, 12 Dec 2006 22:31:46 +0000 |
parents | |
children | fd6931b2b8ce |
rev | line source |
---|---|
1571
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
1 /* |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
2 * X11 video grab interface |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
3 * Copyright (c) 2006 Clemens Fruhwirth |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
4 * |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
5 * A quick note on licensing. This file is a mixture of LGPL code |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
6 * (ffmpeg) and GPL code (xvidcap). The result is a file that must |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
7 * abid both licenses. As they are compatible and GPL is more |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
8 * strict, this code has an "effective" GPL license. |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
9 * |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
10 * This file contains code from grab.c: |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
11 * Copyright (c) 2000,2001 Fabrice Bellard |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
12 * |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
13 * This library is free software; you can redistribute it and/or |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
14 * modify it under the terms of the GNU Lesser General Public |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
15 * License as published by the Free Software Foundation; either |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
16 * version 2 of the License, or (at your option) any later version. |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
17 * |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
18 * This library is distributed in the hope that it will be useful, |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
21 * Lesser General Public License for more details. |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
22 * |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
23 * You should have received a copy of the GNU Lesser General Public |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
24 * License along with this library; if not, write to the Free Software |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
26 * |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
27 * This file contains code from the xvidcap project: |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
28 * Copyright (C) 1997-98 Rasca, Berlin |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
29 * Copyright (C) 2003,04 Karl H. Beckers, Frankfurt |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
30 * |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
31 * This program is free software; you can redistribute it and/or modify |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
32 * it under the terms of the GNU General Public License as published by |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
33 * the Free Software Foundation; either version 2 of the License, or |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
34 * (at your option) any later version. |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
35 * |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
36 * This program is distributed in the hope that it will be useful, |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
37 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
38 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
39 * GNU General Public License for more details. |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
40 * |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
41 * You should have received a copy of the GNU General Public License |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
42 * along with this program; if not, write to the Free Software |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
43 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
44 */ |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
45 #include "avformat.h" |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
46 #include <unistd.h> |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
47 #include <fcntl.h> |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
48 #include <sys/ioctl.h> |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
49 #include <sys/mman.h> |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
50 #include <sys/time.h> |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
51 #define _LINUX_TIME_H 1 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
52 #include <time.h> |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
53 #include <X11/X.h> |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
54 #include <X11/Xlib.h> |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
55 #include <X11/Xlibint.h> |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
56 #include <X11/Xproto.h> |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
57 #include <X11/Xutil.h> |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
58 #include <sys/ipc.h> |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
59 #include <sys/shm.h> |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
60 #include <X11/extensions/XShm.h> |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
61 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
62 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
63 typedef struct { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
64 Display *dpy; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
65 int frame_format; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
66 int frame_size; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
67 int frame_rate; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
68 int frame_rate_base; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
69 int64_t time_frame; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
70 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
71 int height; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
72 int width; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
73 int x_off; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
74 int y_off; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
75 XImage *image; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
76 int use_shm; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
77 XShmSegmentInfo shminfo; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
78 int mouse_wanted; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
79 } X11Grab; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
80 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
81 static int x11grab_read_header(AVFormatContext *s1, AVFormatParameters *ap) |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
82 { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
83 X11Grab *x11grab=s1->priv_data; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
84 Display *dpy; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
85 AVStream *st; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
86 int width, height; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
87 int frame_rate, frame_rate_base, frame_size; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
88 int input_pixfmt; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
89 XImage *image; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
90 int x_off=0; int y_off = 0; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
91 char *device_parsing = strdup(ap->device); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
92 int use_shm; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
93 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
94 dpy = XOpenDisplay(NULL); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
95 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
96 if(!dpy) |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
97 goto fail; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
98 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
99 sscanf(device_parsing,"x11:%d,%d",&x_off, &y_off); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
100 fprintf(stderr,"device: %s -> x: %d y: %d width: %d height: %d\n", ap->device, x_off, y_off, ap->width, ap->height); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
101 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
102 if (!ap || ap->width <= 0 || ap->height <= 0 || ap->time_base.den <= 0) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
103 fprintf(stderr,"x11grab: AVParameters don't have any video size. Use -s.\n"); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
104 return AVERROR_IO; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
105 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
106 width = ap->width; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
107 height = ap->height; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
108 frame_rate = ap->time_base.den; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
109 frame_rate_base = ap->time_base.num; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
110 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
111 st = av_new_stream(s1, 0); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
112 if (!st) |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
113 return -ENOMEM; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
114 av_set_pts_info(st, 48, 1, 1000000); /* 48 bits pts in us */ |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
115 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
116 use_shm = XShmQueryExtension(dpy); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
117 fprintf(stderr,"x11grab: shared memory extension %s\n",use_shm?"found":"not found"); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
118 if(use_shm) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
119 int scr = XDefaultScreen(dpy); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
120 image = XShmCreateImage(dpy, |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
121 DefaultVisual(dpy,scr), |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
122 DefaultDepth(dpy,scr), |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
123 ZPixmap, NULL, |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
124 &x11grab->shminfo, ap->width, ap->height); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
125 x11grab->shminfo.shmid = shmget(IPC_PRIVATE, |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
126 image->bytes_per_line * image->height, IPC_CREAT|0777); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
127 if (x11grab->shminfo.shmid == -1) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
128 fprintf(stderr,"Fatal: Can't get shared memory!\n"); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
129 return -ENOMEM; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
130 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
131 x11grab->shminfo.shmaddr = image->data = shmat(x11grab->shminfo.shmid, 0, 0); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
132 x11grab->shminfo.readOnly = False; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
133 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
134 if (XShmAttach(dpy, &x11grab->shminfo) == 0) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
135 fprintf(stderr,"Fatal: Failed to attach shared memory!\n"); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
136 /* needs some better error subroutine :) */ |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
137 return AVERROR_IO; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
138 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
139 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
140 else { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
141 image = XGetImage(dpy, RootWindow(dpy, DefaultScreen(dpy)), |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
142 x_off,y_off, |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
143 ap->width,ap->height, |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
144 AllPlanes, ZPixmap); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
145 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
146 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
147 switch (image->bits_per_pixel) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
148 case 8: |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
149 fprintf (stderr, "x11grab: 8 bit pallete\n"); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
150 input_pixfmt = PIX_FMT_PAL8; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
151 break; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
152 case 16: |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
153 if ( image->red_mask == 0xF800 && image->green_mask == 0x07E0 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
154 && image->blue_mask == 0x1F ) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
155 fprintf (stderr, "x11grab: 16 bit RGB565\n"); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
156 input_pixfmt = PIX_FMT_RGB565; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
157 } else if ( image->red_mask == 0x7C00 && |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
158 image->green_mask == 0x03E0 && |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
159 image->blue_mask == 0x1F ) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
160 fprintf (stderr, "x11grab: 16 bit RGB555\n"); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
161 input_pixfmt = PIX_FMT_RGB555; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
162 } else { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
163 fprintf (stderr, "x11grab: RGB ordering at image depth %i not supported ... aborting\n", image->bits_per_pixel); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
164 fprintf (stderr, "x11grab: color masks: r 0x%.6X g 0x%.6X b 0x%.6X\n", image->red_mask, image->green_mask, image->blue_mask); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
165 return AVERROR_IO; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
166 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
167 break; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
168 case 24: |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
169 if ( image->red_mask == 0xFF0000 && |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
170 image->green_mask == 0xFF00 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
171 && image->blue_mask == 0xFF ) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
172 input_pixfmt = PIX_FMT_BGR24; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
173 } else if ( image->red_mask == 0xFF && image->green_mask == 0xFF00 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
174 && image->blue_mask == 0xFF0000 ) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
175 input_pixfmt = PIX_FMT_RGB24; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
176 } else { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
177 fprintf (stderr, "xtoffmpeg.XImageToFFMPEG(): rgb ordering at image depth %i not supported ... aborting\n", image->bits_per_pixel); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
178 fprintf (stderr, "xtoffmpeg.XImageToFFMPEG(): color masks: r 0x%.6X g 0x%.6X b 0x%.6X\n", image->red_mask, image->green_mask, image->blue_mask); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
179 return AVERROR_IO; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
180 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
181 break; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
182 case 32: |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
183 #if 0 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
184 GetColorInfo (image, &c_info); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
185 if ( c_info.alpha_mask == 0xFF000000 && image->green_mask == 0xFF00 ) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
186 // byte order is relevant here, not endianness |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
187 // endianness is handled by avcodec, but atm no such thing |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
188 // as having ABGR, instead of ARGB in a word. Since we |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
189 // need this for Solaris/SPARC, but need to do the conversion |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
190 // for every frame we do it outside of this loop, cf. below |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
191 // this matches both ARGB32 and ABGR32 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
192 input_pixfmt = PIX_FMT_ARGB32; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
193 } else { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
194 fprintf (stderr, "xtoffmpeg.XImageToFFMPEG(): image depth %i not supported ... aborting\n", image->bits_per_pixel); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
195 return AVERROR_IO; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
196 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
197 #endif |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
198 input_pixfmt = PIX_FMT_RGBA32; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
199 break; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
200 default: |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
201 fprintf (stderr, "xtoffmpeg.XImageToFFMPEG(): image depth %i not supported ... aborting\n", image->bits_per_pixel); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
202 return -1; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
203 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
204 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
205 frame_size = width * height * image->bits_per_pixel/8; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
206 x11grab->frame_size = frame_size; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
207 x11grab->dpy = dpy; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
208 x11grab->width = ap->width; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
209 x11grab->height = ap->height; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
210 x11grab->frame_rate = frame_rate; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
211 x11grab->frame_rate_base = frame_rate_base; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
212 x11grab->time_frame = av_gettime() * frame_rate / frame_rate_base; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
213 x11grab->x_off = x_off; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
214 x11grab->y_off = y_off; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
215 x11grab->image = image; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
216 x11grab->use_shm = use_shm; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
217 x11grab->mouse_wanted = 1; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
218 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
219 st->codec->codec_type = CODEC_TYPE_VIDEO; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
220 st->codec->codec_id = CODEC_ID_RAWVIDEO; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
221 st->codec->width = width; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
222 st->codec->height = height; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
223 st->codec->pix_fmt = input_pixfmt; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
224 st->codec->time_base.den = frame_rate; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
225 st->codec->time_base.num = frame_rate_base; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
226 st->codec->bit_rate = frame_size * 1/av_q2d(st->codec->time_base) * 8; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
227 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
228 return 0; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
229 fail: |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
230 av_free(st); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
231 av_free(device_parsing); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
232 return AVERROR_IO; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
233 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
234 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
235 uint16_t mousePointerBlack[] = { 0, 49152, 40960, 36864, 34816, 33792, 33280, 33024, 32896, 32832, |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
236 33728, 37376, 43264, 51456, 1152, 1152, 576, 576, 448, 0 }; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
237 uint16_t mousePointerWhite[] = { 0, 0, 16384, 24576, 28672, 30720, 31744, 32256, 32512, 32640, 31744, |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
238 27648, 17920, 1536, 768, 768, 384, 384, 0, 0 }; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
239 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
240 static void getCurrentPointer(X11Grab *s, int *x, int *y) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
241 Window mrootwindow, childwindow; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
242 int dummy; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
243 Display *dpy = s->dpy; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
244 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
245 mrootwindow = DefaultRootWindow(dpy); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
246 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
247 if (XQueryPointer(dpy, mrootwindow, &mrootwindow, &childwindow, |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
248 x, y, &dummy, &dummy, &dummy)) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
249 } else { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
250 fprintf(stderr,"couldn't find mouse pointer\n"); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
251 *x = -1; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
252 *y = -1; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
253 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
254 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
255 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
256 static void paintMousePointer(X11Grab *s, int *x, int *y, XImage *image) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
257 int x_off = s->x_off; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
258 int y_off = s->y_off; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
259 int width = s->width; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
260 int height = s->height; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
261 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
262 if ((*x - x_off) >= 0 && |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
263 *x < (width + x_off) && |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
264 (*y - y_off) >= 0 && |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
265 *y < (height + y_off) ) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
266 int line; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
267 uint8_t *im_data = image->data; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
268 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
269 im_data += (image->bytes_per_line * (*y - y_off)); // shift to right line |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
270 im_data += (image->bits_per_pixel / 8 * (*x - x_off)); // shift to right pixel |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
271 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
272 switch(image->bits_per_pixel) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
273 case 32: |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
274 { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
275 uint32_t *cursor; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
276 int width_cursor; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
277 uint16_t bm_b, bm_w, mask; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
278 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
279 for (line = 0; line < 20; line++ ) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
280 if (s->mouse_wanted == 1) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
281 bm_b = mousePointerBlack[line]; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
282 bm_w = mousePointerWhite[line]; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
283 } else { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
284 bm_b = mousePointerWhite[line]; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
285 bm_w = mousePointerBlack[line]; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
286 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
287 mask = ( 0x0001 << 15 ); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
288 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
289 for (cursor = (uint32_t*) im_data, width_cursor = 0; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
290 ((width_cursor + *x) < (width + x_off) && width_cursor < 16); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
291 cursor++, width_cursor++) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
292 // Boolean pointer_b_bit, pointer_w_bit; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
293 // pointer_b_bit = ( ( bm_b & mask ) > 0 ); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
294 // pointer_w_bit = ( ( bm_w & mask ) > 0 ); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
295 // printf("%i ", pointer_b_bit, pointer_w_bit ); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
296 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
297 if ( ( bm_b & mask ) > 0 ) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
298 *cursor &= ((~ image->red_mask) & (~ image->green_mask) & (~image->blue_mask )); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
299 } else if ( ( bm_w & mask ) > 0 ) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
300 *cursor |= (image->red_mask | image->green_mask | image->blue_mask ); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
301 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
302 mask >>= 1; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
303 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
304 // printf("\n"); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
305 im_data += image->bytes_per_line; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
306 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
307 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
308 break; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
309 #if 0 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
310 case 24: // not sure this can occur at all .......... |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
311 fprintf(stderr,"input image bits_per_pixel %i not implemented with mouse pointer capture ... aborting!\n", |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
312 image->bits_per_pixel); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
313 fprintf(stderr,"Please file a bug at http://www.sourceforge.net/projects/xvidcap/\n"); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
314 exit(1); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
315 break; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
316 case 16: { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
317 uint16_t *cursor; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
318 int width; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
319 uint16_t bm_b, bm_w, mask; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
320 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
321 for (line = 0; line < 16; line++ ) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
322 if (mjob->mouseWanted == 1) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
323 bm_b = mousePointerBlack[line]; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
324 bm_w = mousePointerWhite[line]; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
325 } else { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
326 bm_b = mousePointerWhite[line]; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
327 bm_w = mousePointerBlack[line]; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
328 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
329 mask = ( 0x0001 << 15 ); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
330 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
331 for (cursor = (uint16_t*) im_data, width = 0; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
332 ((width + *x) < (mjob->area->width + mjob->area->x)&&width < 6); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
333 cursor++, width++) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
334 // Boolean pointer_b_bit, pointer_w_bit; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
335 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
336 // pointer_b_bit = ( ( bm_b & mask ) > 0 ); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
337 // pointer_w_bit = ( ( bm_w & mask ) > 0 ); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
338 // printf("%i ", pointer_b_bit, pointer_w_bit ); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
339 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
340 if ( ( bm_b & mask ) > 0 ) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
341 *cursor &= ((~ image->red_mask) & (~ image->green_mask) & (~ |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
342 image->blue_mask )); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
343 } else if ( ( bm_w & mask ) > 0 ) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
344 *cursor |= (image->red_mask | image->green_mask | image->blue_mask ); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
345 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
346 mask >>= 1; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
347 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
348 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
349 // printf("\n"); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
350 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
351 im_data += image->bytes_per_line; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
352 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
353 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
354 break; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
355 case 8: { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
356 uint8_t *cursor; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
357 int width; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
358 uint16_t bm_b, bm_w, mask; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
359 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
360 for (line = 0; line < 16; line++ ) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
361 if (mjob->mouseWanted == 1) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
362 bm_b = mousePointerBlack[line]; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
363 bm_w = mousePointerWhite[line]; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
364 } else { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
365 bm_b = mousePointerWhite[line]; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
366 bm_w = mousePointerBlack[line]; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
367 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
368 mask = ( 0x0001 << 15 ); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
369 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
370 for (cursor = im_data, width = 0; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
371 ((width + *x) < (mjob->area->width + mjob->area->x)&&width < 6); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
372 cursor++, width++) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
373 // Boolean pointer_b_bit, pointer_w_bit; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
374 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
375 // pointer_b_bit = ( ( bm_b & mask ) > 0 ); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
376 // pointer_w_bit = ( ( bm_w & mask ) > 0 ); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
377 // printf("%i ", pointer_b_bit, pointer_w_bit ); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
378 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
379 if ( ( bm_b & mask ) > 0 ) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
380 *cursor = 0; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
381 } else if ( ( bm_w & mask ) > 0 ) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
382 *cursor = 1; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
383 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
384 mask >>= 1; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
385 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
386 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
387 // printf("\n"); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
388 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
389 im_data += image->bytes_per_line; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
390 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
391 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
392 break; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
393 default: |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
394 fprintf(stderr,"input image bits_per_pixel %i not supported with mouse pointer capture ... aborting!\n", |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
395 image->bits_per_pixel); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
396 exit(1); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
397 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
398 #endif |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
399 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
400 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
401 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
402 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
403 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
404 /* |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
405 * just read new data in the image structure, the image |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
406 * structure inclusive the data area must be allocated before |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
407 */ |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
408 static int |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
409 XGetZPixmap(Display *dpy, Drawable d, XImage *image, int x, int y) |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
410 { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
411 xGetImageReply rep; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
412 xGetImageReq *req; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
413 long nbytes; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
414 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
415 if (!image) |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
416 return (False); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
417 LockDisplay(dpy); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
418 GetReq(GetImage, req); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
419 /* |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
420 * first set up the standard stuff in the request |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
421 */ |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
422 req->drawable = d; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
423 req->x = x; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
424 req->y = y; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
425 req->width = image->width; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
426 req->height = image->height; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
427 req->planeMask = AllPlanes; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
428 req->format = ZPixmap; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
429 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
430 if (_XReply(dpy, (xReply *) &rep, 0, xFalse) == 0 || |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
431 rep.length == 0) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
432 UnlockDisplay(dpy); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
433 SyncHandle(); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
434 return (False); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
435 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
436 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
437 nbytes = (long)rep.length << 2; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
438 _XReadPad(dpy, image->data, nbytes); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
439 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
440 UnlockDisplay(dpy); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
441 SyncHandle(); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
442 return (True); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
443 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
444 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
445 static int |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
446 x11grab_read_packet(AVFormatContext *s1, AVPacket *pkt) |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
447 { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
448 X11Grab *s = s1->priv_data; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
449 Display *dpy = s->dpy; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
450 XImage *image = s->image; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
451 int x_off = s->x_off; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
452 int y_off = s->y_off; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
453 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
454 int64_t curtime, delay; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
455 struct timespec ts; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
456 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
457 /* Calculate the time of the next frame */ |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
458 s->time_frame += int64_t_C(1000000); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
459 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
460 /* wait based on the frame rate */ |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
461 for(;;) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
462 curtime = av_gettime(); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
463 delay = s->time_frame * s->frame_rate_base / s->frame_rate - curtime; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
464 if (delay <= 0) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
465 if (delay < int64_t_C(-1000000) * s->frame_rate_base / s->frame_rate) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
466 /* printf("grabbing is %d frames late (dropping)\n", (int) -(delay / 16666)); */ |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
467 s->time_frame += int64_t_C(1000000); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
468 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
469 break; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
470 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
471 ts.tv_sec = delay / 1000000; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
472 ts.tv_nsec = (delay % 1000000) * 1000; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
473 nanosleep(&ts, NULL); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
474 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
475 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
476 if (av_new_packet(pkt, s->frame_size) < 0) |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
477 return AVERROR_IO; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
478 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
479 pkt->pts = curtime & ((1LL << 48) - 1); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
480 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
481 if(s->use_shm) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
482 if (!XShmGetImage(dpy, |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
483 RootWindow(dpy, DefaultScreen(dpy)), |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
484 image, x_off, y_off, AllPlanes)) { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
485 fprintf(stderr,"XShmGetImage() failed\n"); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
486 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
487 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
488 else { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
489 XGetZPixmap(dpy, |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
490 RootWindow(dpy, DefaultScreen(dpy)), |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
491 image, x_off, y_off); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
492 }; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
493 { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
494 int pointer_x, pointer_y; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
495 getCurrentPointer(s, &pointer_x, &pointer_y); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
496 paintMousePointer(s, &pointer_x, &pointer_y, image); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
497 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
498 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
499 #warning FIXME - avoid memcpy |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
500 memcpy(pkt->data, image->data, s->frame_size); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
501 return s->frame_size; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
502 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
503 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
504 static int |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
505 x11grab_read_close(AVFormatContext *s1) |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
506 { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
507 X11Grab *x11grab = s1->priv_data; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
508 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
509 XCloseDisplay(x11grab->dpy); |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
510 return 0; |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
511 } |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
512 |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
513 AVInputFormat x11_grab_device_demuxer = { |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
514 "x11grab", |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
515 "X11grab", |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
516 sizeof(X11Grab), |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
517 NULL, |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
518 x11grab_read_header, |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
519 x11grab_read_packet, |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
520 x11grab_read_close, |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
521 .flags = AVFMT_NOFILE, |
1db03d7eebe1
Original X11 device demuxer patch from Clemens Fruhwirth
gpoirier
parents:
diff
changeset
|
522 }; |