#include "VSScript4.h"
#include "VSHelper4.h"
#include <stdio.h>
#include <assert.h>
static const char *messageTypeToString(int msgType) {
switch (msgType) {
case mtDebug: return "Debug";
case mtInformation: return "Information";
case mtWarning: return "Warning";
case mtCritical: return "Critical";
case mtFatal: return "Fatal";
default: return "";
}
}
static void VS_CC logMessageHandler(int msgType, const char *msg, void *userData) {
if (msgType >= mtInformation)
fprintf(stderr, "%s: %s\n", messageTypeToString(msgType), msg);
}
int main(int argc, char **argv) {
const VSAPI *vsapi = NULL;
const VSSCRIPTAPI *vssapi = NULL;
VSScript *se = NULL;
VSCore *core = NULL;
FILE *outFile = NULL;
if (argc != 3) {
fprintf(stderr, "Usage: vsscript_example <infile> <outfile>\n");
return 1;
}
outFile = fopen(argv[2], "wb");
if (!outFile) {
fprintf(stderr, "Failed to open output for writing\n");
return 1;
}
vssapi = getVSScriptAPI(VSSCRIPT_API_VERSION);
if (!vssapi) {
fprintf(stderr, "Failed to initialize VSScript library\n");
return 1;
}
vsapi = vssapi->getVSAPI(VAPOURSYNTH_API_VERSION);
assert(vsapi);
core = vsapi->createCore(0);
vsapi->addLogHandler(logMessageHandler, NULL, NULL, core);
vsapi->setCoreNodeTiming(core, 1);
se = vssapi->createScript(core);
if (vssapi->evaluateFile(se, argv[1])) {
fprintf(stderr, "Script evaluation failed:\n%s", vssapi->getError(se));
vssapi->freeScript(se);
return 1;
}
VSNode *node = vssapi->getOutputNode(se, 0);
if (!node) {
fprintf(stderr, "Failed to retrieve output node\n");
vssapi->freeScript(se);
return 1;
}
const VSVideoInfo *vi = vsapi->getVideoInfo(node);
if (!vsh_isConstantVideoFormat(vi)) {
fprintf(stderr, "Cannot output clips with varying dimensions or format\n");
vsapi->freeNode(node);
vssapi->freeScript(se);
return 1;
}
char errMsg[1024];
int error = 0;
for (int n = 0; n < vi->numFrames; n++) {
const VSFrame *frame = vsapi->getFrame(n, node, errMsg, sizeof(errMsg));
if (!frame) { error = 1;
break;
}
for (int p = 0; p < vi->format.numPlanes; p++) {
ptrdiff_t stride = vsapi->getStride(frame, p);
const uint8_t *readPtr = vsapi->getReadPtr(frame, p);
int rowSize = vsapi->getFrameWidth(frame, p) * vi->format.bytesPerSample;
int height = vsapi->getFrameHeight(frame, p);
for (int y = 0; y < height; y++) {
fwrite(readPtr, rowSize, 1, outFile);
readPtr += stride;
}
}
vsapi->freeFrame(frame);
}
fclose(outFile);
vsapi->freeNode(node);
vssapi->freeScript(se);
if (error) {
fprintf(stderr, "%s", errMsg);
return 1;
}
return 0;
}