1/* Copyright (c) 2012-2016, The Linux Foundation. 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 The Linux Foundation 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
30#ifndef MM_JPEG_INTERFACE_H_
31#define MM_JPEG_INTERFACE_H_
32
33// System dependencies
34#include <stdbool.h>
35
36// Camera dependencies
37#include "QOMX_JpegExtensions.h"
38#include "cam_intf.h"
39
40#define MM_JPEG_MAX_PLANES 3
41#define MM_JPEG_MAX_BUF CAM_MAX_NUM_BUFS_PER_STREAM
42#define QUANT_SIZE 64
43#define QTABLE_MAX 2
44#define MM_JPEG_MAX_MPO_IMAGES 2
45
46typedef enum {
47  MM_JPEG_FMT_YUV,
48  MM_JPEG_FMT_BITSTREAM
49} mm_jpeg_format_t;
50
51typedef enum {
52  MM_JPEG_TYPE_JPEG,
53  MM_JPEG_TYPE_MPO
54} mm_jpeg_image_type_t;
55
56typedef struct {
57  cam_ae_exif_debug_t ae_debug_params;
58  cam_awb_exif_debug_t awb_debug_params;
59  cam_af_exif_debug_t af_debug_params;
60  cam_asd_exif_debug_t asd_debug_params;
61  cam_stats_buffer_exif_debug_t stats_debug_params;
62  cam_bestats_buffer_exif_debug_t bestats_debug_params;
63  cam_bhist_buffer_exif_debug_t bhist_debug_params;
64  cam_q3a_tuning_info_t q3a_tuning_debug_params;
65  uint8_t ae_debug_params_valid;
66  uint8_t awb_debug_params_valid;
67  uint8_t af_debug_params_valid;
68  uint8_t asd_debug_params_valid;
69  uint8_t stats_debug_params_valid;
70  uint8_t bestats_debug_params_valid;
71  uint8_t bhist_debug_params_valid;
72  uint8_t q3a_tuning_debug_params_valid;
73} mm_jpeg_debug_exif_params_t;
74
75typedef struct {
76  cam_3a_params_t cam_3a_params;
77  uint8_t cam_3a_params_valid;
78  cam_sensor_params_t sensor_params;
79  mm_jpeg_debug_exif_params_t *debug_params;
80} mm_jpeg_exif_params_t;
81
82typedef struct {
83  /* Indicates if it is a single jpeg or part of a multi picture sequence*/
84  mm_jpeg_image_type_t type;
85
86  /*Indicates if image is the primary image in a sequence of images.
87  Applicable only to multi picture formats*/
88  uint8_t is_primary;
89
90  /*Number of images in the sequence*/
91  uint32_t num_of_images;
92} mm_jpeg_multi_image_t;
93
94typedef struct {
95  uint32_t sequence;          /* for jpeg bit streams, assembling is based on sequence. sequence starts from 0 */
96  uint8_t *buf_vaddr;        /* ptr to buf */
97  int fd;                    /* fd of buf */
98  size_t buf_size;         /* total size of buf (header + image) */
99  mm_jpeg_format_t format;   /* buffer format*/
100  cam_frame_len_offset_t offset; /* offset of all the planes */
101  uint32_t index; /* index used to identify the buffers */
102} mm_jpeg_buf_t;
103
104typedef struct {
105  uint8_t *buf_vaddr;        /* ptr to buf */
106  int fd;                    /* fd of buf */
107  size_t buf_filled_len;   /* used for output image. filled by the client */
108} mm_jpeg_output_t;
109
110typedef enum {
111  MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V2,
112  MM_JPEG_COLOR_FORMAT_YCBCRLP_H2V2,
113  MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V1,
114  MM_JPEG_COLOR_FORMAT_YCBCRLP_H2V1,
115  MM_JPEG_COLOR_FORMAT_YCRCBLP_H1V2,
116  MM_JPEG_COLOR_FORMAT_YCBCRLP_H1V2,
117  MM_JPEG_COLOR_FORMAT_YCRCBLP_H1V1,
118  MM_JPEG_COLOR_FORMAT_YCBCRLP_H1V1,
119  MM_JPEG_COLOR_FORMAT_MONOCHROME,
120  MM_JPEG_COLOR_FORMAT_BITSTREAM_H2V2,
121  MM_JPEG_COLOR_FORMAT_BITSTREAM_H2V1,
122  MM_JPEG_COLOR_FORMAT_BITSTREAM_H1V2,
123  MM_JPEG_COLOR_FORMAT_BITSTREAM_H1V1,
124  MM_JPEG_COLOR_FORMAT_MAX
125} mm_jpeg_color_format;
126
127typedef enum {
128  JPEG_JOB_STATUS_DONE = 0,
129  JPEG_JOB_STATUS_ERROR
130} jpeg_job_status_t;
131
132typedef void (*jpeg_encode_callback_t)(jpeg_job_status_t status,
133  uint32_t client_hdl,
134  uint32_t jobId,
135  mm_jpeg_output_t *p_output,
136  void *userData);
137
138typedef struct {
139  /* src img dimension */
140  cam_dimension_t src_dim;
141
142  /* jpeg output dimension */
143  cam_dimension_t dst_dim;
144
145  /* crop information */
146  cam_rect_t crop;
147} mm_jpeg_dim_t;
148
149typedef struct {
150  /* num of buf in src img */
151  uint32_t num_src_bufs;
152
153  /* num of src tmb bufs */
154  uint32_t num_tmb_bufs;
155
156  /* num of buf in src img */
157  uint32_t num_dst_bufs;
158
159  /* should create thumbnail from main image or not */
160  uint32_t encode_thumbnail;
161
162  /* src img bufs */
163  mm_jpeg_buf_t src_main_buf[MM_JPEG_MAX_BUF];
164
165  /* this will be used only for bitstream */
166  mm_jpeg_buf_t src_thumb_buf[MM_JPEG_MAX_BUF];
167
168  /* this will be used only for bitstream */
169  mm_jpeg_buf_t dest_buf[MM_JPEG_MAX_BUF];
170
171  /* mainimage color format */
172  mm_jpeg_color_format color_format;
173
174  /* thumbnail color format */
175  mm_jpeg_color_format thumb_color_format;
176
177  /* jpeg quality: range 0~100 */
178  uint32_t quality;
179
180  /* jpeg thumbnail quality: range 0~100 */
181  uint32_t thumb_quality;
182
183  /* buf to exif entries, caller needs to
184   * take care of the memory manage with insider ptr */
185  QOMX_EXIF_INFO exif_info;
186
187  /*Callback registered to be called after encode*/
188  jpeg_encode_callback_t jpeg_cb;
189
190  /*Appdata passed by the user*/
191  void* userdata;
192
193  /* thumbnail dimension */
194  mm_jpeg_dim_t thumb_dim;
195
196  /* rotation informaiton */
197  uint32_t rotation;
198
199  /* thumb rotation informaiton */
200  uint32_t thumb_rotation;
201
202  /* main image dimension */
203  mm_jpeg_dim_t main_dim;
204
205  /* enable encoder burst mode */
206  uint32_t burst_mode;
207
208  /* get memory function ptr */
209  int (*get_memory)( omx_jpeg_ouput_buf_t *p_out_buf);
210
211  /* release memory function ptr */
212  int (*put_memory)( omx_jpeg_ouput_buf_t *p_out_buf);
213
214  /* Flag to indicate whether to generate thumbnail from postview */
215  bool thumb_from_postview;
216} mm_jpeg_encode_params_t;
217
218typedef struct {
219  /* num of buf in src img */
220  uint32_t num_src_bufs;
221
222  /* num of buf in src img */
223  uint32_t num_dst_bufs;
224
225  /* src img bufs */
226  mm_jpeg_buf_t src_main_buf[MM_JPEG_MAX_BUF];
227
228  /* this will be used only for bitstream */
229  mm_jpeg_buf_t dest_buf[MM_JPEG_MAX_BUF];
230
231  /* color format */
232  mm_jpeg_color_format color_format;
233
234  jpeg_encode_callback_t jpeg_cb;
235
236  void* userdata;
237
238} mm_jpeg_decode_params_t;
239
240typedef struct {
241  /* active indices of the buffers for encoding */
242  int32_t src_index;
243  int32_t dst_index;
244  uint32_t thumb_index;
245  mm_jpeg_dim_t thumb_dim;
246
247  /* rotation informaiton */
248  uint32_t rotation;
249
250  /* main image dimension */
251  mm_jpeg_dim_t main_dim;
252
253  /*session id*/
254  uint32_t session_id;
255
256  /* jpeg output buffer ref count */
257  int32_t ref_count;
258
259  /* allocated jpeg output buffer */
260  void *alloc_out_buffer;
261
262  /*Metadata stream*/
263  metadata_buffer_t *p_metadata;
264
265  /*HAL version*/
266  cam_hal_version_t hal_version;
267
268  /* buf to exif entries, caller needs to
269   * take care of the memory manage with insider ptr */
270  QOMX_EXIF_INFO exif_info;
271
272  /* 3a parameters */
273  mm_jpeg_exif_params_t cam_exif_params;
274
275  /* jpeg encoder QTable */
276  uint8_t qtable_set[QTABLE_MAX];
277
278  OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE qtable[QTABLE_MAX];
279
280  /* flag to enable/disable mobicat */
281  uint8_t mobicat_mask;
282
283  /*Info associated with multiple image sequence*/
284  mm_jpeg_multi_image_t multi_image_info;
285
286  /* work buf */
287  mm_jpeg_buf_t work_buf;
288} mm_jpeg_encode_job_t;
289
290typedef struct {
291  /* active indices of the buffers for encoding */
292  int32_t src_index;
293  int32_t dst_index;
294  uint32_t tmb_dst_index;
295
296  /* rotation informaiton */
297  uint32_t rotation;
298
299  /* main image  */
300  mm_jpeg_dim_t main_dim;
301
302  /*session id*/
303  uint32_t session_id;
304} mm_jpeg_decode_job_t;
305
306typedef enum {
307  JPEG_JOB_TYPE_ENCODE,
308  JPEG_JOB_TYPE_DECODE,
309  JPEG_JOB_TYPE_MAX
310} mm_jpeg_job_type_t;
311
312typedef struct {
313  mm_jpeg_job_type_t job_type;
314  union {
315    mm_jpeg_encode_job_t encode_job;
316    mm_jpeg_decode_job_t decode_job;
317  };
318} mm_jpeg_job_t;
319
320typedef struct {
321  uint32_t w;
322  uint32_t h;
323} mm_dimension;
324
325typedef struct {
326  /*Primary image in the MPO sequence*/
327  mm_jpeg_output_t primary_image;
328
329  /*All auxillary images in the sequence*/
330  mm_jpeg_output_t aux_images[MM_JPEG_MAX_MPO_IMAGES - 1];
331
332  /*Total number of images in the MPO sequence*/
333  int num_of_images;
334
335  /*Output MPO buffer*/
336  mm_jpeg_output_t output_buff;
337
338  /*Size of the allocated output buffer*/
339  size_t output_buff_size;
340} mm_jpeg_mpo_info_t;
341
342typedef struct {
343  /* config a job -- async call */
344  int (*start_job)(mm_jpeg_job_t* job, uint32_t* job_id);
345
346  /* abort a job -- sync call */
347  int (*abort_job)(uint32_t job_id);
348
349  /* create a session */
350  int (*create_session)(uint32_t client_hdl,
351    mm_jpeg_encode_params_t *p_params, uint32_t *p_session_id);
352
353  /* destroy session */
354  int (*destroy_session)(uint32_t session_id);
355
356  /* close a jpeg client -- sync call */
357  int (*close) (uint32_t clientHdl);
358
359} mm_jpeg_ops_t;
360
361typedef struct {
362  /* config a job -- async call */
363  int (*start_job)(mm_jpeg_job_t* job, uint32_t* job_id);
364
365  /* abort a job -- sync call */
366  int (*abort_job)(uint32_t job_id);
367
368  /* create a session */
369  int (*create_session)(uint32_t client_hdl,
370    mm_jpeg_decode_params_t *p_params, uint32_t *p_session_id);
371
372  /* destroy session */
373  int (*destroy_session)(uint32_t session_id);
374
375  /* close a jpeg client -- sync call */
376  int (*close) (uint32_t clientHdl);
377} mm_jpegdec_ops_t;
378
379typedef struct {
380
381  /* Get Mpo size*/
382  int (*get_mpo_size)(mm_jpeg_output_t jpeg_buffer[MM_JPEG_MAX_MPO_IMAGES],
383    int num_of_images);
384
385  /* Compose MPO*/
386  int (*compose_mpo)(mm_jpeg_mpo_info_t *mpo_info);
387
388} mm_jpeg_mpo_ops_t;
389
390/* open a jpeg client -- sync call
391 * returns client_handle.
392 * failed if client_handle=0
393 * jpeg ops tbl and mpo ops tbl will be filled in if open succeeds
394 * and jpeg meta data will be cached */
395uint32_t jpeg_open(mm_jpeg_ops_t *ops, mm_jpeg_mpo_ops_t *mpo_ops,
396  mm_dimension picture_size,
397  cam_jpeg_metadata_t *jpeg_metadata);
398
399/* open a jpeg client -- sync call
400 * returns client_handle.
401 * failed if client_handle=0
402 * jpeg ops tbl will be filled in if open succeeds */
403uint32_t jpegdec_open(mm_jpegdec_ops_t *ops);
404
405#endif /* MM_JPEG_INTERFACE_H_ */
406