Skip to content

Commit

Permalink
multimedia/vapoursynth: Update to R63
Browse files Browse the repository at this point in the history
* Plugins are no longer maintained within the main project repo
* Revert upstream commit 1239124c2d70f32c468326e48bfa7e9362550c36
  as it breaks compatibility with Clang/LLVM with libc++ [1]

1: vapoursynth/vapoursynth#953

Changelog: https://github.com/vapoursynth/vapoursynth/releases/tag/R63
  • Loading branch information
Daniel Engberg authored and Daniel Engberg committed Aug 5, 2023
1 parent c92e9cc commit 69e0cbe
Show file tree
Hide file tree
Showing 6 changed files with 187 additions and 118 deletions.
117 changes: 25 additions & 92 deletions multimedia/vapoursynth/Makefile
@@ -1,108 +1,51 @@
PORTNAME= vapoursynth
DISTVERSION= R54
PORTREVISION= 4
DISTVERSION= R63
CATEGORIES= multimedia

MAINTAINER= ports@FreeBSD.org
COMMENT= Video processing framework with simplicity in mind
WWW= https://www.vapoursynth.com/

LICENSE= LGPL21+
LICENSE_FILE= ${WRKSRC}/COPYING.LESSER

BUILD_DEPENDS= ${BUILD_DEPENDS_${ARCH}}
BUILD_DEPENDS_amd64= nasm:devel/nasm
LIB_DEPENDS= libzimg.so:graphics/sekrit-twc-zimg

USES= autoreconf compiler:c++17-lang gmake libtool localbase pathfix python pkgconfig
USE_PYTHON= cython
USE_GITHUB= yes
USE_LDCONFIG= yes

USES= autoreconf gmake libtool localbase pathfix pkgconfig
GNU_CONFIGURE= yes
BINARY_ALIAS= cython=cython-${PYTHON_VER}
INSTALL_TARGET= install-strip
USE_LDCONFIG= yes
DATADIR= ${PREFIX}/lib/vapoursynth

OPTIONS_DEFINE= DEBUG DOCS FRAME_GUARD
OPTIONS_DEFAULT=${OPTIONS_GROUP_COMPS} ${OPTIONS_GROUP_PLUGINS}
OPTIONS_SUB= yes
GNU_CONFIGURE= yes

OPTIONS_DEFINE_amd64= SIMD
OPTIONS_DEFINE_i386= SIMD
OPTIONS_DEFAULT_amd64= SIMD
DATADIR= ${PREFIX}/lib/vapoursynth

OPTIONS_GROUP= COMPS PLUGINS
COMPS_DESC= Components
OPTIONS_GROUP_COMPS= CORE PYTHON VSPIPE VSSCRIPT
PLUGINS_DESC= Plugins
OPTIONS_GROUP_PLUGINS= ASS EEDI3 IMAGEMAGICK MISCFILTERS MORPHO TESSERACT \
REMOVEGRAIN VINVERSE VIVTC
CONFIGURE_ARGS= --disable-static

# General options
OPTIONS_DEFINE= DEBUG DOCS FRAME_GUARD
OPTIONS_SUB= yes

DEBUG_CONFIGURE_ENABLE= debug

DOCS_BUILD_DEPENDS= sphinx-build:textproc/py-sphinx
DOCS_USES= makeinfo
DOCS_INFO= VapourSynth
DOCS_BUILD_DEPENDS= sphinx-build:textproc/py-sphinx \
${PYTHON_PKGNAMEPREFIX}sphinx_rtd_theme>0:textproc/py-sphinx_rtd_theme@${PY_FLAVOR}
DOCS_PORTDOCS= *

FRAME_GUARD_DESC= Check integrity after each filter
FRAME_GUARD_CONFIGURE_ENABLE= guard-pattern

# VSSCRIPT or REMOVEGRAIN
SIMD_BUILD_DEPENDS= nasm:devel/nasm
SIMD_CONFIGURE_ENABLE= x86-asm

# COMPS group

CORE_DESC= Core library
CORE_BUILD_DEPENDS= sekrit-twc-zimg>=2.9.3:graphics/sekrit-twc-zimg
CORE_LIB_DEPENDS= libzimg.so:graphics/sekrit-twc-zimg
CORE_USES= compiler:c++11-lib
CORE_CONFIGURE_ENABLE= core

PYTHON_USES= python
PYTHON_USE= python=cython
PYTHON_VARS= BINARY_ALIAS=cython=cython-${PYTHON_VER}
PYTHON_CONFIGURE_ENABLE= python-module
PYTHON_IMPLIES= CORE

