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