// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Next MinVersion: 4

module chromeos.media_perception.mojom;

import "mojom/appearances.mojom";
import "mojom/device_management.mojom";
import "mojom/frame_perception.mojom";
import "mojom/hotword_detection.mojom";
import "mojom/occupancy_trigger.mojom";
import "mojom/pipeline.mojom";
import "mojom/presence_perception.mojom";
import "mojom/one_touch_autozoom.mojom";
import "mojom/software_autozoom.mojom";

struct SuccessStatus {
  // Whether or not the action succeeded.
  bool success@0;
  string? failure_reason@1;
};

// Feature or configuration specific functionality belongs in these interfaces.
struct PerceptionInterfaces {
  FramePerceptionHandler&? frame_perception_handler_request@0;
  HotwordDetectionHandler&? hotword_detection_handler_request@1;
  PresencePerceptionHandler&? presence_perception_handler_request@2;
  OccupancyTriggerHandler&? occupancy_trigger_handler_request@3;
  [MinVersion=1] AppearancesHandler&? appearances_handler_request@4;
  [MinVersion=2] OneTouchAutozoomHandler&? one_touch_autozoom_handler_request@5;
  [MinVersion=3] SoftwareAutozoomHandler&? software_autozoom_handler_request@6;
};

interface MediaPerception {
  // Sets up the pipeline configuration to select a desired featureset. Media
  // perception service responds back with the InterfaceType(s) that the client
  // needs to have implemented.
  // Client of the MediaPerception service needs to provide an implemented
  // interface for the requests that are returned.
  SetupConfiguration@0(string configuration_name) =>
	  (SuccessStatus status,
	   PerceptionInterfaces interfaces);

  // Sets template arguments for a specified configuration. Arguments should be
  // passed as a serialized proto that is kept in sync between the MPS and a
  // client.
  SetTemplateArguments@10(
      string configuration_name, array<uint8> serialized_arguments_proto) =>
      (SuccessStatus status);

  // ------------------- Start of device management definitions. -------------

  GetVideoDevices@1() => (array<VideoDevice> devices);

  GetAudioDevices@2() => (array<AudioDevice> devices);

  // Returns a list of template names for devices that can be filled in for
  // a particular configuration.
  GetTemplateDevices@3(string configuration_name) =>
      (array<DeviceTemplate> device_templates);

  SetVideoDeviceForTemplateName@4(
      string configuration_name, string template_name,
      VideoDevice device) => (SuccessStatus status);

  SetAudioDeviceForTemplateName@5(
      string configuration_name, string template_name,
      AudioDevice device) => (SuccessStatus status);

  SetVirtualVideoDeviceForTemplateName@6(
      string configuration_name, string template_name,
      VirtualVideoDevice device) => (SuccessStatus status);

  // ------------------- End of device management definitions. ---------------

  // ------------------- Start of pipeline state definitions. ----------------

  // Get the status of the media perception processing pipeline.
  GetPipelineState@7(string configuration_name) => (PipelineState state);

  // Set the desired state of the media perception pipeline.
  SetPipelineState@8(string configuration_name, PipelineState desired_state)
      => (PipelineState state);

  // Returns the state of all pipelines.
  GetGlobalPipelineState@9() => (GlobalPipelineState state);

  // ------------------- End of pipeline state definitions. ------------------
};
