From 0c4167a1f58b82791bf9f66acb4e57fcfb5ee1e2 Mon Sep 17 00:00:00 2001 From: WeebDataHoarder <57538841+WeebDataHoarder@users.noreply.github.com> Date: Tue, 8 Aug 2023 17:42:01 +0200 Subject: [PATCH] Enable static builds, go1.21 --- .dockerignore | 3 + .drone.yml | 240 +++++++++++++++++++---------- build/Dockerfile | 64 ++++++++ cli/encode-libaom/encode-libaom.go | 2 + encoder/libaom/libaom.go | 32 +++- encoder/libx264/libx264.go | 32 +++- frame/frame_uint16.go | 2 +- go.mod | 4 +- go.sum | 4 +- 9 files changed, 284 insertions(+), 99 deletions(-) create mode 100644 .dockerignore create mode 100644 build/Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..d165b43 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +testdata/*.ivf +testdata/*.y4m +testdata/testoutput \ No newline at end of file diff --git a/.drone.yml b/.drone.yml index 4bbc727..5ee6a16 100644 --- a/.drone.yml +++ b/.drone.yml @@ -10,12 +10,19 @@ environment: GOARCH: amd64 GOAMD64: v3 GOOS: linux + GOTRACEBACK: 2 + GOEXPERIMENT: "cgocheck2" CFLAGS: "-march=native -Ofast" - LDFLAGS: "-flto" + CXXFLAGS: "-march=native -Ofast" + LDFLAGS: "-flto -Wl,-z,stack-size=2097152 -static -static-libstdc++" PKG_CONFIG_PATH: "/drone/src/build_deps/lib/pkgconfig" LD_LIBRARY_PATH: "/drone/src/build_deps/lib" CGO_CFLAGS: "-I/drone/src/build_deps/include" CGO_LDFLAGS: "-L/drone/src/build_deps/lib" + X264_TAG: "stable" + VMAF_TAG: "v2.3.1" + AOM_TAG: "v3.6.1" + DAV1D_TAG: "1.2.1" workspace: path: /drone/src @@ -28,37 +35,57 @@ steps: - apk add --no-cache wget bash - ./testdata/prepare.sh - name: build-x264 - image: golang:1.19-bullseye + image: alpine:3.18 commands: - - DEBIAN_FRONTEND=noninteractive apt update - - DEBIAN_FRONTEND=noninteractive apt install -y git gcc g++ bash make libtool nasm + - apk update && apk add --no-cache git gcc g++ bash make libtool nasm - cd /tmp - - git clone --depth 1 --branch stable https://code.videolan.org/videolan/x264.git && cd x264 && ./configure --disable-cli --disable-ffms --disable-lavf --disable-swscale --enable-static --bit-depth=all --chroma-format=all --enable-lto --enable-pic --disable-opencl --prefix=/drone/src/build_deps && make -j$(nproc) && make install && cd .. + - >- + git clone --depth 1 --branch $X264_TAG https://code.videolan.org/videolan/x264.git && cd x264 && + ./configure --disable-cli --disable-ffms --disable-lavf --disable-swscale --enable-static --bit-depth=all --chroma-format=all --enable-lto --enable-pic --disable-opencl --prefix=/drone/src/build_deps && + make -j$(nproc) && + make install && + cd .. - name: build-vmaf - image: golang:1.19-bullseye + image: alpine:3.18 commands: - - DEBIAN_FRONTEND=noninteractive apt update - - DEBIAN_FRONTEND=noninteractive apt install -y git gcc g++ bash cmake make libtool meson ccache nasm perl xxd pkg-config + - apk update && apk add --no-cache git gcc g++ bash cmake make libtool meson ccache nasm perl xxd pkgconfig - cd /tmp - - git clone --depth 1 --branch v2.3.1 https://github.com/Netflix/vmaf.git && cd vmaf/libvmaf && meson setup build . --prefix /drone/src/build_deps --buildtype release -Denable_float=true -Dbuilt_in_models=true && ninja -vC build && ninja -vC build install && cd ../.. + - >- + git clone --depth 1 --branch $VMAF_TAG https://github.com/Netflix/vmaf.git && cd vmaf/libvmaf && + meson setup build . --prefix /drone/src/build_deps --buildtype release --default-library=static + -Denable_float=true -Dbuilt_in_models=true -Denable_tests=false -Denable_docs=false && + ninja -vC build && + ninja -vC build install && + cd ../.. - name: build-libaom - image: golang:1.19-bullseye + image: alpine:3.18 depends_on: - build-vmaf commands: - - DEBIAN_FRONTEND=noninteractive apt update - - DEBIAN_FRONTEND=noninteractive apt install -y git gcc g++ bash cmake make libtool ccache nasm perl xxd pkg-config + - apk update && apk add --no-cache git gcc g++ bash cmake make libtool ccache nasm perl xxd pkgconfig - cd /tmp - - git clone --depth 1 --branch v3.5.0 https://aomedia.googlesource.com/aom.git && cd aom && mkdir b && cd b && cmake .. -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -D CMAKE_INSTALL_PREFIX:PATH=/drone/src/build_deps -DENABLE_DOCS=OFF -DENABLE_EXAMPLES=OFF -DENABLE_TOOLS=OFF -DENABLE_TESTS=OFF -DENABLE_CCACHE=ON -DCONFIG_FRAME_PARALLEL_ENCODE=1 -DCONFIG_AV1_TEMPORAL_DENOISING=1 -DCONFIG_BITRATE_ACCURACY=1 -DCONFIG_TUNE_VMAF=1 -DCONFIG_NN_V2=1 -DCONFIG_RT_ML_PARTITIONING=1 -DCONFIG_THREE_PASS=1 -DCONFIG_AV1_ENCODER=1 -DCONFIG_AV1_DECODER=1 && make -j$(nproc) && make install && cd ../.. + - >- + git clone --depth 1 --branch $AOM_TAG https://aomedia.googlesource.com/aom.git && cd aom && + mkdir b && cd b && + cmake .. -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -D CMAKE_INSTALL_PREFIX:PATH=/drone/src/build_deps + -DENABLE_DOCS=OFF -DENABLE_EXAMPLES=OFF -DENABLE_TOOLS=OFF -DENABLE_TESTS=OFF -DENABLE_CCACHE=ON -DCONFIG_FRAME_PARALLEL_ENCODE=1 -DCONFIG_AV1_TEMPORAL_DENOISING=1 + -DCONFIG_BITRATE_ACCURACY=1 -DCONFIG_TUNE_VMAF=1 -DCONFIG_NN_V2=1 -DCONFIG_RT_ML_PARTITIONING=1 -DCONFIG_THREE_PASS=0 -DCONFIG_AV1_ENCODER=1 -DCONFIG_AV1_DECODER=1 && + make -j$(nproc) && + make install && + cd ../.. - name: build-dav1d - image: golang:1.19-bullseye + image: alpine:3.18 commands: - - DEBIAN_FRONTEND=noninteractive apt update - - DEBIAN_FRONTEND=noninteractive apt install -y git gcc g++ bash libtool meson ccache nasm pkg-config + - apk update && apk add --no-cache git gcc g++ bash libtool meson ccache nasm pkgconfig - cd /tmp - - git clone --depth 1 --branch 1.0.0 https://code.videolan.org/videolan/dav1d.git && cd dav1d && meson setup build . --prefix /drone/src/build_deps --buildtype release --default-library=static && ninja -vC build && ninja -vC build install && cd .. + - >- + git clone --depth 1 --branch $DAV1D_TAG https://code.videolan.org/videolan/dav1d.git && cd dav1d && + meson setup build . --prefix /drone/src/build_deps --buildtype release --default-library=static && + ninja -vC build && + ninja -vC build install + && cd .. - name: test-nocgo-short - image: golang:1.19-alpine + image: golang:1.21-alpine3.18 depends_on: - prepare-testdata commands: @@ -66,44 +93,56 @@ steps: - apk add --no-cache git - CGO_ENABLED=0 go test -p 1 -failfast -timeout 60m -cover -gcflags=-d=checkptr -v ./... -test.short - name: test-cgo-libdav1d-long - image: golang:1.19-bullseye + image: golang:1.21-alpine3.18 depends_on: - build-dav1d - prepare-testdata commands: - - DEBIAN_FRONTEND=noninteractive apt update - - DEBIAN_FRONTEND=noninteractive apt install -y git gcc pkg-config - - go test -p 1 -failfast -timeout 60m -cover -gcflags=-d=checkptr -v -tags=disable_library_libaom,disable_library_libx264,disable_library_libvmaf ./decoder/libdav1d + - apk update && apk add --no-cache git gcc pkgconfig musl-dev libstdc++-dev + - >- + go test -p 1 -failfast -timeout 60m -cover -gcflags=-d=checkptr -v + -ldflags '-linkmode external -extldflags "-Wl,-z,stack-size=2097152 -fno-PIC -static -lstdc++"' + -tags 'osusergo netgo static_build disable_library_libaom disable_library_libx264 disable_library_libvmaf' + ./decoder/libdav1d - name: test-cgo-libaom-long - image: golang:1.19-bullseye + image: golang:1.21-alpine3.18 depends_on: - build-libaom - prepare-testdata commands: - - DEBIAN_FRONTEND=noninteractive apt update - - DEBIAN_FRONTEND=noninteractive apt install -y git gcc pkg-config - - go test -p 1 -failfast -timeout 60m -cover -gcflags=-d=checkptr -v -tags=disable_library_libdav1d,disable_library_libx264,disable_library_libvmaf ./encoder/libaom + - apk update && apk add --no-cache git gcc pkgconfig musl-dev libstdc++-dev + - >- + go test -p 1 -failfast -timeout 60m -cover -gcflags=-d=checkptr -v + -ldflags '-linkmode external -extldflags "-Wl,-z,stack-size=2097152 -fno-PIC -static -lstdc++"' + -tags 'osusergo netgo static_build disable_library_libdav1d disable_library_libx264 disable_library_libvmaf' + ./encoder/libaom - name: test-cgo-libx264-long - image: golang:1.19-bullseye + image: golang:1.21-alpine3.18 depends_on: - build-x264 - prepare-testdata commands: - - DEBIAN_FRONTEND=noninteractive apt update - - DEBIAN_FRONTEND=noninteractive apt install -y git gcc pkg-config - - go test -p 1 -failfast -timeout 60m -cover -gcflags=-d=checkptr -v -tags=disable_library_libdav1d,disable_library_libaom,disable_library_libvmaf ./encoder/libx264 + - apk update && apk add --no-cache git gcc pkgconfig musl-dev libstdc++-dev + - >- + go test -p 1 -failfast -timeout 60m -cover -gcflags=-d=checkptr -v + -ldflags '-linkmode external -extldflags "-Wl,-z,stack-size=2097152 -fno-PIC -static -lstdc++"' + -tags 'osusergo netgo static_build disable_library_libdav1d disable_library_libaom disable_library_libvmaf' + ./encoder/libx264 - name: test-cgo-libvmaf-long - image: golang:1.19-bullseye + image: golang:1.21-alpine3.18 depends_on: - build-dav1d - build-vmaf - prepare-testdata commands: - - DEBIAN_FRONTEND=noninteractive apt update - - DEBIAN_FRONTEND=noninteractive apt install -y git gcc pkg-config - - go test -p 1 -failfast -timeout 60m -cover -gcflags=-d=checkptr -v -tags=disable_library_libaom,disable_library_libx264 ./utilities/libvmaf + - apk update && apk add --no-cache git gcc pkgconfig musl-dev libstdc++-dev + - >- + go test -p 1 -failfast -timeout 60m -cover -gcflags=-d=checkptr -v + -ldflags '-linkmode external -extldflags "-Wl,-z,stack-size=2097152 -fno-PIC -static -lstdc++"' + -tags 'osusergo netgo static_build disable_library_libaom disable_library_libx264' + ./utilities/libvmaf - name: test-cgo-full-short - image: golang:1.19-bullseye + image: golang:1.21-alpine3.18 depends_on: - build-x264 - build-vmaf @@ -111,9 +150,12 @@ steps: - build-dav1d - prepare-testdata commands: - - DEBIAN_FRONTEND=noninteractive apt update - - DEBIAN_FRONTEND=noninteractive apt install -y git gcc pkg-config - - go test -p 1 -failfast -timeout 60m -cover -gcflags=-d=checkptr -v ./... -test.short + - apk update && apk add --no-cache git gcc pkgconfig musl-dev libstdc++-dev + - >- + go test -p 1 -failfast -timeout 60m -cover -gcflags=-d=checkptr -v + -ldflags '-linkmode external -extldflags "-Wl,-z,stack-size=2097152 -fno-PIC -static -lstdc++"' + -tags 'osusergo netgo static_build' + ./... -test.short --- kind: pipeline type: docker @@ -126,55 +168,82 @@ environment: GOPROXY: direct GOARCH: arm64 GOOS: linux - CFLAGS: "-march=native -Ofast" - LDFLAGS: "-flto" + GOTRACEBACK: 2 + GOEXPERIMENT: "cgocheck2" + CFLAGS: "-march=armv8-a -Ofast" + CXXFLAGS: "-march=armv8-a -Ofast" + LDFLAGS: "-flto -Wl,-z,stack-size=2097152 -static -static-libstdc++" PKG_CONFIG_PATH: "/drone/src/build_deps/lib/pkgconfig" LD_LIBRARY_PATH: "/drone/src/build_deps/lib" CGO_CFLAGS: "-I/drone/src/build_deps/include" CGO_LDFLAGS: "-L/drone/src/build_deps/lib" + X264_TAG: "stable" + VMAF_TAG: "v2.3.1" + AOM_TAG: "v3.6.1" + DAV1D_TAG: "1.2.1" workspace: path: /drone/src steps: - name: prepare-testdata - image: alpine + image: alpine:3.18 commands: - apk update - apk add --no-cache wget bash - ./testdata/prepare.sh - name: build-x264 - image: golang:1.19-bullseye + image: alpine:3.18 commands: - - DEBIAN_FRONTEND=noninteractive apt update - - DEBIAN_FRONTEND=noninteractive apt install -y git gcc g++ bash make libtool nasm + - apk update && apk add --no-cache git gcc g++ bash make libtool nasm - cd /tmp - - git clone --depth 1 --branch stable https://code.videolan.org/videolan/x264.git && cd x264 && ./configure --disable-cli --disable-ffms --disable-lavf --disable-swscale --enable-static --bit-depth=all --chroma-format=all --enable-lto --enable-pic --disable-opencl --prefix=/drone/src/build_deps && make -j$(nproc) && make install && cd .. + - >- + git clone --depth 1 --branch $X264_TAG https://code.videolan.org/videolan/x264.git && cd x264 && + ./configure --disable-cli --disable-ffms --disable-lavf --disable-swscale --enable-static --bit-depth=all --chroma-format=all --enable-lto --enable-pic --disable-opencl --prefix=/drone/src/build_deps && + make -j$(nproc) && + make install && + cd .. - name: build-vmaf - image: golang:1.19-bullseye + image: alpine:3.18 commands: - - DEBIAN_FRONTEND=noninteractive apt update - - DEBIAN_FRONTEND=noninteractive apt install -y git gcc g++ bash cmake make libtool meson ccache nasm perl xxd pkg-config + - apk update && apk add --no-cache git gcc g++ bash cmake make libtool meson ccache nasm perl xxd pkgconfig - cd /tmp - - git clone --depth 1 --branch v2.3.1 https://github.com/Netflix/vmaf.git && cd vmaf/libvmaf && meson setup build . --prefix /drone/src/build_deps --buildtype release -Denable_float=true -Dbuilt_in_models=true && ninja -vC build && ninja -vC build install && cd ../.. + - >- + git clone --depth 1 --branch $VMAF_TAG https://github.com/Netflix/vmaf.git && cd vmaf/libvmaf && + meson setup build . --prefix /drone/src/build_deps --buildtype release --default-library=static + -Denable_float=true -Dbuilt_in_models=true -Denable_tests=false -Denable_docs=false && + ninja -vC build && + ninja -vC build install && + cd ../.. - name: build-libaom - image: golang:1.19-bullseye + image: alpine:3.18 depends_on: - build-vmaf commands: - - DEBIAN_FRONTEND=noninteractive apt update - - DEBIAN_FRONTEND=noninteractive apt install -y git gcc g++ bash cmake make libtool ccache nasm perl xxd pkg-config + - apk update && apk add --no-cache git gcc g++ bash cmake make libtool ccache nasm perl xxd pkgconfig - cd /tmp - - git clone --depth 1 --branch v3.5.0 https://aomedia.googlesource.com/aom.git && cd aom && mkdir b && cd b && cmake .. -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -D CMAKE_INSTALL_PREFIX:PATH=/drone/src/build_deps -DENABLE_DOCS=OFF -DENABLE_EXAMPLES=OFF -DENABLE_TOOLS=OFF -DENABLE_TESTS=OFF -DENABLE_CCACHE=ON -DCONFIG_FRAME_PARALLEL_ENCODE=1 -DCONFIG_AV1_TEMPORAL_DENOISING=1 -DCONFIG_BITRATE_ACCURACY=1 -DCONFIG_TUNE_VMAF=1 -DCONFIG_NN_V2=1 -DCONFIG_RT_ML_PARTITIONING=1 -DCONFIG_THREE_PASS=1 -DCONFIG_AV1_ENCODER=1 -DCONFIG_AV1_DECODER=1 && make -j$(nproc) && make install && cd ../.. + - >- + git clone --depth 1 --branch $AOM_TAG https://aomedia.googlesource.com/aom.git && cd aom && + mkdir b && cd b && + cmake .. -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -D CMAKE_INSTALL_PREFIX:PATH=/drone/src/build_deps + -DENABLE_DOCS=OFF -DENABLE_EXAMPLES=OFF -DENABLE_TOOLS=OFF -DENABLE_TESTS=OFF -DENABLE_CCACHE=ON -DCONFIG_FRAME_PARALLEL_ENCODE=1 -DCONFIG_AV1_TEMPORAL_DENOISING=1 + -DCONFIG_BITRATE_ACCURACY=1 -DCONFIG_TUNE_VMAF=1 -DCONFIG_NN_V2=1 -DCONFIG_RT_ML_PARTITIONING=1 -DCONFIG_THREE_PASS=0 -DCONFIG_AV1_ENCODER=1 -DCONFIG_AV1_DECODER=1 && + make -j$(nproc) && + make install && + cd ../.. - name: build-dav1d - image: golang:1.19-bullseye + image: alpine:3.18 commands: - - DEBIAN_FRONTEND=noninteractive apt update - - DEBIAN_FRONTEND=noninteractive apt install -y git gcc g++ bash libtool meson ccache nasm pkg-config + - apk update && apk add --no-cache git gcc g++ bash libtool meson ccache nasm pkgconfig - cd /tmp - - git clone --depth 1 --branch 1.0.0 https://code.videolan.org/videolan/dav1d.git && cd dav1d && meson setup build . --prefix /drone/src/build_deps --buildtype release --default-library=static && ninja -vC build && ninja -vC build install && cd .. + - >- + git clone --depth 1 --branch $DAV1D_TAG https://code.videolan.org/videolan/dav1d.git && cd dav1d && + meson setup build . --prefix /drone/src/build_deps --buildtype release --default-library=static && + ninja -vC build && + ninja -vC build install + && cd .. - name: test-nocgo-short - image: golang:1.19-alpine + image: golang:1.21-alpine3.18 depends_on: - prepare-testdata commands: @@ -182,44 +251,56 @@ steps: - apk add --no-cache git - CGO_ENABLED=0 go test -p 1 -failfast -timeout 60m -cover -gcflags=-d=checkptr -v ./... -test.short - name: test-cgo-libdav1d-long - image: golang:1.19-bullseye + image: golang:1.21-alpine3.18 depends_on: - build-dav1d - prepare-testdata commands: - - DEBIAN_FRONTEND=noninteractive apt update - - DEBIAN_FRONTEND=noninteractive apt install -y git gcc pkg-config - - go test -p 1 -failfast -timeout 60m -cover -gcflags=-d=checkptr -v -tags=disable_library_libaom,disable_library_libx264,disable_library_libvmaf ./decoder/libdav1d + - apk update && apk add --no-cache git gcc pkgconfig musl-dev libstdc++-dev + - >- + go test -p 1 -failfast -timeout 60m -cover -gcflags=-d=checkptr -v + -ldflags '-linkmode external -extldflags "-Wl,-z,stack-size=2097152 -fno-PIC -static -lstdc++"' + -tags 'osusergo netgo static_build disable_library_libaom disable_library_libx264 disable_library_libvmaf' + ./decoder/libdav1d - name: test-cgo-libaom-long - image: golang:1.19-bullseye + image: golang:1.21-alpine3.18 depends_on: - build-libaom - prepare-testdata commands: - - DEBIAN_FRONTEND=noninteractive apt update - - DEBIAN_FRONTEND=noninteractive apt install -y git gcc pkg-config - - go test -p 1 -failfast -timeout 60m -cover -gcflags=-d=checkptr -v -tags=disable_library_libdav1d,disable_library_libx264,disable_library_libvmaf ./encoder/libaom + - apk update && apk add --no-cache git gcc pkgconfig musl-dev libstdc++-dev + - >- + go test -p 1 -failfast -timeout 60m -cover -gcflags=-d=checkptr -v + -ldflags '-linkmode external -extldflags "-Wl,-z,stack-size=2097152 -fno-PIC -static -lstdc++"' + -tags 'osusergo netgo static_build disable_library_libdav1d disable_library_libx264 disable_library_libvmaf' + ./encoder/libaom - name: test-cgo-libx264-long - image: golang:1.19-bullseye + image: golang:1.21-alpine3.18 depends_on: - build-x264 - prepare-testdata commands: - - DEBIAN_FRONTEND=noninteractive apt update - - DEBIAN_FRONTEND=noninteractive apt install -y git gcc pkg-config - - go test -p 1 -failfast -timeout 60m -cover -gcflags=-d=checkptr -v -tags=disable_library_libdav1d,disable_library_libaom,disable_library_libvmaf ./encoder/libx264 + - apk update && apk add --no-cache git gcc pkgconfig musl-dev libstdc++-dev + - >- + go test -p 1 -failfast -timeout 60m -cover -gcflags=-d=checkptr -v + -ldflags '-linkmode external -extldflags "-Wl,-z,stack-size=2097152 -fno-PIC -static -lstdc++"' + -tags 'osusergo netgo static_build disable_library_libdav1d disable_library_libaom disable_library_libvmaf' + ./encoder/libx264 - name: test-cgo-libvmaf-long - image: golang:1.19-bullseye + image: golang:1.21-alpine3.18 depends_on: - build-dav1d - build-vmaf - prepare-testdata commands: - - DEBIAN_FRONTEND=noninteractive apt update - - DEBIAN_FRONTEND=noninteractive apt install -y git gcc pkg-config - - go test -p 1 -failfast -timeout 60m -cover -gcflags=-d=checkptr -v -tags=disable_library_libaom,disable_library_libx264 ./utilities/libvmaf + - apk update && apk add --no-cache git gcc pkgconfig musl-dev libstdc++-dev + - >- + go test -p 1 -failfast -timeout 60m -cover -gcflags=-d=checkptr -v + -ldflags '-linkmode external -extldflags "-Wl,-z,stack-size=2097152 -fno-PIC -static -lstdc++"' + -tags 'osusergo netgo static_build disable_library_libaom disable_library_libx264' + ./utilities/libvmaf - name: test-cgo-full-short - image: golang:1.19-bullseye + image: golang:1.21-alpine3.18 depends_on: - build-x264 - build-vmaf @@ -227,7 +308,10 @@ steps: - build-dav1d - prepare-testdata commands: - - DEBIAN_FRONTEND=noninteractive apt update - - DEBIAN_FRONTEND=noninteractive apt install -y git gcc pkg-config - - go test -p 1 -failfast -timeout 60m -cover -gcflags=-d=checkptr -v ./... -test.short + - apk update && apk add --no-cache git gcc pkgconfig musl-dev libstdc++-dev + - >- + go test -p 1 -failfast -timeout 60m -cover -gcflags=-d=checkptr -v + -ldflags '-linkmode external -extldflags "-Wl,-z,stack-size=2097152 -fno-PIC -static -lstdc++"' + -tags 'osusergo netgo static_build' + ./... -test.short ... \ No newline at end of file diff --git a/build/Dockerfile b/build/Dockerfile new file mode 100644 index 0000000..37a2260 --- /dev/null +++ b/build/Dockerfile @@ -0,0 +1,64 @@ +FROM golang:1.21-alpine3.18 AS builder + +ENV CFLAGS="-march=native -Ofast" +ENV CXXFLAGS="-march=native -Ofast" +ENV LDFLAGS="-flto -Wl,-z,stack-size=2097152 -static -static-libstdc++" +ENV CGO_CFLAGS="-march=native -Ofast" + +ARG X264_TAG="stable" +ARG VMAF_TAG="v2.3.1" +ARG AOM_TAG="v3.6.1" +ARG DAV1D_TAG="1.2.1" + +RUN apk update && apk add --no-cache \ + git gcc g++ musl-dev bash nasm autoconf automake cmake make libtool gettext pkgconfig meson ccache perl xxd + +RUN git clone --depth 1 --branch "${X264_TAG}" https://code.videolan.org/videolan/x264.git /tmp/x264 && cd /tmp/x264 && \ + ./configure --disable-cli --disable-ffms --disable-lavf --disable-swscale --enable-static --bit-depth=all --chroma-format=all --enable-lto --enable-pic --disable-opencl --prefix=/usr && \ + make -j$(nproc) && \ + make install && \ + cd / && \ + rm -rf /tmp/x264 + +RUN git clone --depth 1 --branch "${VMAF_TAG}" https://github.com/Netflix/vmaf.git /tmp/vmaf && cd /tmp/vmaf/libvmaf && \ + meson setup build . --prefix /usr --buildtype release --default-library=static \ + -Denable_float=true -Dbuilt_in_models=true -Denable_tests=false -Denable_docs=false && \ + ninja -vC build && \ + ninja -vC build install && \ + cd / && \ + rm -rf /tmp/vmaf + +RUN git clone --depth 1 --branch "${AOM_TAG}" https://aomedia.googlesource.com/aom.git /tmp/aom && cd /tmp/aom && \ + mkdir b && cd b && \ + cmake .. -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -D CMAKE_INSTALL_PREFIX:PATH=/usr \ + -DENABLE_DOCS=OFF -DENABLE_EXAMPLES=OFF -DENABLE_TOOLS=OFF -DENABLE_TESTS=OFF -DENABLE_CCACHE=ON -DCONFIG_FRAME_PARALLEL_ENCODE=1 -DCONFIG_AV1_TEMPORAL_DENOISING=1 \ + -DCONFIG_BITRATE_ACCURACY=1 -DCONFIG_TUNE_VMAF=1 -DCONFIG_NN_V2=1 -DCONFIG_RT_ML_PARTITIONING=1 -DCONFIG_THREE_PASS=0 -DCONFIG_AV1_ENCODER=1 -DCONFIG_AV1_DECODER=1 && \ + make -j$(nproc) && \ + make install && \ + cd / && \ + rm -rf /tmp/aom + +RUN git clone --depth 1 --branch "${DAV1D_TAG}" https://code.videolan.org/videolan/dav1d.git /tmp/dav1d && cd /tmp/dav1d && \ + meson setup build . --prefix /usr --buildtype release --default-library=static && \ + ninja -vC build && \ + ninja -vC build install && \ + cd / && \ + rm -rf /tmp/dav1d + +WORKDIR /usr/src/Ignite + +ARG GOPROXY="" +ENV GOPROXY=${GOPROXY} + +COPY go.mod go.sum ./ +RUN go mod download -x && go mod verify + +COPY . . + +RUN go build -v -ldflags '-linkmode external -extldflags "-Wl,-z,stack-size=2097152 -fno-PIC -static -lstdc++"' -buildmode pie -tags 'osusergo netgo static_build' -o /usr/bin/ignite-encode-libaom git.gammaspectra.live/S.O.N.G/Ignite/cli/encode-libaom + +FROM alpine:3.18 + +COPY --from=builder /usr/bin/ignite-encode-libaom /usr/bin/ignite-encode-libaom + +WORKDIR / \ No newline at end of file diff --git a/cli/encode-libaom/encode-libaom.go b/cli/encode-libaom/encode-libaom.go index c3b38df..1d42262 100644 --- a/cli/encode-libaom/encode-libaom.go +++ b/cli/encode-libaom/encode-libaom.go @@ -1,3 +1,5 @@ +//go:build cgo && !disable_codec_libaom + package main import ( diff --git a/encoder/libaom/libaom.go b/encoder/libaom/libaom.go index 619a732..1aa0c58 100644 --- a/encoder/libaom/libaom.go +++ b/encoder/libaom/libaom.go @@ -27,6 +27,7 @@ type Encoder struct { codec C.aom_codec_ctx_t raw *C.aom_image_t frames uint32 + pinner runtime.Pinner } var libaomVersion = "libaom-av1 " + C.GoString(C.aom_codec_version_str()) @@ -297,16 +298,31 @@ func (e *Encoder) EncodeStream(stream *frame.Stream) error { func (e *Encoder) Encode(f frame.Frame) error { - if f8, ok := f.(frame.TypedFrame[uint8]); ok { - e.raw.planes[0] = (*C.uint8_t)(unsafe.Pointer(&f8.GetNativeLuma()[0])) - e.raw.planes[1] = (*C.uint8_t)(unsafe.Pointer(&f8.GetNativeCb()[0])) - e.raw.planes[2] = (*C.uint8_t)(unsafe.Pointer(&f8.GetNativeCr()[0])) - } else if f16, ok := f.(frame.TypedFrame[uint16]); ok { - e.raw.planes[0] = (*C.uint8_t)(unsafe.Pointer(&f16.GetNativeLuma()[0])) - e.raw.planes[1] = (*C.uint8_t)(unsafe.Pointer(&f16.GetNativeCb()[0])) - e.raw.planes[2] = (*C.uint8_t)(unsafe.Pointer(&f16.GetNativeCr()[0])) + var luma, cb, cr unsafe.Pointer + + switch typedFrame := f.(type) { + case frame.TypedFrame[uint8]: + luma = unsafe.Pointer(unsafe.SliceData(typedFrame.GetNativeLuma())) + cb = unsafe.Pointer(unsafe.SliceData(typedFrame.GetNativeCb())) + cr = unsafe.Pointer(unsafe.SliceData(typedFrame.GetNativeCr())) + case frame.TypedFrame[uint16]: + luma = unsafe.Pointer(unsafe.SliceData(typedFrame.GetNativeLuma())) + cb = unsafe.Pointer(unsafe.SliceData(typedFrame.GetNativeCb())) + cr = unsafe.Pointer(unsafe.SliceData(typedFrame.GetNativeCr())) + default: + return errors.New("unknown frame type") } + e.pinner.Pin(luma) + e.pinner.Pin(cb) + e.pinner.Pin(cr) + + e.raw.planes[0] = (*C.uint8_t)(luma) + e.raw.planes[1] = (*C.uint8_t)(cb) + e.raw.planes[2] = (*C.uint8_t)(cr) + + defer e.pinner.Unpin() + defer runtime.KeepAlive(f) //cleanup pointers defer func() { diff --git a/encoder/libx264/libx264.go b/encoder/libx264/libx264.go index d55d3aa..f0de706 100644 --- a/encoder/libx264/libx264.go +++ b/encoder/libx264/libx264.go @@ -25,6 +25,7 @@ type Encoder struct { pictureIn *C.x264_picture_t pictureOut C.x264_picture_t h *C.x264_t + pinner runtime.Pinner } var x264Version = fmt.Sprintf("x264 core:%d%s", C.X264_BUILD, C.GoString(C.Version())) @@ -177,16 +178,31 @@ func (e *Encoder) Encode(f frame.Frame) error { var iNal C.int var frameSize C.int - if f8, ok := f.(frame.TypedFrame[uint8]); ok { - e.pictureIn.img.plane[0] = (*C.uint8_t)(unsafe.Pointer(&f8.GetNativeLuma()[0])) - e.pictureIn.img.plane[1] = (*C.uint8_t)(unsafe.Pointer(&f8.GetNativeCb()[0])) - e.pictureIn.img.plane[2] = (*C.uint8_t)(unsafe.Pointer(&f8.GetNativeCr()[0])) - } else if f16, ok := f.(frame.TypedFrame[uint16]); ok { - e.pictureIn.img.plane[0] = (*C.uint8_t)(unsafe.Pointer(&f16.GetNativeLuma()[0])) - e.pictureIn.img.plane[1] = (*C.uint8_t)(unsafe.Pointer(&f16.GetNativeCb()[0])) - e.pictureIn.img.plane[2] = (*C.uint8_t)(unsafe.Pointer(&f16.GetNativeCr()[0])) + var luma, cb, cr unsafe.Pointer + + switch typedFrame := f.(type) { + case frame.TypedFrame[uint8]: + luma = unsafe.Pointer(unsafe.SliceData(typedFrame.GetNativeLuma())) + cb = unsafe.Pointer(unsafe.SliceData(typedFrame.GetNativeCb())) + cr = unsafe.Pointer(unsafe.SliceData(typedFrame.GetNativeCr())) + case frame.TypedFrame[uint16]: + luma = unsafe.Pointer(unsafe.SliceData(typedFrame.GetNativeLuma())) + cb = unsafe.Pointer(unsafe.SliceData(typedFrame.GetNativeCb())) + cr = unsafe.Pointer(unsafe.SliceData(typedFrame.GetNativeCr())) + default: + return errors.New("unknown frame type") } + e.pinner.Pin(luma) + e.pinner.Pin(cb) + e.pinner.Pin(cr) + + e.pictureIn.img.plane[0] = (*C.uint8_t)(luma) + e.pictureIn.img.plane[1] = (*C.uint8_t)(cb) + e.pictureIn.img.plane[2] = (*C.uint8_t)(cr) + + defer e.pinner.Unpin() + defer runtime.KeepAlive(f) //cleanup pointers defer func() { diff --git a/frame/frame_uint16.go b/frame/frame_uint16.go index 8e44f27..1385417 100644 --- a/frame/frame_uint16.go +++ b/frame/frame_uint16.go @@ -24,7 +24,7 @@ func NewUint16FrameFromBytes(properties Properties, pts int64, data []byte) (*Fr } buf := make([]uint16, len(data)/2) - copy(buf, unsafe.Slice((*uint16)(unsafe.Pointer(&data[0])), len(data)/2)) + copy(buf, unsafe.Slice((*uint16)(unsafe.Pointer(unsafe.SliceData(data))), len(data)/2)) runtime.KeepAlive(data) iY := properties.ColorSpace.ChromaSampling.PlaneLumaSamples(properties.Width, properties.Height) diff --git a/go.mod b/go.mod index b2d44d5..bd1b018 100644 --- a/go.mod +++ b/go.mod @@ -1,10 +1,10 @@ module git.gammaspectra.live/S.O.N.G/Ignite -go 1.19 +go 1.21 require ( github.com/stretchr/testify v1.8.1 - golang.org/x/exp v0.0.0-20221126150942-6ab00d035af9 + golang.org/x/exp v0.0.0-20230807204917-050eac23e9de ) require ( diff --git a/go.sum b/go.sum index e9ef72c..37c155c 100644 --- a/go.sum +++ b/go.sum @@ -10,8 +10,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -golang.org/x/exp v0.0.0-20221126150942-6ab00d035af9 h1:yZNXmy+j/JpX19vZkVktWqAo7Gny4PBWYYK3zskGpx4= -golang.org/x/exp v0.0.0-20221126150942-6ab00d035af9/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230807204917-050eac23e9de h1:l5Za6utMv/HsBWWqzt4S8X17j+kt1uVETUX5UFhn2rE= +golang.org/x/exp v0.0.0-20230807204917-050eac23e9de/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=