VSPIPE_DESC= Command line interface
VSPIPE_USES= compiler:c++11-lib
VSPIPE_CONFIGURE_ENABLE= vspipe
VSPIPE_IMPLIES= VSSCRIPT

VSSCRIPT_DESC= Scripting library
VSSCRIPT_USES= compiler:c++11-lib python
VSSCRIPT_CONFIGURE_ENABLE= vsscript

# PLUGINS group

ASS_DESC= Subtitles rendering via libass
ASS_LIB_DEPENDS= libavcodec.so:multimedia/ffmpeg \
libass.so:multimedia/libass
ASS_USES= iconv
ASS_CONFIGURE_ENABLE= subtext

EEDI3_DESC= Very slow edge directed interpolation
EEDI3_CONFIGURE_ENABLE= eedi3

IMAGEMAGICK_USES= compiler:c++11-lib magick:7
IMAGEMAGICK_CONFIGURE_ENABLE= imwri

TESSERACT_DESC= Optical Character Recognition via Tesseract
TESSERACT_LIB_DEPENDS= libtesseract.so:graphics/tesseract
TESSERACT_CONFIGURE_ENABLE= ocr

MISCFILTERS_DESC= Miscellaneous filters
MISCFILTERS_CONFIGURE_ENABLE= miscfilters

MORPHO_DESC= Morphological filter
MORPHO_CONFIGURE_ENABLE= morpho

REMOVEGRAIN_DESC= 3x3 median and convolution denoising
REMOVEGRAIN_CONFIGURE_ENABLE= removegrain

VINVERSE_DESC= Remove residual combing
VINVERSE_CONFIGURE_ENABLE= vinverse
.include <bsd.port.pre.mk>

VIVTC_DESC= Field matching, inverse telecine and decimation
VIVTC_CONFIGURE_ENABLE= vivtc
.if ${ARCH} == amd64 && defined(MACHINE_CPU) && ${MACHINE_CPU:Mavx2}
CONFIGURE_ARGS+= --enable-x86-asm
.else
CONFIGURE_ARGS+= --disable-x86-asm
.endif

post-patch:
@${REINPLACE_CMD} -e 's/x86_64/&|amd64/' \
Expand All @@ -111,20 +54,10 @@ post-patch:
${WRKSRC}/configure.ac

post-build-DOCS-on:
@${DO_MAKE_BUILD} html texinfo -C${WRKSRC}/doc
@${DO_MAKE_BUILD} info -C${WRKSRC}/doc/_build/texinfo
@if [ -n "${PORT_OPTIONS:MVSPIPE}" ]; then \
${DO_MAKE_BUILD} man -C${WRKSRC}/doc; \
fi
@${LOCALBASE}/bin/sphinx-build-${PYTHON_VER} -d ${WRKDIR} ${WRKSRC}/doc ${WRKSRC}/doc/_build/html

post-install-DOCS-on:
${INSTALL_DATA} ${WRKSRC}/doc/_build/texinfo/VapourSynth.info \
${STAGEDIR}${PREFIX}/${INFO_PATH}
(cd ${WRKSRC}/doc/_build/html && ${COPYTREE_SHARE} \
"${PORTDOCS}" ${STAGEDIR}${DOCSDIR})
@if [ -n "${PORT_OPTIONS:MVSPIPE}" ]; then \
${INSTALL_MAN} -v ${WRKSRC}/doc/_build/man/vspipe.1 \
${STAGEDIR}${PREFIX}/share/man/man1; \
fi

.include <bsd.port.mk>
.include <bsd.port.post.mk>
6 changes: 3 additions & 3 deletions multimedia/vapoursynth/distinfo
@@ -1,3 +1,3 @@
TIMESTAMP = 1626721847
SHA256 (vapoursynth-vapoursynth-R54_GH0.tar.gz) = ad0c446adcb3877c253dc8c1372a053ad35022bcf42600889b927d2797c5330b
SIZE (vapoursynth-vapoursynth-R54_GH0.tar.gz) = 631275
TIMESTAMP = 1690671648
SHA256 (vapoursynth-vapoursynth-R63_GH0.tar.gz) = ed909b3c58e79bcbb056d07c5d301222ba8001222b4b40d5c1123be35fea9ae2
SIZE (vapoursynth-vapoursynth-R63_GH0.tar.gz) = 1869415
9 changes: 9 additions & 0 deletions multimedia/vapoursynth/files/patch-Makefile.am
@@ -0,0 +1,9 @@
--- Makefile.am.orig 2023-07-30 11:59:40 UTC
+++ Makefile.am
@@ -1,5 +1,5 @@
warningflags = -Wall -Wextra -Wno-unused-parameter -Wno-unused-function -Wno-ignored-attributes
-commoncflags = -O3 -fvisibility=hidden $(warningflags) -I$(srcdir)/include $(DEBUGCFLAGS) $(MFLAGS) $(UNICODECFLAGS) $(STACKREALIGN)
+commoncflags = -fvisibility=hidden $(warningflags) -I$(srcdir)/include $(DEBUGCFLAGS) $(MFLAGS) $(UNICODECFLAGS) $(STACKREALIGN)
AM_CXXFLAGS = -std=c++17 $(commoncflags)
AM_CFLAGS = -std=c99 $(commoncflags)
ACLOCAL_AMFLAGS = -I m4
13 changes: 13 additions & 0 deletions multimedia/vapoursynth/files/patch-configure.ac
@@ -0,0 +1,13 @@
--- configure.ac.orig 2023-07-30 14:56:15 UTC
+++ configure.ac
@@ -109,8 +109,8 @@ AS_IF(
]
)

