private void setEuclideanDistance(WebSocketSession session, JsonObject jsonObject) {
    try {
      int euc_dis = jsonObject.get("val").getAsInt();

      if (null != face) face.euclideanDistance(euc_dis);

    } catch (Throwable t) {
      error(session, t.getClass().getSimpleName() + ": " + t.getMessage());
    }
  }
  private void setTrackThreshold(WebSocketSession session, JsonObject jsonObject) {
    try {
      int track_thres = jsonObject.get("val").getAsInt();

      if (null != face) face.trackThreshold(track_thres);

    } catch (Throwable t) {
      error(session, t.getClass().getSimpleName() + ": " + t.getMessage());
    }
  }
  private void setScaleFactor(WebSocketSession session, JsonObject jsonObject) {

    try {
      int scale = jsonObject.get("val").getAsInt();

      if (null != face) face.multiScaleFactor(scale);

    } catch (Throwable t) {
      error(session, t.getClass().getSimpleName() + ": " + t.getMessage());
    }
  }
  private void setWidthToProcess(WebSocketSession session, JsonObject jsonObject) {

    try {
      int width = jsonObject.get("val").getAsInt();

      if (null != face) {
        face.widthToProcess(width);
      }
    } catch (Throwable t) {
      error(session, t.getClass().getSimpleName() + ": " + t.getMessage());
    }
  }
  private void setVisualization(WebSocketSession session, JsonObject jsonObject) {

    try {

      visualizeFace = jsonObject.get("val").getAsInt();

      if (null != face) face.showFaces(visualizeFace);

    } catch (Throwable t) {
      error(session, t.getClass().getSimpleName() + ": " + t.getMessage());
    }
  }
  private void setProcessNumberFrames(WebSocketSession session, JsonObject jsonObject) {

    try {
      int num_img = jsonObject.get("val").getAsInt();

      if (null != face) {
        log.debug("Sending process num frames...." + num_img);
        face.processXevery4Frames(num_img);
      }

    } catch (Throwable t) {
      error(session, t.getClass().getSimpleName() + ": " + t.getMessage());
    }
  }
  private void start(final WebSocketSession session, JsonObject jsonMessage) {
    try {

      String sessionId = session.getId();
      UserSession user = new UserSession(sessionId);
      users.put(sessionId, user);
      webRtcEndpoint = user.getWebRtcEndpoint();

      // Ice Candidate
      webRtcEndpoint.addOnIceCandidateListener(
          new EventListener<OnIceCandidateEvent>() {
            @Override
            public void onEvent(OnIceCandidateEvent event) {
              JsonObject response = new JsonObject();
              response.addProperty("id", "iceCandidate");
              response.add("candidate", JsonUtils.toJsonObject(event.getCandidate()));
              sendMessage(session, new TextMessage(response.toString()));
            }
          });

      face = new NuboFaceDetector.Builder(user.getMediaPipeline()).build();
      face.activateServerEvents(1, 3000);
      addFaceListener();

      webRtcEndpoint.connect(face);
      face.connect(webRtcEndpoint);

      // SDP negotiation (offer and answer)
      String sdpOffer = jsonMessage.get("sdpOffer").getAsString();
      String sdpAnswer = webRtcEndpoint.processOffer(sdpOffer);

      // Sending response back to client
      JsonObject response = new JsonObject();
      response.addProperty("id", "startResponse");
      response.addProperty("sdpAnswer", sdpAnswer);

      synchronized (session) {
        sendMessage(session, new TextMessage(response.toString()));
      }
      webRtcEndpoint.gatherCandidates();

    } catch (NotEnoughResourcesException e) {
      log.warn("Not enough resources", e);
      notEnoughResources(session);
    } catch (Throwable t) {
      log.error("Exception starting session", t);
      error(session, t.getClass().getSimpleName() + ": " + t.getMessage());
    }
  }