軽く画面キャプチャしたい
id:toge:20070126#1169796599
ちょっと前の話を受けて、軽く画面キャプチャする仕組みを模索してみようという話。
ビデオキャプチャとかハードウェアが入らない、お手軽路線で。
まずはglXSwapBuffers()を独自関数でラップしようとしたのですが、効果無し。
参考文献:BINARY HACKS #61
/* gcc -shared -fPIC -o libglcap.so glcap.c -ldl -lGL */ #include <stdio.h> #include <GL/gl.h> #define __USE_GNU #include <dlfcn.h> static void (*real_glXSwapBuffers)(Display*,GLXDrawable) = NULL; void __attribute__((constructor)) init_glXSwapBuffers() { real_glXSwapBuffers = dlsym(RTLD_NEXT, "glXSwapBuffers"); } void glXSwapBuffers(Display *dpy, GLXDrawable drawable) { printf("foge\n"); real_glXSwapBuffers(dpy, drawable); }
調べてみるとSDLのSDL_GL_SwapBuffers()はSDLの初期化時にlibGL.soあたりから動的に関数をロードしているらしい。そりゃglXSwapBuffers()をラップしても意味ないか。
ということでSDL_GL_SwapBuffers()をラップする方向に変更。
/* gcc -shared -fPIC -o libsdlcap.so sdlcap.c -ldl */ #include <stdio.h> #define __USE_GNU #include <dlfcn.h> static void (*real_SDLGLSwapBuffers)() = NULL; void __attribute__((constructor)) init_SDLGLSwapBuffers() { real_SDLGLSwapBuffers = dlsym(RTLD_NEXT, "SDL_GL_SwapBuffers"); } void SDL_GL_SwapBuffers() { printf("foge\n"); real_SDLGLSwapBuffers(); }
うん、うまくいきました。汎用的にするにはglXSwapBuffers()とSDL_GL_SwapBuffers()をラップしておけば言い訳か。まずは最初の一歩は成功しましたとさ。