diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b43c066 --- /dev/null +++ b/Makefile @@ -0,0 +1,61 @@ +# When there's no argument provided to make, all codecs will be built to all +# supported platforms. Otherwise, it'll build only the provided target. +# +# Usage: +# make [--] +# +# Examples: +# * make: build all codecs for all supported platforms +# * make opus-darwin-x64: only build opus for darwin-x64 platform + +docker_owner := lherman +docker_prefix := cross +toolchain_dockerfiles := dockerfiles +script_path := $(realpath scripts) +toolchain_path := $(script_path)/$(docker_prefix) +os_list := \ + linux \ + windows \ + darwin +arch_list := \ + armv7 \ + arm64 \ + x64 +supported_platforms := \ + linux-armv7 \ + linux-arm64 \ + linux-x64 \ + windows-x64 \ + darwin-x64 +codec_dir := pkg/codec +codec_list := $(shell ls $(codec_dir)/*/Makefile) +codec_list := $(codec_list:$(codec_dir)/%/Makefile=%) +targets := $(foreach codec, $(codec_list), $(addprefix $(codec)-, $(supported_platforms))) + +define BUILD_TEMPLATE +ifneq (,$$(findstring $(2)-$(3),$$(supported_platforms))) +$(1)-$(2)-$(3): toolchain-$(2)-$(3) + $$(MAKE) --directory=$$(codec_dir)/$(1) \ + MEDIADEVICES_TOOLCHAIN_BIN=$$(toolchain_path)/$(docker_prefix)-$(2)-$(3) \ + MEDIADEVICES_TARGET_PLATFORM=$(2)-$(3) \ + MEDIADEVICES_TARGET_OS=$(2) \ + MEDIADEVICES_TARGET_ARCH=$(3) +endif +endef + +.PHONY: all +all: $(targets) + +toolchain-%: $(toolchain_dockerfiles) + $(MAKE) --directory=$< "$*" \ + MEDIADEVICES_DOCKER_OWNER=$(docker_owner) \ + MEDIADEVICES_DOCKER_PREFIX=$(docker_prefix) + @mkdir -p $(toolchain_path) + @docker run $(docker_owner)/$(docker_prefix)-$* > \ + $(toolchain_path)/$(docker_prefix)-$* + @chmod +x $(toolchain_path)/$(docker_prefix)-$* + +$(foreach codec, $(codec_list), \ + $(foreach os, $(os_list), \ + $(foreach arch, $(arch_list), \ + $(eval $(call BUILD_TEMPLATE,$(codec),$(os),$(arch)))))) diff --git a/build.sh b/build.sh deleted file mode 100755 index 692b274..0000000 --- a/build.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/bin/bash - -MEDIADEVICES_TOOLCHAIN_OWNER=lherman -MEDIADEVICES_TOOLCHAIN_PREFIX=cross -MEDIADEVICES_SCRIPT_PATH=$(realpath ./scripts) -MEDIADEVICES_TOOLCHAIN_PATH=${MEDIADEVICES_SCRIPT_PATH}/${MEDIADEVICES_TOOLCHAIN_PREFIX} -MEDIADEVICES_DOCKERFILES_PATH=dockerfiles - -# Reference: https://github.com/dockcross/dockcross#cross-compilers -MEDIADEVICES_TARGET_PLATFORMS=( - linux-armv7 - linux-arm64 - linux-x64 - windows-x64 - darwin-x64 -) - -if [[ -z ${VERBOSE} ]]; then - MEDIADEVICES_OUTPUT=/dev/null -else - MEDIADEVICES_OUTPUT=/dev/stdout -fi - -install_toolchains() { - bash ${MEDIADEVICES_DOCKERFILES_PATH}/build.sh &> ${MEDIADEVICES_OUTPUT} - for platform in ${MEDIADEVICES_TARGET_PLATFORMS[@]} - do - mkdir -p ${MEDIADEVICES_TOOLCHAIN_PATH} - image=${MEDIADEVICES_TOOLCHAIN_OWNER}/${MEDIADEVICES_TOOLCHAIN_PREFIX}-${platform} - bin_path=${MEDIADEVICES_TOOLCHAIN_PATH}/${MEDIADEVICES_TOOLCHAIN_PREFIX}-${platform} - docker run ${image} > ${bin_path} - chmod +x ${bin_path} - done -} - -build() { - sub_builds=$(find pkg -type f -name "build.sh") - for sub_build in ${sub_builds[@]} - do - sub_build=$(realpath ${sub_build}) - sub_build_dir=$(dirname ${sub_build}) - current_dir=${PWD} - cd $sub_build_dir - for platform in ${MEDIADEVICES_TARGET_PLATFORMS[@]} - do - export MEDIADEVICES_TOOLCHAIN_BIN=${MEDIADEVICES_TOOLCHAIN_PATH}/${MEDIADEVICES_TOOLCHAIN_PREFIX}-${platform} - # convert '-' to '_' since '_' is more common in library names - export MEDIADEVICES_TARGET_PLATFORM=${platform//-/_} - export MEDIADEVICES_TARGET_OS=$(echo $MEDIADEVICES_TARGET_PLATFORM | cut -d'_' -f1) - export MEDIADEVICES_TARGET_ARCH=${platform//${MEDIADEVICES_TARGET_OS}-/} - - echo "Building ${sub_build_dir}:" - echo " PLATFORM : ${MEDIADEVICES_TARGET_PLATFORM}" - echo " OS : ${MEDIADEVICES_TARGET_OS}" - echo " ARCH : ${MEDIADEVICES_TARGET_ARCH}" - echo " TOOLCHAIN_BIN : ${MEDIADEVICES_TOOLCHAIN_BIN}" - echo "" - - ${sub_build} &> ${MEDIADEVICES_OUTPUT} - done - cd ${current_dir} - done -} - -if [[ $# > 0 && $1 != "all" ]]; then - MEDIADEVICES_TARGET_PLATFORMS=($1) -fi - -install_toolchains -build diff --git a/dockerfiles/Makefile b/dockerfiles/Makefile new file mode 100644 index 0000000..f04c4b2 --- /dev/null +++ b/dockerfiles/Makefile @@ -0,0 +1,11 @@ +dockerfiles := $(wildcard *.Dockerfile) +supported_platforms := $(dockerfiles:.Dockerfile=) + +.PHONY: all +all: $(supported_platforms) + +%: %.Dockerfile guard-MEDIADEVICES_DOCKER_OWNER guard-MEDIADEVICES_DOCKER_PREFIX + docker build -t "$(MEDIADEVICES_DOCKER_OWNER)/$(MEDIADEVICES_DOCKER_PREFIX)-$@" -f "$<" . + +guard-%: + @if [ -z ${$*} ]; then echo "$* is a required environment variable"; exit 1; fi diff --git a/dockerfiles/build.sh b/dockerfiles/build.sh deleted file mode 100755 index d6ef91f..0000000 --- a/dockerfiles/build.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -cd $(dirname $0) - -OWNER=lherman -PREFIX=cross -IMAGES=$(ls *.Dockerfile) - -for image in ${IMAGES[@]} -do - tag=${OWNER}/cross-${image//.Dockerfile/} - docker build -t "${tag}" -f "$image" . -done diff --git a/pkg/codec/openh264/Makefile b/pkg/codec/openh264/Makefile new file mode 100644 index 0000000..0ee4a12 --- /dev/null +++ b/pkg/codec/openh264/Makefile @@ -0,0 +1,47 @@ +git_url := https://github.com/cisco/openh264.git +version := v2.1.1 +src_root_dir := src +lib_dir := lib +include_dir := include/openh264 +lib_prefix := libopenh264 +src_dir := $(src_root_dir)/$(MEDIADEVICES_TARGET_PLATFORM) +output_path := $(lib_dir)/$(lib_prefix)-$(MEDIADEVICES_TARGET_PLATFORM).a + +# OS and Arch mapping to OpenH264 parameters +ifeq (windows,$(MEDIADEVICES_TARGET_OS)) + os := mingw_nt +else + os := $(MEDIADEVICES_TARGET_OS) +endif + +ifneq (,$(findstring $(MEDIADEVICES_TARGET_ARCH),armv6 armv7 armv8)) + arch := arm +else ifeq (x64,$(MEDIADEVICES_TARGET_ARCH)) + arch := x86_64 +else + arch := $(MEDIADEVICES_TARGET_ARCH) +endif + +.PHONY: all +all: guard-MEDIADEVICES_TARGET_PLATFORM guard-MEDIADEVICES_TARGET_PLATFORM \ + guard-MEDIADEVICES_TARGET_OS guard-MEDIADEVICES_TARGET_ARCH \ + $(output_path) headers + +headers: | $(src_dir) $(include_dir) + @cp $(src_dir)/codec/api/svc/*.h $(include_dir) + +$(output_path): $(src_dir)/$(lib_prefix).a | $(lib_dir) + @cp $< $@ + +$(src_dir)/$(lib_prefix).a: | $(src_dir) + $(MEDIADEVICES_TOOLCHAIN_BIN) make --directory=$(src_dir) $(lib_prefix).a \ + OS=$(os) ARCH=$(arch) + +$(src_dir): | $(src_root_dir) + git clone --depth=1 --branch=$(version) $(git_url) $@ + +$(src_root_dir) $(lib_dir) $(include_dir): + @mkdir -p $@ + +guard-%: + @if [ -z ${$*} ]; then echo "$* is a required environment variable"; exit 1; fi diff --git a/pkg/codec/openh264/build.sh b/pkg/codec/openh264/build.sh deleted file mode 100755 index cf89480..0000000 --- a/pkg/codec/openh264/build.sh +++ /dev/null @@ -1,36 +0,0 @@ -GIT_URL=https://github.com/cisco/openh264.git -VERSION=v2.1.1 -SRC_DIR=src -LIB_DIR=lib -INCLUDE_DIR=include/openh264 -ROOT_DIR=${PWD} -LIB_PREFIX=libopenh264 - -OS=${MEDIADEVICES_TARGET_OS} -ARCH=${MEDIADEVICES_TARGET_ARCH} - -case ${MEDIADEVICES_TARGET_OS} in - windows) - OS=mingw_nt - ;; -esac - -case ${MEDIADEVICES_TARGET_ARCH} in - armv6 | armv7 | armv8) - ARCH=arm - ;; - x64) - ARCH=x86_64 - ;; -esac - -mkdir -p ${LIB_DIR} ${INCLUDE_DIR} - -git clone --depth=1 --branch=${VERSION} ${GIT_URL} ${SRC_DIR} -cd ${SRC_DIR} -${MEDIADEVICES_TOOLCHAIN_BIN} make -j2 ${LIB_PREFIX}.a OS=${OS} ARCH=${ARCH} -${MEDIADEVICES_TOOLCHAIN_BIN} echo $PATH -mv ${LIB_PREFIX}.a ${ROOT_DIR}/${LIB_DIR}/${LIB_PREFIX}_${MEDIADEVICES_TARGET_PLATFORM}.a -mkdir -p ${ROOT_DIR}/${INCLUDE_DIR} -cp codec/api/svc/*.h ${ROOT_DIR}/${INCLUDE_DIR} -make clean diff --git a/pkg/codec/openh264/include/openh264/codec_ver.h b/pkg/codec/openh264/include/openh264/codec_ver.h index a4e494f..f45ab3f 100644 --- a/pkg/codec/openh264/include/openh264/codec_ver.h +++ b/pkg/codec/openh264/include/openh264/codec_ver.h @@ -4,12 +4,12 @@ #include "codec_app_def.h" -static const OpenH264Version g_stCodecVersion = {2, 1, 0, 2002}; -static const char* const g_strCodecVer = "OpenH264 version:2.1.0.2002"; +static const OpenH264Version g_stCodecVersion = {2, 1, 1, 2005}; +static const char* const g_strCodecVer = "OpenH264 version:2.1.1.2005"; #define OPENH264_MAJOR (2) #define OPENH264_MINOR (1) -#define OPENH264_REVISION (0) -#define OPENH264_RESERVED (2002) +#define OPENH264_REVISION (1) +#define OPENH264_RESERVED (2005) #endif // CODEC_VER_H diff --git a/pkg/codec/openh264/lib/libopenh264_darwin_x64.a b/pkg/codec/openh264/lib/libopenh264-darwin-x64.a similarity index 91% rename from pkg/codec/openh264/lib/libopenh264_darwin_x64.a rename to pkg/codec/openh264/lib/libopenh264-darwin-x64.a index 3de6456..0488886 100644 Binary files a/pkg/codec/openh264/lib/libopenh264_darwin_x64.a and b/pkg/codec/openh264/lib/libopenh264-darwin-x64.a differ diff --git a/pkg/codec/openh264/lib/libopenh264_linux_arm64.a b/pkg/codec/openh264/lib/libopenh264-linux-arm64.a similarity index 88% rename from pkg/codec/openh264/lib/libopenh264_linux_arm64.a rename to pkg/codec/openh264/lib/libopenh264-linux-arm64.a index e2846ec..e6e46b0 100644 Binary files a/pkg/codec/openh264/lib/libopenh264_linux_arm64.a and b/pkg/codec/openh264/lib/libopenh264-linux-arm64.a differ diff --git a/pkg/codec/openh264/lib/libopenh264_linux_armv7.a b/pkg/codec/openh264/lib/libopenh264-linux-armv7.a similarity index 87% rename from pkg/codec/openh264/lib/libopenh264_linux_armv7.a rename to pkg/codec/openh264/lib/libopenh264-linux-armv7.a index 71a91a1..517c5a6 100644 Binary files a/pkg/codec/openh264/lib/libopenh264_linux_armv7.a and b/pkg/codec/openh264/lib/libopenh264-linux-armv7.a differ diff --git a/pkg/codec/openh264/lib/libopenh264_linux_x64.a b/pkg/codec/openh264/lib/libopenh264-linux-x64.a similarity index 88% rename from pkg/codec/openh264/lib/libopenh264_linux_x64.a rename to pkg/codec/openh264/lib/libopenh264-linux-x64.a index 1f3bdb8..d155ccd 100644 Binary files a/pkg/codec/openh264/lib/libopenh264_linux_x64.a and b/pkg/codec/openh264/lib/libopenh264-linux-x64.a differ diff --git a/pkg/codec/openh264/lib/libopenh264_windows_x64.a b/pkg/codec/openh264/lib/libopenh264-windows-x64.a similarity index 77% rename from pkg/codec/openh264/lib/libopenh264_windows_x64.a rename to pkg/codec/openh264/lib/libopenh264-windows-x64.a index 862555a..9e9c0ef 100644 Binary files a/pkg/codec/openh264/lib/libopenh264_windows_x64.a and b/pkg/codec/openh264/lib/libopenh264-windows-x64.a differ diff --git a/pkg/codec/openh264/openh264_static.go b/pkg/codec/openh264/openh264_static.go index 31a4f30..b53cb22 100644 --- a/pkg/codec/openh264/openh264_static.go +++ b/pkg/codec/openh264/openh264_static.go @@ -4,9 +4,9 @@ package openh264 //#cgo CFLAGS: -I${SRCDIR}/include //#cgo CXXFLAGS: -I${SRCDIR}/include -//#cgo linux,arm LDFLAGS: ${SRCDIR}/lib/libopenh264_linux_armv7.a -//#cgo linux,arm64 LDFLAGS: ${SRCDIR}/lib/libopenh264_linux_arm64.a -//#cgo linux,amd64 LDFLAGS: ${SRCDIR}/lib/libopenh264_linux_x64.a -//#cgo darwin,amd64 LDFLAGS: ${SRCDIR}/lib/libopenh264_darwin_x64.a -//#cgo windows,amd64 LDFLAGS: ${SRCDIR}/lib/libopenh264_windows_x64.a -lssp +//#cgo linux,arm LDFLAGS: ${SRCDIR}/lib/libopenh264-linux-armv7.a +//#cgo linux,arm64 LDFLAGS: ${SRCDIR}/lib/libopenh264-linux-arm64.a +//#cgo linux,amd64 LDFLAGS: ${SRCDIR}/lib/libopenh264-linux-x64.a +//#cgo darwin,amd64 LDFLAGS: ${SRCDIR}/lib/libopenh264-darwin-x64.a +//#cgo windows,amd64 LDFLAGS: ${SRCDIR}/lib/libopenh264-windows-x64.a -lssp import "C" diff --git a/pkg/codec/opus/Makefile b/pkg/codec/opus/Makefile new file mode 100644 index 0000000..a9bd8e9 --- /dev/null +++ b/pkg/codec/opus/Makefile @@ -0,0 +1,31 @@ +git_url := https://github.com/xiph/opus.git +version := v1.3.1 +src_root_dir := src +lib_dir := lib +include_dir := include +lib_prefix := libopus +src_dir := $(src_root_dir)/$(MEDIADEVICES_TARGET_PLATFORM) +output_path := $(lib_dir)/$(lib_prefix)-$(MEDIADEVICES_TARGET_PLATFORM).a + +.PHONY: all +all: guard-MEDIADEVICES_TARGET_PLATFORM guard-MEDIADEVICES_TOOLCHAIN_BIN $(output_path) headers + +headers: | $(src_dir) $(include_dir) + @cp $(src_dir)/include/*.h $(include_dir) + +$(output_path): $(src_dir)/$(lib_prefix).a | $(lib_dir) + @cp $< $@ + +$(src_dir)/$(lib_prefix).a: | $(src_dir) + cd $(src_dir) && \ + $(MEDIADEVICES_TOOLCHAIN_BIN) cmake -DOPUS_STACK_PROTECTOR=OFF && \ + $(MEDIADEVICES_TOOLCHAIN_BIN) make + +$(src_dir): | $(src_root_dir) + git clone --depth=1 --branch=$(version) $(git_url) $@ + +$(src_root_dir) $(lib_dir) $(include_dir): + @mkdir -p $@ + +guard-%: + @if [ -z ${$*} ]; then echo "$* is a required environment variable"; exit 1; fi diff --git a/pkg/codec/opus/build.sh b/pkg/codec/opus/build.sh deleted file mode 100755 index 6d95eeb..0000000 --- a/pkg/codec/opus/build.sh +++ /dev/null @@ -1,19 +0,0 @@ -GIT_URL=https://github.com/xiph/opus.git -VERSION=v1.3.1 -SRC_DIR=src -LIB_DIR=lib -INCLUDE_DIR=include -ROOT_DIR=${PWD} -LIB_PREFIX=libopus - -mkdir -p ${LIB_DIR} ${INCLUDE_DIR} - -git clone --depth=1 --branch=${VERSION} ${GIT_URL} ${SRC_DIR} -cd ${SRC_DIR} -${MEDIADEVICES_TOOLCHAIN_BIN} cmake -DOPUS_STACK_PROTECTOR=OFF . -${MEDIADEVICES_TOOLCHAIN_BIN} make -j2 -mv ${LIB_PREFIX}.a ${ROOT_DIR}/${LIB_DIR}/${LIB_PREFIX}_${MEDIADEVICES_TARGET_PLATFORM}.a -mkdir -p ${ROOT_DIR}/${INCLUDE_DIR} -cp include/*.h ${ROOT_DIR}/${INCLUDE_DIR} -git clean -dfx -git reset --hard diff --git a/pkg/codec/opus/lib/libopus_darwin_x64.a b/pkg/codec/opus/lib/libopus-darwin-x64.a similarity index 98% rename from pkg/codec/opus/lib/libopus_darwin_x64.a rename to pkg/codec/opus/lib/libopus-darwin-x64.a index 69e3fca..f981d01 100644 Binary files a/pkg/codec/opus/lib/libopus_darwin_x64.a and b/pkg/codec/opus/lib/libopus-darwin-x64.a differ diff --git a/pkg/codec/opus/lib/libopus_linux_arm64.a b/pkg/codec/opus/lib/libopus-linux-arm64.a similarity index 98% rename from pkg/codec/opus/lib/libopus_linux_arm64.a rename to pkg/codec/opus/lib/libopus-linux-arm64.a index f57d7c3..2fd9cfc 100644 Binary files a/pkg/codec/opus/lib/libopus_linux_arm64.a and b/pkg/codec/opus/lib/libopus-linux-arm64.a differ diff --git a/pkg/codec/opus/lib/libopus-linux-armv7.a b/pkg/codec/opus/lib/libopus-linux-armv7.a new file mode 100644 index 0000000..7fdad3c Binary files /dev/null and b/pkg/codec/opus/lib/libopus-linux-armv7.a differ diff --git a/pkg/codec/opus/lib/libopus_linux_x64.a b/pkg/codec/opus/lib/libopus-linux-x64.a similarity index 100% rename from pkg/codec/opus/lib/libopus_linux_x64.a rename to pkg/codec/opus/lib/libopus-linux-x64.a diff --git a/pkg/codec/opus/lib/libopus_windows_x64.a b/pkg/codec/opus/lib/libopus-windows-x64.a similarity index 100% rename from pkg/codec/opus/lib/libopus_windows_x64.a rename to pkg/codec/opus/lib/libopus-windows-x64.a diff --git a/pkg/codec/opus/lib/libopus_linux_armv7.a b/pkg/codec/opus/lib/libopus_linux_armv7.a deleted file mode 100644 index 13591a0..0000000 Binary files a/pkg/codec/opus/lib/libopus_linux_armv7.a and /dev/null differ diff --git a/pkg/codec/opus/opus_static.go b/pkg/codec/opus/opus_static.go index cf1d809..8ec43ab 100644 --- a/pkg/codec/opus/opus_static.go +++ b/pkg/codec/opus/opus_static.go @@ -4,9 +4,9 @@ package opus //#cgo CFLAGS: -I${SRCDIR}/include //#cgo CXXFLAGS: -I${SRCDIR}/include -//#cgo linux,arm LDFLAGS: ${SRCDIR}/lib/libopus_linux_armv7.a -lm -//#cgo linux,arm64 LDFLAGS: ${SRCDIR}/lib/libopus_linux_arm64.a -lm -//#cgo linux,amd64 LDFLAGS: ${SRCDIR}/lib/libopus_linux_x64.a -lm -//#cgo darwin,amd64 LDFLAGS: ${SRCDIR}/lib/libopus_darwin_x64.a -//#cgo windows,amd64 LDFLAGS: ${SRCDIR}/lib/libopus_windows_x64.a +//#cgo linux,arm LDFLAGS: ${SRCDIR}/lib/libopus-linux-armv7.a -lm +//#cgo linux,arm64 LDFLAGS: ${SRCDIR}/lib/libopus-linux-arm64.a -lm +//#cgo linux,amd64 LDFLAGS: ${SRCDIR}/lib/libopus-linux-x64.a -lm +//#cgo darwin,amd64 LDFLAGS: ${SRCDIR}/lib/libopus-darwin-x64.a +//#cgo windows,amd64 LDFLAGS: ${SRCDIR}/lib/libopus-windows-x64.a import "C"