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_;