1/* Copyright (c) 2012, 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 _OMX_JPEG_COMMON_H_
31#define _OMX_JPEG_COMMON_H_
32#include "OMX_Core.h"
33#include "stdio.h"
34#include "omx_debug.h"
35
36#define INPUT_PORT 0
37#define OUTPUT_PORT 1
38#define CEILING16(X) (((X) + 0x000F) & 0xFFF0)
39#define YUV_SIZER(W, H) ((W * H * 3) /2 )
40
41#define DEFAULT_PICTURE_WIDTH 640
42#define DEFAULT_PICTURE_HEIGHT 480
43
44#define GET_COMP(X) ((OMX_PTR)((OMX_COMPONENTTYPE*)X)->pComponentPrivate)
45#define PAD_TO_WORD(a)               (((a)+3)&~3)
46#define OMX_JPEG_QUEUE_CAPACITY 100
47
48
49#define OMX_MM_MALLOC(size) jpeg_malloc(size, __FILE__, __LINE__)
50#define OMX_MM_ZERO(pointer, type) memset(pointer, 0 ,sizeof(type))
51#define OMX_MM_FREE(pointer) {if (pointer) \
52                               jpeg_free(pointer); \
53                             else \
54	                       OMX_DBG_INFO("%s:%d: null pointer", __FILE__, __LINE__); \
55                             pointer = NULL; \
56	                     }
57#define ONERROR(X, handler) if(X) { \
58        OMX_DBG_ERROR("Failure at  %s:%d", __FILE__, __LINE__); \
59        handler; \
60        return X; \
61    }
62#define ERROR_ENCODING(X, handler) if(X) { \
63        OMX_DBG_ERROR("Failure at  %s:%d", __FILE__, __LINE__); \
64        handler; \
65        pthread_mutex_unlock(&comp->abort_mutex); \
66        return X; \
67    }
68#define ONWARNING(X) if(X) {\
69        OMX_DBG_ERROR("Warning: Failure at %s:%d", __FILE__, __LINE__); \
70    }
71
72#define MIN(a,b)  (((a) < (b)) ? (a) : (b))
73
74/* These are custom events added as an extention to the OMX Events*/
75typedef enum {
76  OMX_EVENT_ETB_DONE = OMX_EventVendorStartUnused+1,
77  OMX_EVENT_FTB_DONE,
78  OMX_EVENT_THUMBNAIL_DROPPED,
79  OMX_EVENT_JPEG_ERROR,
80  OMX_EVENT_JPEG_ABORT,
81  OMX_EVENT_MAIN_IMAGE,
82  OMX_EVENT_THUMBNAIL_IMAGE,
83  OMX_EVENT_DONE
84}omx_jpeg_events;
85
86/*This enum is consistent with the jpeg_color_format enum.
87Please be careful while changing the order. It has to
88match exactly*/
89typedef enum {
90  OMX_YCRCBLP_H2V2 = 0,
91  OMX_YCBCRLP_H2V2 = 1,
92
93  OMX_YCRCBLP_H2V1 = 2,
94  OMX_YCBCRLP_H2V1 = 3,
95
96  OMX_YCRCBLP_H1V2 = 4,
97  OMX_YCBCRLP_H1V2 = 5,
98
99  OMX_YCRCBLP_H1V1 = 6,
100  OMX_YCBCRLP_H1V1 = 7,
101
102  OMX_RGB565 = 8,
103  OMX_RGB888 = 9,
104  OMX_RGBa   = 10,
105
106  OMX_JPEG_BITSTREAM_H2V2 = 12,
107  OMX_JPEG_BITSTREAM_H2V1 = 14,
108  OMX_JPEG_BITSTREAM_H1V2 = 16,
109  OMX_JPEG_BITSTREAM_H1V1 = 18,
110
111  OMX_JPEG_COLOR_FORMAT_MAX,
112
113} omx_jpeg_color_format;
114
115/*This enum is consistent with the jpege_preferences_t  and
116jpegd_preferences_t enum.Please be careful while changing the order.
117It has to match exactly*/
118typedef enum {
119  OMX_JPEG_PREF_HW_ACCELERATED_PREFERRED = 0,
120  OMX_JPEG_PREF_HW_ACCELERATED_ONLY,
121  OMX_JPEG_PREF_SOFTWARE_PREFERRED,
122  OMX_JPEG_PREF_SOFTWARE_ONLY,
123  OMX_JPEG_PREF_MAX,
124
125} omx_jpeg_preference;
126
127typedef enum {
128    OMX_JPEG_MESSAGE_INITIAL=0,
129    OMX_JPEG_MESSAGE_ETB,
130    OMX_JPEG_MESSAGE_FTB,
131    OMX_JPEG_MESSAGE_ETB_DONE,
132    OMX_JPEG_MESSAGE_FTB_DONE,
133    OMX_JPEG_MESSAGE_START_ENCODE,
134    OMX_JPEG_MESSAGE_START_DECODE,
135    OMX_JPEG_MESSAGE_CHANGE_STATE,
136    OMX_JPEG_MESSAGE_FLUSH,
137    OMX_JPEG_MESSAGE_STOP,
138    OMX_JPEG_MESSAGE_FLUSH_COMPLETE,
139    OMX_JPEG_MESSAGE_TRANSACT_COMPLETE,
140    OMX_JPEG_MESSAGE_DEINIT,
141    OMX_JPEG_MESSAGE_EVENT, //for event callback args contain event info
142    OMX_JPEG_MESSAGE_DECODED_IMAGE,
143    OMX_JPEG_MESSAGE_DECODE_DONE,
144
145}omx_jpeg_message;
146
147typedef enum omx_jpeg_image_type{
148  OMX_JPEG =0,
149  OMX_JPS,
150  OMX_MPO,
151
152}omx_jpeg_image_type;
153
154//message arg
155typedef union omx_jpeg_message_arg{
156    void * pValue;
157    int iValue;
158}omx_jpeg_message_arg;
159
160//message
161typedef struct omx_jpeg_queue_item{
162    omx_jpeg_message message;
163    omx_jpeg_message_arg args[3];
164
165}omx_jpeg_queue_item;
166
167
168typedef enum {
169    OMX_JPEG_QUEUE_COMMAND=0,
170    OMX_JPEG_QUEUE_ETB,
171    OMX_JPEG_QUEUE_FTB,
172    OMX_JPEG_QUEUE_ABORT,
173}omx_jpeg_queue_type;
174
175typedef struct omx_jpeg_queue{
176    omx_jpeg_queue_item container[OMX_JPEG_QUEUE_CAPACITY];
177    int front;
178    int back;
179    int size;
180    omx_jpeg_queue_type type;
181}omx_jpeg_queue;
182
183typedef struct omx_jpeg_message_queue{
184    omx_jpeg_queue command;
185    omx_jpeg_queue etb;
186    omx_jpeg_queue ftb;
187    omx_jpeg_queue abort;
188    pthread_mutex_t lock;
189    pthread_cond_t cond;
190    int messageCount;
191    int initialized;
192}omx_jpeg_message_queue;
193
194int omx_jpeg_queue_insert(omx_jpeg_queue* queue, omx_jpeg_queue_item * item);
195int omx_jpeg_queue_remove(omx_jpeg_queue * queue, omx_jpeg_queue_item* item);
196void omx_jpeg_message_queue_init(omx_jpeg_message_queue * queue);
197void omx_jpeg_queue_init(omx_jpeg_queue * queue);
198int omx_jpeg_queue_flush(omx_jpeg_queue * queue);
199//Common OMX Functions
200OMX_ERRORTYPE
201omx_component_image_init(OMX_IN OMX_HANDLETYPE hComp, OMX_IN OMX_STRING componentName);
202
203
204OMX_ERRORTYPE
205omx_component_image_get_version(OMX_IN OMX_HANDLETYPE               hComp,
206                             OMX_OUT OMX_STRING          componentName,
207                             OMX_OUT OMX_VERSIONTYPE* componentVersion,
208                             OMX_OUT OMX_VERSIONTYPE*      specVersion,
209                             OMX_OUT OMX_UUIDTYPE*       componentUUID);
210
211OMX_ERRORTYPE
212omx_component_image_send_command(OMX_IN OMX_HANDLETYPE hComp,
213                              OMX_IN OMX_COMMANDTYPE  cmd,
214                              OMX_IN OMX_U32       param1,
215                              OMX_IN OMX_PTR      cmdData);
216
217OMX_ERRORTYPE
218omx_component_image_get_parameter(OMX_IN OMX_HANDLETYPE     hComp,
219                               OMX_IN OMX_INDEXTYPE paramIndex,
220                               OMX_INOUT OMX_PTR     paramData);
221
222OMX_ERRORTYPE
223omx_component_image_set_parameter(OMX_IN OMX_HANDLETYPE     hComp,
224                               OMX_IN OMX_INDEXTYPE paramIndex,
225                               OMX_IN OMX_PTR        paramData);
226
227OMX_ERRORTYPE
228omx_component_image_get_config(OMX_IN OMX_HANDLETYPE      hComp,
229          OMX_IN OMX_INDEXTYPE configIndex,
230          OMX_INOUT OMX_PTR     configData);
231
232OMX_ERRORTYPE
233omx_component_image_set_config(OMX_IN OMX_HANDLETYPE      hComp,
234                            OMX_IN OMX_INDEXTYPE configIndex,
235                            OMX_IN OMX_PTR        configData);
236
237OMX_ERRORTYPE
238omx_component_image_get_extension_index(OMX_IN OMX_HANDLETYPE      hComp,
239                                     OMX_IN OMX_STRING      paramName,
240                                     OMX_OUT OMX_INDEXTYPE* indexType);
241
242OMX_ERRORTYPE
243omx_component_image_get_state(OMX_IN OMX_HANDLETYPE  hComp,
244                           OMX_OUT OMX_STATETYPE* state);
245
246OMX_ERRORTYPE
247omx_component_image_tunnel_request(OMX_IN OMX_HANDLETYPE                hComp,
248                                OMX_IN OMX_U32                        port,
249                                OMX_IN OMX_HANDLETYPE        peerComponent,
250                                OMX_IN OMX_U32                    peerPort,
251                                OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup);
252
253OMX_ERRORTYPE
254omx_component_image_use_buffer(OMX_IN OMX_HANDLETYPE                hComp,
255                            OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
256                            OMX_IN OMX_U32                        port,
257                            OMX_IN OMX_PTR                     appData,
258                            OMX_IN OMX_U32                       bytes,
259                            OMX_IN OMX_U8*                      buffer);
260
261
262OMX_ERRORTYPE
263omx_component_image_allocate_buffer(OMX_IN OMX_HANDLETYPE                hComp,
264                                 OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
265                                 OMX_IN OMX_U32                        port,
266                                 OMX_IN OMX_PTR                     appData,
267                                 OMX_IN OMX_U32                       bytes);
268
269OMX_ERRORTYPE
270omx_component_image_free_buffer(OMX_IN OMX_HANDLETYPE         hComp,
271                             OMX_IN OMX_U32                 port,
272                             OMX_IN OMX_BUFFERHEADERTYPE* buffer);
273
274OMX_ERRORTYPE
275omx_component_image_empty_this_buffer(OMX_IN OMX_HANDLETYPE         hComp,
276                                   OMX_IN OMX_BUFFERHEADERTYPE* buffer);
277
278OMX_ERRORTYPE
279omx_component_image_fill_this_buffer(OMX_IN OMX_HANDLETYPE         hComp,
280                                  OMX_IN OMX_BUFFERHEADERTYPE* buffer);
281
282OMX_ERRORTYPE
283omx_component_image_set_callbacks(OMX_IN OMX_HANDLETYPE        hComp,
284                               OMX_IN OMX_CALLBACKTYPE* callbacks,
285                               OMX_IN OMX_PTR             appData);
286
287OMX_ERRORTYPE
288omx_component_image_deinit(OMX_IN OMX_HANDLETYPE hComp);
289
290OMX_ERRORTYPE
291omx_component_image_use_EGL_image(OMX_IN OMX_HANDLETYPE                hComp,
292                               OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
293                               OMX_IN OMX_U32                        port,
294                               OMX_IN OMX_PTR                     appData,
295                               OMX_IN void*                      eglImage);
296
297OMX_ERRORTYPE
298omx_component_image_role_enum(OMX_IN OMX_HANDLETYPE hComp,
299                           OMX_OUT OMX_U8*        role,
300                           OMX_IN OMX_U32        index);
301
302#endif
303