/*
 * Copyright 2017 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef CAMERA_INCLUDE_CROS_CAMERA_JPEG_COMPRESSOR_H_
#define CAMERA_INCLUDE_CROS_CAMERA_JPEG_COMPRESSOR_H_

#include <cutils/native_handle.h>

#include <memory>

#include "cros-camera/camera_mojo_channel_manager_token.h"
#include "cros-camera/export.h"

namespace cros {

// Interface for YU12 to JPEG compressor.
class CROS_CAMERA_EXPORT JpegCompressor {
 public:
  struct DmaBufPlane {
    int fd;
    int32_t stride;
    uint32_t offset;
    uint32_t size;
  };

  // [Deprecated]
  static std::unique_ptr<JpegCompressor> GetInstance();

  static std::unique_ptr<JpegCompressor> GetInstance(
      CameraMojoChannelManagerToken* token);

  virtual ~JpegCompressor() {}

  // Compresses YU12 image to JPEG format with HW encode acceleration. It would
  // fallback to SW encode if HW encode fails by default.
  // |quality| is the resulted jpeg image quality. It ranges from 1
  // (poorest quality) to 100 (highest quality).
  // |app1_buffer| is the buffer of APP1 segment (exif) which will be added to
  // the compressed image. Caller should pass the size of output buffer to
  // |out_buffer_size|. Encoded result will be written into |output_buffer|.
  // The actually encoded size will be written into |out_data_size| if image
  // encoded successfully. Returns false if errors occur during compression.
  // |enable_hw_encode| controls the HW/SW encode selection strategy.
  // true - Do HW encode first; falls back to SW encode after failing.
  // false - Don't do HW encode; use SW encode directly.
  virtual bool CompressImage(const void* image,
                             int width,
                             int height,
                             int quality,
                             const void* app1_buffer,
                             uint32_t app1_size,
                             uint32_t out_buffer_size,
                             void* out_buffer,
                             uint32_t* out_data_size,
                             bool enable_hw_encode = true) = 0;

  // Compresses YUV image to JPEG format via buffer handles.
  // |quality| is the resulted jpeg image quality. It ranges from 1
  // (poorest quality) to 100 (highest quality).
  // |app1_buffer| is the buffer of APP1 segment (exif) which will be added to
  // the compressed image.
  // For hardware encoding, it encodes |input| to |output| through DMA-buf. If
  // it fallbacks to software encoding, it maps the |input_handle| and
  // |output_handle| to user space. The actually encoded size will be written
  // into |out_data_size| if image encoded successfully. Returns false if errors
  // occur during compression. |enable_hw_encode| controls the HW/SW encode
  // selection strategy.
  // true - Do HW encode first; falls back to SW encode after failing.
  // false - Don't do HW encode; use SW encode directly.
  virtual bool CompressImageFromHandle(buffer_handle_t input,
                                       buffer_handle_t output,
                                       int width,
                                       int height,
                                       int quality,
                                       const void* app1_ptr,
                                       uint32_t app1_size,
                                       uint32_t* out_data_size,
                                       bool enable_hw_encode = true) = 0;

  // Compresses YUV image to JPEG format via pointers to buffer memory.
  // |quality| is the resulted jpeg image quality. It ranges from 1
  // (poorest quality) to 100 (highest quality).
  // |app1_buffer| is the buffer of APP1 segment (exif) which will be added to
  // the compressed image.
  // It is only used for software encoding, which encodes |input| to |output|.
  // The input buffer has format |input_format| and no paddings between image
  // rows and planes. The size of the output JPEG buffer is
  // |output_buffer_size|.
  // The actually encoded size will be written into |out_data_size| if image
  // encoded successfully. Returns false if errors
  // occur during compression.
  virtual bool CompressImageFromMemory(void* input,
                                       uint32_t input_format,
                                       void* output,
                                       int output_buffer_size,
                                       int width,
                                       int height,
                                       int quality,
                                       const void* app1_ptr,
                                       uint32_t app1_size,
                                       uint32_t* out_data_size) = 0;

  // Compresses YU12 image to JPEG format. |quality| is the resulted jpeg
  // image quality. It ranges from 1 (poorest quality) to 100 (highest quality).
  // Caller should pass the size of output buffer to |out_buffer_size|. Encoded
  // result will be written into |output_buffer|. The actually encoded size will
  // be written into |out_data_size| if image encoded successfully. Returns
  // false if errors occur during compression.
  virtual bool GenerateThumbnail(const void* image,
                                 int image_width,
                                 int image_height,
                                 int thumbnail_width,
                                 int thumbnail_height,
                                 int quality,
                                 uint32_t out_buffer_size,
                                 void* out_buffer,
                                 uint32_t* out_data_size) = 0;
};

}  // namespace cros

#endif  // CAMERA_INCLUDE_CROS_CAMERA_JPEG_COMPRESSOR_H_
