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