Added support for a realease function to eliminate the context blocks used
authorPhilip Gladstone <philipjsg@users.sourceforge.net>
Sat, 30 Nov 2002 17:16:32 +0000 (17:16 +0000)
committerPhilip Gladstone <philipjsg@users.sourceforge.net>
Sat, 30 Nov 2002 17:16:32 +0000 (17:16 +0000)
by each hook.

Originally committed as revision 1294 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/framehook.c
libavformat/framehook.h

index 03ee32e1885dac99fd62d8e92f376a5ea00fa9e8..e0597f00c1299bbede4cb3fbd599b27c60e750bf 100644 (file)
@@ -21,7 +21,7 @@
 #include "framehook.h"
 #include "avformat.h"
 
-#ifdef HAVE_VHOOK
+#ifdef CONFIG_HAVE_DLFCN
 #include <dlfcn.h>
 #endif
 
@@ -30,6 +30,7 @@ typedef struct _FrameHookEntry {
     struct _FrameHookEntry *next;
     FrameHookConfigureFn Configure;
     FrameHookProcessFn Process;
+    FrameHookReleaseFn Release;
     void *ctx;
 } FrameHookEntry;
 
@@ -59,6 +60,7 @@ int frame_hook_add(int argc, char *argv[])
 
     fhe->Configure = dlsym(loaded, "Configure");
     fhe->Process = dlsym(loaded, "Process");
+    fhe->Release = dlsym(loaded, "Release");    /* Optional */
 
     if (!fhe->Process) {
         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;
+}
index eb1a51f7e46cac28e8b2b35a8b85177934ae0f51..210b3d20f4b333391112d9a036cad4efde638dbf 100644 (file)
@@ -8,12 +8,22 @@
 #include "avcodec.h"
 
 /* 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' */
-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 void frame_hook_process(struct AVPicture *pict, enum PixelFormat pix_fmt, int width, int height);
+extern void frame_hook_release();
 
 #endif