- AC_SUBST([MFLAGS], ["-mfpmath=sse -msse2"])
- AC_SUBST([AVX2FLAGS], ["-mavx2 -mfma -mtune=haswell"])
+ AC_SUBST([MFLAGS], [""])
+ AC_SUBST([AVX2FLAGS], [""])
]
)

122 changes: 122 additions & 0 deletions multimedia/vapoursynth/files/patch-src_core_expr_expr.cpp
@@ -0,0 +1,122 @@
--- src/core/expr/expr.cpp.orig 2023-06-06 12:15:18 UTC
+++ src/core/expr/expr.cpp
@@ -20,15 +20,15 @@

#include <algorithm>
#include <cassert>
-#include <charconv>
#include <cmath>
+#include <iostream>
+#include <locale>
#include <map>
#include <memory>
#include <set>
#include <sstream>
#include <stdexcept>
#include <string>
-#include <string_view>
#include <unordered_map>
#include <unordered_set>
#include <vector>
@@ -136,9 +136,9 @@ bool equalSubTree(const ExpressionTreeNode *lhs, const
return true;
}

-std::vector<std::string_view> tokenize(const std::string &expr)
+std::vector<std::string> tokenize(const std::string &expr)
{
- std::vector<std::string_view> tokens;
+ std::vector<std::string> tokens;
auto it = expr.begin();
auto prev = expr.begin();

@@ -147,20 +147,20 @@ std::vector<std::string_view> tokenize(const std::stri

if (std::isspace(c)) {
if (it != prev)
- tokens.push_back({ expr.c_str() + (prev - expr.begin()), static_cast<size_t>(it - prev) });
+ tokens.push_back(expr.substr(prev - expr.begin(), it - prev));
prev = it + 1;
}
++it;
}
if (prev != expr.end())
- tokens.push_back({ expr.c_str() + (prev - expr.begin()), static_cast<size_t>(expr.end() - prev) });
+ tokens.push_back(expr.substr(prev - expr.begin(), expr.end() - prev));

return tokens;
}

