Commit 4df6d5fd authored by philipjsg's avatar philipjsg

Added support for a realease function to eliminate the context blocks used

by each hook.


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@1294 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 096e5a25
...@@ -21,7 +21,7 @@ ...@@ -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 { ...@@ -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[]) ...@@ -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 ...@@ -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 @@ ...@@ -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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment