diff --git a/.gitignore b/.gitignore index dcb58ba..62709eb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ build/ downloads/ +sources/ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..0a0fe18 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "opencv"] + path = opencv + url = ../opencv.git + branch = master diff --git a/build_update.sh b/build_update.sh new file mode 100755 index 0000000..381445c --- /dev/null +++ b/build_update.sh @@ -0,0 +1,79 @@ +#!/bin/bash -e + +if ! git diff-index --quiet HEAD --; then + echo "You have uncommited changes. Please commit your changes first" + exit 1 +fi + +echo "### Update code from OpenCV repository..." +[[ "${BUILD_SKIP_OPENCV_UPDATE}" == "" ]] && +( + cd opencv + git fetch https://github.com/opencv/opencv.git 4.x + if [[ `git merge-base HEAD FETCH_HEAD` != `git rev-parse HEAD` ]]; then + echo "OpenCV folder contains changes. Please save your changes and checkout the latest code: $(pwd)" + exit 1 + fi + if ! git diff-index --quiet HEAD --; then + echo "OpenCV folder contains unsaved changes. Please save (stash) your changes and checkout the latest code: $(pwd)" + exit 1 + fi + git checkout -B ffmpeg_update FETCH_HEAD +) +OPENCV_HASH=`cd opencv; git rev-parse HEAD` +echo "### Update code from OpenCV repository... DONE (${OPENCV_HASH})" + +if ! git diff-index --quiet HEAD --; then + echo "### OpenCV git submodule is updated. Will commit this update..." + git commit -am "update OpenCV code" + echo "### ... DONE" +fi + +echo "### Build ffmpeg wrapper binaries..." +( + ./ffmpeg/build_via_docker.sh +) +echo "### Build ffmpeg wrapper binaries... DONE" + +DATE=${DATE:-`date +%Y%m%d`} +BRANCH=`git rev-parse --abbrev-ref HEAD` +TARGET_BRANCH="${BRANCH}_${DATE}" + +echo "### Commit ffmpeg wrapper binaries to branch ${TARGET_BRANCH}..." +( + ls -l ffmpeg/*.dll + git add ffmpeg/opencv_videoio_ffmpeg.dll + git add ffmpeg/opencv_videoio_ffmpeg_64.dll + git checkout -B ${TARGET_BRANCH} + git commit -m "Update ffmpeg binaries (${DATE}-${OPENCV_HASH})" +) +HASH=`git rev-parse HEAD` +echo "### Commit ffmpeg wrapper binaries to branch ${TARGET_BRANCH}... DONE" +[[ "${BUILD_SKIP_SOURCE_PACKAGE}" == "" ]] && +( + echo "### Adding ffmpeg wrapper sources to branch ${TARGET_BRANCH}_src ..." + git add -fv sources/. + git checkout -B ${TARGET_BRANCH}_src + git commit -m "src: OpenCV FFmpeg wrapper (${DATE}-${HASH})" +) +HASH_SRC=`git rev-parse HEAD` + +echo "" +echo "1) Create pull request to OpenCV 3rdparty binaries repository with branch ${TARGET_BRANCH}" +echo "2) Create pull request to OpenCV repository:" +echo " with updated hashes in /3rdparty/ffmpeg/ffmpeg.cmake:" +HASH_BIN32=($(md5sum ffmpeg/opencv_videoio_ffmpeg.dll)) +HASH_BIN64=($(md5sum ffmpeg/opencv_videoio_ffmpeg_64.dll)) +HASH_CMAKE=($(md5sum ffmpeg/ffmpeg_version.cmake)) +echo "" +echo "# Binaries branch name: ${TARGET_BRANCH}" +echo "# Binaries were created for OpenCV: ${OPENCV_HASH}" +echo "ocv_update(FFMPEG_BINARIES_COMMIT \"${HASH}\")" +echo "ocv_update(FFMPEG_FILE_HASH_BIN32 \"${HASH_BIN32}\")" +echo "ocv_update(FFMPEG_FILE_HASH_BIN64 \"${HASH_BIN64}\")" +echo "ocv_update(FFMPEG_FILE_HASH_CMAKE \"${HASH_CMAKE}\")" +echo "" + +echo "Checkout to branch with scripts only: ${BRANCH} ..." +git checkout ${BRANCH} +echo "All is OK" diff --git a/ffmpeg/archive_src.sh b/ffmpeg/archive_src.sh new file mode 100755 index 0000000..03f9ac2 --- /dev/null +++ b/ffmpeg/archive_src.sh @@ -0,0 +1,41 @@ +#!/bin/bash -ex + +rm -rf ../sources +mkdir -p ../sources +mkdir -p ../sources/opencv +mkdir -p ../sources/build/ffmpeg +mkdir -p ../sources/build/libvpx +mkdir -p ../sources/build/openh264 +mkdir -p ../sources/build/aom + +ARCHIVE_TYPE=tar.xz +( +cd .. +git archive --format=tar HEAD | xz -c - > sources/opencv_ffmpeg.${ARCHIVE_TYPE} +) +( +cd ../opencv +git archive --format=tar HEAD modules/videoio/src/*ffmpeg*.hpp LICENSE | xz -c - > ../sources/opencv/opencv-videoio-ffmpeg.${ARCHIVE_TYPE} +) +( +cd ../build/ffmpeg +git archive --format=tar HEAD | xz -c - > ../../sources/build/ffmpeg/ffmpeg-src-$(git describe --tags).${ARCHIVE_TYPE} +) +( +# We use headers for public API only +cd ../build/openh264 +git archive --format=tar HEAD codec/api/svc LICENSE | xz -c - > ../../sources/build/openh264/openh264-api-headers-$(git describe --tags).${ARCHIVE_TYPE} +) +( +cd ../build/libvpx +git archive --format=tar HEAD | xz -c - > ../../sources/build/libvpx/libvpx-src-$(git describe --tags).${ARCHIVE_TYPE} +) +( +cd ../build/aom +git archive --format=tar HEAD | xz -c - > ../../sources/build/aom/aom-src-$(git describe --tags).${ARCHIVE_TYPE} +) + +find ../sources/ + +echo "Archiving sources: DONE" +exit 0 diff --git a/ffmpeg/build_via_docker.sh b/ffmpeg/build_via_docker.sh new file mode 100755 index 0000000..d80dd66 --- /dev/null +++ b/ffmpeg/build_via_docker.sh @@ -0,0 +1,18 @@ +#!/bin/bash -e +cd "$( dirname "${BASH_SOURCE[0]}" )" + +# Build Docker image +docker build -t opencv_ffmpeg_mingw_build_ubuntu2014 docker + +echo "Downloading 3rdparty sources..." +if [[ ! "${BUILD_SKIP_DOWNLOAD_SOURCES}" ]]; then + ./download_src.sh +fi + +echo "Capture/exporting BUILD_* vars..." +export | (grep -e '-x BUILD_' || true) > ../build/env.sh + +echo "Running docker container:" +docker run --rm=true -it --name opencv_ffmpeg_mingw_build_ubuntu2014 \ +-e "APP_UID=$UID" -e APP_GID=$GROUPS \ +-v $(pwd):/app -v $(pwd)/../build:/build -v $(pwd)/../opencv:/build/opencv opencv_ffmpeg_mingw_build_ubuntu2014 diff --git a/ffmpeg/build_videoio_plugin.sh b/ffmpeg/build_videoio_plugin.sh new file mode 100755 index 0000000..445bf11 --- /dev/null +++ b/ffmpeg/build_videoio_plugin.sh @@ -0,0 +1,132 @@ +#!/bin/bash -e +# TODO: reduce binaries size +# - gc-sections doesn't work properly with MinGW: https://sourceware.org/bugzilla/show_bug.cgi?id=11539 + +{ # force bash to read file completelly + +. ../build/env.sh + +CURRENT_DIR=`pwd` +BUILD_DIR=${1:-/build} +CPU_COUNT=$(nproc || echo 4) + +DST_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +OPENCV_CMAKE_ARGS=( + -DCMAKE_BUILD_TYPE=Release + -DBUILD_SHARED_LIBS=OFF + -DCPU_DISPATCH= + "-DOPENCV_EXTRA_FLAGS=-DCV_EXPORTS= -D_GNU_SOURCE=" + -DWITH_PTHREADS_PF=OFF + -DWITH_IPP=OFF -DWITH_ADE=OFF -DWITH_LAPACK=OFF -DWITH_OPENCL=OFF -DWITH_DIRECTX=OFF -DWITH_WIN32UI=OFF + -DWITH_EIGEN=OFF -DWITH_JPEG=OFF -DWITH_WEBP=OFF -DWITH_JASPER=OFF -DWITH_OPENJPEG=OFF -DWITH_OPENEXR=OFF -DWITH_PNG=OFF -DWITH_TIFF=OFF + -DWITH_FFMPEG=OFF -DWITH_GSTREAMER=OFF -DWITH_DSHOW=OFF -DWITH_1394=OFF + -DWITH_PROTOBUF=OFF -DWITH_IMGCODEC_HDR=OFF -DWITH_IMGCODEC_SUNRASTER=OFF -DWITH_IMGCODEC_PXM=OFF -DWITH_IMGCODEC_PFM=OFF + -DWITH_ITT=OFF -DCV_TRACE=OFF + -DBUILD_LIST=core,imgproc,videoio + -DOPENCV_CORE_EXCLUDE_C_API=1 +) + +OPENCV_PLUGIN_CMAKE_ARGS=( + "-DCMAKE_MODULE_LINKER_FLAGS=-static -lbcrypt -static-libgcc -static-libstdc++ -Wl,--gc-sections -Wl,-Bsymbolic" + -DCMAKE_BUILD_TYPE=Release + -DOPENCV_PLUGIN_MODULE_PREFIX= + -DOPENCV_FFMPEG_SKIP_DOWNLOAD=ON + -DCMAKE_INSTALL_PREFIX=$DST_DIR + ${BUILD_DIR}/opencv/modules/videoio/misc/plugin_ffmpeg + "-DOPENCV_PLUGIN_EXTRA_SRC_FILES=$DST_DIR/opencv_ffmpeg.rc" + "-DOPENCV_PLUGIN_VERSION=" +) + +build_opencv_64() +{ +( + [[ -n "${CLEAN_BUILD_DIR}" ]] && { + rm -rf ${BUILD_DIR}/opencv_x86_64 + } + mkdir -p ${BUILD_DIR}/opencv_x86_64 + pushd ${BUILD_DIR}/opencv_x86_64 + rm -rf CMake* || true + set -e + set -x + cmake -GNinja \ + -DCMAKE_TOOLCHAIN_FILE=$CURRENT_DIR/mingw-toolchain-x86_64.cmake \ + "${OPENCV_CMAKE_ARGS[@]}" \ + /build/opencv + ninja opencv_modules -j${CPU_COUNT} + popd +) +} + +build_plugin_64() +{ +( + rm -rf ${BUILD_DIR}/opencv_ffmpeg_plugin_x86_64 + mkdir -p ${BUILD_DIR}/opencv_ffmpeg_plugin_x86_64 + pushd ${BUILD_DIR}/opencv_ffmpeg_plugin_x86_64 + + set -e + set -x + PKG_CONFIG_PATH=${BUILD_DIR}/ffmpeg_x86_64/install/lib/pkgconfig \ + RCFLAGS=-DFFMPEG_INTERNAL_NAME=opencv_videoio_ffmpeg_64 \ + cmake -GNinja \ + -DCMAKE_TOOLCHAIN_FILE=$CURRENT_DIR/mingw-toolchain-x86_64.cmake \ + -DOpenCV_DIR=${BUILD_DIR}/opencv_x86_64 \ + "${OPENCV_PLUGIN_CMAKE_ARGS[@]}" + ninja -v + ninja install/strip + strings ./opencv_videoio_ffmpeg_64.dll | grep '/src/' | grep opencv | uniq + popd +) +} + +build_opencv_32() +{ +( + [[ -n "${CLEAN_BUILD_DIR}" ]] && { + rm -rf ${BUILD_DIR}/opencv_x86 + } + mkdir -p ${BUILD_DIR}/opencv_x86 + pushd ${BUILD_DIR}/opencv_x86 + rm -rf CMake* || true + set -e + set -x + cmake -GNinja \ + -DCMAKE_TOOLCHAIN_FILE=$CURRENT_DIR/mingw-toolchain-i686.cmake \ + "${OPENCV_CMAKE_ARGS[@]}" \ + /build/opencv + ninja opencv_modules -j${CPU_COUNT} + popd +) +} + +build_plugin_32() +{ +( + rm -rf ${BUILD_DIR}/opencv_ffmpeg_plugin_x86 + mkdir -p ${BUILD_DIR}/opencv_ffmpeg_plugin_x86 + pushd ${BUILD_DIR}/opencv_ffmpeg_plugin_x86 + + set -e + set -x + PKG_CONFIG_PATH=${BUILD_DIR}/ffmpeg_x86/install/lib/pkgconfig \ + RCFLAGS=-DFFMPEG_INTERNAL_NAME=opencv_videoio_ffmpeg \ + cmake -GNinja \ + -DCMAKE_TOOLCHAIN_FILE=$CURRENT_DIR/mingw-toolchain-i686.cmake \ + -DOpenCV_DIR=${BUILD_DIR}/opencv_x86 \ + "${OPENCV_PLUGIN_CMAKE_ARGS[@]}" + ninja -v + ninja install/strip + strings ./opencv_videoio_ffmpeg.dll | grep '/src/' | grep opencv | uniq + popd +) +} + +DEFAULT_TASKS=${1:-build_opencv_64 build_plugin_64 build_opencv_32 build_plugin_32} +for t in $DEFAULT_TASKS $@; do + echo "Task: $t" + $t +done + +exit 0 +} diff --git a/ffmpeg/docker/Dockerfile b/ffmpeg/docker/Dockerfile new file mode 100644 index 0000000..10ec985 --- /dev/null +++ b/ffmpeg/docker/Dockerfile @@ -0,0 +1,26 @@ +FROM ubuntu:20.04 + +RUN \ + apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + build-essential pkg-config \ + software-properties-common \ + curl git man mc vim nano rsync \ + && \ + rm -rf /var/lib/apt/lists/* + +RUN \ + apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + cmake texinfo yasm bison subversion cvs m4 flex pax ninja-build \ + && \ + rm -rf /var/lib/apt/lists/* + +RUN \ + apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + mingw-w64 g++-mingw-w64-x86-64 g++-mingw-w64-i686 yasm nasm \ + && \ + rm -rf /var/lib/apt/lists/* + +CMD ["/app/docker/entry.sh"] diff --git a/ffmpeg/docker/entry.sh b/ffmpeg/docker/entry.sh new file mode 100755 index 0000000..e7c7b2f --- /dev/null +++ b/ffmpeg/docker/entry.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +groupadd -r appgroup -g $APP_GID +useradd -u $APP_UID -r -g appgroup -d /home/appuser -m -s /bin/bash -c "App user" appuser + +exec su - appuser -c "cd /app && ./make_mingw.sh /build || /bin/bash" diff --git a/ffmpeg/download_src.sh b/ffmpeg/download_src.sh new file mode 100755 index 0000000..d740004 --- /dev/null +++ b/ffmpeg/download_src.sh @@ -0,0 +1,37 @@ +#!/bin/bash -ex +# +# This scripts creates build directory with: +# - ffmpeg source tree (git://source.ffmpeg.org/ffmpeg.git) +# - openh264 source tree (https://github.com/cisco/openh264.git) +# - libvpx source tree (https://chromium.googlesource.com/webm/libvpx.git) + +update() { + DIR=$1 + URL=$2 + TAG=$3 + [[ -d $DIR ]] || git clone $URL $DIR + ( + cd $DIR + git fetch -t $URL $TAG + git checkout $TAG + ) || exit 1 +} + +mkdir -p ../build +( +cd ../build +# https://github.com/FFmpeg/FFmpeg/tags +update ffmpeg git://source.ffmpeg.org/ffmpeg.git n4.4.5 +# https://github.com/cisco/openh264/releases +update openh264 https://github.com/cisco/openh264.git v1.8.0 +# https://chromium.googlesource.com/webm/libvpx.git +update libvpx https://chromium.googlesource.com/webm/libvpx.git v1.15.0 +# https://aomedia.googlesource.com/aom +update aom https://aomedia.googlesource.com/aom v3.11.0 +) + +# Pack all source code / build scripts +./archive_src.sh + +echo "Downloading sources: DONE" +exit 0 diff --git a/ffmpeg/dump_versions.sh b/ffmpeg/dump_versions.sh new file mode 100755 index 0000000..7d3deed --- /dev/null +++ b/ffmpeg/dump_versions.sh @@ -0,0 +1,4 @@ +#!/bin/bash +DIR=./build/ffmpeg +[ -d $DIR ] || DIR=../build/ffmpeg +find $DIR -name '*version*.h' -exec grep -n -A3 'VERSION_MAJOR ' {} \; diff --git a/ffmpeg/ffmpeg_version.cmake b/ffmpeg/ffmpeg_version.cmake new file mode 100644 index 0000000..77b6b0b --- /dev/null +++ b/ffmpeg/ffmpeg_version.cmake @@ -0,0 +1,11 @@ +set(FFMPEG_libavcodec_FOUND 1) +set(FFMPEG_libavformat_FOUND 1) +set(FFMPEG_libavutil_FOUND 1) +set(FFMPEG_libswscale_FOUND 1) +set(FFMPEG_libavresample_FOUND 1) + +set(FFMPEG_libavcodec_VERSION 58.134.100) +set(FFMPEG_libavformat_VERSION 58.76.100) +set(FFMPEG_libavutil_VERSION 56.70.100) +set(FFMPEG_libswscale_VERSION 5.9.100) +set(FFMPEG_libavresample_VERSION 4.0.0) diff --git a/ffmpeg/make_mingw.sh b/ffmpeg/make_mingw.sh new file mode 100755 index 0000000..279fb27 --- /dev/null +++ b/ffmpeg/make_mingw.sh @@ -0,0 +1,163 @@ +#!/bin/bash -ex +# This file is well tested on Ubuntu +# List of required packages for build see in docker/Dockerfile +# (preferred way is to use Docker to produce similar environment) +# +# This script may not work in MINGW installation on Windows +# +# Usage ${0} +# build directory should be created via download_src.sh script: +# + +. ../build/env.sh + +CURRENT_DIR=`pwd` +BUILD_DIR=${1:-.} +CPU_COUNT=$(nproc || echo 4) + +## Libvpx + +libvpx_DIR=${BUILD_DIR}/libvpx +libvpx_x86_DIR=${BUILD_DIR}/libvpx_x86 +libvpx_x64_DIR=${BUILD_DIR}/libvpx_x64 +libvpx_configure_OPTIONS="--disable-examples --disable-unit-tests --disable-install-bins --disable-docs --disable-shared --enable-static --enable-vp8 --enable-vp9 --disable-multithread" +if [ ! -d ${libvpx_DIR} ]; then + echo "Libvpx source tree is not found" + exit 1 +fi +#[ -d ${libvpx_x86_DIR} ] || +( +cd ${libvpx_DIR} +mkdir -p ${libvpx_x86_DIR} +rsync -a ./ ${libvpx_x86_DIR} --exclude .git +cd ${libvpx_x86_DIR} +CROSS=i686-w64-mingw32- ./configure --target=x86-win32-gcc ${libvpx_configure_OPTIONS} --prefix=${libvpx_x86_DIR}/install +make -j ${CPU_COUNT} +make install +) +#[ -d ${libvpx_x64_DIR} ] || +( +cd ${libvpx_DIR} +mkdir -p ${libvpx_x64_DIR} +rsync -a ./ ${libvpx_x64_DIR} --exclude .git +cd ${libvpx_x64_DIR} +CROSS=x86_64-w64-mingw32- ./configure --target=x86_64-win64-gcc ${libvpx_configure_OPTIONS} --prefix=${libvpx_x64_DIR}/install +make -j ${CPU_COUNT} +make install +) + +## Open264 + +openh264_DIR=${BUILD_DIR}/openh264 +if [ ! -d ${openh264_DIR} ]; then + echo "OpenH264 source tree is not found" + exit 1 +fi +openh264_x86_DIR=${openh264_DIR}/install_x86 +openh264_x86_64_DIR=${openh264_DIR}/install_x86_64 +( + cd ${openh264_DIR} + if [[ "${BUILD_SKIP_DOWNLOAD_SOURCES}" == "" ]]; then + make PREFIX=${openh264_x86_DIR} install-headers + else + PREFIX=${openh264_x86_DIR} + mkdir -p ${PREFIX}/include/wels + install -m 644 ${openh264_DIR}/codec/api/svc/codec*.h ${PREFIX}/include/wels + fi + mkdir -p ${openh264_x86_DIR}/lib/pkgconfig + i686-w64-mingw32-gcc -m32 -O2 -I${CURRENT_DIR}/openh264_wrapper -I${openh264_x86_DIR} \ + -c ${CURRENT_DIR}/openh264_wrapper/wels/openh264_wrapper.c -o ${openh264_x86_DIR}/lib/openh264_wrapper.o + x86_64-w64-mingw32-ar rcs ${openh264_x86_DIR}/lib/libopenh264_wrapper.a ${openh264_x86_DIR}/lib/openh264_wrapper.o + cat >${openh264_x86_DIR}/lib/pkgconfig/openh264.pc << EOF +prefix=${openh264_x86_DIR} +includedir=\${prefix}/include + +Name: OpenH264 +Description: OpenH264 wrapper with dynamic loading +Version: 1.8 +Libs: -L\${prefix}/lib -lopenh264_wrapper +Libs.private: +Cflags: -I${CURRENT_DIR}/openh264_wrapper -I\${prefix} -I\${includedir} +EOF +) +( + cd ${openh264_DIR} + if [[ "${BUILD_SKIP_DOWNLOAD_SOURCES}" == "" ]]; then + make PREFIX=${openh264_x86_64_DIR} install-headers + else + PREFIX=${openh264_x86_64_DIR} + mkdir -p ${PREFIX}/include/wels + install -m 644 ${openh264_DIR}/codec/api/svc/codec*.h ${PREFIX}/include/wels + fi + mkdir -p ${openh264_x86_64_DIR}/lib/pkgconfig + x86_64-w64-mingw32-gcc -m64 -O2 -I${CURRENT_DIR}/openh264_wrapper -I${openh264_x86_64_DIR} \ + -c ${CURRENT_DIR}/openh264_wrapper/wels/openh264_wrapper.c -o ${openh264_x86_64_DIR}/lib/openh264_wrapper.o + x86_64-w64-mingw32-ar rcs ${openh264_x86_64_DIR}/lib/libopenh264_wrapper.a ${openh264_x86_64_DIR}/lib/openh264_wrapper.o + cat >${openh264_x86_64_DIR}/lib/pkgconfig/openh264.pc << EOF +prefix=${openh264_x86_64_DIR} +includedir=\${prefix}/include + +Name: OpenH264 +Description: OpenH264 wrapper with dynamic loading +Version: 1.8 +Libs: -L\${prefix}/lib -lopenh264_wrapper +Libs.private: +Cflags: -I${CURRENT_DIR}/openh264_wrapper -I\${prefix} -I\${includedir} +EOF +) + +## AOM: https://aomedia.googlesource.com/aom + +AOM_DIR=${BUILD_DIR}/aom +if [ ! -d ${AOM_DIR} ]; then + echo "AOM source tree is not found" + exit 1 +fi +AOM_X86_DIR=${BUILD_DIR}/aom_x86 +AOM_X64_DIR=${BUILD_DIR}/aom_x64 +AOM_CONFIGURE_OPTIONS="-DENABLE_TESTS=OFF -DENABLE_EXAMPLES=OFF -DENABLE_TOOLS=OFF -DENABLE_DOCS=OFF -DCONFIG_MULTITHREAD=1 -DCONFIG_AV1_ENCODER=1" +( + mkdir -p "${AOM_X86_DIR}" + cd "${AOM_X86_DIR}" + cmake -GNinja -DAOM_TARGET_CPU=generic -DCMAKE_TOOLCHAIN_FILE=${AOM_DIR}/build/cmake/toolchains/x86-mingw-gcc.cmake -DCMAKE_INSTALL_PREFIX=${AOM_X86_DIR}/install ${AOM_CONFIGURE_OPTIONS} ${AOM_DIR} + cmake --build . --target install +) +( + mkdir -p "${AOM_X64_DIR}" + cd "${AOM_X64_DIR}" + cmake -GNinja -DAOM_TARGET_CPU=generic -DCMAKE_TOOLCHAIN_FILE=${AOM_DIR}/build/cmake/toolchains/x86_64-mingw-gcc.cmake -DCMAKE_INSTALL_PREFIX=${AOM_X64_DIR}/install ${AOM_CONFIGURE_OPTIONS} ${AOM_DIR} + cmake --build . --target install +) + +FFMPEG_DIR=${BUILD_DIR}/ffmpeg +if [ ! -d ${FFMPEG_DIR} ]; then + echo "FFMPEG source tree is not found" + exit 1 +fi + +## FFmpeg + +FFMPEG_x86_DIR=${BUILD_DIR}/ffmpeg_x86 +FFMPEG_x86_64_DIR=${BUILD_DIR}/ffmpeg_x86_64 +FFMPEG_CONFIGURE_OPTIONS="--pkg-config=pkg-config --enable-static --enable-avresample --enable-w32threads --enable-libopenh264 --enable-libvpx --disable-filters --disable-bsfs --disable-programs --disable-debug --disable-cuda --disable-cuvid --disable-nvenc --enable-libaom" +#[ -d ${FFMPEG_x86_DIR} ] || +( + cd ${FFMPEG_DIR} + mkdir -p ${FFMPEG_x86_DIR} + rsync -a ./ ${FFMPEG_x86_DIR} --exclude .git + cd ${FFMPEG_x86_DIR} + PKG_CONFIG_PATH=${openh264_x86_DIR}/lib/pkgconfig:${libvpx_x86_DIR}/install/lib/pkgconfig:${AOM_X86_DIR}/install/lib/pkgconfig ./configure --enable-cross-compile --arch=x86 --target-os=mingw32 --cross-prefix=i686-w64-mingw32- ${FFMPEG_CONFIGURE_OPTIONS} --prefix=`pwd`/install + make -j${CPU_COUNT} install +) +#[ -d ${FFMPEG_x86_64_DIR} ] || +( + cd ${FFMPEG_DIR} + mkdir -p ${FFMPEG_x86_64_DIR} + rsync -a ./ ${FFMPEG_x86_64_DIR} --exclude .git + cd ${FFMPEG_x86_64_DIR} + PKG_CONFIG_PATH=${openh264_x86_64_DIR}/lib/pkgconfig:${libvpx_x64_DIR}/install/lib/pkgconfig:${AOM_X64_DIR}/install/lib/pkgconfig ./configure --enable-cross-compile --arch=x86_64 --target-os=mingw32 --cross-prefix=x86_64-w64-mingw32- ${FFMPEG_CONFIGURE_OPTIONS} --prefix=`pwd`/install + make -j${CPU_COUNT} install +) + +## OpenCV plugins +./build_videoio_plugin.sh diff --git a/ffmpeg/mingw-toolchain-i686.cmake b/ffmpeg/mingw-toolchain-i686.cmake new file mode 100644 index 0000000..4f3cefe --- /dev/null +++ b/ffmpeg/mingw-toolchain-i686.cmake @@ -0,0 +1,13 @@ +set(CMAKE_SYSTEM_NAME Windows) +set(CMAKE_SYSTEM_PROCESSOR x86) +set(TOOLCHAIN_PREFIX i686-w64-mingw32) + +set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc) +set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++-posix) +set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres) + +set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX} /build/) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff --git a/ffmpeg/mingw-toolchain-x86_64.cmake b/ffmpeg/mingw-toolchain-x86_64.cmake new file mode 100644 index 0000000..2577a34 --- /dev/null +++ b/ffmpeg/mingw-toolchain-x86_64.cmake @@ -0,0 +1,13 @@ +set(CMAKE_SYSTEM_NAME Windows) +set(CMAKE_SYSTEM_PROCESSOR x86_64) +set(TOOLCHAIN_PREFIX x86_64-w64-mingw32) + +set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc) +set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++-posix) +set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres) + +set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX} /build/) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff --git a/ffmpeg/opencv_ffmpeg.rc b/ffmpeg/opencv_ffmpeg.rc new file mode 100644 index 0000000..8f634d0 --- /dev/null +++ b/ffmpeg/opencv_ffmpeg.rc @@ -0,0 +1,46 @@ +#include + +#ifndef FFMPEG_INTERNAL_NAME +#error Configuration error, missing FFMPEG_INTERNAL_NAME +#endif + +#define STR_(__A) #__A +#define STR(__A) STR_(__A) + + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 2024,12,0,0 + PRODUCTVERSION 2024,12,0,0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS 1 +#else + FILEFLAGS 0 +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "FileDescription", "OpenCV FFmpeg wrapper\0" + VALUE "FileVersion", "2024.12.0\0" + VALUE "InternalName", STR(FFMPEG_INTERNAL_NAME) "\0" +#if 0 + VALUE "LegalCopyright", "\0" +#endif + VALUE "OriginalFilename", STR(FFMPEG_INTERNAL_NAME) ".dll\0" + VALUE "ProductName", "OpenCV FFmpeg wrapper\0" + VALUE "ProductVersion", "2024.12.0\0" +#if 1 + VALUE "Comments", "http://opencv.org/\0" +#endif + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/ffmpeg/opencv_videoio_ffmpeg.dll b/ffmpeg/opencv_videoio_ffmpeg.dll new file mode 100755 index 0000000..214d9f8 Binary files /dev/null and b/ffmpeg/opencv_videoio_ffmpeg.dll differ diff --git a/ffmpeg/opencv_videoio_ffmpeg_64.dll b/ffmpeg/opencv_videoio_ffmpeg_64.dll new file mode 100755 index 0000000..43d44b1 Binary files /dev/null and b/ffmpeg/opencv_videoio_ffmpeg_64.dll differ diff --git a/ffmpeg/openh264_wrapper/wels/codec_api.h b/ffmpeg/openh264_wrapper/wels/codec_api.h new file mode 100644 index 0000000..227ab75 --- /dev/null +++ b/ffmpeg/openh264_wrapper/wels/codec_api.h @@ -0,0 +1,211 @@ +// +// This file is a wrapper with dynamic loader for OpenH264 binaries +// Tested with ffmpeg source tree with enabled OpenH264 support +// +// Based on the header file from OpenH264 project: +// https://github.com/cisco/openh264/blob/master/codec/api/svc/codec_api.h +// + +#ifndef __WELS_VIDEO_CODEC_SVC_API_WRAPPER_H__ +#define __WELS_VIDEO_CODEC_SVC_API_WRAPPER_H__ + +#define WelsCreateSVCEncoder WelsCreateSVCEncoder_ +#define WelsDestroySVCEncoder WelsDestroySVCEncoder_ +#define WelsGetDecoderCapability WelsGetDecoderCapability_ +#define WelsCreateDecoder WelsCreateDecoder_ +#define WelsDestroyDecoder WelsDestroyDecoder_ +#define WelsGetCodecVersion WelsGetCodecVersion_ +#define WelsGetCodecVersionEx WelsGetCodecVersionEx_ + +// include original file +#include "include/wels/codec_api.h" + +#undef WelsCreateSVCEncoder +#undef WelsDestroySVCEncoder +#undef WelsGetDecoderCapability +#undef WelsCreateDecoder +#undef WelsDestroyDecoder +#undef WelsGetCodecVersion +#undef WelsGetCodecVersionEx + +// Declarations +int WelsCreateSVCEncoder(ISVCEncoder** ppEncoder); +void WelsDestroySVCEncoder(ISVCEncoder* pEncoder); +int WelsGetDecoderCapability(SDecoderCapability* pDecCapability); +long WelsCreateDecoder(ISVCDecoder** ppDecoder); +void WelsDestroyDecoder(ISVCDecoder* pDecoder); +OpenH264Version WelsGetCodecVersion(void); +void WelsGetCodecVersionEx(OpenH264Version *pVersion); + + +#ifdef OPENH264WRAPPER_WITH_IMPLEMENTATION + +// Fallback +// TODO Calling convention? +static int WelsCreateSVCEncoder_fallback (ISVCEncoder** ppEncoder) { return 1; /*error*/ } +static void WelsDestroySVCEncoder_fallback (ISVCEncoder* pEncoder) { } +static int WelsGetDecoderCapability_fallback (SDecoderCapability* pDecCapability) { return 1; /*error*/ } +static long WelsCreateDecoder_fallback (ISVCDecoder** ppDecoder) { return 1; /*error*/ } +static void WelsDestroyDecoder_fallback (ISVCDecoder* pDecoder) { } +static OpenH264Version WelsGetCodecVersion_fallback (void) +{ + static const OpenH264Version v = {0, 0, 0, 0}; + return v; +} +static void WelsGetCodecVersionEx_fallback (OpenH264Version *pVersion) +{ + static const OpenH264Version v = {0, 0, 0, 0}; + *pVersion = v; +} + +typedef int (*FN_WelsCreateSVCEncoder) (ISVCEncoder** ppEncoder); +typedef void (*FN_WelsDestroySVCEncoder) (ISVCEncoder* pEncoder); +typedef int (*FN_WelsGetDecoderCapability) (SDecoderCapability* pDecCapability); +typedef long (*FN_WelsCreateDecoder) (ISVCDecoder** ppDecoder); +typedef void (*FN_WelsDestroyDecoder) (ISVCDecoder* pDecoder); +typedef OpenH264Version (*FN_WelsGetCodecVersion) (void); +typedef void (*FN_WelsGetCodecVersionEx) (OpenH264Version *pVersion); + +static FN_WelsCreateSVCEncoder p_WelsCreateSVCEncoder = WelsCreateSVCEncoder_fallback; +static FN_WelsDestroySVCEncoder p_WelsDestroySVCEncoder = WelsDestroySVCEncoder_fallback; +static FN_WelsGetDecoderCapability p_WelsGetDecoderCapability = WelsGetDecoderCapability_fallback; +static FN_WelsCreateDecoder p_WelsCreateDecoder = WelsCreateDecoder_fallback; +static FN_WelsDestroyDecoder p_WelsDestroyDecoder = WelsDestroyDecoder_fallback; +static FN_WelsGetCodecVersion p_WelsGetCodecVersion = WelsGetCodecVersion_fallback; +static FN_WelsGetCodecVersionEx p_WelsGetCodecVersionEx = WelsGetCodecVersionEx_fallback; + +#include +#ifdef _WIN32 +#include +#elif defined __linux__ || defined __APPLE__ +#include +#endif + +#ifdef _WIN32 +#define LIBRARY_HANDLE_TYPE HANDLE +#else +#define LIBRARY_HANDLE_TYPE void* +#endif +static int _loadLibrary(const char* name, LIBRARY_HANDLE_TYPE* handle) +{ +#ifdef _WIN32 + *handle = LoadLibraryA(name); +#define GETADDR(name) GetProcAddress(handle, #name) +#elif defined __linux__ || defined __APPLE__ + *handle = dlopen(name, RTLD_LAZY | RTLD_GLOBAL); +#define GETADDR(name) dlsym(handle, #name) +#else +#error "Not supported platform" +#endif + return (handle != NULL) ? 1 : 0; +} + + +static void _initLibrary(void) +{ + static const char* defaultLibraryName = +#ifdef _WIN32 +#if defined _M_X64 || defined __x86_64__ + "openh264-1.8.0-win64.dll" +#else + "openh264-1.8.0-win32.dll" +#endif +// Linux/Unix based on dlopen/dlsym +#elif defined __linux__ +# if defined __x86_64__ + "libopenh264-1.8.0-linux64.4.so" +# else + "libopenh264-1.8.0-linux32.4.so" +# endif +#elif defined __APPLE__ +# if defined __x86_64__ + "libopenh264-1.8.0-osx64.4.dylib" +# else + "libopenh264-1.8.0-osx32.4.dylib" +# endif +#else +#error "Not supported platform" +#endif + ; + + int errors = 0; + void *fn_addr = NULL; + + const char* forced_name = getenv("OPENH264_LIBRARY"); + const char* libraryName = forced_name == NULL ? defaultLibraryName : forced_name; + + LIBRARY_HANDLE_TYPE handle = NULL; + if (_loadLibrary(libraryName, &handle) == 0) + { + errors++; + } + else if (handle == NULL) + { + errors++; + } + else + { +#define FILLADDR(name) \ + fn_addr = GETADDR(name); \ + if (fn_addr != NULL) \ + p_ ## name = (FN_ ## name)fn_addr; \ + else \ + errors++; + FILLADDR(WelsCreateSVCEncoder) + FILLADDR(WelsDestroySVCEncoder) +#ifdef _WIN32 + // Not exported into DLL: FILLADDR(WelsGetDecoderCapability) +#else + FILLADDR(WelsGetDecoderCapability) +#endif + FILLADDR(WelsCreateDecoder) + FILLADDR(WelsDestroyDecoder) + FILLADDR(WelsGetCodecVersion) + FILLADDR(WelsGetCodecVersionEx) + } +#undef FILLADDR +#undef GETADDR +#undef LIBRARY_HANDLE_TYPE + if (errors == 0) + { + fprintf(stderr, "\n\tOpenH264 Video Codec provided by Cisco Systems, Inc.\n\n"); + } + else + { + fprintf(stderr, "\nFailed to load OpenH264 library: %s\n", libraryName); + fprintf(stderr, "\tPlease check environment and/or download library: https://github.com/cisco/openh264/releases\n\n"); + } +} + +static void initLibrary(void) +{ + static bool initialized = false; + if (initialized) + return; + _initLibrary(); + initialized = true; +} + +#define WRAP(name, ret_type, decl_args, call_args) \ +ret_type name decl_args { \ + initLibrary(); \ + return p_ ## name call_args; \ +} + +#define WRAP_VOID(name, decl_args, call_args) \ +void name decl_args { \ + initLibrary(); \ + p_ ## name call_args; \ +} + +WRAP(WelsCreateSVCEncoder, int, (ISVCEncoder** ppEncoder), (ppEncoder) ) +WRAP_VOID(WelsDestroySVCEncoder, (ISVCEncoder* pEncoder), (pEncoder) ) +WRAP(WelsGetDecoderCapability, int, (SDecoderCapability* pDecCapability), (pDecCapability) ) +WRAP(WelsCreateDecoder, long, (ISVCDecoder** ppDecoder), (ppDecoder) ) +WRAP_VOID(WelsDestroyDecoder, (ISVCDecoder* pDecoder), (pDecoder) ) +WRAP(WelsGetCodecVersion, OpenH264Version, (void), () ) +WRAP_VOID(WelsGetCodecVersionEx, (OpenH264Version *pVersion), (pVersion) ) + +#endif + +#endif // __WELS_VIDEO_CODEC_SVC_API_WRAPPER_H__ diff --git a/ffmpeg/openh264_wrapper/wels/openh264_wrapper.c b/ffmpeg/openh264_wrapper/wels/openh264_wrapper.c new file mode 100644 index 0000000..75d2ace --- /dev/null +++ b/ffmpeg/openh264_wrapper/wels/openh264_wrapper.c @@ -0,0 +1,19 @@ +// +// This file is a wrapper with dynamic loader for OpenH264 binaries +// Tested with ffmpeg source tree with enabled OpenH264 support +// +// Based on the header file from OpenH264 project: +// https://github.com/cisco/openh264/blob/master/codec/api/svc/codec_api.h +// + +#ifdef __cplusplus +extern "C" { +#endif + +#define OPENH264WRAPPER_WITH_IMPLEMENTATION + +#include "codec_api.h" + +#ifdef __cplusplus +} +#endif diff --git a/license.txt b/license.txt new file mode 100644 index 0000000..e018837 --- /dev/null +++ b/license.txt @@ -0,0 +1,520 @@ + Copyright (C) 2001 Fabrice Bellard + + FFmpeg is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + FFmpeg is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with FFmpeg; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +================================================================================== + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/opencv b/opencv new file mode 160000 index 0000000..09892c9 --- /dev/null +++ b/opencv @@ -0,0 +1 @@ +Subproject commit 09892c9d1706f40342bda0bc404580f63492d9f8 diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..597aa13 --- /dev/null +++ b/readme.txt @@ -0,0 +1,37 @@ +* On Linux and other Unix flavors OpenCV uses default or user-built ffmpeg/libav libraries. + If user builds ffmpeg/libav from source and wants OpenCV to stay BSD library, not GPL/LGPL, + he/she should use --enabled-shared configure flag and make sure that no GPL components are + enabled (some notable examples are x264 (H264 encoder) and libac3 (Dolby AC3 audio codec)). + See https://www.ffmpeg.org/legal.html for details. + + If you want to play very safe and do not want to use FFMPEG at all, regardless of whether it's installed on + your system or not, configure and build OpenCV using CMake with WITH_FFMPEG=OFF flag. OpenCV will then use + AVFoundation (OSX), GStreamer (Linux) or other available backends supported by opencv_videoio module. + + There is also our self-contained motion jpeg codec, which you can use without any worries. + It handles CV_FOURCC('M', 'J', 'P', 'G') streams within an AVI container (".avi"). + +* On Windows OpenCV uses pre-built ffmpeg binaries, built with proper flags (without GPL components) and + wrapped with simple, stable OpenCV-compatible API. + The binaries are opencv_videoio_ffmpeg.dll (version for 32-bit Windows) and + opencv_videoio_ffmpeg_64.dll (version for 64-bit Windows). + + The pre-built opencv_videoio_ffmpeg*.dll is: + * LGPL library, not BSD libraries. + * Loaded at runtime by opencv_videoio module. + If it succeeds, ffmpeg can be used to decode/encode videos; + otherwise, other API is used. + + FFMPEG build includes support for H264 encoder based on the OpenH264 library. + OpenH264 Video Codec provided by Cisco Systems, Inc. + See https://github.com/cisco/openh264/releases for details and OpenH264 license. + OpenH264 library should be installed separatelly. Downloaded binary file can be placed into global system path + (System32 or SysWOW64) or near application binaries (check documentation of "LoadLibrary" Win32 function from MSDN). + Or you can specify location of binary file via OPENH264_LIBRARY environment variable. + + If LGPL/GPL software can not be supplied with your OpenCV-based product, simply exclude + opencv_videoio_ffmpeg*.dll from your distribution; OpenCV will stay fully functional except for the ability to + decode/encode videos using FFMPEG (though, it may still be able to do that using other API, + such as Video for Windows, Windows Media Foundation or our self-contained motion jpeg codec). + + See license.txt for the FFMPEG copyright notice and the licensing terms. diff --git a/sources/build/aom/aom-src-v3.11.0.tar.xz b/sources/build/aom/aom-src-v3.11.0.tar.xz new file mode 100644 index 0000000..a74854c Binary files /dev/null and b/sources/build/aom/aom-src-v3.11.0.tar.xz differ diff --git a/sources/build/ffmpeg/ffmpeg-src-n4.4.5.tar.xz b/sources/build/ffmpeg/ffmpeg-src-n4.4.5.tar.xz new file mode 100644 index 0000000..5f46a5a Binary files /dev/null and b/sources/build/ffmpeg/ffmpeg-src-n4.4.5.tar.xz differ diff --git a/sources/build/libvpx/libvpx-src-v1.15.0.tar.xz b/sources/build/libvpx/libvpx-src-v1.15.0.tar.xz new file mode 100644 index 0000000..b811487 Binary files /dev/null and b/sources/build/libvpx/libvpx-src-v1.15.0.tar.xz differ diff --git a/sources/build/openh264/openh264-api-headers-v1.8.0.tar.xz b/sources/build/openh264/openh264-api-headers-v1.8.0.tar.xz new file mode 100644 index 0000000..5c44920 Binary files /dev/null and b/sources/build/openh264/openh264-api-headers-v1.8.0.tar.xz differ diff --git a/sources/opencv/opencv-videoio-ffmpeg.tar.xz b/sources/opencv/opencv-videoio-ffmpeg.tar.xz new file mode 100644 index 0000000..28e1aac Binary files /dev/null and b/sources/opencv/opencv-videoio-ffmpeg.tar.xz differ diff --git a/sources/opencv_ffmpeg.tar.xz b/sources/opencv_ffmpeg.tar.xz new file mode 100644 index 0000000..db46607 Binary files /dev/null and b/sources/opencv_ffmpeg.tar.xz differ