/*
 * Copyright (C) 2019 MediaTek Inc.
 *
 * 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.
 */

#ifndef CAMERA_HAL_MEDIATEK_MTKCAM_PIPELINE_MODEL_UTILS_INCLUDE_IMPL_PIPELINECONTEXTBUILDER_H_
#define CAMERA_HAL_MEDIATEK_MTKCAM_PIPELINE_MODEL_UTILS_INCLUDE_IMPL_PIPELINECONTEXTBUILDER_H_

#include <mtkcam/pipeline/pipeline/PipelineContext.h>

#include <impl/types.h>

#include <memory>
#include <string>
#include <vector>

/******************************************************************************
 *
 ******************************************************************************/
namespace NSCam {
namespace v3 {
namespace pipeline {
namespace model {

/**
 * Used on the call buildPipelineContext().
 */
struct BuildPipelineContextInputParams {
  std::string pipelineName;

  /**
   * Pipeline static info. and user configuration given at the configuration
   * stage.
   */
  PipelineStaticInfo const* pPipelineStaticInfo = nullptr;
  PipelineUserConfiguration const* pPipelineUserConfiguration = nullptr;

  /**
   * Non-P1-specific stream info configuration.
   */
  ParsedStreamInfo_NonP1 const* pParsedStreamInfo_NonP1 = nullptr;

  /**
   * P1-specific stream info configuration.
   */
  std::vector<ParsedStreamInfo_P1> const* pvParsedStreamInfo_P1 = nullptr;

  /**
   *  Replaced provider of P1 for ZSL streambuffer acquisition.
   */
  std::shared_ptr<Utils::IStreamBufferProvider> pZSLProvider = nullptr;

  /**
   * The sensor settings.
   */
  std::vector<SensorSetting> const* pvSensorSetting = nullptr;

  /**
   * P1 hardware settings.
   */
  std::vector<P1HwSetting> const* pvP1HwSetting = nullptr;

  /**
   * It indicates which pipeline nodes are needed.
   */
  PipelineNodesNeed const* pPipelineNodesNeed = nullptr;

  /**
   * The streaming feature settings.
   */
  StreamingFeatureSetting const* pStreamingFeatureSetting = nullptr;

  /**
   * The capture feature settings.
   */
  CaptureFeatureSetting const* pCaptureFeatureSetting = nullptr;

  /**
   * Batch size
   *
   * A batch size is a divisor of fps / 30. For example, if fps is 300, a batch
   * size could only be one of only be 1, 2, 5, or 10.
   *
   * See static_android.control.availableHighSpeedVideoConfigurations under
   * https://android.googlesource.com/platform/system/media/+/master/camera/docs/docs.html
   */
  uint32_t batchSize = 0;

  /**
   * Old pipeline context.
   *
   * Passing 'nullptr' indicates no old pipeline context.
   * Callers must make sure "pOldPipelineContext" and "out" are different
   * instances.
   */
  std::shared_ptr<NSPipelineContext::PipelineContext> const pOldPipelineContext;

  std::shared_ptr<NSPipelineContext::IDataCallback> const pDataCallback =
      nullptr;

  /**
   * using multi-thread to init/config each node.
   */
  bool bUsingMultiThreadToBuildPipelineContext = true;
  bool bIsReconfigure = false;
};

/**
 * Generate a new pipeline context.
 *
 * @param[out] out: a new-created pipeline context.
 *
 * @param[in] in: input parameters.
 *
 * @return
 *      0 indicates success; otherwise failure.
 */
auto VISIBILITY_PUBLIC
buildPipelineContext(std::shared_ptr<NSPipelineContext::PipelineContext>* out,
                     BuildPipelineContextInputParams const& in) -> int;

/******************************************************************************
 *
 ******************************************************************************/
};      // namespace model
};      // namespace pipeline
};      // namespace v3
};      // namespace NSCam
#endif  // CAMERA_HAL_MEDIATEK_MTKCAM_PIPELINE_MODEL_UTILS_INCLUDE_IMPL_PIPELINECONTEXTBUILDER_H_
