Am 28.07.24 um 15:09 schrieb Ramiro Polla:
if (st->codecpar->format == AV_PIX_FMT_NONE) {
- av_log(s, AV_LOG_ERROR, "Unsupported VS pixel format %s\n",
info->format->name);
+ if(vs->vsapi->getVideoFormatName(&info->format, vsfmt))
+ av_log(s, AV_LOG_ERROR, "Unsupported VS pixel format
%s\n", vsfmt);
+ else
+ av_log(s, AV_LOG_ERROR, "Unsupported VS pixel format\n");
err = AVERROR_EXTERNAL;
goto done;
}
- av_log(s, AV_LOG_VERBOSE, "VS format %s -> pixfmt %s\n",
info->format->name,
- av_get_pix_fmt_name(st->codecpar->format));
-
- if (info->format->colorFamily == cmYCoCg)
- st->codecpar->color_space = AVCOL_SPC_YCGCO;
+ if (vs->vsapi->getVideoFormatName(&info->format, vsfmt))
+ av_log(s, AV_LOG_VERBOSE, "VS format %s -> pixfmt %s\n",
+ vsfmt, av_get_pix_fmt_name(st->codecpar->format));
+ else
+ av_log(s, AV_LOG_VERBOSE, "VS format -> pixfmt %s\n",
+ av_get_pix_fmt_name(st->codecpar->format));
Could you change this to have a single call go av_log()? Possibly using
a %s with a string for the unknown format. Same thing for the other
av_log() above.
[...]
It now prints "(unknown)" for a video format that VapourSynth cannot
resolve. "(unknown)" is also printed at other places in ffmpeg in
similar cases, so it's consistent.
Also could you give us a very minimal test script to test this?
I have attached a minimal test script, it will generate 10 frames each
black, red, green, blue in 640x480, RGB24
Best regards
Stefan
From 2279d2e225c665cab68d26652e1cca4fdf04faaa Mon Sep 17 00:00:00 2001
From: Stefan Oltmanns <stefan-oltma...@gmx.net>
Date: Mon, 29 Jul 2024 05:08:57 +0200
Subject: [PATCH 1/2] avformat/vapoursynth: Update to API version 4
Signed-off-by: Stefan Oltmanns <stefan-oltma...@gmx.net>
---
configure | 2 +-
libavformat/vapoursynth.c | 77 ++++++++++++++++++++-------------------
2 files changed, 40 insertions(+), 39 deletions(-)
diff --git a/configure b/configure
index f6f5c29fea..c50b5ad4b4 100755
--- a/configure
+++ b/configure
@@ -7085,7 +7085,7 @@ enabled rkmpp && { require_pkg_config rkmpp rockchip_mpp rockchip/r
{ enabled libdrm ||
die "ERROR: rkmpp requires --enable-libdrm"; }
}
-enabled vapoursynth && require_pkg_config vapoursynth "vapoursynth-script >= 42" VSScript.h vsscript_init
+enabled vapoursynth && require_pkg_config vapoursynth "vapoursynth-script >= 55" VSScript4.h getVSScriptAPI
if enabled gcrypt; then
diff --git a/libavformat/vapoursynth.c b/libavformat/vapoursynth.c
index 8a2519e19a..26c9986138 100644
--- a/libavformat/vapoursynth.c
+++ b/libavformat/vapoursynth.c
@@ -25,8 +25,7 @@
#include <limits.h>
-#include <VapourSynth.h>
-#include <VSScript.h>
+#include <VSScript4.h>
#include "libavutil/avassert.h"
#include "libavutil/avstring.h"
@@ -41,6 +40,7 @@
#include "internal.h"
struct VSState {
+ const VSSCRIPTAPI *vssapi;
VSScript *vss;
};
@@ -49,10 +49,10 @@ typedef struct VSContext {
AVBufferRef *vss_state;
+ const VSSCRIPTAPI *vssapi;
const VSAPI *vsapi;
- VSCore *vscore;
- VSNodeRef *outnode;
+ VSNode *outnode;
int is_cfr;
int current_frame;
@@ -75,8 +75,7 @@ static void free_vss_state(void *opaque, uint8_t *data)
struct VSState *vss = opaque;
if (vss->vss) {
- vsscript_freeScript(vss->vss);
- vsscript_finalize();
+ vss->vssapi->freeScript(vss->vss);
}
}
@@ -90,7 +89,6 @@ static av_cold int read_close_vs(AVFormatContext *s)
av_buffer_unref(&vs->vss_state);
vs->vsapi = NULL;
- vs->vscore = NULL;
vs->outnode = NULL;
return 0;
@@ -106,7 +104,7 @@ static av_cold int is_native_endian(enum AVPixelFormat pixfmt)
return pd && (!!HAVE_BIGENDIAN == !!(pd->flags & AV_PIX_FMT_FLAG_BE));
}
-static av_cold enum AVPixelFormat match_pixfmt(const VSFormat *vsf, int c_order[4])
+static av_cold enum AVPixelFormat match_pixfmt(const VSVideoFormat *vsf, int c_order[4])
{
static const int yuv_order[4] = {0, 1, 2, 0};
static const int rgb_order[4] = {1, 2, 0, 0};
@@ -128,13 +126,12 @@ static av_cold enum AVPixelFormat match_pixfmt(const VSFormat *vsf, int c_order[
pd->log2_chroma_h != vsf->subSamplingH)
continue;
- is_rgb = vsf->colorFamily == cmRGB;
+ is_rgb = vsf->colorFamily == cfRGB;
if (is_rgb != !!(pd->flags & AV_PIX_FMT_FLAG_RGB))
continue;
- is_yuv = vsf->colorFamily == cmYUV ||
- vsf->colorFamily == cmYCoCg ||
- vsf->colorFamily == cmGray;
+ is_yuv = vsf->colorFamily == cfYUV ||
+ vsf->colorFamily == cfGray;
if (!is_rgb && !is_yuv)
continue;
@@ -176,15 +173,30 @@ static av_cold int read_header_vs(AVFormatContext *s)
int64_t sz = avio_size(pb);
char *buf = NULL;
char dummy;
+ char vsfmt[32];
const VSVideoInfo *info;
struct VSState *vss_state;
int err = 0;
+ if (!(vs->vssapi = getVSScriptAPI(VSSCRIPT_API_VERSION))) {
+ av_log(s, AV_LOG_ERROR, "Failed to initialize VSScript (possibly PYTHONPATH not set).\n");
+ err = AVERROR_EXTERNAL;
+ goto done;
+ }
+
+ if (!(vs->vsapi = vs->vssapi->getVSAPI(VAPOURSYNTH_API_VERSION))) {
+ av_log(s, AV_LOG_ERROR, "Could not get VSAPI. "
+ "Check VapourSynth installation.\n");
+ err = AVERROR_EXTERNAL;
+ goto done;
+ }
+
vss_state = av_mallocz(sizeof(*vss_state));
if (!vss_state) {
err = AVERROR(ENOMEM);
goto done;
}
+ vss_state->vssapi = vs->vssapi;
vs->vss_state = av_buffer_create(NULL, 0, free_vss_state, vss_state, 0);
if (!vs->vss_state) {
@@ -193,16 +205,9 @@ static av_cold int read_header_vs(AVFormatContext *s)
goto done;
}
- if (!vsscript_init()) {
- av_log(s, AV_LOG_ERROR, "Failed to initialize VSScript (possibly PYTHONPATH not set).\n");
- err = AVERROR_EXTERNAL;
- goto done;
- }
-
- if (vsscript_createScript(&vss_state->vss)) {
+ if (!(vss_state->vss = vs->vssapi->createScript(NULL))) {
av_log(s, AV_LOG_ERROR, "Failed to create script instance.\n");
err = AVERROR_EXTERNAL;
- vsscript_finalize();
goto done;
}
@@ -235,17 +240,14 @@ static av_cold int read_header_vs(AVFormatContext *s)
}
buf[sz] = '\0';
- if (vsscript_evaluateScript(&vss_state->vss, buf, s->url, 0)) {
- const char *msg = vsscript_getError(vss_state->vss);
+ if (vs->vssapi->evaluateBuffer(vss_state->vss, buf, s->url)) {
+ const char *msg = vs->vssapi->getError(vss_state->vss);
av_log(s, AV_LOG_ERROR, "Failed to parse script: %s\n", msg ? msg : "(unknown)");
err = AVERROR_EXTERNAL;
goto done;
}
- vs->vsapi = vsscript_getVSApi();
- vs->vscore = vsscript_getCore(vss_state->vss);
-
- vs->outnode = vsscript_getOutput(vss_state->vss, 0);
+ vs->outnode = vs->vssapi->getOutputNode(vss_state->vss, 0);
if (!vs->outnode) {
av_log(s, AV_LOG_ERROR, "Could not get script output node.\n");
err = AVERROR_EXTERNAL;
@@ -260,7 +262,7 @@ static av_cold int read_header_vs(AVFormatContext *s)
info = vs->vsapi->getVideoInfo(vs->outnode);
- if (!info->format || !info->width || !info->height) {
+ if (!info->format.colorFamily || !info->width || !info->height) {
av_log(s, AV_LOG_ERROR, "Non-constant input format not supported.\n");
err = AVERROR_PATCHWELCOME;
goto done;
@@ -280,19 +282,18 @@ static av_cold int read_header_vs(AVFormatContext *s)
st->codecpar->codec_id = AV_CODEC_ID_WRAPPED_AVFRAME;
st->codecpar->width = info->width;
st->codecpar->height = info->height;
- st->codecpar->format = match_pixfmt(info->format, vs->c_order);
+ st->codecpar->format = match_pixfmt(&info->format, vs->c_order);
if (st->codecpar->format == AV_PIX_FMT_NONE) {
- av_log(s, AV_LOG_ERROR, "Unsupported VS pixel format %s\n", info->format->name);
+ av_log(s, AV_LOG_ERROR, "Unsupported VS pixel format %s\n",
+ vs->vsapi->getVideoFormatName(&info->format, vsfmt) ? vsfmt : "(unknown)");
err = AVERROR_EXTERNAL;
goto done;
}
- av_log(s, AV_LOG_VERBOSE, "VS format %s -> pixfmt %s\n", info->format->name,
+ av_log(s, AV_LOG_VERBOSE, "VS format %s -> pixfmt %s\n",
+ vs->vsapi->getVideoFormatName(&info->format, vsfmt) ? vsfmt : "(unknown)",
av_get_pix_fmt_name(st->codecpar->format));
- if (info->format->colorFamily == cmYCoCg)
- st->codecpar->color_space = AVCOL_SPC_YCGCO;
-
done:
av_free(buf);
return err;
@@ -311,13 +312,13 @@ static int get_vs_prop_int(AVFormatContext *s, const VSMap *map, const char *nam
int64_t res;
int err = 1;
- res = vs->vsapi->propGetInt(map, name, 0, &err);
+ res = vs->vsapi->mapGetInt(map, name, 0, &err);
return err || res < INT_MIN || res > INT_MAX ? def : res;
}
struct vsframe_ref_data {
const VSAPI *vsapi;
- const VSFrameRef *frame;
+ const VSFrame *frame;
AVBufferRef *vss_state;
};
@@ -339,7 +340,7 @@ static int read_packet_vs(AVFormatContext *s, AVPacket *pkt)
AVStream *st = s->streams[0];
AVFrame *frame = NULL;
char vserr[80];
- const VSFrameRef *vsframe;
+ const VSFrame *vsframe;
const VSVideoInfo *info = vs->vsapi->getVideoInfo(vs->outnode);
const VSMap *props;
const AVPixFmtDescriptor *desc;
@@ -381,7 +382,7 @@ static int read_packet_vs(AVFormatContext *s, AVPacket *pkt)
goto end;
}
- props = vs->vsapi->getFramePropsRO(vsframe);
+ props = vs->vsapi->getFramePropertiesRO(vsframe);
frame = av_frame_alloc();
if (!frame) {
@@ -410,7 +411,7 @@ static int read_packet_vs(AVFormatContext *s, AVPacket *pkt)
desc = av_pix_fmt_desc_get(frame->format);
- for (i = 0; i < info->format->numPlanes; i++) {
+ for (i = 0; i < info->format.numPlanes; i++) {
int p = vs->c_order[i];
ptrdiff_t plane_h = frame->height;
--
2.34.1
import vapoursynth as vs
core = vs.core
a = core.std.BlankClip(width=640,height=480,length=10)
b = core.std.BlankClip(width=640,height=480,length=10,color=[255, 0, 0])
c = core.std.BlankClip(width=640,height=480,length=10,color=[ 0, 255, 0])
d = core.std.BlankClip(width=640,height=480,length=10,color=[ 0, 0, 255])
r = a + b + c + d
r.set_output(0)
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".