*/
#include <errno.h>
#include "config.h"
-#include "framehook.h"
#include "avformat.h"
+#include "framehook.h"
-#ifdef HAVE_VHOOK
+#ifdef CONFIG_HAVE_DLFCN
#include <dlfcn.h>
#endif
struct _FrameHookEntry *next;
FrameHookConfigureFn Configure;
FrameHookProcessFn Process;
+ FrameHookReleaseFn Release;
void *ctx;
} FrameHookEntry;
loaded = dlopen(argv[0], RTLD_NOW);
if (!loaded) {
- fprintf(stderr, "%s\n", dlerror());
+ av_log(NULL, AV_LOG_ERROR, "%s\n", dlerror());
return -1;
}
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]);
+ av_log(NULL, AV_LOG_ERROR, "Failed to find Process entrypoint in %s\n", argv[0]);
return -1;
}
if (!fhe->Configure && argc > 1) {
- fprintf(stderr, "Failed to find Configure entrypoint in %s\n", argv[0]);
+ av_log(NULL, AV_LOG_ERROR, "Failed to find Configure entrypoint in %s\n", argv[0]);
return -1;
}
if (argc > 1 || fhe->Configure) {
if (fhe->Configure(&fhe->ctx, argc, argv)) {
- fprintf(stderr, "Failed to Configure %s\n", argv[0]);
+ av_log(NULL, AV_LOG_ERROR, "Failed to Configure %s\n", argv[0]);
return -1;
}
}
return 0;
#else
- fprintf(stderr, "Video hooking not compiled into this version\n");
+ av_log(NULL, AV_LOG_ERROR, "Video hooking not compiled into this version\n");
return 1;
#endif
}
{
if (first_hook) {
FrameHookEntry *fhe;
- INT64 pts = av_gettime();
+ int64_t pts = av_gettime();
for (fhe = first_hook; fhe; fhe = fhe->next) {
fhe->Process(fhe->ctx, pict, pix_fmt, width, height, pts);
}
}
}
+
+void frame_hook_release(void)
+{
+ 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;
+}