static const VSFrameRef *VS_CC textGetFrame(int n, int activationReason, void **instanceData, void **frameData, VSFrameContext *frameCtx, VSCore *core, const VSAPI *vsapi) { TextData *d = (TextData *) * instanceData; if (activationReason == arInitial) { vsapi->requestFrameFilter(n, d->node, frameCtx); } else if (activationReason == arAllFramesReady) { const VSFrameRef *src = vsapi->getFrameFilter(n, d->node, frameCtx); VSFrameRef *dst = vsapi->copyFrame(src, core); vsapi->freeFrame(src); const VSFormat *frame_format = vsapi->getFrameFormat(dst); if ((frame_format->sampleType == stInteger && frame_format->bitsPerSample > 16) || (frame_format->sampleType == stFloat && frame_format->bitsPerSample != 32)) { vsapi->setFilterError((d->instanceName + ": Only 8..16 bit integer and 32 bit float formats supported").c_str(), frameCtx); return NULL; } if (d->filter == FILTER_FRAMENUM) { scrawl_text(std::to_string(n), d->alignment, dst, vsapi); } else if (d->filter == FILTER_FRAMEPROPS) { const VSMap *props = vsapi->getFramePropsRO(dst); int numKeys = vsapi->propNumKeys(props); int i; std::string text = "Frame properties:\n"; if (!d->props.empty()) { for (stringlist::const_iterator iter = d->props.begin(); iter != d->props.end(); ++iter) { append_prop(text, *iter, props, vsapi); } } else { for (i = 0; i < numKeys; i++) { const char *key = vsapi->propGetKey(props, i); append_prop(text, key, props, vsapi); } } scrawl_text(text, d->alignment, dst, vsapi); } else if (d->filter == FILTER_COREINFO) { const VSCoreInfo *ci = vsapi->getCoreInfo(core); std::string text; text.append(ci->versionString).append("\n"); text.append("Threads: ").append(std::to_string(ci->numThreads)).append("\n"); text.append("Maximum framebuffer cache size: ").append(std::to_string(ci->maxFramebufferSize)).append(" bytes\n"); text.append("Used framebuffer cache size: ").append(std::to_string(ci->usedFramebufferSize)).append(" bytes"); scrawl_text(text, d->alignment, dst, vsapi); } else { scrawl_text(d->text, d->alignment, dst, vsapi); } return dst; } return 0; }
static const VSFrameRef *VS_CC textGetFrame(int n, int activationReason, void **instanceData, void **frameData, VSFrameContext *frameCtx, VSCore *core, const VSAPI *vsapi) { TextData *d = static_cast<TextData *>(*instanceData); if (activationReason == arInitial) { vsapi->requestFrameFilter(n, d->node, frameCtx); } else if (activationReason == arAllFramesReady) { const VSFrameRef *src = vsapi->getFrameFilter(n, d->node, frameCtx); const VSFormat *frame_format = vsapi->getFrameFormat(src); if ((frame_format->sampleType == stInteger && frame_format->bitsPerSample > 16) || (frame_format->sampleType == stFloat && frame_format->bitsPerSample != 32)) { vsapi->freeFrame(src); vsapi->setFilterError((d->instanceName + ": Only 8..16 bit integer and 32 bit float formats supported").c_str(), frameCtx); return nullptr; } VSFrameRef *dst = vsapi->copyFrame(src, core); if (d->filter == FILTER_FRAMENUM) { scrawl_text(std::to_string(n), d->alignment, dst, vsapi); } else if (d->filter == FILTER_FRAMEPROPS) { const VSMap *props = vsapi->getFramePropsRO(dst); int numKeys = vsapi->propNumKeys(props); int i; std::string text = "Frame properties:\n"; if (!d->props.empty()) { for (const auto &iter : d->props) { append_prop(text, iter, props, vsapi); } } else { for (i = 0; i < numKeys; i++) { const char *key = vsapi->propGetKey(props, i); append_prop(text, key, props, vsapi); } } scrawl_text(text, d->alignment, dst, vsapi); } else if (d->filter == FILTER_COREINFO) { const VSCoreInfo *ci = vsapi->getCoreInfo(core); std::string text; text.append(ci->versionString).append("\n"); text.append("Threads: ").append(std::to_string(ci->numThreads)).append("\n"); text.append("Maximum framebuffer cache size: ").append(std::to_string(ci->maxFramebufferSize)).append(" bytes\n"); text.append("Used framebuffer cache size: ").append(std::to_string(ci->usedFramebufferSize)).append(" bytes"); scrawl_text(text, d->alignment, dst, vsapi); } else if (d->filter == FILTER_CLIPINFO) { const VSMap *props = vsapi->getFramePropsRO(src); std::string text = "Clip info:\n"; if (d->vi->width) { text += "Width: " + std::to_string(vsapi->getFrameWidth(dst, 0)) + " px\n"; text += "Height: " + std::to_string(vsapi->getFrameHeight(dst, 0)) + " px\n"; } else { text += "Width: " + std::to_string(vsapi->getFrameWidth(dst, 0)) + " px (may vary)\n"; text += "Height: " + std::to_string(vsapi->getFrameHeight(dst, 0)) + " px (may vary)\n"; } int snerr, sderr; int sn = int64ToIntS(vsapi->propGetInt(props, "_SARNum", 0, &snerr)); int sd = int64ToIntS(vsapi->propGetInt(props, "_SARDen", 0, &sderr)); if (snerr || sderr) text += "Aspect ratio: Unknown\n"; else text += "Sample aspect ratio: " + std::to_string(sn) + ":" + std::to_string(sd) + "\n"; text += "Length: " + std::to_string(d->vi->numFrames) + " frames\n"; text += "Format name: " + std::string(frame_format->name) + (d->vi->format ? "\n" : " (may vary)\n"); text += "Color family: " + colorFamilyToString(frame_format->colorFamily) + "\n"; text += "Sample type: " + std::string(frame_format->sampleType == stInteger ? "Integer" : "Float") + "\n"; text += "Bits per sample: " + std::to_string(frame_format->bitsPerSample) + "\n"; text += "Subsampling Height/Width: " + std::to_string(1 << frame_format->subSamplingH) + "x/" + std::to_string(1 << frame_format->subSamplingW) + "x\n"; int err; int matrix = int64ToIntS(vsapi->propGetInt(props, "_Matrix", 0, &err)); if (err) matrix = -1; int primaries = int64ToIntS(vsapi->propGetInt(props, "_Primaries", 0, &err)); if (err) primaries = -1; int transfer = int64ToIntS(vsapi->propGetInt(props, "_Transfer", 0, &err)); if (err) transfer = -1; int range = int64ToIntS(vsapi->propGetInt(props, "_ColorRange", 0, &err)); if (err) range = -1; int location = int64ToIntS(vsapi->propGetInt(props, "_ChromaLocation", 0, &err)); if (err) location = -1; int field = int64ToIntS(vsapi->propGetInt(props, "_FieldBased", 0, &err)); if (err) field = -1; const char *picttype = vsapi->propGetData(props, "_PictType", 0, &err); text += "Matrix: " + matrixToString(matrix) + "\n"; text += "Primaries: " + primariesToString(primaries) + "\n"; text += "Transfer: " + transferToString(transfer) + "\n"; text += "Range: " + rangeToString(range) + "\n"; text += "Chroma Location: " + chromaLocationToString(location) + "\n"; text += "Field handling: " + fieldBasedToString(field) + "\n"; text += "Picture type: " + std::string(picttype ? picttype : "Unknown") + "\n"; if (d->vi->fpsNum && d->vi->fpsDen) { text += "Fps: " + std::to_string(d->vi->fpsNum) + "/" + std::to_string(d->vi->fpsDen) + " (" + std::to_string(static_cast<double>(d->vi->fpsNum) / d->vi->fpsDen) + ")\n"; } else { text += "Fps: Unknown\n"; } int fnerr, fderr; int fn = int64ToIntS(vsapi->propGetInt(props, "_DurationNum", 0, &fnerr)); int fd = int64ToIntS(vsapi->propGetInt(props, "_DurationDen", 0, &fderr)); if (fnerr || fderr) { text += "Frame duration: Unknown\n"; } else { text += "Frame duration: " + std::to_string(fn) + "/" + std::to_string(fd) + " (" + std::to_string(static_cast<double>(fn) / fd) + ")\n"; } scrawl_text(text, d->alignment, dst, vsapi); } else { scrawl_text(d->text, d->alignment, dst, vsapi); } vsapi->freeFrame(src); return dst; } return nullptr; }