#!/bin/bash
# Copyright 2020 The MediaPipe Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# =========================================================================
#
# Script to build/run all MediaPipe desktop example apps (with webcam input).
#
# To build and run all apps and store them in out_dir:
#   $ ./build_desktop_examples.sh -d out_dir
#   Omitting -d and the associated directory saves all generated apps in the
#   current directory.
# To build all apps and store them in out_dir:
#   $ ./build_desktop_examples.sh -d out_dir -b
#   Omitting -d and the associated directory saves all generated apps in the
#   current directory.
# To run all apps already stored in out_dir:
#   $ ./build_desktop_examples.sh -d out_dir -r
#   Omitting -d and the associated directory assumes all apps are in the current
#   directory.

set -e

out_dir="."
build_only=false
run_only=false
app_dir="mediapipe/examples/desktop"
bin_dir="bazel-bin"
declare -a default_bazel_flags=(build -c opt --define MEDIAPIPE_DISABLE_GPU=1)

while [[ -n $1 ]]; do
  case $1 in
    -d)
      shift
      out_dir=$1
      ;;
    -b)
      build_only=true
      ;;
    -r)
      run_only=true
      ;;
    *)
      echo "Unsupported input argument $1."
      exit 1
      ;;
  esac
  shift
done

echo "app_dir: $app_dir"
echo "out_dir: $out_dir"

declare -a bazel_flags

apps="${app_dir}/*"
for app in ${apps}; do
  if [[ -d "${app}" ]]; then
    target_name=${app##*/}
    if [[ "${target_name}" == "autoflip" ||
          "${target_name}" == "hello_world" ||
          "${target_name}" == "media_sequence" ||
          "${target_name}" == "object_detection_3d" ||
          "${target_name}" == "template_matching" ||
          "${target_name}" == "youtube8m" ]]; then
      continue
    fi
    target="${app}:${target_name}_cpu"

    echo "=== Target: ${target}"

    if [[ $run_only == false ]]; then
      bazel_flags=("${default_bazel_flags[@]}")
      bazel_flags+=(${target})

      bazelisk "${bazel_flags[@]}"
      cp -f "${bin_dir}/${app}/"*"_cpu" "${out_dir}"
    fi
    if [[ $build_only == false ]]; then
      if  [[ ${target_name} == "object_tracking" ]]; then
        graph_name="tracking/object_detection_tracking"
      elif [[ ${target_name} == "upper_body_pose_tracking" ]]; then
        graph_name="pose_tracking/upper_body_pose_tracking"
      else
        graph_name="${target_name}/${target_name}"
      fi
      if [[ ${target_name} == "holistic_tracking" ||
            ${target_name} == "iris_tracking" ||
            ${target_name} == "pose_tracking" ||
            ${target_name} == "selfie_segmentation" ||
            ${target_name} == "upper_body_pose_tracking" ]]; then
        graph_suffix="cpu"
      else
        graph_suffix="desktop_live"
      fi
      GLOG_logtostderr=1 "${out_dir}/${target_name}_cpu" \
        --calculator_graph_config_file=mediapipe/graphs/"${graph_name}_${graph_suffix}.pbtxt"
    fi
  fi
done