-ExprOp decodeToken(std::string_view token)
+ExprOp decodeToken(const std::string &token)
{
- static const std::unordered_map<std::string_view, ExprOp> simple{
+ static const std::unordered_map<std::string, ExprOp> simple{
{ "+", { ExprOpType::ADD } },
{ "-", { ExprOpType::SUB } },
{ "*", { ExprOpType::MUL } },
@@ -195,26 +195,34 @@ ExprOp decodeToken(std::string_view token)
return{ ExprOpType::MEM_LOAD_U8, token[0] >= 'x' ? token[0] - 'x' : token[0] - 'a' + 3 };
} else if (token.substr(0, 3) == "dup" || token.substr(0, 4) == "swap") {
size_t prefix = token[0] == 'd' ? 3 : 4;
+ size_t count = 0;
int idx = -1;

- auto result = std::from_chars(token.data() + prefix, token.data() + token.size(), idx);
- if (idx < 0 || result.ptr != token.data() + token.size())
- throw std::runtime_error("illegal token: " + std::string{ token });
+ try {
+ idx = std::stoi(token.substr(prefix), &count);
+ } catch (...) {
+ // ...
+ }
+
+ if (idx < 0 || prefix + count != token.size())
+ throw std::runtime_error("illegal token: " + token);
return{ token[0] == 'd' ? ExprOpType::DUP : ExprOpType::SWAP, idx };
} else {
float f;
- auto result = std::from_chars(token.data(), token.data() + token.size(), f);
- if (result.ec == std::errc::invalid_argument)
- throw std::runtime_error("failed to convert '" + std::string{ token } + "' to float");
- if (result.ptr != token.data() + token.size())
- throw std::runtime_error("failed to convert '" + std::string{ token } + "' to float, not the whole token could be converted");
+ std::string s;
+ std::istringstream numStream(token);
+ numStream.imbue(std::locale::classic());
+ if (!(numStream >> f))
+ throw std::runtime_error("failed to convert '" + token + "' to float");
+ if (numStream >> s)
+ throw std::runtime_error("failed to convert '" + token + "' to float, not the whole token could be converted");
return{ ExprOpType::CONSTANT, f };
}
}

ExpressionTree parseExpr(const std::string &expr, const VSVideoInfo * const srcFormats[], int numInputs)
{
- static constexpr unsigned char numOperands[] = {
+ constexpr unsigned char numOperands[] = {
0, // MEM_LOAD_U8
0, // MEM_LOAD_U16
0, // MEM_LOAD_F16
@@ -256,16 +264,16 @@ ExpressionTree parseExpr(const std::string &expr, cons
ExpressionTree tree;
std::vector<ExpressionTreeNode *> stack;

- for (std::string_view tok : tokens) {
+ for (const std::string &tok : tokens) {
ExprOp op = decodeToken(tok);

// Check validity.
if (op.type == ExprOpType::MEM_LOAD_U8 && op.imm.i >= numInputs)
- throw std::runtime_error("reference to undefined clip: " + std::string{ tok });
+ throw std::runtime_error("reference to undefined clip: " + tok);
if ((op.type == ExprOpType::DUP || op.type == ExprOpType::SWAP) && op.imm.u >= stack.size())
- throw std::runtime_error("insufficient values on stack: " + std::string{ tok });
+ throw std::runtime_error("insufficient values on stack: " + tok);
if (stack.size() < numOperands[static_cast<size_t>(op.type)])
- throw std::runtime_error("insufficient values on stack: " + std::string{ tok });
+ throw std::runtime_error("insufficient values on stack: " + tok);

// Rename load operations with the correct data type.
if (op.type == ExprOpType::MEM_LOAD_U8) {
38 changes: 15 additions & 23 deletions multimedia/vapoursynth/pkg-plist
@@ -1,23 +1,15 @@
%%VSPIPE%%bin/vspipe
%%CORE%%include/vapoursynth/VSHelper.h
%%CORE%%include/vapoursynth/VSScript.h
%%CORE%%include/vapoursynth/VapourSynth.h
%%VSSCRIPT%%lib/libvapoursynth-script.a
%%VSSCRIPT%%lib/libvapoursynth-script.so
%%VSSCRIPT%%lib/libvapoursynth-script.so.0
%%VSSCRIPT%%lib/libvapoursynth-script.so.0.0.0
%%CORE%%lib/libvapoursynth.a
%%CORE%%lib/libvapoursynth.so
%%PYTHON%%%%PYTHON_SITELIBDIR%%/vapoursynth.so
%%VSSCRIPT%%libdata/pkgconfig/vapoursynth-script.pc
%%CORE%%libdata/pkgconfig/vapoursynth.pc
%%EEDI3%%%%DATADIR%%/libeedi3.so
%%IMAGEMAGICK%%%%DATADIR%%/libimwri.so
%%MISCFILTERS%%%%DATADIR%%/libmiscfilters.so
%%MORPHO%%%%DATADIR%%/libmorpho.so
%%TESSERACT%%%%DATADIR%%/libocr.so
%%REMOVEGRAIN%%%%DATADIR%%/libremovegrain.so
%%ASS%%%%DATADIR%%/libsubtext.so
%%VINVERSE%%%%DATADIR%%/libvinverse.so
%%VIVTC%%%%DATADIR%%/libvivtc.so
%%DOCS%%%%VSPIPE%%share/man/man1/vspipe.1.gz
bin/vspipe
include/vapoursynth/VSConstants4.h
include/vapoursynth/VSHelper.h
include/vapoursynth/VSHelper4.h
include/vapoursynth/VSScript.h
include/vapoursynth/VSScript4.h
include/vapoursynth/VapourSynth.h
include/vapoursynth/VapourSynth4.h
lib/libvapoursynth-script.so
lib/libvapoursynth-script.so.0
lib/libvapoursynth-script.so.0.0.0
lib/libvapoursynth.so
%%PYTHON_SITELIBDIR%%/vapoursynth.so
libdata/pkgconfig/vapoursynth-script.pc
libdata/pkgconfig/vapoursynth.pc

0 comments on commit 69e0cbe

Please sign in to comment.