1 /*
2  * Copyright (C) Texas Instruments - http://www.ti.com/
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19  */
20 /* =============================================================================
21 * Done            Texas Instruments OMAP(TM) Platform Software
22 *  (c) Copyright Texas Instruments, Incorporated.  All Rights Reserved.
23 *
24 *  Use of this software is controlled by the terms and conditions found
25 *  in the license agreement under which this software has been supplied.
26 * ============================================================================ */
27 /**
28 * @file OMX_JpegEnc_Utils.h
29 *
30 * This is a header file for a JPEG encoder that is fully
31 * compliant with the OMX Image specification.
32 * This the file that the application that uses OMX would include
33 * in its code.
34 *
35 * @path  $(CSLPATH)\inc
36 *
37 * @rev  0.1
38 */
39 /* -------------------------------------------------------------------------------- */
40 /* ================================================================================
41 *!
42 *! Revision History
43 *! ===================================
44 *!
45 *! 22-May-2006 mf: Revisions appear in reverse chronological order;
46 *! that is, newest first.  The date format is dd-Mon-yyyy.
47 * ================================================================================= */
48 
49 #ifndef OMX_JPEGENC_UTILS__H
50 #define OMX_JPEGENC_UTILS__H
51 #include <OMX_Component.h>
52 #include <OMX_IVCommon.h>
53 
54 
55 #ifndef UNDER_CE
56 #include <dlfcn.h>
57 #endif
58 #include "LCML_DspCodec.h"
59 #include "LCML_Types.h"
60 #include "LCML_CodecInterface.h"
61 #include <pthread.h>
62 #include <stdarg.h>
63 #include <OMX_Core.h>
64 #include <OMX_Types.h>
65 #include <OMX_Image.h>
66 #include<OMX_TI_Common.h>
67 #include <OMX_TI_Debug.h>
68 #ifdef RESOURCE_MANAGER_ENABLED
69 #include <ResourceManagerProxyAPI.h>
70 #endif
71 #include "OMX_JpegEnc_CustomCmd.h"
72 
73 #include <utils/Log.h>
74 #define LOG_TAG "OMX_JPGENC"
75 
76 #ifdef __PERF_INSTRUMENTATION__
77 #include "perf.h"
78 #endif
79 
80 #define OMX_JPEGENC_NonMIME 1
81 #define OMX_NOPORT 0xFFFFFFFE
82 #define JPEGE_TIMEOUT (100000)
83 #define NUM_OF_PORTS  2
84 #define NUM_OF_BUFFERSJPEG 4
85 
86 #define MAX_INPARAM_SIZE 1024
87 
88 #define COMP_MAX_NAMESIZE 127
89 
90 #define OMX_CustomCommandStopThread (OMX_CommandMax - 1)
91 
92 #define PADDING_128_BYTE	128
93 #define PADDING_256_BYTE	256
94 #define JPEGENC_THUMBNAIL_ABSENT_WARNING 4
95 
96 #ifdef UNDER_CE
97     #include <oaf_debug.h>
98 #endif
99 
100 #define KHRONOS_1_1
101 
102 #ifndef FUNC
103 #define FUNC 1
104 #endif
105 
106 #ifdef RESOURCE_MANAGER_ENABLED
107 #define JPEGENC1MPImage 1000000
108 #define JPEGENC2MPImage 2000000
109 #endif
110 
111 #define DSP_MMU_FAULT_HANDLING
112 
113 //JPEG Encoder Specific DSP Err Codes
114 #define IUALG_ERR_INSUFF_BUFFER 0x8401
115 
116 /*Linked List */
117 
118 typedef struct Node {
119     struct Node *pNextNode;
120     void *pValue;
121 } Node;
122 
123 typedef struct LinkedList {
124     Node *pRoot;
125     pthread_mutex_t lock;
126 }   LinkedList;
127 
128 LinkedList AllocList;
129 
130 void LinkedList_Create(LinkedList *LinkedList);
131 void LinkedList_AddElement(LinkedList *LinkedList, void *pValue);
132 void LinkedList_FreeElement(LinkedList *LinkedList, void *pValue);
133 void LinkedList_FreeAll(LinkedList *LinkedList);
134 void LinkedList_DisplayAll(LinkedList *LinkedList);
135 void LinkedList_Destroy(LinkedList *LinkedList);
136 
137 /*
138  *     M A C R O S
139  */
140 
141 #define OMX_CONF_INIT_STRUCT(_s_, _name_)   \
142     memset((_s_), 0x0, sizeof(_name_)); \
143     (_s_)->nSize = sizeof(_name_);      \
144     (_s_)->nVersion.s.nVersionMajor = 0x1;  \
145     (_s_)->nVersion.s.nVersionMinor = 0x0;  \
146     (_s_)->nVersion.s.nRevision = 0x0;      \
147     (_s_)->nVersion.s.nStep = 0x0
148 
149 #define OMX_CHECK_PARAM(_ptr_)  \
150 {   \
151     if(!_ptr_) {    \
152     eError = OMX_ErrorBadParameter; \
153     goto EXIT; \
154     }   \
155 }
156 
157 #define OMX_CONF_SET_ERROR_BAIL(_eError, _eCode)\
158 {                       \
159     _eError = _eCode;               \
160     goto OMX_CONF_CMD_BAIL;         \
161 }
162 
163 #define OMX_MALLOC(_pStruct_, _size_)   \
164     _pStruct_ = malloc(_size_);  \
165     if(_pStruct_ == NULL){  \
166         eError = OMX_ErrorInsufficientResources;    \
167         goto EXIT;  \
168     } \
169     memset(_pStruct_, 0, _size_);\
170     LinkedList_AddElement(&AllocList, _pStruct_);
171 
172 #define OMX_FREE(_ptr)   \
173 {                     \
174     if (_ptr != NULL) { \
175         LinkedList_FreeElement(&AllocList, _ptr);\
176         _ptr = NULL; \
177     }                \
178 }
179 
180 #define OMX_FREEALL()   \
181 {                     \
182         LinkedList_FreeAll(&AllocList);\
183 }
184 
185 #define OMX_MEMCPY_CHECK(_p_)\
186 {\
187     if (_p_ == NULL) { \
188     eError = OMX_ErrorInsufficientResources;  \
189     goto EXIT;   \
190     } \
191 }
192 
193 
194 #ifdef RESOURCE_MANAGER_ENABLED
195 #define OMX_GET_RM_VALUE(_Res_, _RM_, _dbg_) \
196 {   \
197     if ((_Res_) <= JPEGENC1MPImage){  \
198         (_RM_) = 30;  \
199         }   \
200     else {  \
201         (_RM_) = 60;  \
202         }   \
203     \
204         \
205     OMX_PRMGR2((_dbg_), "Value in MHz requested to RM = %d\n", (_RM_)); \
206 }
207 #endif
208 
209 typedef struct IDMJPGE_TIGEM_Comment {
210   OMX_U8 comment[256];
211   OMX_U16 commentLen;
212 } IDMJPGE_TIGEM_Comment;
213 
214 
215 typedef struct IIMGENC_DynamicParams {
216     OMX_U32 nSize;             /* nSize of this structure */
217     OMX_U32 nNumAU;            /* Number of Access unit to encode,
218                                   * set to XDM_DEFAULT in case of entire frame
219                                   */
220     OMX_U32 nInputChromaFormat;/* Input chroma format, Refer above comments regarding chroma                    */
221     OMX_U32 nInputHeight;       /* Input nHeight*/
222     OMX_U32 nInputWidth;        /* Input nWidth*/
223     OMX_U32 nCaptureWidth;      /* 0: use imagewidth as pitch, otherwise:
224                                    * use given display nWidth (if > imagewidth)
225                                    * for pitch.
226                                    */
227     OMX_U32 nGenerateHeader;    /* XDM_ENCODE_AU or XDM_GENERATE_HEADER */
228     OMX_U32 qValue;            /* Q value compression factor for encoder */
229 } IIMGENC_DynamicParams;
230 
231 
232   typedef struct IDMJPGE_TIGEM_CustomQuantTables
233   {
234     /* The array "lum_quant_tab" defines the quantization table for the luma component. */
235     OMX_U16 lum_quant_tab[64];
236     /* The array "chm_quant_tab" defines the quantization table for the chroma component.  */
237     OMX_U16 chm_quant_tab[64];
238   } IDMJPGE_TIGEM_CustomQuantTables;
239 
240 
241 typedef struct IDMJPGE_TIGEM_DynamicParams {
242     IIMGENC_DynamicParams  params;
243     OMX_U32 captureHeight;       /* if set to 0 use image height
244                                      else should set to actual Image height */
245     OMX_U32 DRI_Interval ;
246     JPEGENC_CUSTOM_HUFFMAN_TABLE *huffmanTable;
247     IDMJPGE_TIGEM_CustomQuantTables *quantTable;
248 } IDMJPGE_TIGEM_DynamicParams;
249 
250 /* PPLIB not needed if the the input to jpeg encoder is yuv. Uncomment the next line if PPLIB is needed */
251 /* #define __JPEG_OMX_PPLIB_ENABLED__ */
252 
253 #ifdef __JPEG_OMX_PPLIB_ENABLED__
254 #define OMX_JPEGENC_NUM_DLLS (5)
255 #else
256 #define OMX_JPEGENC_NUM_DLLS (4)
257 #endif
258 
259 
260 #ifdef UNDER_CE
261 #define JPEG_ENC_NODE_DLL "/windows/jpegenc_sn.dll64P"
262 #define JPEG_COMMON_DLL "/windows/usn.dll64P"
263 #define USN_DLL "/windows/usn.dll64P"
264 #define CONVERSIONS_DLL "/windows/conversions.dll64P"
265 	#ifdef __JPEG_OMX_PPLIB_ENABLED__
266 		#define PPLIB_DLL "/windows/postprocessor_dualout.dll64P"
267 	#endif
268 #else
269 #define JPEG_ENC_NODE_DLL "jpegenc_sn.dll64P"
270 #define JPEG_COMMON_DLL "usn.dll64P"
271 #define USN_DLL "usn.dll64P"
272 #define CONVERSIONS_DLL "conversions.dll64P"
273 	#ifdef __JPEG_OMX_PPLIB_ENABLED__
274 		#define PPLIB_DLL "postprocessor_dualout.dll64P"
275 	#endif
276 #endif
277 
278 #define JPGENC_SNTEST_STRMCNT          2
279 #define JPGENC_SNTEST_INSTRMID         0
280 #define JPGENC_SNTEST_OUTSTRMID        1
281 #define JPGENC_SNTEST_ARGLENGTH        20
282 #define JPGENC_SNTEST_INBUFCNT         4
283 #define JPGENC_SNTEST_OUTBUFCNT        4
284 #define JPGENC_SNTEST_MAX_HEIGHT       4096
285 #define JPGENC_SNTEST_MAX_WIDTH        4096
286 #define JPGENC_SNTEST_PROG_FLAG        1
287 #define M_COM   0xFE            /* COMment  */
288 
289 #define JPEGE_DSPSTOP       0x01
290 #define JPEGE_BUFFERBACK    0x02
291 #define JPEGE_IDLEREADY     ( JPEGE_DSPSTOP | JPEGE_BUFFERBACK )
292 
293 typedef enum Content_Type
294 {
295     APP0_BUFFER = 0,
296     APP1_BUFFER,
297     APP13_BUFFER,
298     COMMENT_BUFFER,
299     APP0_NUMBUF,
300     APP1_NUMBUF,
301     APP13_NUMBUF,
302     COMMENT_NUMBUF,
303     APP0_THUMB_H,
304     APP0_THUMB_W,
305     APP1_THUMB_H,
306     APP1_THUMB_W,
307     APP13_THUMB_H,
308     APP13_THUMB_W,
309     APP0_THUMB_INDEX,
310     APP1_THUMB_INDEX,
311     APP13_THUMB_INDEX,
312     DYNPARAMS_HUFFMANTABLE,
313     DYNPARAMS_QUANTTABLE,
314     APP5_BUFFER,
315     APP5_NUMBUF,
316     APP5_THUMB_H,
317     APP5_THUMB_W,
318     APP5_THUMB_INDEX
319 } Content_Type;
320 
321 /*This enum must not be changed.  */
322 typedef enum JPEG_PORT_TYPE_INDEX
323     {
324     JPEGENC_INP_PORT,
325     JPEGENC_OUT_PORT
326 }JPEG_PORT_TYPE_INDEX;
327 
328 typedef enum JPEGENC_BUFFER_OWNER {
329     JPEGENC_BUFFER_CLIENT = 0x0,
330     JPEGENC_BUFFER_COMPONENT_IN,
331     JPEGENC_BUFFER_COMPONENT_OUT,
332     JPEGENC_BUFFER_DSP,
333     JPEGENC_BUFFER_TUNNEL_COMPONENT
334 } JPEGENC_BUFFER_OWNER;
335 
336 typedef struct _JPEGENC_BUFFERFLAG_TRACK {
337     OMX_U32 flag;
338     OMX_U32 buffer_id;
339     OMX_HANDLETYPE hMarkTargetComponent;
340     OMX_PTR pMarkData;
341 } JPEGENC_BUFFERFLAG_TRACK;
342 
343 typedef struct _JPEGENC_BUFFERMARK_TRACK {
344     OMX_U32 buffer_id;
345     OMX_HANDLETYPE hMarkTargetComponent;
346     OMX_PTR pMarkData;
347 } JPEGENC_BUFFERMARK_TRACK;
348 
349 typedef struct JPEGENC_BUFFER_PRIVATE {
350     OMX_BUFFERHEADERTYPE* pBufferHdr;
351     JPEGENC_BUFFER_OWNER eBufferOwner;
352     OMX_BOOL bAllocByComponent;
353     OMX_BOOL bReadFromPipe;
354 } JPEGENC_BUFFER_PRIVATE;
355 
356 typedef struct JPEG_PORT_TYPE   {
357     OMX_HANDLETYPE hTunnelComponent;
358     OMX_U32 nTunnelPort;
359     JPEGENC_BUFFER_PRIVATE* pBufferPrivate[NUM_OF_BUFFERSJPEG];
360     JPEGENC_BUFFERFLAG_TRACK sBufferFlagTrack[NUM_OF_BUFFERSJPEG];
361     JPEGENC_BUFFERMARK_TRACK sBufferMarkTrack[NUM_OF_BUFFERSJPEG];
362     OMX_PARAM_PORTDEFINITIONTYPE* pPortDef;
363     OMX_BUFFERSUPPLIERTYPE pBufSupplier;
364     OMX_PARAM_BUFFERSUPPLIERTYPE* pParamBufSupplier;
365     OMX_IMAGE_PARAM_PORTFORMATTYPE* pPortFormat;
366     OMX_U8 nBuffCount;
367 }JPEG_PORT_TYPE;
368 
369 typedef struct JPEGE_INPUT_PARAMS {
370     OMX_U32 *pInParams;
371     OMX_U32 size;
372 } JPEGE_INPUT_PARAMS;
373 
374 typedef struct _JPEGENC_CUSTOM_PARAM_DEFINITION {
375     OMX_U8 cCustomParamName[128];
376     OMX_INDEXTYPE nCustomParamIndex;
377 } JPEGENC_CUSTOM_PARAM_DEFINITION;
378 
379 typedef struct JPEGENC_COMPONENT_PRIVATE
380 {
381     JPEG_PORT_TYPE* pCompPort[NUM_OF_PORTS];
382     OMX_PORT_PARAM_TYPE* pPortParamType;
383     OMX_PORT_PARAM_TYPE* pPortParamTypeAudio;
384     OMX_PORT_PARAM_TYPE* pPortParamTypeVideo;
385     OMX_PORT_PARAM_TYPE* pPortParamTypeOthers;
386     OMX_PRIORITYMGMTTYPE* pPriorityMgmt;
387     OMX_CALLBACKTYPE cbInfo;
388     OMX_IMAGE_PARAM_QFACTORTYPE* pQualityfactor;
389     OMX_CONFIG_RECTTYPE  *pCrop;
390     /** This is component handle */
391     OMX_COMPONENTTYPE* pHandle;
392     /*Comonent Name& Version*/
393     OMX_STRING cComponentName;
394     OMX_VERSIONTYPE ComponentVersion;
395     OMX_VERSIONTYPE SpecVersion;
396 
397     /** Current state of this component */
398     OMX_STATETYPE   nCurState;
399     OMX_STATETYPE   nToState;
400     OMX_U8          ExeToIdleFlag;  /* StateCheck */
401 
402     OMX_U32 nInPortIn;
403     OMX_U32 nInPortOut;
404     OMX_U32 nOutPortIn;
405     OMX_U32 nOutPortOut;
406     OMX_BOOL bInportDisableIncomplete;
407     OMX_BOOL bOutportDisableIncomplete;
408     OMX_BOOL bSetLumaQuantizationTable;
409     OMX_BOOL bSetChromaQuantizationTable;
410     OMX_BOOL bSetHuffmanTable;
411 	OMX_BOOL bConvert420pTo422i;
412 	OMX_BOOL bPPLibEnable;
413     OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE *pCustomLumaQuantTable;
414     OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE *pCustomChromaQuantTable;
415     JPEGENC_CUSTOM_HUFFMANTTABLETYPE *pHuffmanTable;
416 
417 
418     /** The component thread handle */
419     pthread_t ComponentThread;
420     /** The pipes to maintain free buffers */
421     int free_outBuf_Q[2];
422     /** The pipes to maintain input buffers sent from app*/
423     int filled_inpBuf_Q[2];
424     /** The pipes for sending buffers to the thread */
425     int nCmdPipe[2];
426     int nCmdDataPipe[2];
427     OMX_U32 nApp_nBuf;
428     short int nNum_dspBuf;
429     int nCommentFlag;
430     OMX_U8 *pString_Comment;
431     JPEG_APPTHUMB_MARKER sAPP0;
432     JPEG_APPTHUMB_MARKER sAPP1;
433     JPEG_APPTHUMB_MARKER sAPP5;
434     JPEG_APP13_MARKER sAPP13;
435     JPEGE_INPUT_PARAMS InParams;
436 #ifdef __JPEG_OMX_PPLIB_ENABLED__
437     OMX_U32 *pOutParams;
438 #endif
439 #ifdef RESOURCE_MANAGER_ENABLED
440     RMPROXY_CALLBACKTYPE rmproxyCallback;
441 #endif
442     OMX_BOOL bPreempted;
443     int nFlags;
444     int nMarkPort;
445     OMX_PTR pMarkData;
446     OMX_HANDLETYPE hMarkTargetComponent;
447     OMX_BOOL bDSPStopAck;
448    OMX_BOOL bFlushComplete;
449     OMX_BOOL bAckFromSetStatus;
450     void* pLcmlHandle;   /* Review Utils.c */
451     int isLCMLActive;
452     LCML_DSP_INTERFACE* pLCML;
453     void * pDllHandle;
454     OMX_U8 nDRI_Interval;
455 #ifdef KHRONOS_1_1
456     OMX_PARAM_COMPONENTROLETYPE componentRole;
457 #endif
458     IDMJPGE_TIGEM_DynamicParams *pDynParams;
459 
460     pthread_mutex_t jpege_mutex;
461     pthread_cond_t  stop_cond;
462     pthread_cond_t  flush_cond;
463     /* pthread_cond_t  control_cond; */
464     pthread_mutex_t jpege_mutex_app;
465     pthread_cond_t  populate_cond;
466     pthread_cond_t  unpopulate_cond;
467 
468 
469 #ifdef __PERF_INSTRUMENTATION__
470     PERF_OBJHANDLE pPERF, pPERFcomp;
471 #endif
472     struct OMX_TI_Debug dbg;
473 
474     /* Reference count for pending state change requests */
475     OMX_U32 nPendingStateChangeRequests;
476     pthread_mutex_t mutexStateChangeRequest;
477     pthread_cond_t StateChangeCondition;
478 
479 } JPEGENC_COMPONENT_PRIVATE;
480 
481 
482 OMX_ERRORTYPE HandleJpegEncCommand (JPEGENC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U32 nParam1);
483 OMX_ERRORTYPE JpegEncDisablePort(JPEGENC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U32 nParam1);
484 OMX_ERRORTYPE JpegEncEnablePort(JPEGENC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U32 nParam1);
485 OMX_ERRORTYPE HandleJpegEncCommandFlush(JPEGENC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U32 nParam1);
486 OMX_ERRORTYPE JPEGEnc_Start_ComponentThread(OMX_HANDLETYPE pHandle);
487 OMX_ERRORTYPE HandleJpegEncDataBuf_FromApp(JPEGENC_COMPONENT_PRIVATE *pComponentPrivate );
488 OMX_ERRORTYPE HandleJpegEncDataBuf_FromDsp( JPEGENC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE* pBuffHead );
489 OMX_ERRORTYPE HandleJpegEncFreeDataBuf( JPEGENC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE* pBuffHead );
490 OMX_ERRORTYPE HandleJpegEncFreeOutputBufferFromApp( JPEGENC_COMPONENT_PRIVATE *pComponentPrivate );
491 OMX_ERRORTYPE AllocJpegEncResources( JPEGENC_COMPONENT_PRIVATE *pComponentPrivate );
492 OMX_ERRORTYPE JPEGEnc_Free_ComponentResources(JPEGENC_COMPONENT_PRIVATE *pComponentPrivate);
493 OMX_ERRORTYPE Fill_JpegEncLCMLInitParams(LCML_DSP *lcml_dsp, OMX_U16 arr[], OMX_HANDLETYPE pComponent);
494 OMX_ERRORTYPE GetJpegEncLCMLHandle(OMX_HANDLETYPE pComponent);
495 OMX_ERRORTYPE SetJpegEncInParams(JPEGENC_COMPONENT_PRIVATE *pComponentPrivate);
496 OMX_ERRORTYPE SendDynamicParam(JPEGENC_COMPONENT_PRIVATE *pComponentPrivate);
497 OMX_BOOL IsTIOMXComponent(OMX_HANDLETYPE hComp);
498 
499 #ifdef __JPEG_OMX_PPLIB_ENABLED__
500 #define JPEGENC_PPLIB_CREATEPARAM_SIZE 28
501 #define JPEGENC_PPLIB_DYNPARM_SIZE 252
502 OMX_ERRORTYPE SendDynamicPPLibParam(JPEGENC_COMPONENT_PRIVATE *pComponentPrivate,OMX_U32 *ptInputParam);
503 
504 
505 
506 typedef struct _PPLIB_UALGRunTimeParam_t
507 {
508     OMX_U32 size;                            /**< Size of the structure in bytes. */
509     OMX_U32 ulInWidth;                       /**< Input picture buffer width.  This value should be the same as the original decoded output width of the WMV9/VC1 stream. */
510     OMX_U32 ulInHeight;                      /**< Input picture buffer height.  This value should be the same as the original decoded output height of the WMV9/VC1 stream. */
511     OMX_U32 ulFrameEnabled[2];               /**< It is possible to run the VGPOP twice with two separate sets of configuration parameters using PPLIB.  This parameter specifies whether each set of configuration parameters is to be used when running PPLIB for this particular frame. */
512     OMX_U32 ulEnableYUVOutput[2];            /**< Flag to enable YUV output */
513     OMX_U32 ulEnableRGBOutput[2];            /**< Flag to enable RGB output. */
514     OMX_U32 ulFrameInputStartYOffset[2];     /**< Offset from the start of the input buffer where the input Y data is located.  You can specify a different offset for each set of VGPOP parameters.  In most cases, this will be 0. */
515     OMX_U32 ulFrameInputStartCOffset[2];     /**< Offset from the start of the input buffer where the input CrCb data is located.  You can specify a different offset for each set of VGPOP parameters.  In most cases, this will be the same as (input width * input height) + Y offset. */
516     OMX_U32 ulFrameOutputStartYOffset[2];    /**< Offset from the start of the output buffer where the output Y data should be placed.  You can specify a different offset for each set of VGPOP parameters. */
517     OMX_U32 ulFrameOutputStartCOffset[2];    /**< Offset from the start of the output buffer where the output CrCb data should be placed.  You can specify a different offset for each set of VGPOP parameters.  In most cases, this will be the same as (output width * output height) + Y offset. */
518     OMX_U32 ulFrameOutputRGBOffset[2];       /**< Offset from the start of the output buffer where the output RGB data is located.  You can specify a different offset for each set of VGPOP parameters.  In most cases, this will be 0. */
519     OMX_U32 ulFrameOutputHeight[2];          /**< Output picture buffer height for each VGPOP parameter set.*/
520     OMX_U32 ulFrameOutputWidth[2];           /**< Output picture buffer width for each VGPOP parameter set. */
521     OMX_U32 ulFrameContrast[2];              /**< Contrast Method for each VGPOP parameter set */
522     OMX_U32 ulFrameInXStart[2];              /**< Horizontal cropping start position in the input buffer.  Set to 0 if no cropping is desired. */
523     OMX_U32 ulFrameInYStart[2];              /**< Vertical cropping start position in the input buffer.  Set to 0 if no cropping is desired.*/
524     OMX_U32 ulFrameInXSize[2];               /**< Horizontal cropping width.  Set to 0 if no cropping is desired */
525     OMX_U32 ulFrameInYSize[2];               /**< Vertical cropping height.  Set to 0 if no cropping is desired.*/
526     OMX_U32 ulFrameZoomFactor[2];            /**< Zooming ratio value, where ulZoomFactor = (Desired Zoom Ratio * 1024).  Set to 1024 if no zooming is desired.  Set above 1024 to enable zooming. */
527     OMX_U32 ulFrameZoomLimit[2];             /**< Zooming ratio limit, where ulZoomLimit=(Desired Zoom Limit * 1024).*/
528     OMX_U32 ulFrameZoomSpeed[2];             /**< Speed of ratio change.  Set to 0 to disable zoom variation.  The variation speed is proportional to the value while the direction (in/out) is given by the sign.*/
529     OMX_U32 ulFrameEnableLightChroma[2];     /**< Light chrominance process.  */
530     OMX_U32 ulFrameEnableAspectRatioLock[2]; /**< Locked H/V ratio */
531     OMX_U32 ulFrameEnableMirroring[2];       /**< To mirror the picture: */
532     OMX_U32 ulFrameRGBRotation[2];           /**< Rotation to apply to RGB Output. May be set to 0, 90, 180 or 270.*/
533     OMX_U32 ulFrameYUVRotation[2];           /**< Rotation to apply to YUV Output. May be set to 0, 90, 180, or 270*/
534     OMX_U32 ulFrameIORange[2];               /**< IO Video Range.   */
535     OMX_U32 ulFrameEnableDithering[2];       /**< Dithering Enable */
536     OMX_U32 ulFrameOutputPitch[2];           /**< Enable an output pitch */
537     OMX_U32 ulAlphaRGB[2];                   /**< This is the default alpha values for ARGB32 or RGBA32. */
538     OMX_U32 ulIsFrameGenerated[2];           /**< Flag to notify the user if a frame has been generated */
539     OMX_U32 ulYUVFrameSize[2];               /**< YUV output size in bytes */
540     OMX_U32 ulRGBFrameSize[2];               /**< RGB output size in bytes. */
541 } PPLIB_UALGRunTimeParam_t;
542 
543 
544 
545 #endif
546 
547 typedef OMX_ERRORTYPE (*fpo)(OMX_HANDLETYPE);
548 
549 static const struct DSP_UUID JPEGESOCKET_TI_UUID = {
550     0xCB70C0C1, 0x4C85, 0x11D6, 0xB1, 0x05, {
551         0x00, 0xC0, 0x4F, 0x32, 0x90, 0x31
552     }
553 };
554 
555 
556 static const struct DSP_UUID USN_UUID = {
557     0x79A3C8B3, 0x95F2, 0x403F, 0x9A, 0x4B, {
558         0xCF, 0x80, 0x57, 0x73, 0x05, 0x41
559     }
560 };
561 
562 static const struct DSP_UUID CONVERSIONS_UUID = {
563 	0x722DD0DA, 0xF532, 0x4238, 0xB8, 0x46, {
564 		0xAB, 0xFF, 0x5D, 0xA4, 0xBA, 0x02
565 	}
566 };
567 
568 #ifdef __JPEG_OMX_PPLIB_ENABLED__
569 static const struct DSP_UUID PPLIB_UUID = {
570 	0xFC8CF948, 0xD3E9, 0x4B65, 0xBC, 0xA7, {
571 	0x08, 0x2E, 0xA0, 0xAD, 0x86, 0xF0
572     }
573 };
574 #endif
575 void* OMX_JpegEnc_Thread (void* pThreadData);
576 
577 typedef enum ThrCmdType
578 {
579     SetState,
580     Flush,
581     StopPort,
582     RestartPort,
583     MarkBuf,
584     Start,
585     Stop,
586     FillBuf,
587     EmptyBuf
588 } ThrCmdType;
589 
590 typedef enum OMX_JPEGE_INDEXTYPE  {
591 
592     OMX_IndexCustomCommentFlag = 0xFF000001,
593     OMX_IndexCustomCommentString = 0xFF000002,
594     OMX_IndexCustomInputFrameWidth,
595     OMX_IndexCustomInputFrameHeight,
596     OMX_IndexCustomAPP0,
597     OMX_IndexCustomAPP1,
598     OMX_IndexCustomAPP5,
599     OMX_IndexCustomAPP13,
600     OMX_IndexCustomQFactor,
601     OMX_IndexCustomDRI,
602     OMX_IndexCustomHuffmanTable,
603     OMX_IndexCustomDebug,
604 	OMX_IndexCustomColorFormatConvertion_420pTo422i,
605 	OMX_IndexCustomPPLibEnable
606 }OMX_INDEXIMAGETYPE;
607 
608 typedef struct IUALG_Buf {
609     OMX_PTR            pBufAddr;
610     unsigned long          ulBufSize;
611     OMX_PTR            pParamAddr;
612     unsigned long        ulParamSize;
613     unsigned long          ulBufSizeUsed;
614     //IUALG_BufState tBufState;
615     OMX_BOOL           bBufActive;
616     OMX_U32          unBufID;
617     unsigned long          ulReserved;
618 } IUALG_Buf;
619 
620 typedef enum {
621     IUALG_CMD_STOP             = 0,
622     IUALG_CMD_PAUSE            = 1,
623     IUALG_CMD_GETSTATUS        = 2,
624     IUALG_CMD_SETSTATUS        = 3,
625     IUALG_CMD_USERSETCMDSTART  = 100,
626     IUALG_CMD_USERGETCMDSTART  = 150,
627     IUALG_CMD_FLUSH            = 0x100
628 }IUALG_Cmd;
629 
630 OMX_ERRORTYPE AddStateTransition(JPEGENC_COMPONENT_PRIVATE* pComponentPrivate);
631 OMX_ERRORTYPE RemoveStateTransition(JPEGENC_COMPONENT_PRIVATE* pComponentPrivate, OMX_BOOL bEnableSignal);
632 
633 #endif /*OMX_JPEGENC_UTILS__H*/
634