Initial checkin.
[glcapture] / glcapture.c
1 /*
2  * Use something like this:
3  *
4  * gcc -shared -fPIC -o glcapture.so glcapture.c -ldl
5  * LD_PRELOAD=`pwd`/glcapture.so ./demo
6  * for FILE in *.ppm; do convert -flip $FILE ${FILE/ppm/tga}; echo $FILE; done
7  * mencoder -noskip -endpos 76.920 -ovc x264 -x264encopts bitrate=3000:pass=1 -audiofile data/Juledemo.ogg -o tufs.avi mf://\*.tga -mf fps=50 -oac mp3lame -lameopts cbr:br=128
8  * mencoder -noskip -endpos 76.920 -ovc x264 -x264encopts bitrate=3000:pass=2 -audiofile data/Juledemo.ogg -o tufs.avi mf://\*.tga -mf fps=50 -oac mp3lame -lameopts cbr:br=128
9  */
10
11 #include <stdio.h>
12 #include <GL/glx.h>
13 #include <sys/time.h>
14 #include <unistd.h>
15 #include <dlfcn.h>
16
17 #ifndef RTLD_NEXT
18 #define RTLD_NEXT ((void *) -1l)
19 #endif
20
21 static char buf[640 * 480 * 3];
22 static int frameno = 0;
23
24 void glXSwapBuffers( Display *dpy, GLXDrawable drawable )
25 {
26         void (*real_swap)(Display*, GLXDrawable);
27         real_swap = (void(*)(Display*, GLXDrawable))dlsym(RTLD_NEXT, "glXSwapBuffers");
28
29         FILE *ppm;
30         char filename[256];
31         glReadPixels(0, 0, 640, 480, GL_RGB, GL_UNSIGNED_BYTE, buf);
32
33         sprintf(filename, "frame%05u.ppm", frameno++);
34         ppm = fopen(filename, "w");
35         fprintf(ppm, "P6\n640 480\n255\n");
36         fwrite(buf, 640*480*3, 1, ppm);
37         fclose(ppm);
38
39         real_swap(dpy, drawable);
40 }
41
42 int gettimeofday(struct timeval *tv, struct timezone *tz)
43 {
44         printf("gettimeofday frame %u\n", frameno);
45         tv->tv_sec = frameno / 50;
46         tv->tv_usec = ((double)(frameno % 50) / 50) * 1000000;
47         return 0;
48 }