1 /* Copyright (c) 2012-2013, 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_H_ 31 #define MM_JPEG_H_ 32 33 #include <cam_semaphore.h> 34 #include "mm_jpeg_interface.h" 35 #include "cam_list.h" 36 #include "OMX_Types.h" 37 #include "OMX_Index.h" 38 #include "OMX_Core.h" 39 #include "OMX_Component.h" 40 #include "QOMX_JpegExtensions.h" 41 42 #define MM_JPEG_MAX_THREADS 30 43 #define MM_JPEG_CIRQ_SIZE 30 44 #define MM_JPEG_MAX_SESSION 10 45 #define MAX_EXIF_TABLE_ENTRIES 50 46 #define ASPECT_TOLERANCE 0.001 47 48 typedef struct { 49 struct cam_list list; 50 void* data; 51 } mm_jpeg_q_node_t; 52 53 typedef struct { 54 mm_jpeg_q_node_t head; /* dummy head */ 55 uint32_t size; 56 pthread_mutex_t lock; 57 } mm_jpeg_queue_t; 58 59 typedef enum { 60 MM_JPEG_CMD_TYPE_JOB, /* job cmd */ 61 MM_JPEG_CMD_TYPE_EXIT, /* EXIT cmd for exiting jobMgr thread */ 62 MM_JPEG_CMD_TYPE_MAX 63 } mm_jpeg_cmd_type_t; 64 65 typedef struct { 66 union { 67 int i_data[MM_JPEG_CIRQ_SIZE]; 68 void *p_data[MM_JPEG_CIRQ_SIZE]; 69 }; 70 int front; 71 int rear; 72 int count; 73 pthread_mutex_t lock; 74 } mm_jpeg_cirq_t; 75 76 typedef struct { 77 uint32_t client_hdl; /* client handler */ 78 uint32_t jobId; /* job ID */ 79 uint32_t sessionId; /* session ID */ 80 mm_jpeg_encode_params_t params; /* encode params */ 81 mm_jpeg_encode_job_t encode_job; /* job description */ 82 pthread_t encode_pid; /* encode thread handler*/ 83 84 void *jpeg_obj; /* ptr to mm_jpeg_obj */ 85 jpeg_job_status_t job_status; /* job status */ 86 87 int state_change_pending; /* flag to indicate if state change is pending */ 88 OMX_ERRORTYPE error_flag; /* variable to indicate error during encoding */ 89 OMX_BOOL abort_flag; /* variable to indicate abort during encoding */ 90 91 /* OMX related */ 92 OMX_HANDLETYPE omx_handle; /* handle to omx engine */ 93 OMX_CALLBACKTYPE omx_callbacks; /* callbacks to omx engine */ 94 95 /* buffer headers */ 96 OMX_BUFFERHEADERTYPE *p_in_omx_buf[MM_JPEG_MAX_BUF]; 97 OMX_BUFFERHEADERTYPE *p_in_omx_thumb_buf[MM_JPEG_MAX_BUF]; 98 OMX_BUFFERHEADERTYPE *p_out_omx_buf[MM_JPEG_MAX_BUF]; 99 100 OMX_PARAM_PORTDEFINITIONTYPE inputPort; 101 OMX_PARAM_PORTDEFINITIONTYPE outputPort; 102 OMX_PARAM_PORTDEFINITIONTYPE inputTmbPort; 103 104 /* event locks */ 105 pthread_mutex_t lock; 106 pthread_cond_t cond; 107 108 QEXIF_INFO_DATA exif_info_local[MAX_EXIF_TABLE_ENTRIES]; //all exif tags for JPEG encoder 109 int exif_count_local; 110 111 mm_jpeg_cirq_t cb_q; 112 int32_t ebd_count; 113 int32_t fbd_count; 114 115 /* this flag represents whether the job is active */ 116 OMX_BOOL active; 117 118 /* this flag indicates if the configration is complete */ 119 OMX_BOOL config; 120 121 /* job history count to generate unique id */ 122 int job_hist; 123 124 OMX_BOOL encoding; 125 } mm_jpeg_job_session_t; 126 127 typedef struct { 128 mm_jpeg_encode_job_t encode_job; 129 uint32_t job_id; 130 uint32_t client_handle; 131 } mm_jpeg_encode_job_info_t; 132 133 typedef struct { 134 mm_jpeg_cmd_type_t type; 135 union { 136 mm_jpeg_encode_job_info_t enc_info; 137 }; 138 } mm_jpeg_job_q_node_t; 139 140 typedef struct { 141 uint8_t is_used; /* flag: if is a valid client */ 142 uint32_t client_handle; /* client handle */ 143 mm_jpeg_job_session_t session[MM_JPEG_MAX_SESSION]; 144 pthread_mutex_t lock; /* job lock */ 145 } mm_jpeg_client_t; 146 147 typedef struct { 148 pthread_t pid; /* job cmd thread ID */ 149 cam_semaphore_t job_sem; /* semaphore for job cmd thread */ 150 mm_jpeg_queue_t job_queue; /* queue for job to do */ 151 } mm_jpeg_job_cmd_thread_t; 152 153 #define MAX_JPEG_CLIENT_NUM 8 154 typedef struct mm_jpeg_obj_t { 155 /* ClientMgr */ 156 int num_clients; /* num of clients */ 157 mm_jpeg_client_t clnt_mgr[MAX_JPEG_CLIENT_NUM]; /* client manager */ 158 159 /* JobMkr */ 160 pthread_mutex_t job_lock; /* job lock */ 161 mm_jpeg_job_cmd_thread_t job_mgr; /* job mgr thread including todo_q*/ 162 mm_jpeg_queue_t ongoing_job_q; /* queue for ongoing jobs */ 163 } mm_jpeg_obj; 164 165 extern int32_t mm_jpeg_init(mm_jpeg_obj *my_obj); 166 extern int32_t mm_jpeg_deinit(mm_jpeg_obj *my_obj); 167 extern uint32_t mm_jpeg_new_client(mm_jpeg_obj *my_obj); 168 extern int32_t mm_jpeg_start_job(mm_jpeg_obj *my_obj, 169 mm_jpeg_job_t* job, 170 uint32_t* jobId); 171 extern int32_t mm_jpeg_abort_job(mm_jpeg_obj *my_obj, 172 uint32_t jobId); 173 extern int32_t mm_jpeg_close(mm_jpeg_obj *my_obj, 174 uint32_t client_hdl); 175 extern int32_t mm_jpeg_create_session(mm_jpeg_obj *my_obj, 176 uint32_t client_hdl, 177 mm_jpeg_encode_params_t *p_params, 178 uint32_t* p_session_id); 179 extern int32_t mm_jpeg_destroy_session_by_id(mm_jpeg_obj *my_obj, 180 uint32_t session_id); 181 extern int32_t mm_jpeg_destroy_job(mm_jpeg_job_session_t *p_session); 182 183 /* utiltity fucntion declared in mm-camera-inteface2.c 184 * and need be used by mm-camera and below*/ 185 uint32_t mm_jpeg_util_generate_handler(uint8_t index); 186 uint8_t mm_jpeg_util_get_index_by_handler(uint32_t handler); 187 188 /* basic queue functions */ 189 extern int32_t mm_jpeg_queue_init(mm_jpeg_queue_t* queue); 190 extern int32_t mm_jpeg_queue_enq(mm_jpeg_queue_t* queue, void* node); 191 extern void* mm_jpeg_queue_deq(mm_jpeg_queue_t* queue); 192 extern int32_t mm_jpeg_queue_deinit(mm_jpeg_queue_t* queue); 193 extern int32_t mm_jpeg_queue_flush(mm_jpeg_queue_t* queue); 194 extern uint32_t mm_jpeg_queue_get_size(mm_jpeg_queue_t* queue); 195 extern void* mm_jpeg_queue_peek(mm_jpeg_queue_t* queue); 196 extern int32_t addExifEntry(QOMX_EXIF_INFO *p_exif_info, exif_tag_id_t tagid, 197 exif_tag_type_t type, uint32_t count, void *data); 198 extern int32_t releaseExifEntry(QEXIF_INFO_DATA *p_exif_data); 199 extern int process_meta_data_v1(cam_metadata_info_t *p_meta, 200 QOMX_EXIF_INFO *exif_info, mm_jpeg_exif_params_t *p_cam_exif_params); 201 extern int process_meta_data_v3(metadata_buffer_t *p_meta, 202 QOMX_EXIF_INFO *exif_info, mm_jpeg_exif_params_t *p_cam3a_params); 203 204 #endif /* MM_JPEG_H_ */ 205 206 207