1/* Copyright (c) 2012, Code Aurora Forum. All rights reserved.
2 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * met:
6 *     * Redistributions of source code must retain the above copyright
7 *       notice, this list of conditions and the following disclaimer.
8 *     * Redistributions in binary form must reproduce the above
9 *       copyright notice, this list of conditions and the following
10 *       disclaimer in the documentation and/or other materials provided
11 *       with the distribution.
12 *     * Neither the name of Code Aurora Forum, Inc. nor the names of its
13 *       contributors may be used to endorse or promote products derived
14 *       from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#ifndef MM_JPEG_INTERFACE_H_
30#define MM_JPEG_INTERFACE_H_
31#include "QCamera_Intf.h"
32
33typedef struct {
34    int width;
35    int height;
36} image_resolution;
37
38typedef enum {
39    JPEG_SRC_IMAGE_FMT_YUV,
40    JPEG_SRC_IMAGE_FMT_BITSTREAM
41} jpeg_enc_src_img_fmt_t;
42
43typedef enum {
44    JPEG_SRC_IMAGE_TYPE_MAIN,
45    JPEG_SRC_IMAGE_TYPE_THUMB,
46    JPEG_SRC_IMAGE_TYPE_MAX
47} jpeg_enc_src_img_type_t;
48
49typedef struct  {
50    int32_t offset_x;
51    int32_t offset_y;
52    int32_t width;
53    int32_t height;
54} image_crop_t;
55
56typedef struct {
57    uint8_t sequence;                /*for jpeg bit streams, assembling is based on sequence. sequence starts from 0*/
58    uint8_t *buf_vaddr;              /*ptr to buf*/
59    int fd;                          /*fd of buf*/
60    uint32_t buf_size;               /* total size of buf (header + image) */
61    uint32_t data_offset;            /*data offset*/
62} src_bitstream_buffer_t;
63
64typedef struct {
65    uint8_t *buf_vaddr;              /*ptr to buf*/
66    int fd;                          /*fd of buf*/
67    cam_frame_len_offset_t offset;   /*alway use multi-planar, offset is used to skip the metadata header*/
68} src_image_buffer_t;
69
70typedef enum {
71    MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V2,
72    MM_JPEG_COLOR_FORMAT_YCBCRLP_H2V2,
73    MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V1,
74    MM_JPEG_COLOR_FORMAT_YCBCRLP_H2V1,
75    MM_JPEG_COLOR_FORMAT_YCRCBLP_H1V2,
76    MM_JPEG_COLOR_FORMAT_YCBCRLP_H1V2,
77    MM_JPEG_COLOR_FORMAT_YCRCBLP_H1V1,
78    MM_JPEG_COLOR_FORMAT_YCBCRLP_H1V1,
79    MM_JPEG_COLOR_FORMAT_RGB565,
80    MM_JPEG_COLOR_FORMAT_RGB888,
81    MM_JPEG_COLOR_FORMAT_RGBa,
82    MM_JPEG_COLOR_FORMAT_BITSTREAM,
83    MM_JPEG_COLOR_FORMAT_MAX
84} mm_jpeg_color_format;
85
86#define MAX_SRC_BUF_NUM 2
87typedef struct {
88    /* src img format: YUV, Bitstream */
89    jpeg_enc_src_img_fmt_t img_fmt;
90
91	/* num of buf in src img */
92    uint8_t num_bufs;
93
94	/* src img bufs */
95    union {
96        src_bitstream_buffer_t bit_stream[MAX_SRC_BUF_NUM];
97        src_image_buffer_t src_image[MAX_SRC_BUF_NUM];
98    };
99
100    /* src img type: main or thumbnail */
101    jpeg_enc_src_img_type_t type;
102
103    /* color format */
104    mm_jpeg_color_format color_format;
105
106    /* src img dimension */
107    image_resolution src_dim;
108
109    /* jpeg output dimension */
110    image_resolution out_dim;
111
112    /* crop information */
113    image_crop_t crop;
114
115    /* jpeg quality: range 0~100 */
116    uint32_t quality;
117} src_image_buffer_info;
118
119typedef struct {
120  uint8_t *buf_vaddr;              /*ptr to buf*/
121  int fd;                          /*fd of buf*/
122  int buf_len;
123} out_image_buffer_info;
124
125typedef struct {
126    /* num of src imgs: e.g. main/thumbnail img
127     * if main img only: src_img_num = 1;
128     * if main+thumbnail: src_img_num = 2;
129     * No support for thumbnail only case */
130    uint8_t src_img_num;
131
132    /* index 0 is always for main image
133     * if thumbnail presented, it will be in index 1 */
134    src_image_buffer_info src_img[JPEG_SRC_IMAGE_TYPE_MAX];
135} src_image_buffer_config;
136
137typedef struct {
138    src_image_buffer_config src_imgs;
139    out_image_buffer_info sink_img;
140} jpeg_image_buffer_config;
141
142typedef struct {
143    /* config for scr images */
144    jpeg_image_buffer_config buf_info;
145
146    /* rotation informaiton */
147    int rotation;
148
149    /* num of exif entries */
150    int exif_numEntries;
151
152    /* buf to exif entries, caller needs to
153     * take care of the memory manage with insider ptr */
154    exif_tags_info_t *exif_data;
155} mm_jpeg_encode_params;
156
157typedef enum {
158  JPEG_JOB_STATUS_DONE = 0,
159  JPEG_JOB_STATUS_ERROR
160} jpeg_job_status_t;
161
162typedef void (*jpeg_encode_callback_t)(jpeg_job_status_t status,
163                                       uint8_t thumbnailDroppedFlag,
164                                       uint32_t client_hdl,
165                                       uint32_t jobId,
166                                       uint8_t* out_data,
167                                       uint32_t data_size,
168                                       void *userData);
169
170typedef struct {
171    mm_jpeg_encode_params encode_parm;
172    jpeg_encode_callback_t jpeg_cb;
173    void* userdata;
174} mm_jpeg_encode_job;
175
176typedef enum {
177    JPEG_JOB_TYPE_ENCODE,
178    //JPEG_JOB_TYPE_DECODE, /*enable decode later*/
179    JPEG_JOB_TYPE_MAX
180} mm_jpeg_job_type_t;
181
182typedef struct {
183    mm_jpeg_job_type_t job_type;
184    union {
185        mm_jpeg_encode_job encode_job;
186    };
187} mm_jpeg_job;
188
189typedef struct {
190    /* start a job -- async call
191     * the result of job (DONE/ERROR) will rcvd through CB */
192    int32_t (* start_job) (uint32_t client_hdl, mm_jpeg_job* job, uint32_t* jobId);
193
194    /* abort a job -- sync call */
195    int32_t  (* abort_job) (uint32_t client_hdl, uint32_t jobId);
196
197    /* close a jpeg client -- sync call */
198    int32_t  (* close) (uint32_t clientHdl);
199} mm_jpeg_ops_t;
200
201/* open a jpeg client -- sync call
202 * returns client_handle.
203 * failed if client_handle=0
204 * jpeg ops tbl will be filled in if open succeeds */
205uint32_t jpeg_open(mm_jpeg_ops_t *ops);
206
207#endif /* MM_JPEG_INTERFACE_H_ */
208
209
210