by each hook. Originally committed as revision 1294 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.5
| @@ -21,7 +21,7 @@ | |||||
| #include "framehook.h" | #include "framehook.h" | ||||
| #include "avformat.h" | #include "avformat.h" | ||||
| #ifdef HAVE_VHOOK | |||||
| #ifdef CONFIG_HAVE_DLFCN | |||||
| #include <dlfcn.h> | #include <dlfcn.h> | ||||
| #endif | #endif | ||||
| @@ -30,6 +30,7 @@ typedef struct _FrameHookEntry { | |||||
| struct _FrameHookEntry *next; | struct _FrameHookEntry *next; | ||||
| FrameHookConfigureFn Configure; | FrameHookConfigureFn Configure; | ||||
| FrameHookProcessFn Process; | FrameHookProcessFn Process; | ||||
| FrameHookReleaseFn Release; | |||||
| void *ctx; | void *ctx; | ||||
| } FrameHookEntry; | } FrameHookEntry; | ||||
| @@ -59,6 +60,7 @@ int frame_hook_add(int argc, char *argv[]) | |||||
| fhe->Configure = dlsym(loaded, "Configure"); | fhe->Configure = dlsym(loaded, "Configure"); | ||||
| fhe->Process = dlsym(loaded, "Process"); | fhe->Process = dlsym(loaded, "Process"); | ||||
| fhe->Release = dlsym(loaded, "Release"); /* Optional */ | |||||
| if (!fhe->Process) { | if (!fhe->Process) { | ||||
| fprintf(stderr, "Failed to find Process entrypoint in %s\n", argv[0]); | fprintf(stderr, "Failed to find Process entrypoint in %s\n", argv[0]); | ||||
| @@ -100,3 +102,18 @@ void frame_hook_process(AVPicture *pict, enum PixelFormat pix_fmt, int width, in | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| void frame_hook_release() | |||||
| { | |||||
| FrameHookEntry *fhe; | |||||
| FrameHookEntry *fhenext; | |||||
| for (fhe = first_hook; fhe; fhe = fhenext) { | |||||
| fhenext = fhe->next; | |||||
| if (fhe->Release) | |||||
| fhe->Release(fhe->ctx); | |||||
| av_free(fhe); | |||||
| } | |||||
| first_hook = NULL; | |||||
| } | |||||
| @@ -8,12 +8,22 @@ | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| /* Function must be called 'Configure' */ | /* Function must be called 'Configure' */ | ||||
| typedef int (*FrameHookConfigureFn)(void **ctxp, int argc, char *argv[]); | |||||
| typedef int (FrameHookConfigure)(void **ctxp, int argc, char *argv[]); | |||||
| typedef FrameHookConfigure *FrameHookConfigureFn; | |||||
| extern FrameHookConfigure Configure; | |||||
| /* Function must be called 'Process' */ | /* Function must be called 'Process' */ | ||||
| typedef void (*FrameHookProcessFn)(void *ctx, struct AVPicture *pict, enum PixelFormat pix_fmt, int width, int height, INT64 pts); | |||||
| typedef void (FrameHookProcess)(void *ctx, struct AVPicture *pict, enum PixelFormat pix_fmt, int width, int height, INT64 pts); | |||||
| typedef FrameHookProcess *FrameHookProcessFn; | |||||
| extern FrameHookProcess Process; | |||||
| /* Function must be called 'Release' */ | |||||
| typedef void (FrameHookRelease)(void *ctx); | |||||
| typedef FrameHookRelease *FrameHookReleaseFn; | |||||
| extern FrameHookRelease Release; | |||||
| extern int frame_hook_add(int argc, char *argv[]); | extern int frame_hook_add(int argc, char *argv[]); | ||||
| extern void frame_hook_process(struct AVPicture *pict, enum PixelFormat pix_fmt, int width, int height); | extern void frame_hook_process(struct AVPicture *pict, enum PixelFormat pix_fmt, int width, int height); | ||||
| extern void frame_hook_release(); | |||||
| #endif | #endif | ||||