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