Added support for a realease function to eliminate the context blocks used
by each hook. Originally committed as revision 1294 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
@ -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
|
||||||
|
Reference in New Issue
Block a user