1 /*
2 * Copyright (c) 1995 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * Permission to use, copy, modify, and distribute this software and its
6 * documentation for any purpose, without fee, and without written agreement is
7 * hereby granted, provided that the above copyright notice and the following
8 * two paragraphs appear in all copies of this software.
9 *
10 * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
11 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
12 * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
13 * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14 *
15 * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
16 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
17 * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
18 * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
19 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
20 */
21
22 /* gcc -o playone playone.c -lX11 -lXvid -I/n/picasso/project/mm/xvideo/include
23 */
24 #include <stdio.h>
25 #include <X11/Xlib.h>
26 #include <X11/Xutil.h>
27 #include <XPlxExt.h>
28
usage(p)29 usage (p)
30 char *p;
31
32 {
33 fprintf (stderr, "Usage: %s filename width height start end outbase [quality]\n", p);
34 exit (1);
35 }
36
37 static char buffer[300000];
38
39 Visual *
FindFullColorVisual(dpy,depth)40 FindFullColorVisual (dpy, depth)
41 Display *dpy;
42 int *depth;
43 {
44 XVisualInfo vinfo;
45 XVisualInfo *vinfo_ret;
46 int numitems, maxdepth;
47
48 vinfo.class = TrueColor;
49
50 vinfo_ret = XGetVisualInfo(dpy, VisualClassMask, &vinfo, &numitems);
51
52 if (numitems == 0) return NULL;
53
54 maxdepth = 0;
55 while(numitems > 0) {
56 if (vinfo_ret[numitems-1].depth > maxdepth) {
57 maxdepth = vinfo_ret[numitems-1 ].depth;
58 }
59 numitems--;
60 }
61 XFree(vinfo_ret);
62
63 if (maxdepth < 24) return NULL;
64
65 if (XMatchVisualInfo(dpy, DefaultScreen(dpy), maxdepth,
66 TrueColor, &vinfo)) {
67 *depth = maxdepth;
68 return vinfo.visual;
69 }
70
71 return NULL;
72 }
73
74 Window
CreateFullColorWindow(dpy,x,y,w,h)75 CreateFullColorWindow (dpy, x, y, w, h)
76 Display *dpy;
77 int x, y, w, h;
78 {
79 int depth;
80 Visual *visual;
81 XSetWindowAttributes xswa;
82 unsigned int mask;
83 unsigned int class;
84 int screen;
85
86 screen = XDefaultScreen(dpy);
87 class = InputOutput; /* Could be InputOnly */
88 visual = FindFullColorVisual (dpy, &depth);
89 if (visual == NULL) {
90 return 0;
91 }
92 mask = CWBackPixel | CWColormap | CWBorderPixel;
93 xswa.colormap = XCreateColormap(dpy, XRootWindow(dpy, screen),
94 visual, AllocNone);
95 xswa.background_pixel = BlackPixel(dpy, DefaultScreen(dpy));
96 xswa.border_pixel = WhitePixel(dpy, DefaultScreen(dpy));
97
98 return XCreateWindow(dpy, RootWindow(dpy, screen), x, y, w, h,
99 1, depth, class, visual, mask, &xswa);
100 }
101
main(argc,argv)102 main (argc, argv)
103 int argc;
104 char **argv;
105
106 {
107 char *filename;
108 Display *dpy;
109 int screen;
110 Window root;
111 XEvent event;
112 GC gc;
113 Window win;
114 XPlxCImage image;
115 int size;
116 char *qTable;
117 FILE *inFile;
118 FILE *outFile;
119 extern char *malloc();
120 int fd, r1, r2, i, j, r;
121 int quality;
122 int start, end;
123 XImage *ximage;
124 char *tdata;
125 char *obase;
126 char ofname[256];
127 int height, width;
128 char command[256];
129
130
131 if ((argc != 7) && (argc != 8))usage (argv[0]);
132 filename = argv[1];
133
134 width = atoi(argv[2]);
135 height = atoi(argv[3]);
136
137 start = atoi(argv[4]);
138 end = atoi(argv[5]);
139
140 if ((start < 1) || (end < start)) {
141 perror ("Bad start and end values.");
142 exit();
143 }
144
145 obase = argv[6];
146
147 quality = 100;
148
149 if (argc > 7)
150 quality = atoi (argv[7]);
151
152 dpy = XOpenDisplay (NULL);
153 screen = DefaultScreen(dpy);
154 root = DefaultRootWindow(dpy);
155 /* gc = DefaultGC(dpy, screen); */
156 /* win = XCreateSimpleWindow (dpy, root, 0, 0, width, height,
157 0, NULL, NULL);
158 */
159 win = CreateFullColorWindow(dpy, 0, 0, width+4, height+4);
160 gc = XCreateGC(dpy, win, 0, NULL);
161
162 if (!win ) {
163 perror ("Unable to create window");
164 exit(1);
165 }
166
167 XMapWindow (dpy, win);
168 XSelectInput (dpy, win, ExposureMask |ButtonPressMask);
169
170 size = MakeQTables(quality, &qTable);
171 XPlxPutTable(dpy, win, gc, qTable, size, 0);
172 XPlxPutTable(dpy, win, gc, qTable, size, 1);
173 XPlxVideoTag (dpy, win, gc, PLX_VIDEO);
174
175 inFile = fopen(filename, "r");
176 if (inFile == NULL) {
177 perror (filename);
178 exit (1);
179 }
180 fd = fileno(inFile);
181 wait(2);
182
183 for (i=0; i<start; i++) {
184 if (read (fd, &image, sizeof(image)) != sizeof(image)) {
185 perror("End of file.");
186 exit();
187 }
188 image.data = buffer;
189 if (read (fd, buffer, image.size) != image.size) {
190 perror("End of file.");
191 exit();
192 }
193 }
194
195 for (i=start; i<=end; i++) {
196 fprintf(stdout, "GRABBING FRAME %d\n", i);
197
198 if (read (fd, &image, sizeof(image)) != sizeof(image)) {
199 perror("End of file.");
200 exit();
201 }
202 image.data = buffer;
203 if (read (fd, buffer, image.size) != image.size) {
204 perror("End of file.");
205 exit();
206 }
207
208 XPlxPutCImage (dpy, win, gc, &image, 0, 0, image.width,
209 image.height, 0, 0, width+2, height+2, 1);
210
211 XFlush(dpy);
212
213 ximage = XGetImage(dpy, win, 0, 0, width, height, 0x00ffffff,
214 ZPixmap);
215
216 if (i == 0) {
217 fprintf(stderr, "Depth %d\n", ximage->depth);
218 fprintf(stderr, "Height: %d Width: %d\n", height, width );
219 }
220 tdata = ximage->data;
221
222
223 sprintf(ofname, "%s.%d.jpeg", obase, i);
224 outFile = fopen("/tmp/foobar", "w");
225 if (!outFile) {
226 perror("Couldn't open output file.");
227 }
228
229 for (r=0; r<height; r++) {
230 for (j=0; j<width; j++) {
231 fputc(*(tdata+3), outFile);
232 fputc(*(tdata+2), outFile);
233 fputc(*(tdata+1), outFile);
234 tdata += 4;
235 }
236 }
237
238 fclose(outFile);
239
240 free(tdata);
241
242 sprintf(command, "rawtoppm %d %d < /tmp/foobar | cjpeg > %s",
243 width, height, ofname);
244 system(command);
245 }
246 }
247
248
249
250
251
252