1 //////////////////////////////////////////
2 // This file contains a simple filter
3 // skeleton you can use to get started.
4 // With no changes it simply passes
5 // frames through.
6 
7 #include "VapourSynth.h"
8 #include "VSHelper.h"
9 
10 typedef struct {
11     VSNodeRef *node;
12     const VSVideoInfo *vi;
13 } FilterData;
14 
filterInit(VSMap * in,VSMap * out,void ** instanceData,VSNode * node,VSCore * core,const VSAPI * vsapi)15 static void VS_CC filterInit(VSMap *in, VSMap *out, void **instanceData, VSNode *node, VSCore *core, const VSAPI *vsapi) {
16     FilterData *d = (FilterData *) * instanceData;
17     vsapi->setVideoInfo(d->vi, 1, node);
18 }
19 
filterGetFrame(int n,int activationReason,void ** instanceData,void ** frameData,VSFrameContext * frameCtx,VSCore * core,const VSAPI * vsapi)20 static const VSFrameRef *VS_CC filterGetFrame(int n, int activationReason, void **instanceData, void **frameData, VSFrameContext *frameCtx, VSCore *core, const VSAPI *vsapi) {
21     FilterData *d = (FilterData *) * instanceData;
22 
23     if (activationReason == arInitial) {
24         vsapi->requestFrameFilter(n, d->node, frameCtx);
25     } else if (activationReason == arAllFramesReady) {
26         const VSFrameRef *frame = vsapi->getFrameFilter(n, d->node, frameCtx);
27 
28         // your code here...
29 
30         return frame;
31     }
32 
33     return 0;
34 }
35 
filterFree(void * instanceData,VSCore * core,const VSAPI * vsapi)36 static void VS_CC filterFree(void *instanceData, VSCore *core, const VSAPI *vsapi) {
37     FilterData *d = (FilterData *)instanceData;
38     vsapi->freeNode(d->node);
39     free(d);
40 }
41 
filterCreate(const VSMap * in,VSMap * out,void * userData,VSCore * core,const VSAPI * vsapi)42 static void VS_CC filterCreate(const VSMap *in, VSMap *out, void *userData, VSCore *core, const VSAPI *vsapi) {
43     FilterData d;
44     FilterData *data;
45 
46     d.node = vsapi->propGetNode(in, "clip", 0, 0);
47     d.vi = vsapi->getVideoInfo(d.node);
48 
49     data = malloc(sizeof(d));
50     *data = d;
51 
52     vsapi->createFilter(in, out, "Filter", filterInit, filterGetFrame, filterFree, fmParallel, 0, data, core);
53 }
54 
55 //////////////////////////////////////////
56 // Init
57 
VapourSynthPluginInit(VSConfigPlugin configFunc,VSRegisterFunction registerFunc,VSPlugin * plugin)58 VS_EXTERNAL_API(void) VapourSynthPluginInit(VSConfigPlugin configFunc, VSRegisterFunction registerFunc, VSPlugin *plugin) {
59     configFunc("com.example.filter", "filter", "VapourSynth Filter Skeleton", VAPOURSYNTH_API_VERSION, 1, plugin);
60     registerFunc("Filter", "clip:clip;", filterCreate, 0, plugin);
61 }
62