text: /* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions are
   * met:
   *     * Redistributions of source code must retain the above copyright
   *       notice, this list of conditions and the following disclaimer.
   *     * Redistributions in binary form must reproduce the above
   *       copyright notice, this list of conditions and the following
   *       disclaimer in the documentation and/or other materials provided
   *       with the distribution.
   *     * Neither the name of The Linux Foundation nor the names of its
   *       contributors may be used to endorse or promote products derived
   *       from this software without specific prior written permission.
   *
   * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
   * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
   * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
   * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
   * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
   * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
   * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   *
   */
  
  #ifndef MM_LIB2D_H_
  #define MM_LIB2D_H_
  
  #include "cam_types.h"
  #ifdef QCAMERA_REDEFINE_LOG
  #ifndef CAM_MODULE
  #define CAM_MODULE CAM_NO_MODULE
  #endif
  // Camera dependencies
  #include "mm_camera_dbg.h"
  #endif
  
  /** lib2d_error
   * @MM_LIB2D_SUCCESS: Success
   * @MM_LIB2D_ERR_GENERAL: General Error
   * @MM_LIB2D_ERR_MEMORY: Insufficient memory error
   * @MM_LIB2D_ERR_BAD_PARAM: Bad params error
  **/
  typedef enum lib2d_error_t {
    MM_LIB2D_SUCCESS,
    MM_LIB2D_ERR_GENERAL,
    MM_LIB2D_ERR_MEMORY,
    MM_LIB2D_ERR_BAD_PARAM,
  } lib2d_error;
  
  /** lib2d_mode
   * @MM_LIB2D_SYNC_MODE: Synchronous mode
   * @MM_LIB2D_ASYNC_MODE: Asynchronous mode
  **/
  typedef enum mm_lib2d_mode_t {
    MM_LIB2D_SYNC_MODE,
    MM_LIB2D_ASYNC_MODE,
  } lib2d_mode;
  
  /** mm_lib2d_buffer_type
   * @MM_LIB2D_BUFFER_TYPE_RGB: RGB Buffer type
   * @MM_LIB2D_BUFFER_TYPE_YUV: YUV buffer type
  **/
  typedef enum mm_lib2d_buffer_type_t {
    MM_LIB2D_BUFFER_TYPE_RGB,
    MM_LIB2D_BUFFER_TYPE_YUV,
  } mm_lib2d_buffer_type;
  
  /** mm_lib2d_rgb_buffer
   * @fd: handle to the buffer memory
   * @format: RGB color format
   * @width: defines width in pixels
   * @height: defines height in pixels
   * @buffer: pointer to the RGB buffer
   * @phys: gpu mapped physical address
   * @stride: defines stride in bytes
  **/
  typedef struct mm_lib2d_rgb_buffer_t {
    int32_t      fd;
    cam_format_t format;
    uint32_t     width;
    uint32_t     height;
    void        *buffer;
    void        *phys;
    int32_t      stride;
  } mm_lib2d_rgb_buffer;
  
  /** mm_lib2d_yuv_buffer
   * @fd: handle to the buffer memory
   * @format: YUV color format
   * @width: defines width in pixels
   * @height: defines height in pixels
   * @plane0: holds the whole buffer if YUV format is not planar
   * @phys0: gpu mapped physical address
   * @stride0: stride in bytes
   * @plane1: holds UV or VU plane for planar interleaved
   * @phys2: gpu mapped physical address
   * @stride1: stride in bytes
   * @plane2: holds the 3. plane, ignored if YUV format is not planar
   * @phys2: gpu mapped physical address
   * @stride2: stride in bytes
  **/
  typedef struct mm_lib2d_yuv_buffer_t {
    int32_t      fd;
    cam_format_t format;
    uint32_t     width;
    uint32_t     height;
    void        *plane0;
    void        *phys0;
    int32_t      stride0;
    void        *plane1;
    void        *phys1;
    int32_t      stride1;
    void        *plane2;
    void        *phys2;
    int32_t      stride2;
  } mm_lib2d_yuv_buffer;
  
  /** mm_lib2d_buffer
   * @buffer_type: Buffer type. whether RGB or YUV
   * @rgb_buffer: RGB buffer handle
   * @yuv_buffer: YUV buffer handle
  **/
  typedef struct mm_lib2d_buffer_t {
    mm_lib2d_buffer_type buffer_type;
    union {
      mm_lib2d_rgb_buffer rgb_buffer;
      mm_lib2d_yuv_buffer yuv_buffer;
    };
  } mm_lib2d_buffer;
  
  /** lib2d_client_cb
   * @userdata: App userdata
   * @jobid: job id
  **/
  typedef lib2d_error (*lib2d_client_cb) (void *userdata, int jobid);
  
  /**
   * Function: mm_lib2d_init
   *
   * Description: Initialization function for Lib2D. src_format, dst_format
   *     are hints to the underlying component to initialize.
   *
   * Input parameters:
   *   mode - Mode (sync/async) in which App wants lib2d to run.
   *   src_format - source surface format
   *   dst_format - Destination surface format
   *   my_obj - handle that will be returned on succesful Init. App has to
   *       call other lib2d functions by passing this handle.
   *
   * Return values:
   *   MM_LIB2D_SUCCESS
   *   MM_LIB2D_ERR_MEMORY
   *   MM_LIB2D_ERR_BAD_PARAM
   *   MM_LIB2D_ERR_GENERAL
   *
   * Notes: none
   **/
  lib2d_error mm_lib2d_init(lib2d_mode mode, cam_format_t src_format,
    cam_format_t dst_format, void **lib2d_obj_handle);
  
  /**
   * Function: mm_lib2d_deinit
   *
   * Description: De-Initialization function for Lib2D
   *
   * Input parameters:
   *   lib2d_obj_handle - handle tto the lib2d object
   *
   * Return values:
   *   MM_LIB2D_SUCCESS
   *   MM_LIB2D_ERR_GENERAL
   *
   * Notes: none
   **/
  lib2d_error mm_lib2d_deinit(void *lib2d_obj_handle);
  
  /**
   * Function: mm_lib2d_start_job
   *
   * Description: Start executing the job
   *
   * Input parameters:
   *   lib2d_obj_handle - handle tto the lib2d object
   *   src_buffer - pointer to the source buffer
   *   dst_buffer - pointer to the destination buffer
   *   jobid - job id of this request
   *   userdata - userdata that will be pass through callback function
   *   cb - callback function that will be called on completion of this job
   *   rotation - rotation to be applied
   *
   * Return values:
   *   MM_LIB2D_SUCCESS
   *   MM_LIB2D_ERR_MEMORY
   *   MM_LIB2D_ERR_GENERAL
   *
   * Notes: none
   **/
  lib2d_error mm_lib2d_start_job(void *lib2d_obj_handle,
      mm_lib2d_buffer* src_buffer, mm_lib2d_buffer* dst_buffer,
      int jobid, void *userdata, lib2d_client_cb cb, uint32_t rotation);
  
  #endif /* MM_LIB2D_H_ */
  
  
  