439 lines
12 KiB
C
439 lines
12 KiB
C
/* Copyright (c) 2012-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_JPEG_INTERFACE_H_
|
|
#define MM_JPEG_INTERFACE_H_
|
|
|
|
// System dependencies
|
|
#include <stdbool.h>
|
|
|
|
// Camera dependencies
|
|
#include "QOMX_JpegExtensions.h"
|
|
#include "cam_intf.h"
|
|
|
|
#define MM_JPEG_MAX_PLANES 3
|
|
#define MM_JPEG_MAX_BUF CAM_MAX_NUM_BUFS_PER_STREAM
|
|
#define QUANT_SIZE 64
|
|
#define QTABLE_MAX 2
|
|
#define MM_JPEG_MAX_MPO_IMAGES 3
|
|
|
|
/* bit mask for buffer usage*/
|
|
#define MM_JPEG_HAS_READ_BUF CPU_HAS_READ
|
|
#define MM_JPEG_HAS_WRITTEN_BUF CPU_HAS_WRITTEN
|
|
|
|
typedef enum {
|
|
MM_JPEG_FMT_YUV,
|
|
MM_JPEG_FMT_BITSTREAM
|
|
} mm_jpeg_format_t;
|
|
|
|
typedef enum {
|
|
MM_JPEG_TYPE_JPEG,
|
|
MM_JPEG_TYPE_MPO
|
|
} mm_jpeg_image_type_t;
|
|
|
|
typedef struct {
|
|
cam_ae_exif_debug_t ae_debug_params;
|
|
cam_awb_exif_debug_t awb_debug_params;
|
|
cam_af_exif_debug_t af_debug_params;
|
|
cam_asd_exif_debug_t asd_debug_params;
|
|
cam_stats_buffer_exif_debug_t stats_debug_params;
|
|
cam_bestats_buffer_exif_debug_t bestats_debug_params;
|
|
cam_bhist_buffer_exif_debug_t bhist_debug_params;
|
|
cam_q3a_tuning_info_t q3a_tuning_debug_params;
|
|
uint8_t ae_debug_params_valid;
|
|
uint8_t awb_debug_params_valid;
|
|
uint8_t af_debug_params_valid;
|
|
uint8_t asd_debug_params_valid;
|
|
uint8_t stats_debug_params_valid;
|
|
uint8_t bestats_debug_params_valid;
|
|
uint8_t bhist_debug_params_valid;
|
|
uint8_t q3a_tuning_debug_params_valid;
|
|
} mm_jpeg_debug_exif_params_t;
|
|
|
|
typedef struct {
|
|
cam_3a_params_t cam_3a_params;
|
|
uint8_t cam_3a_params_valid;
|
|
cam_sensor_params_t sensor_params;
|
|
mm_jpeg_debug_exif_params_t *debug_params;
|
|
} mm_jpeg_exif_params_t;
|
|
|
|
typedef struct {
|
|
/* Indicates if it is a single jpeg or part of a multi picture sequence */
|
|
mm_jpeg_image_type_t type;
|
|
|
|
/* Indicates if image is the primary image in a sequence of images.
|
|
Applicable only to multi picture formats */
|
|
uint8_t is_primary;
|
|
|
|
/* Number of images in the sequence */
|
|
uint32_t num_of_images;
|
|
|
|
/* Flag to indicate if multi picture metadata need to be added to Exif */
|
|
uint8_t enable_metadata;
|
|
} mm_jpeg_multi_image_t;
|
|
|
|
typedef struct {
|
|
uint32_t sequence; /* for jpeg bit streams, assembling is based on sequence. sequence starts from 0 */
|
|
uint8_t *buf_vaddr; /* ptr to buf */
|
|
int fd; /* fd of buf */
|
|
size_t buf_size; /* total size of buf (header + image) */
|
|
mm_jpeg_format_t format; /* buffer format*/
|
|
cam_frame_len_offset_t offset; /* offset of all the planes */
|
|
uint32_t index; /* index used to identify the buffers */
|
|
} mm_jpeg_buf_t;
|
|
|
|
typedef struct {
|
|
uint8_t *buf_vaddr; /* ptr to buf */
|
|
int fd; /* fd of buf */
|
|
size_t buf_filled_len; /* used for output image. filled by the client */
|
|
} mm_jpeg_output_t;
|
|
|
|
typedef enum {
|
|
MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V2,
|
|
MM_JPEG_COLOR_FORMAT_YCBCRLP_H2V2,
|
|
MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V1,
|
|
MM_JPEG_COLOR_FORMAT_YCBCRLP_H2V1,
|
|
MM_JPEG_COLOR_FORMAT_YCRCBLP_H1V2,
|
|
MM_JPEG_COLOR_FORMAT_YCBCRLP_H1V2,
|
|
MM_JPEG_COLOR_FORMAT_YCRCBLP_H1V1,
|
|
MM_JPEG_COLOR_FORMAT_YCBCRLP_H1V1,
|
|
MM_JPEG_COLOR_FORMAT_MONOCHROME,
|
|
MM_JPEG_COLOR_FORMAT_BITSTREAM_H2V2,
|
|
MM_JPEG_COLOR_FORMAT_BITSTREAM_H2V1,
|
|
MM_JPEG_COLOR_FORMAT_BITSTREAM_H1V2,
|
|
MM_JPEG_COLOR_FORMAT_BITSTREAM_H1V1,
|
|
MM_JPEG_COLOR_FORMAT_MAX
|
|
} mm_jpeg_color_format;
|
|
|
|
typedef enum {
|
|
JPEG_JOB_STATUS_DONE = 0,
|
|
JPEG_JOB_STATUS_ERROR
|
|
} jpeg_job_status_t;
|
|
|
|
typedef void (*jpeg_encode_callback_t)(jpeg_job_status_t status,
|
|
uint32_t client_hdl,
|
|
uint32_t jobId,
|
|
mm_jpeg_output_t *p_output,
|
|
void *userData);
|
|
|
|
typedef void (*mpo_encode_callback_t)(jpeg_job_status_t status,
|
|
mm_jpeg_output_t *p_output,
|
|
void *userData);
|
|
|
|
typedef struct {
|
|
/* src img dimension */
|
|
cam_dimension_t src_dim;
|
|
|
|
/* jpeg output dimension */
|
|
cam_dimension_t dst_dim;
|
|
|
|
/* crop information */
|
|
cam_rect_t crop;
|
|
} mm_jpeg_dim_t;
|
|
|
|
typedef struct {
|
|
/* num of buf in src img */
|
|
uint32_t num_src_bufs;
|
|
|
|
/* num of src tmb bufs */
|
|
uint32_t num_tmb_bufs;
|
|
|
|
/* num of buf in src img */
|
|
uint32_t num_dst_bufs;
|
|
|
|
/* should create thumbnail from main image or not */
|
|
uint32_t encode_thumbnail;
|
|
|
|
/* src img bufs */
|
|
mm_jpeg_buf_t src_main_buf[MM_JPEG_MAX_BUF];
|
|
|
|
/* this will be used only for bitstream */
|
|
mm_jpeg_buf_t src_thumb_buf[MM_JPEG_MAX_BUF];
|
|
|
|
/* this will be used only for bitstream */
|
|
mm_jpeg_buf_t dest_buf[MM_JPEG_MAX_BUF];
|
|
|
|
/* mainimage color format */
|
|
mm_jpeg_color_format color_format;
|
|
|
|
/* thumbnail color format */
|
|
mm_jpeg_color_format thumb_color_format;
|
|
|
|
/* jpeg quality: range 0~100 */
|
|
uint32_t quality;
|
|
|
|
/* jpeg thumbnail quality: range 0~100 */
|
|
uint32_t thumb_quality;
|
|
|
|
/* buf to exif entries, caller needs to
|
|
* take care of the memory manage with insider ptr */
|
|
QOMX_EXIF_INFO exif_info;
|
|
|
|
/*Callback registered to be called after encode*/
|
|
jpeg_encode_callback_t jpeg_cb;
|
|
|
|
/*Appdata passed by the user*/
|
|
void* userdata;
|
|
|
|
/* thumbnail dimension */
|
|
mm_jpeg_dim_t thumb_dim;
|
|
|
|
/* rotation informaiton */
|
|
uint32_t rotation;
|
|
|
|
/* thumb rotation informaiton */
|
|
uint32_t thumb_rotation;
|
|
|
|
/* main image dimension */
|
|
mm_jpeg_dim_t main_dim;
|
|
|
|
/* enable encoder burst mode */
|
|
uint32_t burst_mode;
|
|
|
|
/* get memory function ptr */
|
|
int (*get_memory)( omx_jpeg_ouput_buf_t *p_out_buf);
|
|
|
|
/* release memory function ptr */
|
|
int (*put_memory)( omx_jpeg_ouput_buf_t *p_out_buf);
|
|
|
|
/* Flag to indicate whether to generate thumbnail from postview */
|
|
bool thumb_from_postview;
|
|
} mm_jpeg_encode_params_t;
|
|
|
|
typedef struct {
|
|
/* num of buf in src img */
|
|
uint32_t num_src_bufs;
|
|
|
|
/* num of buf in src img */
|
|
uint32_t num_dst_bufs;
|
|
|
|
/* src img bufs */
|
|
mm_jpeg_buf_t src_main_buf[MM_JPEG_MAX_BUF];
|
|
|
|
/* this will be used only for bitstream */
|
|
mm_jpeg_buf_t dest_buf[MM_JPEG_MAX_BUF];
|
|
|
|
/* color format */
|
|
mm_jpeg_color_format color_format;
|
|
|
|
jpeg_encode_callback_t jpeg_cb;
|
|
|
|
void* userdata;
|
|
|
|
} mm_jpeg_decode_params_t;
|
|
|
|
/* This structure is populated by HAL to notify buffer
|
|
usage like has read or has written. This info is then
|
|
used to perform cache ops in jpeg */
|
|
typedef struct {
|
|
/* main image source buff usage */
|
|
uint8_t main_src_buf;
|
|
|
|
/* thumbnail source buff usage */
|
|
uint8_t thumb_src_buf;
|
|
|
|
/* destination buff usage */
|
|
uint8_t dest_buf;
|
|
|
|
/* work buff usage */
|
|
uint8_t work_buf;
|
|
|
|
} mm_jpeg_buf_usage_t;
|
|
|
|
typedef struct {
|
|
/* active indices of the buffers for encoding */
|
|
int32_t src_index;
|
|
int32_t dst_index;
|
|
uint32_t thumb_index;
|
|
mm_jpeg_dim_t thumb_dim;
|
|
|
|
/* rotation informaiton */
|
|
uint32_t rotation;
|
|
|
|
/* main image dimension */
|
|
mm_jpeg_dim_t main_dim;
|
|
|
|
/*session id*/
|
|
uint32_t session_id;
|
|
|
|
/* jpeg output buffer ref count */
|
|
int32_t ref_count;
|
|
|
|
/* allocated jpeg output buffer */
|
|
void *alloc_out_buffer;
|
|
|
|
/*Metadata stream*/
|
|
metadata_buffer_t *p_metadata;
|
|
|
|
/*HAL version*/
|
|
cam_hal_version_t hal_version;
|
|
|
|
/* buf to exif entries, caller needs to
|
|
* take care of the memory manage with insider ptr */
|
|
QOMX_EXIF_INFO exif_info;
|
|
|
|
/* 3a parameters */
|
|
mm_jpeg_exif_params_t cam_exif_params;
|
|
|
|
/* jpeg encoder QTable */
|
|
uint8_t qtable_set[QTABLE_MAX];
|
|
|
|
OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE qtable[QTABLE_MAX];
|
|
|
|
/* flag to enable/disable mobicat */
|
|
uint8_t mobicat_mask;
|
|
|
|
/*Info associated with multiple image sequence*/
|
|
mm_jpeg_multi_image_t multi_image_info;
|
|
|
|
/* work buf */
|
|
mm_jpeg_buf_t work_buf;
|
|
|
|
/* Input from HAL notifing the prior usage of buffers,
|
|
this info will be used to perform cache ops*/
|
|
mm_jpeg_buf_usage_t buf_usage;
|
|
|
|
} mm_jpeg_encode_job_t;
|
|
|
|
typedef struct {
|
|
/* active indices of the buffers for encoding */
|
|
int32_t src_index;
|
|
int32_t dst_index;
|
|
uint32_t tmb_dst_index;
|
|
|
|
/* rotation informaiton */
|
|
uint32_t rotation;
|
|
|
|
/* main image */
|
|
mm_jpeg_dim_t main_dim;
|
|
|
|
/*session id*/
|
|
uint32_t session_id;
|
|
} mm_jpeg_decode_job_t;
|
|
|
|
typedef enum {
|
|
JPEG_JOB_TYPE_ENCODE,
|
|
JPEG_JOB_TYPE_DECODE,
|
|
JPEG_JOB_TYPE_MAX
|
|
} mm_jpeg_job_type_t;
|
|
|
|
typedef struct {
|
|
mm_jpeg_job_type_t job_type;
|
|
union {
|
|
mm_jpeg_encode_job_t encode_job;
|
|
mm_jpeg_decode_job_t decode_job;
|
|
};
|
|
} mm_jpeg_job_t;
|
|
|
|
typedef struct {
|
|
uint32_t w;
|
|
uint32_t h;
|
|
} mm_dimension;
|
|
|
|
typedef struct {
|
|
/*Primary image in the MPO sequence*/
|
|
mm_jpeg_output_t primary_image;
|
|
|
|
/*All auxillary images in the sequence*/
|
|
mm_jpeg_output_t aux_images[MM_JPEG_MAX_MPO_IMAGES - 1];
|
|
|
|
/*Total number of images in the MPO sequence*/
|
|
int num_of_images;
|
|
|
|
/*Output MPO buffer*/
|
|
mm_jpeg_output_t output_buff;
|
|
|
|
/*Size of the allocated output buffer*/
|
|
size_t output_buff_size;
|
|
} mm_jpeg_mpo_info_t;
|
|
|
|
typedef struct {
|
|
/* config a job -- async call */
|
|
int (*start_job)(mm_jpeg_job_t* job, uint32_t* job_id);
|
|
|
|
/* abort a job -- sync call */
|
|
int (*abort_job)(uint32_t job_id);
|
|
|
|
/* create a session */
|
|
int (*create_session)(uint32_t client_hdl,
|
|
mm_jpeg_encode_params_t *p_params, uint32_t *p_session_id);
|
|
|
|
/* destroy session */
|
|
int (*destroy_session)(uint32_t session_id);
|
|
|
|
/* close a jpeg client -- sync call */
|
|
int (*close) (uint32_t clientHdl);
|
|
|
|
} mm_jpeg_ops_t;
|
|
|
|
typedef struct {
|
|
/* config a job -- async call */
|
|
int (*start_job)(mm_jpeg_job_t* job, uint32_t* job_id);
|
|
|
|
/* abort a job -- sync call */
|
|
int (*abort_job)(uint32_t job_id);
|
|
|
|
/* create a session */
|
|
int (*create_session)(uint32_t client_hdl,
|
|
mm_jpeg_decode_params_t *p_params, uint32_t *p_session_id);
|
|
|
|
/* destroy session */
|
|
int (*destroy_session)(uint32_t session_id);
|
|
|
|
/* close a jpeg client -- sync call */
|
|
int (*close) (uint32_t clientHdl);
|
|
} mm_jpegdec_ops_t;
|
|
|
|
typedef struct {
|
|
|
|
/* Get Mpo size*/
|
|
int (*get_mpo_size)(mm_jpeg_output_t jpeg_buffer[MM_JPEG_MAX_MPO_IMAGES],
|
|
int num_of_images);
|
|
|
|
/* Compose MPO*/
|
|
int (*compose_mpo)(mm_jpeg_mpo_info_t *mpo_info);
|
|
|
|
} mm_jpeg_mpo_ops_t;
|
|
|
|
/* open a jpeg client -- sync call
|
|
* returns client_handle.
|
|
* failed if client_handle=0
|
|
* jpeg ops tbl and mpo ops tbl will be filled in if open succeeds
|
|
* and jpeg meta data will be cached */
|
|
uint32_t jpeg_open(mm_jpeg_ops_t *ops, mm_jpeg_mpo_ops_t *mpo_ops,
|
|
mm_dimension picture_size,
|
|
cam_jpeg_metadata_t *jpeg_metadata);
|
|
|
|
/* open a jpeg client -- sync call
|
|
* returns client_handle.
|
|
* failed if client_handle=0
|
|
* jpeg ops tbl will be filled in if open succeeds */
|
|
uint32_t jpegdec_open(mm_jpegdec_ops_t *ops);
|
|
|
|
#endif /* MM_JPEG_INTERFACE_H_ */
|