macosx: add build option for macosx
Gitlab: #18
Change-Id: I1372c1881b894fd0cde76f5ad94067bd22192315
diff --git a/GreenScreen/build.sh b/GreenScreen/build.sh
index a04f9e9..5118613 100755
--- a/GreenScreen/build.sh
+++ b/GreenScreen/build.sh
@@ -2,7 +2,7 @@
# Build the plugin for the project
set -e
export OSTYPE
-ARCH=$(arch)
+ARCH=$(uname -m)
EXTRAPATH=''
# Flags:
@@ -27,6 +27,20 @@
PLUGINS_LIB="../lib"
LIBS_DIR="./../contrib/Libs"
PREFERENCESFILENAME="preferences"
+PLATFORM=$(uname)
+
+if [ "${PLATFORM}" = "Linux" ]; then
+ PLATFORM="linux-gnu"
+ CONTRIB_PLATFORM_CURT=${ARCH}
+ echo "Building with ${PLATFORM}"
+elif [ "${PLATFORM}" = "Darwin" ]; then
+ PLATFORM="darwin"
+ SO_FILE_NAME="lib${PLUGIN_NAME}.dylib"
+ alias nproc='sysctl -n hw.logicalcpu'
+ CONTRIB_PLATFORM_CURT=${ARCH}-apple
+ CONTRIB_PLATFORM_EXTRA=$(uname -r)
+ echo "Building with ${PLATFORM}"
+fi
if [ "${PROCESSOR}" = "CPU" ]; then
ONNX_LIBS="cpu"
@@ -36,8 +50,6 @@
PREFERENCESFILENAME="${PREFERENCESFILENAME}-accel"
fi
-PLATFORM="linux-gnu"
-
while getopts t:c:p OPT; do
case "$OPT" in
t)
@@ -58,7 +70,7 @@
cp -r ffmpeg ${CONTRIB_PATH}/src/
-if [ "${PLATFORM}" = "linux-gnu" ]
+if [ "${PLATFORM}" = "linux-gnu" ] || [ "${PLATFORM}" = "redhat-linux" ]
then
if [ -f "${CONTRIB_PATH}/native/.ffmpeg" ]; then
rm "${CONTRIB_PATH}/native/.ffmpeg"
@@ -68,9 +80,9 @@
make .ffmpeg -j$(nproc)
rm .ffmpeg
cd ${WORKPATH}
+
python3 ./../SDK/jplManipulation.py --preassemble --plugin=${PLUGIN_NAME}
- CONTRIB_PLATFORM_CURT=${ARCH}
CONTRIB_PLATFORM=${CONTRIB_PLATFORM_CURT}-${PLATFORM}
ONNX_PATH=${EXTRALIBS_PATH}
if [ -z "${EXTRALIBS_PATH}" ]
@@ -117,7 +129,6 @@
-lonnxruntime \
-o "build-local/jpl/lib/${CONTRIB_PLATFORM}/${SO_FILE_NAME}"
-
cp "${ONNX_PATH}/lib/onnxruntime/${ONNX_LIBS}/libonnxruntime.so" "build-local/jpl/lib/$CONTRIB_PLATFORM/libonnxruntime.so.1.6.0"
if [ "${PROCESSOR}" = "NVIDIA" ]
then
@@ -134,6 +145,90 @@
cp "./modelSRC/mModel.onnx" "./build-local/jpl/data/model/mModel.onnx"
cp "./${PREFERENCESFILENAME}.json" "./build-local/jpl/data/preferences.json"
+elif [ "${PLATFORM}" = "darwin" ]
+then
+ if [ -f "${CONTRIB_PATH}/native/.ffmpeg" ]; then
+ rm "${CONTRIB_PATH}/native/.ffmpeg"
+ fi
+ WORKPATH=$(pwd)
+ cd "${CONTRIB_PATH}/native/"
+ make .ffmpeg -j$(nproc)
+ rm .ffmpeg
+ cd ${WORKPATH}
+
+ python3 ./../SDK/jplManipulation.py --preassemble --plugin=${PLUGIN_NAME}
+
+ CONTRIB_PLATFORM=${CONTRIB_PLATFORM_CURT}-${PLATFORM}
+ ONNX_PATH=${EXTRALIBS_PATH}
+ if [ -z "${EXTRALIBS_PATH}" ]
+ then
+ ONNX_PATH="${CONTRIB_PATH}/${CONTRIB_PLATFORM}${CONTRIB_PLATFORM_EXTRA}"
+ fi
+
+ # Compile
+ clang++ -std=c++17 -shared -fPIC \
+ -Wl,-no_compact_unwind -Wl,-framework,CoreFoundation \
+ -Wl,-framework,Security -Wl,-framework,VideoToolbox \
+ -Wl,-framework,CoreMedia -Wl,-framework,CoreVideo \
+ -Wl,-framework,OpenCl -Wl,-framework,Accelerate \
+ -Wl,-rpath,"\${ORIGIN}" \
+ -Wall -Wextra \
+ -Wno-unused-variable \
+ -Wno-unused-function \
+ -Wno-unused-parameter \
+ -D${PROCESSOR} \
+ -I"." \
+ -I"${DAEMON_SRC}" \
+ -I"${CONTRIB_PATH}/${CONTRIB_PLATFORM}${CONTRIB_PLATFORM_EXTRA}/include" \
+ -I"${CONTRIB_PATH}/${CONTRIB_PLATFORM}${CONTRIB_PLATFORM_EXTRA}/include/opencv4" \
+ -I"${ONNX_PATH}/include/onnxruntime/session" \
+ -I"${PLUGINS_LIB}" \
+ ./../lib/accel.cpp \
+ ./../lib/frameUtils.cpp \
+ ./../lib/frameFilter.cpp \
+ main.cpp \
+ videoSubscriber.cpp \
+ pluginMediaHandler.cpp \
+ pluginProcessor.cpp \
+ -L"${CONTRIB_PATH}/${CONTRIB_PLATFORM}${CONTRIB_PLATFORM_EXTRA}/lib/" \
+ -L"${CONTRIB_PATH}/${CONTRIB_PLATFORM}${CONTRIB_PLATFORM_EXTRA}/lib/opencv4/3rdparty/" \
+ -L"${ONNX_PATH}/lib/onnxruntime/${ONNX_LIBS}" \
+ -lavfilter \
+ -lswscale \
+ -lavformat \
+ -lavcodec \
+ -lavutil \
+ -lvpx -lx264 -lbz2 -liconv -lz \
+ -lopencv_imgproc \
+ -lopencv_core \
+ -lonnxruntime \
+ "/usr/local/opt/speex/lib/libspeex.a" \
+ "/usr/local/opt/opus/lib/libopus.a" \
+ -o "build-local/jpl/lib/${CONTRIB_PLATFORM}/${SO_FILE_NAME}"
+
+ cp "${ONNX_PATH}/lib/onnxruntime/${ONNX_LIBS}/libonnxruntime.dylib" "build-local/jpl/lib/${CONTRIB_PLATFORM}/libonnxruntime.dylib"
+ install_name_tool -id "@loader_path/libonnxruntime.1.6.0.dylib" "build-local/jpl/lib/${CONTRIB_PLATFORM}/libonnxruntime.dylib"
+ install_name_tool -id "@loader_path/${SO_FILE_NAME}" "build-local/jpl/lib/${CONTRIB_PLATFORM}/${SO_FILE_NAME}"
+ install_name_tool -change "@rpath/libonnxruntime.1.6.0.dylib" "@loader_path/libonnxruntime.dylib" "build-local/jpl/lib/${CONTRIB_PLATFORM}/${SO_FILE_NAME}"
+
+ mkdir "./build-local/jpl/data/model"
+ cp "./modelSRC/mModel.onnx" "./build-local/jpl/data/model/mModel.onnx"
+ cp "./${PREFERENCESFILENAME}.json" "./build-local/jpl/data/preferences.json"
+
+ if [ -n "${APPLE_SIGN_CERTIFICATE}" ]; then
+ codesign --force --verify --timestamp -o runtime --sign "${APPLE_SIGN_CERTIFICATE}" "build-local/jpl/lib/${CONTRIB_PLATFORM}/libonnxruntime.dylib"
+ codesign --force --verify --timestamp -o runtime --sign "${APPLE_SIGN_CERTIFICATE}" "build-local/jpl/lib/${CONTRIB_PLATFORM}/${SO_FILE_NAME}"
+ ditto -c -k --rsrc "build-local/jpl/lib/${CONTRIB_PLATFORM}/libonnxruntime.dylib" "build-local/libonnxruntime.dylib.zip"
+ LIBRARYNAME=libonnxruntime.dylib sh ./../notarize.sh
+ ditto -x -k "build-local/libonnxruntime.dylib.zip" "build-local/notarized0"
+ cp "build-local/notarized0/libonnxruntime.dylib" "build-local/jpl/lib/${CONTRIB_PLATFORM}/libonnxruntime.dylib"
+
+ ditto -c -k --rsrc "build-local/jpl/lib/${CONTRIB_PLATFORM}/${SO_FILE_NAME}" "build-local/${SO_FILE_NAME}.zip"
+ LIBRARYNAME=${SO_FILE_NAME} sh ./../notarize.sh
+ ditto -x -k "build-local/${SO_FILE_NAME}.zip" "build-local/notarized1"
+ cp "build-local/notarized1/${SO_FILE_NAME}" "build-local/jpl/lib/${CONTRIB_PLATFORM}/${SO_FILE_NAME}"
+ fi
+
elif [ "${PLATFORM}" = "android" ]
then
python3 ./../SDK/jplManipulation.py --preassemble --plugin=${PLUGIN_NAME} --distribution=${PLATFORM}
diff --git a/GreenScreen/pluginProcessor.cpp b/GreenScreen/pluginProcessor.cpp
index ff4955b..1337f6f 100644
--- a/GreenScreen/pluginProcessor.cpp
+++ b/GreenScreen/pluginProcessor.cpp
@@ -242,7 +242,7 @@
cv::Mat roiMaskImg = previousMasks_[0].clone() * 255.;
roiMaskImg.convertTo(roiMaskImg, CV_8UC1);
- gsFrame maskFrame = {av_frame_alloc(), frameFree};
+ uniqueFramePtr maskFrame = {av_frame_alloc(), frameFree};
maskFrame->format = AV_PIX_FMT_GRAY8;
maskFrame->width = roiMaskImg.cols;
maskFrame->height = roiMaskImg.rows;
diff --git a/GreenScreen/pluginProcessor.h b/GreenScreen/pluginProcessor.h
index 36eaa78..aec78eb 100644
--- a/GreenScreen/pluginProcessor.h
+++ b/GreenScreen/pluginProcessor.h
@@ -46,8 +46,6 @@
namespace jami {
-using gsFrame = std::unique_ptr<AVFrame, decltype(&frameFree)>;
-
static const char* modelInputNames[8] = {"image:0"};
static const char* modelOutputNames[11] = {"Identity:0"};
diff --git a/GreenScreen/videoSubscriber.cpp b/GreenScreen/videoSubscriber.cpp
index 92147c8..25e6ce4 100644
--- a/GreenScreen/videoSubscriber.cpp
+++ b/GreenScreen/videoSubscriber.cpp
@@ -24,6 +24,7 @@
extern "C" {
#include <libavutil/display.h>
}
+#include <frameScaler.h>
#include <accel.h>
#include <mediaStream.h>
#include <pluglog.h>
@@ -89,7 +90,8 @@
//======================================================================================
// GET RAW FRAME
- gsFrame rgbFrame = {transferToMainMemory(pluginFrame, AV_PIX_FMT_NV12), frameFree};
+ uniqueFramePtr rgbFrame = {transferToMainMemory(pluginFrame, AV_PIX_FMT_NV12), frameFree};
+ rgbFrame.reset(FrameScaler::convertFormat(rgbFrame.get(), AV_PIX_FMT_YUV420P));
if (!rgbFrame.get())
return;
rgbFrame->pts = 1;
@@ -133,6 +135,7 @@
pluginProcessor.drawMaskOnFrame(rgbFrame.get(), filteredFrame, angle_);
frameFree(filteredFrame);
+ rgbFrame.reset(FrameScaler::convertFormat(rgbFrame.get(), AV_PIX_FMT_YUV420P));
moveFrom(pluginFrame, rgbFrame.get());
}
diff --git a/GreenScreen/videoSubscriber.h b/GreenScreen/videoSubscriber.h
index 9841ec7..df7edd3 100644
--- a/GreenScreen/videoSubscriber.h
+++ b/GreenScreen/videoSubscriber.h
@@ -54,7 +54,7 @@
// Observer pattern
Observable<AVFrame*>* observable_ {};
int angle_ {0};
- gsFrame inputFrame_ = {av_frame_alloc(), frameFree};
+ uniqueFramePtr inputFrame_ = {av_frame_alloc(), frameFree};
FrameFilter inputFilter_;
std::string inputFilterDescription_;