toge's diary

コンピュータ関連の趣味をつらつらと。

軽く画面キャプチャしたい

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);
} 

調べてみるとSDLSDL_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()をラップしておけば言い訳か。まずは最初の一歩は成功しましたとさ。