1
2/*
3 *  Copyright 2001-2008 Texas Instruments - http://www.ti.com/
4 *
5 *  Licensed under the Apache License, Version 2.0 (the "License");
6 *  you may not use this file except in compliance with the License.
7 *  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17/* ====================================================================
18*             Texas Instruments OMAP(TM) Platform Software
19* (c) Copyright Texas Instruments, Incorporated. All Rights Reserved.
20*
21* Use of this software is controlled by the terms and conditions found
22* in the license agreement under which this software has been supplied.
23* ==================================================================== */
24/**
25* @file JPEGTestEnc.c
26*
27* This file implements OMX Component for JPEG encoder that
28* is fully compliant with the OMX specification 1.5.
29*
30* @path  $(CSLPATH)\src
31*
32* @rev  0.1
33*/
34/* -------------------------------------------------------------------------------- */
35/* ================================================================================
36*!
37*! Revision History
38*! ===================================
39*!
40*! 22-May-2006 mf: Revisions appear in reverse chronological order;
41*! that is, newest first.  The date format is dd-Mon-yyyy.
42* ================================================================================= */
43
44/*utilities includes */
45#ifdef UNDER_CE
46#include <windows.h>
47#endif
48#include <stdio.h>
49#include <stdlib.h>
50#include <stdarg.h>
51#include <string.h>
52#include <sched.h>
53#include <unistd.h>
54#include <sys/types.h>
55#include <sys/select.h>
56#include <time.h>
57//#include <mcheck.h>
58#include <getopt.h>
59#include <signal.h>
60
61/* OMX includes */
62#include <OMX_Component.h>
63#include "OMX_JpegEnc_CustomCmd.h"
64#include "JPEGTestEnc.h"
65#include "OMX_JpegEnc_Utils.h"
66
67/* DSP recovery includes */
68#include <qosregistry.h>
69#include <qosti.h>
70#include <dbapi.h>
71#include <DSPManager.h>
72#include <DSPProcessor.h>
73#include <DSPProcessor_OEM.h>
74
75#define STRESS
76#define NSTRESSCASES 1
77#define STRESSMULTILOAD 1
78#define NUM_OF_PORTS  2
79#define NUM_OF_BUFFERSJPEG 1
80
81#ifdef UNDER_CE
82OMX_STRING StrJpegEncoder= "OMX.TI.IMAGE.JPEG.ENC";
83#else
84 OMX_STRING StrJpegEncoder= "OMX.TI.JPEG.Encoder";
85#endif
86
87OMX_U8 APPLICATION1_NOTHUMB[]={
88
89/* 0 */0, 0, 0, 0, 0x45, 0x78, 0x69, 0x66, 0x00, 0x00,      /* Indicate Exif Data*/
90
91/* 10 */ 0x49, 0x49,                                                  /* "Intel" type byte align*/
92
930x2A, 0x00,                                             /* Confirm "Intel" type byte align*/
94
95/* 14 */ 0x08, 0x00, 0x00, 0x00,            /* Offset to first IFDc*/
96
970x06, 0x00,                     /* Number of IFD as 1*/
98
99/* 21 */0x0f, 0x01,                     /* TAG: Make*/
100
1010x02, 0x00,                    /* Type: Data format is 0x0002, ASCII */
102
1030x0c, 0x00, 0x00, 0x00,  /* Count: number of chars*/
104
1050x56, 0x00, 0x00, 0x00, /* Offset Make data*/
106
107/* 33 */0x10, 0x01,                     /* TAG: Model*/
108
1090x02, 0x00,                    /* Type: Data format is 0x0002, ASCII */
110
1110x05, 0x00, 0x00, 0x00,  /* Count: number of chars*/
112
1130x62, 0x00, 0x00, 0x00, /* Offset Model data*/
114
115/*45*/0x12, 0x01,                     /* TAG: Orientation*/
116
1170x03, 0x00,                    /* Type: Data format is 0x0003,  (short)*/
118
1190x01, 0x00, 0x00, 0x00,  /* Count: number of chars*/
120
1210x01, 0x00, 0x00, 0x00, /* 1 means normal orientation*/
122
123/*57*/0x31, 0x01,                     /* TAG: Software*/
124
1250x02, 0x00,                    /* Type: ASCII*/
126
1270x08, 0x00, 0x00, 0x00,  /* Count: number of chars*/
128
1290x67, 0x00, 0x00, 0x00, /* Offset*/
130
131/*69*/0x3b, 0x01,                     /* TAG: Artist*/
132
1330x02, 0x00,                    /* Type: ASCII*/
134
1350x09, 0x00, 0x00, 0x00,  /* Count: number of chars*/
136
1370x6f, 0x00, 0x00, 0x00, /* Offset*/
138
139/* 81 */0x69, 0x87,                     /* Exif SubIFD*/
140
141/* 83 */ 0x04, 0x00,                    /* Data format is 0x0004, ULInt*/
142
1430x01, 0x00,  0x00, 0x00,            /* number of components is 1.*/
144
145/*long integer data size is 4bytes/components, so total data length is 1x4=4bytes*/
146
147/* 89 */ 0x78, 0x00,0x00, 0x00,             /* Offset of Exif data*/
148
149/*93*/0x9E, 0x00,  0x00, 0x00,    /* Offset to next IFD. As we are saying only one directory( Number of IFD as 1) this indicate the offset of next IFD*/
150
151/*97*/0x53, 0x61, 0x73, 0x6b, 0x65, 0x6e, 0x20, 0x26, 0x20, 0x54, 0x49, 0x00, /*Make*/
152
153/*109*/0x4f, 0x4d, 0x41, 0x50,0x00, /*Model*/
154
155/*114*/0x4f, 0x70, 0x65, 0x6e, 0x4d, 0x61, 0x78, 0x00, /*Software*/
156
157/*122*/0x47, 0x65, 0x6f, 0x72, 0x67, 0x65, 0x20, 0x53, 0x00, /*Artist*/
158
159/* exif ub-ID start Here */
160
161/* 131 */ 0x03,  0x00,   /* Number of Exif ID*/
162
1630x00, 0x90, /* Exif Version*/
164
1650x07, 0x00,     /*Data format is 0x0007, undefined*/
166
1670x04, 0x00, 0x00, 0x00,         /* number of components is 4.*/
168
169/*Undefined data size is   1bytes/components, so total data length is 4x1=4bytes*/
170
1710x30, 0x32, 0x32, 0x30, /* Exif version number 30 32 32 30 meaning 0220 (2.2)*/
172
173/* next IFD start Here */
174
175/*169*/0x03,  0x00,    /* Number of IFD1*/
176
177/*171*/0x03,  0x01,    /* Compression  (0x0103)*/
178
1790x03, 0x00,                     /*Data format is 0x0003 unsigned short,*/
180
1810x01, 0x00,  0x00, 0x00,            /* number of components is 1.*/
182
183/*unsigned short  data size is 2bytes/components, so total data length is 1x2=2bytes*/
184
185/*183*/            0x01,  0x02,    /* JpegIFOffset  (0x0201)*/
186
187                        0x04, 0x00,                     /* Data format is 0x0004, ULInt*/
188
189                        0x01, 0x00,  0x00, 0x00,            /* number of components is 1.*/
190
191/*195*/            0x02,  0x02,    /* JpegIFByteCount (0x0202)*/
192
193                        0x04, 0x00,                     /* Data format is 0x0004, ULInt*/
194
195                        0x01, 0x00,  0x00, 0x00,            /* number of components is 1.*/
196
197/*203*/            0xff, 0xff,0xff, 0xff,  /* Legth of thumbnail data*/
198
199};
200
201OMX_U8 APPLICATION1_THUMB[]={
202/* 0 */0, 0, 0, 0, 0x45, 0x78, 0x69, 0x66, 0x00, 0x00,      /* Indicate Exif Data*/
203/* 10 */ 0x49, 0x49,                                                  /* "Intel" type byte align*/
2040x2A, 0x00,                                             /* Confirm "Intel" type byte align*/
205/* 14 */ 0x08, 0x00, 0x00, 0x00,            /* Offset to first IFDc*/
2060x06, 0x00,                     /* Number of IFD as 1*/
207
208/* 21 */0x0f, 0x01,                     /* TAG: Make*/
2090x02, 0x00,                    /* Type: Data format is 0x0002, ASCII */
2100x0c, 0x00, 0x00, 0x00,  /* Count: number of chars*/
2110x56, 0x00, 0x00, 0x00, /* Offset Make data*/
212
213/* 33 */0x10, 0x01,                     /* TAG: Model*/
2140x02, 0x00,                    /* Type: Data format is 0x0002, ASCII */
2150x05, 0x00, 0x00, 0x00,  /* Count: number of chars*/
2160x62, 0x00, 0x00, 0x00, /* Offset Model data*/
217
218/*45*/0x12, 0x01,                     /* TAG: Orientation*/
2190x03, 0x00,                    /* Type: Data format is 0x0003,  (short)*/
2200x01, 0x00, 0x00, 0x00,  /* Count: number of chars*/
2210x01, 0x00, 0x00, 0x00, /* 1 means normal orientation*/
222
223/*57*/0x31, 0x01,                     /* TAG: Software*/
2240x02, 0x00,                    /* Type: ASCII*/
2250x08, 0x00, 0x00, 0x00,  /* Count: number of chars*/
2260x67, 0x00, 0x00, 0x00, /* Offset*/
227
228/*69*/0x3b, 0x01,                     /* TAG: Artist*/
2290x02, 0x00,                    /* Type: ASCII*/
2300x09, 0x00, 0x00, 0x00,  /* Count: number of chars*/
2310x6f, 0x00, 0x00, 0x00, /* Offset*/
232
233
234/* 81 */0x69, 0x87,                     /* Exif SubIFD*/
235/* 83 */ 0x04, 0x00,                    /* Data format is 0x0004, ULInt*/
2360x01, 0x00,  0x00, 0x00,            /* number of components is 1.*/
237/*long integer data size is 4bytes/components, so total data length is 1x4=4bytes*/
238/* 89 */ 0x78, 0x00,0x00, 0x00,             /* Offset of Exif data*/
239
240/*93*/0x9E, 0x00,  0x00, 0x00,    /* Offset to next IFD. As we are saying only one directory( Number of IFD as 1) this indicate the offset of next IFD*/
241
242/*97*/0x53, 0x61, 0x73, 0x6b, 0x65, 0x6e, 0x20, 0x26, 0x20, 0x54, 0x49, 0x00, /*Make*/
243
244/*109*/0x4f, 0x4d, 0x41, 0x50,0x00, /*Model*/
245
246/*114*/0x4f, 0x70, 0x65, 0x6e, 0x4d, 0x61, 0x78, 0x00, /*Software*/
247
248/*122*/0x47, 0x65, 0x6f, 0x72, 0x67, 0x65, 0x20, 0x53, 0x00, /*Artist*/
249
250/* exif ub-ID start Here */
251/* 131 */ 0x03,  0x00,   /* Number of Exif ID*/
2520x00, 0x90, /* Exif Version*/
2530x07, 0x00,     /*Data format is 0x0007, undefined*/
2540x04, 0x00, 0x00, 0x00,         /* number of components is 4.*/
255/*Undefined data size is   1bytes/components, so total data length is 4x1=4bytes*/
2560x30, 0x32, 0x32, 0x30, /* Exif version number 30 32 32 30 meaning 0220 (2.2)*/
257
258/*145*/0x02,  0xA0,    /* Exif Image Width  (0xA002)*/
2590x04, 0x00,                     /* Data format is 0x0004, ULInt*/
2600x01, 0x00,  0x00, 0x00,            /* number of components is 1.*/
261/* 153 */ 0xB0, 0x00,0x00, 0x00,     /* Image width  , 0x00000280 i.e. 640*/
262
263/*157*/0x03,  0xA0,    /* Exif Image Width  (0xA003)*/
2640x04, 0x00,                     /* Data format is 0x0004, ULInt*/
2650x01, 0x00,  0x00, 0x00,            /* number of components is 1.*/
266/* 165 */ 0x90, 0x00,0x00, 0x00,     /* Image Height  , 0x000001E0 i.e. 480*/
267
268
269
270/* next IFD start Here */
271/*169*/0x03,  0x00,    /* Number of IFD1*/
272/*171*/0x03,  0x01,    /* Compression  (0x0103)*/
2730x03, 0x00,                     /*Data format is 0x0003 unsigned short,*/
2740x01, 0x00,  0x00, 0x00,            /* number of components is 1.*/
275/*unsigned short  data size is 2bytes/components, so total data length is 1x2=2bytes*/
276
2770x06, 0x00,0x00, 0x00,  /* '6' means JPEG compression.*/
278                        /*Shows compression method.
279                        o   '1' means no compression,
280                        o    '6' means JPEG compression.*/
281
282/*183*/            0x01,  0x02,    /* JpegIFOffset  (0x0201)*/
283                        0x04, 0x00,                     /* Data format is 0x0004, ULInt*/
284                        0x01, 0x00,  0x00, 0x00,            /* number of components is 1.*/
285/*191*/            0xc4, 0x00,0x00, 0x00,  /* Address 0f Thumbnail data*/
286
287/*195*/            0x02,  0x02,    /* JpegIFByteCount (0x0202)*/
288                        0x04, 0x00,                     /* Data format is 0x0004, ULInt*/
289                        0x01, 0x00,  0x00, 0x00,            /* number of components is 1.*/
290/*203*/            0xff, 0xff,0xff, 0xff,  /* Legth of thumbnail data*/
291};
292
293/*Set the fist 4 bytes to 0*/
294OMX_U8 APPLICATION13[200] = {
295    0x00, 0x00, 0x00, 0x00, /*We should set the first 4 bytes to 0 */
296    0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x33, 0x2e, 0x30, 0x00,/*Photoshop header*/
297    0x38, 0x42, 0x49, 0x4d, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
298    0x4e, /* Initial marker*/
299    /*IPTC Marker       TAG         Size of string*/
300    0x1c,      0x02,       0x78,       0x00, 0x20,
301    0x54, 0x68, 0x69, 0x73,  0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, /*String of data (ASCII)*/
302    0x1c, 0x02, 0x7a, 0x00, 0x16,
303    0x49, 0x27,0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72,
304    0x1c, 0x02, 0x5a, 0x00, 0x09,
305    0x4d, 0x6f, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x65, 0x79,
306
307};
308
309OMX_U8 APPLICATION0[19]={0, 0, 0, 0,
310	0x4A, 0x46, 0x49, 0x46, 0x00, // JFIF Identifier
311	0x01, 0x02, // Version
312	0x00, // X and Y Unit Densities.
313	0x00, 0x08, // Horizontal Pixel density
314	0x00, 0x09, // Vertical Pixel density
315	0x00,
316	0x00,
317	0x00,
318};
319
320OMX_U8 APPLICATION5[6]={0xff,0xff,0xff,0xff,0xff,0xff};
321const OMX_U8 CustomLumaQuantizationTable[64]= {
32214, 10, 9, 14, 22, 30, 41, 51,
32312, 12, 14, 19, 26, 58, 60, 55,
32414, 13, 16, 24, 40, 57, 69, 56,
32514, 17, 22, 29, 51, 87, 80, 62,
32618, 22, 37, 56, 68, 109, 103, 77,
32724, 35, 55, 64, 81, 104, 113, 92,
32849, 64, 78, 87, 103, 121, 120, 101,
32972, 92, 95, 98, 112, 100, 103, 99,
330};
331
332const OMX_U8 CustomChromaQuantizationTable[64]= {
33315, 16, 22, 35, 99, 99, 99, 99,
33418, 21, 26, 66, 99, 99, 99, 99,
33524, 26, 56, 99, 99, 99, 99, 99,
33647, 66, 99, 99, 99, 99, 99, 99,
33799, 99, 99, 99, 99, 99, 99, 99,
33899, 99, 99, 99, 99, 99, 99, 99,
33999, 99, 99, 99, 99, 99, 99, 99,
34099, 99, 99, 99, 99, 99, 99, 99
341};
342
343JPEGENC_CUSTOM_HUFFMAN_TABLE CustomHuffmanTable =
344{
345    /* VLC Tables */
346    /*Set 1 for Y Component */
347    /*DC-Y*/
348    /*const unsigned int JPEGENC_DCHUFFY[12] */
349    /*Length[16]-Codeword[16]*/
350    {
351        0x00020000,
352        0x00030002,
353        0x00030003,
354        0x00030004,
355        0x00030005,
356        0x00030006,
357        0x0004000e,
358        0x0005001e,
359        0x0006003e,
360        0x0007007e,
361        0x000800fe,
362        0x000901fe
363    },
364
365    /*AC-Y*/
366    /*const unsigned int JPEGENC_ACHUFFY[16][16] */
367    /*Length[16]-Codeword[16]*/
368    {
369        {
370            0x0004000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
371            0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
372            0x00000000, 0x00000000, 0x00000000, 0x000b07f9
373        },
374        {
375            0x00020000, 0x0004000c, 0x0005001c, 0x0006003a, 0x0006003b, 0x0007007a,
376            0x0007007b, 0x000800fa, 0x000901f8, 0x000901f9, 0x000901fa, 0x000a03f9,
377            0x000a03fa, 0x000b07f8, 0x0010ffeb, 0x0010fff5
378        },
379        {
380            0x00020001, 0x0005001b, 0x000800f9, 0x000901f7, 0x000a03f8, 0x000b07f7,
381            0x000c0ff6, 0x000c0ff7, 0x000f7fc0, 0x0010ffbe, 0x0010ffc7, 0x0010ffd0,
382            0x0010ffd9, 0x0010ffe2, 0x0010ffec, 0x0010fff6
383        },
384        {
385            0x00030004, 0x00070079, 0x000a03f7, 0x000c0ff5, 0x0010ff96, 0x0010ff9e,
386            0x0010ffa6, 0x0010ffae, 0x0010ffb6, 0x0010ffbf, 0x0010ffc8, 0x0010ffd1,
387            0x0010ffda, 0x0010ffe3, 0x0010ffed, 0x0010fff7
388        },
389        {
390            0x0004000b, 0x000901f6, 0x000c0ff4, 0x0010ff8f, 0x0010ff97, 0x0010ff9f,
391            0x0010ffa7, 0x0010ffaf, 0x0010ffb7, 0x0010ffc0, 0x0010ffc9, 0x0010ffd2,
392            0x0010ffdb, 0x0010ffe4, 0x0010ffee, 0x0010fff8
393        },
394        {
395            0x0005001a, 0x000b07f6, 0x0010ff89, 0x0010ff90, 0x0010ff98, 0x0010ffa0,
396            0x0010ffa8, 0x0010ffb0, 0x0010ffb8, 0x0010ffc1, 0x0010ffca, 0x0010ffd3,
397            0x0010ffdc, 0x0010ffe5, 0x0010ffef, 0x0010fff9
398        },
399        {
400            0x00070078, 0x0010ff84, 0x0010ff8a, 0x0010ff91, 0x0010ff99, 0x0010ffa1,
401            0x0010ffa9, 0x0010ffb1, 0x0010ffb9, 0x0010ffc2, 0x0010ffcb, 0x0010ffd4,
402            0x0010ffdd, 0x0010ffe6, 0x0010fff0, 0x0010fffa
403        },
404        {
405            0x000800f8, 0x0010ff85, 0x0010ff8b, 0x0010ff92, 0x0010ff9a, 0x0010ffa2,
406            0x0010ffaa, 0x0010ffb2, 0x0010ffba, 0x0010ffc3, 0x0010ffcc, 0x0010ffd5,
407            0x0010ffde, 0x0010ffe7, 0x0010fff1, 0x0010fffb
408        },
409        {
410            0x000a03f6, 0x0010ff86, 0x0010ff8c, 0x0010ff93, 0x0010ff9b, 0x0010ffa3,
411            0x0010ffab, 0x0010ffb3, 0x0010ffbb, 0x0010ffc4, 0x0010ffcd, 0x0010ffd6,
412            0x0010ffdf, 0x0010ffe8, 0x0010fff2, 0x0010fffc
413        },
414        {
415            0x0010ff82, 0x0010ff87, 0x0010ff8d, 0x0010ff94, 0x0010ff9c, 0x0010ffa4,
416            0x0010ffac, 0x0010ffb4, 0x0010ffbc, 0x0010ffc5, 0x0010ffce, 0x0010ffd7,
417            0x0010ffe0, 0x0010ffe9, 0x0010fff3, 0x0010fffd
418        },
419        {
420            0x0010ff83, 0x0010ff88, 0x0010ff8e, 0x0010ff95, 0x0010ff9d, 0x0010ffa5,
421            0x0010ffad, 0x0010ffb5, 0x0010ffbd, 0x0010ffc6, 0x0010ffcf, 0x0010ffd8,
422            0x0010ffe1, 0x0010ffea, 0x0010fff4, 0x0010fffe
423        },
424        {
425            0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
426            0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
427            0x00000000, 0x00000000, 0x00000000, 0x00000000
428        },
429        {
430            0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
431            0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
432            0x00000000, 0x00000000, 0x00000000, 0x00000000
433        },
434        {
435            0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
436            0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
437            0x00000000, 0x00000000, 0x00000000, 0x00000000
438        },
439        {
440            0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
441            0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
442            0x00000000, 0x00000000, 0x00000000, 0x00000000
443        },
444        {
445        0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
446        0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
447        0x00000000, 0x00000000, 0x00000000, 0x00000000
448        }
449    },
450
451    /*Set 2 for U & V Component */
452    /*DC-UV*/
453    /*const unsigned int JPEGENC_DCHUFFUV[12] */
454    /*Length[16]-Codeword[16]*/
455    {
456        0x00020000,
457        0x00020001,
458        0x00020002,
459        0x00030006,
460        0x0004000e,
461        0x0005001e,
462        0x0006003e,
463        0x0007007e,
464        0x000800fe,
465        0x000901fe,
466        0x000a03fe,
467        0x000b07fe
468    },
469
470    /*AC-UV*/
471    /*const unsigned int JPEGENC_ACHUFFUV[16][16] */
472    /*Length[16]-Codeword[16]*/
473    {
474        {
475            0x00020000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
476            0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
477            0x00000000, 0x00000000, 0x00000000, 0x000a03fa
478        },
479        {
480            0x00020001, 0x0004000b, 0x0005001a, 0x0005001b, 0x0006003a, 0x0006003b,
481            0x00070079, 0x0007007a, 0x000800f9, 0x000901f7, 0x000901f8, 0x000901f9,
482            0x000901fa, 0x000b07f9, 0x000e3fe0, 0x000f7fc3
483        },
484        {
485            0x00030004, 0x00060039, 0x000800f7, 0x000800f8, 0x000901f6, 0x000a03f9,
486            0x000b07f7, 0x000b07f8, 0x0010ffb7, 0x0010ffc0, 0x0010ffc9, 0x0010ffd2,
487            0x0010ffdb, 0x0010ffe4, 0x0010ffed, 0x0010fff6
488        },
489        {
490            0x0004000a, 0x000800f6, 0x000a03f7, 0x000a03f8, 0x0010ff97, 0x0010ff9f,
491            0x0010ffa7, 0x0010ffaf, 0x0010ffb8, 0x0010ffc1, 0x0010ffca, 0x0010ffd3,
492            0x0010ffdc, 0x0010ffe5, 0x0010ffee, 0x0010fff7
493        },
494        {
495            0x00050018, 0x000901f5, 0x000c0ff6, 0x000c0ff7, 0x0010ff98, 0x0010ffa0,
496            0x0010ffa8, 0x0010ffb0, 0x0010ffb9, 0x0010ffc2, 0x0010ffcb, 0x0010ffd4,
497            0x0010ffdd, 0x0010ffe6, 0x0010ffef, 0x0010fff8
498        },
499        {
500            0x00050019, 0x000b07f6, 0x000f7fc2, 0x0010ff91, 0x0010ff99, 0x0010ffa1,
501            0x0010ffa9, 0x0010ffb1, 0x0010ffba, 0x0010ffc3, 0x0010ffcc, 0x0010ffd5,
502            0x0010ffde, 0x0010ffe7, 0x0010fff0, 0x0010fff9
503        },
504        {
505            0x00060038, 0x000c0ff5, 0x0010ff8c, 0x0010ff92, 0x0010ff9a, 0x0010ffa2,
506            0x0010ffaa, 0x0010ffb2, 0x0010ffbb, 0x0010ffc4, 0x0010ffcd, 0x0010ffd6,
507            0x0010ffdf, 0x0010ffe8, 0x0010fff1, 0x0010fffa
508        },
509        {
510            0x00070078, 0x0010ff88, 0x0010ff8d, 0x0010ff93, 0x0010ff9b, 0x0010ffa3,
511            0x0010ffab, 0x0010ffb3, 0x0010ffbc, 0x0010ffc5, 0x0010ffce, 0x0010ffd7,
512            0x0010ffe0, 0x0010ffe9, 0x0010fff2, 0x0010fffb
513        },
514        {
515            0x000901f4, 0x0010ff89, 0x0010ff8e, 0x0010ff94, 0x0010ff9c, 0x0010ffa4,
516            0x0010ffac, 0x0010ffb4, 0x0010ffbd, 0x0010ffc6, 0x0010ffcf, 0x0010ffd8,
517            0x0010ffe1, 0x0010ffea, 0x0010fff3, 0x0010fffc
518        },
519        {
520            0x000a03f6, 0x0010ff8a, 0x0010ff8f, 0x0010ff95, 0x0010ff9d, 0x0010ffa5,
521            0x0010ffad, 0x0010ffb5, 0x0010ffbe, 0x0010ffc7, 0x0010ffd0, 0x0010ffd9,
522            0x0010ffe2, 0x0010ffeb, 0x0010fff4, 0x0010fffd
523        },
524        {
525            0x000c0ff4, 0x0010ff8b, 0x0010ff90, 0x0010ff96, 0x0010ff9e, 0x0010ffa6,
526            0x0010ffae, 0x0010ffb6, 0x0010ffbf, 0x0010ffc8, 0x0010ffd1, 0x0010ffda,
527            0x0010ffe3, 0x0010ffec, 0x0010fff5, 0x0010fffe
528        },
529        {
530            0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
531            0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
532            0x00000000, 0x00000000, 0x00000000, 0x00000000
533        },
534        {
535            0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
536            0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
537            0x00000000, 0x00000000, 0x00000000, 0x00000000
538        },
539        {
540            0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
541            0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
542            0x00000000, 0x00000000, 0x00000000, 0x00000000
543        },
544        {
545            0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
546            0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
547            0x00000000, 0x00000000, 0x00000000, 0x00000000
548        },
549        {
550            0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
551            0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
552            0x00000000, 0x00000000, 0x00000000, 0x00000000
553        }
554    },
555
556    /* DHT Marker */
557    /* lum_dc_codelens */
558    {0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
559    /* lum_dc_ncodes */
560    16,
561    /* lum_dc_symbols */
562    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
563    /* lum_dc_nsymbols */
564    12,
565    /* lum_ac_codelens */
566    {0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d},
567    /* lum_ac_ncodes */
568    16,
569    /* lum_ac_symbols */
570    {
571        0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
572        0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
573        0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
574        0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
575        0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
576        0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
577        0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
578        0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
579        0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
580        0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
581        0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
582        0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
583        0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
584        0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
585        0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
586        0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
587        0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
588        0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
589        0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
590        0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
591        0xf9, 0xfa
592    },
593
594    /* lum_ac_nsymbols */
595    162,
596    /* chm_dc_codelens */
597    {0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0},
598    /* chm_dc_ncodes */
599    16,
600    /* chm_dc_symbols */
601    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
602    /* chm_dc_nsymbols */
603    12,
604    /* chm_ac_codelens */
605    {0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77},
606    /* chm_ac_ncodes */
607    16,
608    /* chm_ac_symbols */
609    {
610        0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
611        0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
612        0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
613        0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
614        0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
615        0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
616        0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
617        0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
618        0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
619        0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
620        0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
621        0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
622        0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
623        0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
624        0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
625        0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
626        0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
627        0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
628        0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
629        0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
630        0xf9, 0xfa
631    },
632    /* chm_ac_nsymbols */
633    162
634};
635
636
637typedef unsigned char uchar;
638/**
639 * Pipe used to communicate back to the main thread from the component thread;
640**/
641int IpBuf_Pipe[2];
642int OpBuf_Pipe[2];
643int Event_Pipe[2];
644
645/* the FLAG when we need to DeInit the OMX */
646int DEINIT_FLAG = 0;
647
648/* Flag set when component is preempted */
649int bPreempted=0;
650
651/* Hardware error flag */
652OMX_BOOL bError = OMX_FALSE;
653
654/*function prototypes */
655inline int maxint(int a, int b);
656OMX_ERRORTYPE SetMarkers(OMX_HANDLETYPE pHandle, IMAGE_INFO *imageinfo, OMX_CONFIG_RECTTYPE sCrop, int nWidth, int nHeight);
657
658#ifdef DSP_MMU_FAULT_HANDLING
659int LoadBaseImage();
660#endif
661
662/*Routine to get the maximum of 2 integers */
663inline int maxint(int a, int b)
664{
665    return(a>b) ? a : b;
666}
667
668
669/**
670 * This method will wait for the component or mixer to get to the correct
671 * state.  It is not a real implementation, but just simulates what a real
672 * wait routine may do.
673**/
674static OMX_ERRORTYPE WaitForState(OMX_HANDLETYPE* pHandle,
675                                  OMX_STATETYPE DesiredState)
676{
677	OMX_STATETYPE CurState = OMX_StateInvalid;
678	OMX_ERRORTYPE eError = OMX_ErrorNone;
679	int nCnt = 0;
680	OMX_COMPONENTTYPE *pComponent = (OMX_COMPONENTTYPE *)pHandle;
681
682	PRINT("Inside Test Application WaitForState function\n");
683	eError = pComponent->GetState(pHandle, &CurState);
684	while ( (eError == OMX_ErrorNone) &&
685	        (CurState != DesiredState)) {
686		sched_yield();
687		/*sleep(1);*/
688		if ( nCnt++ == 0xFFFFFFFE ) {
689			fprintf(stderr, "Press CTL-C to continue\n");
690		}
691
692		eError = pComponent->GetState(pHandle, &CurState);
693		if (CurState == OMX_StateInvalid && DesiredState != OMX_StateInvalid) {
694			eError = OMX_ErrorInvalidState;
695			break;
696		}
697	}
698
699	if ( eError != OMX_ErrorNone ) {
700		PRINT("Error: Couldn't get state for component or sent to invalid state because of an error.\n");
701		return eError;
702	}
703	return OMX_ErrorNone;
704}
705
706OMX_ERRORTYPE EventHandler(OMX_HANDLETYPE hComponent,OMX_PTR pAppData,OMX_EVENTTYPE eEvent,
707                           OMX_U32 nData1, OMX_U32 data2, OMX_PTR pEventData)
708{
709    OMX_COMPONENTTYPE *pComponent = (OMX_COMPONENTTYPE *)hComponent;
710    OMX_STATETYPE state;
711    OMX_ERRORTYPE eError;
712    JPEGE_EVENTPRIVATE MyEvent;
713
714    MyEvent.eEvent = eEvent;
715    MyEvent.nData1 = nData1;
716    MyEvent.nData2 = data2;
717    MyEvent.pAppData = pAppData;
718    MyEvent.pEventInfo = pEventData;
719    PRINT("Inside Test Application EventHandler function\n");
720    eError = pComponent->GetState (hComponent, &state);
721
722    if ( eError != OMX_ErrorNone ) {
723        PRINT("Error: From JPEGENC_GetState\n");
724    }
725    switch ( eEvent ) {
726
727        case OMX_EventCmdComplete:
728            PRINT ("Component State Changed\n");
729            break;
730
731        case OMX_EventError:
732                if (nData1 == OMX_ErrorHardware){
733                    printf("\n\nAPP:: ErrorNotification received: Error Num = %p Severity = %ld String  = %s\n", (OMX_PTR)nData1, data2, (OMX_STRING)pEventData);
734                    printf("\nAPP:: OMX_ErrorHardware. Deinitialization of the component....\n\n");
735                    if(!bError) {
736                        bError = OMX_TRUE;
737                        write(Event_Pipe[1], &MyEvent, sizeof(JPEGE_EVENTPRIVATE));
738                    }
739                }
740                else if(nData1 == OMX_ErrorResourcesPreempted) {
741                    bPreempted = 1;
742                    PRINT("APP:: OMX_ErrorResourcesPreempted !\n\n");
743                }
744                else if(nData1 == OMX_ErrorInvalidState) {
745                    printf("\n\nAPP:: ErrorNotification received: Error Num = %p Severity = %ld String	= %s\n", (OMX_PTR)nData1, data2, (OMX_STRING)pEventData);
746                    printf("\nAPP:: Invalid state\n\n");
747                    if(!bError) {
748                        bError = OMX_TRUE;
749                        write(Event_Pipe[1], &MyEvent, sizeof(JPEGE_EVENTPRIVATE));
750                    }
751                }
752                else if(nData1 == OMX_ErrorPortUnpopulated) {
753                    printf("APP:: OMX_ErrorPortUnpopulated\n");
754    		    bError = OMX_TRUE;
755                }
756                else if (nData1 == OMX_ErrorStreamCorrupt) {
757                    printf("\n\nAPP:: ErrorNotification received: Error Num = %p Severity = %ld String	= %s\n", (OMX_PTR)nData1, data2, (OMX_STRING)pEventData);
758                    printf("%s: Stream Corrupt (%ld %s)\n",__FUNCTION__,data2,(char*)pEventData);
759                    if(!bError) {
760    			bError = OMX_TRUE;
761    			write(Event_Pipe[1], &MyEvent, sizeof(JPEGE_EVENTPRIVATE));
762    		    }
763                }
764                else {
765    		    bError = OMX_TRUE;
766                    DEINIT_FLAG = 1;
767                }
768
769            break;
770
771        case OMX_EventResourcesAcquired:
772            bPreempted = 0;
773            break;
774
775        case OMX_EventPortSettingsChanged:
776        case OMX_EventBufferFlag:
777            PRINT("Event Buffer Flag detected\n");
778        case OMX_EventMax:
779        case OMX_EventMark:
780            break;
781
782        default:
783                PRINT("ErrorNotification received: Error Num %p: String :%s\n", (OMX_PTR)nData1, (OMX_STRING)pEventData);
784    }
785
786    return OMX_ErrorNone;
787}
788
789
790void FillBufferDone (OMX_HANDLETYPE hComponent, OMX_PTR ptr,
791                     OMX_BUFFERHEADERTYPE* pBuffHead)
792{
793    PRINT("Inside Test Application FillBufferDone function\n");
794    write(OpBuf_Pipe[1], &pBuffHead, sizeof(pBuffHead));
795}
796
797
798void EmptyBufferDone(OMX_HANDLETYPE hComponent, OMX_PTR ptr,
799                     OMX_BUFFERHEADERTYPE* pBuffer)
800{
801    PRINT("Inside Test Application EmptyBufferDone function\n");
802    write(IpBuf_Pipe[1], &pBuffer, sizeof(pBuffer));
803}
804
805#ifdef UNDER_CE
806int fill_data (OMX_BUFFERHEADERTYPE *pBufferPrivate, HANDLE fIn, int buffSize)
807#else
808int fill_data (OMX_BUFFERHEADERTYPE *pBuf, FILE *fIn, int buffSize)
809#endif
810{
811    int nRead;
812    OMX_U8 oneByte;
813    PRINT("Inside Test Application fill_data function\n");
814
815#ifdef UNDER_CE
816    ReadFile(fIn, pBuf->pBuffer, lSize, &nRead, NULL);
817#else
818    nRead = fread(pBuf->pBuffer,1, buffSize , fIn);
819#endif
820
821    printf ("Buffer Size = %d. Read %d bytes from file. \n", (int) buffSize, (int)nRead);
822    pBuf->nFilledLen = nRead;
823
824    oneByte = fgetc(fIn);
825    if (feof(fIn)){
826        pBuf->nFlags = OMX_BUFFERFLAG_ENDOFFRAME;
827        PRINT("Read full file...\n");
828        rewind(fIn);
829    }
830    else{
831        ungetc(oneByte, fIn);
832    }
833
834    return nRead;
835}
836
837OMX_ERRORTYPE SetMarkers(OMX_HANDLETYPE pHandle, IMAGE_INFO *imageinfo, OMX_CONFIG_RECTTYPE sCrop, int nWidth, int nHeight) {
838
839	OMX_ERRORTYPE eError = OMX_ErrorNone;
840	OMX_INDEXTYPE nCustomIndex = OMX_IndexMax;
841
842	/* Set APP0 Marker config (JFIF) */
843	if (imageinfo->bAPP0) {
844
845		JPEG_APPTHUMB_MARKER sAPP0;
846
847		sAPP0.bMarkerEnabled = OMX_TRUE;
848
849		/* set JFIF marker buffer */
850		sAPP0.nMarkerSize = sizeof(APPLICATION0);
851		sAPP0.pMarkerBuffer = APPLICATION0;
852		sAPP0.nThumbnailWidth = imageinfo->nThumbnailWidth_app0;
853		sAPP0.nThumbnailHeight = imageinfo->nThumbnailHeight_app0;
854
855		eError = OMX_GetExtensionIndex(pHandle, "OMX.TI.JPEG.encoder.Config.APP0", (OMX_INDEXTYPE*)&nCustomIndex);
856		if ( eError != OMX_ErrorNone ) {
857			printf("%d::APP_Error at function call: %x\n", __LINE__, eError);
858			eError = OMX_ErrorUndefined;
859			goto EXIT;
860		}
861		eError = OMX_SetConfig(pHandle, nCustomIndex, &sAPP0);
862		if ( eError != OMX_ErrorNone ) {
863			printf("%d::APP_Error at function call: %x\n", __LINE__, eError);
864			eError = OMX_ErrorUndefined;
865			goto EXIT;
866		}
867
868	}
869
870	/* Set APP1 Marker config (EXIF) */
871	if (imageinfo->bAPP1) {
872
873		JPEG_APPTHUMB_MARKER sAPP1;
874
875		sAPP1.bMarkerEnabled = OMX_TRUE;
876
877		/* set JFIF marker buffer */
878		sAPP1.nThumbnailWidth = imageinfo->nThumbnailWidth_app1;
879		sAPP1.nThumbnailHeight = imageinfo->nThumbnailHeight_app1;
880
881		/* if thumbnail is set, use APPLICATION structure with thumbnail */
882		if(sAPP1.nThumbnailWidth > 0 && sAPP1.nThumbnailHeight > 0) {
883			sAPP1.nMarkerSize = sizeof(APPLICATION1_THUMB);
884			sAPP1.pMarkerBuffer = APPLICATION1_THUMB;
885		}
886		else {
887			sAPP1.nMarkerSize = sizeof(APPLICATION1_NOTHUMB);
888			sAPP1.pMarkerBuffer = APPLICATION1_NOTHUMB;
889		}
890
891		/*set crop */
892		if (sCrop.nWidth != 0)
893		{
894			sAPP1.pMarkerBuffer[152] = sCrop.nWidth & 0xFF;
895			sAPP1.pMarkerBuffer[153] = (sCrop.nWidth >> 8) & 0xFF;
896		}
897		else
898		{
899			sAPP1.pMarkerBuffer[152] = nWidth & 0xFF;
900			sAPP1.pMarkerBuffer[153] = (nWidth >> 8) & 0xFF;
901		}
902
903		if (sCrop.nHeight != 0)
904		{
905			sAPP1.pMarkerBuffer[164] = sCrop.nHeight;
906			sAPP1.pMarkerBuffer[165] = (sCrop.nHeight >> 8) & 0xFF;
907		}
908		else
909		{
910			sAPP1.pMarkerBuffer[164] = nHeight;
911			sAPP1.pMarkerBuffer[165] = (nHeight >> 8) & 0xFF;
912		}
913
914		eError = OMX_GetExtensionIndex(pHandle, "OMX.TI.JPEG.encoder.Config.APP1", (OMX_INDEXTYPE*)&nCustomIndex);
915		if ( eError != OMX_ErrorNone ) {
916			printf("%d::APP_Error at function call: %x\n", __LINE__, eError);
917			eError = OMX_ErrorUndefined;
918			goto EXIT;
919		}
920		eError = OMX_SetConfig(pHandle, nCustomIndex, &sAPP1);
921		if ( eError != OMX_ErrorNone ) {
922			printf("%d::APP_Error at function call: %x\n", __LINE__, eError);
923			eError = OMX_ErrorUndefined;
924			goto EXIT;
925		}
926	}
927
928	/* Set APP5 Marker config	*/
929	if (imageinfo->bAPP5) {
930
931		JPEG_APPTHUMB_MARKER sAPP5;
932
933		sAPP5.bMarkerEnabled = OMX_TRUE;
934
935		/* set JFIF marker buffer */
936		sAPP5.nMarkerSize = sizeof(APPLICATION5);
937		sAPP5.pMarkerBuffer = APPLICATION5;
938		sAPP5.nThumbnailWidth = imageinfo->nThumbnailWidth_app5;
939		sAPP5.nThumbnailHeight = imageinfo->nThumbnailHeight_app5;
940
941		eError = OMX_GetExtensionIndex(pHandle, "OMX.TI.JPEG.encoder.Config.APP5", (OMX_INDEXTYPE*)&nCustomIndex);
942		if ( eError != OMX_ErrorNone ) {
943			printf("%d::APP_Error at function call: %x\n", __LINE__, eError);
944			eError = OMX_ErrorUndefined;
945			goto EXIT;
946		}
947		eError = OMX_SetConfig(pHandle, nCustomIndex, &sAPP5);
948		if ( eError != OMX_ErrorNone ) {
949			printf("%d::APP_Error at function call: %x\n", __LINE__, eError);
950			eError = OMX_ErrorUndefined;
951			goto EXIT;
952		}
953
954	}
955
956	/* Set APP13 Marker config	*/
957	if (imageinfo->bAPP13) {
958
959		JPEG_APP13_MARKER sAPP13;
960
961		sAPP13.bMarkerEnabled = OMX_TRUE;
962
963		/* set JFIF marker buffer */
964		sAPP13.nMarkerSize = sizeof(APPLICATION13);
965		sAPP13.pMarkerBuffer = APPLICATION13;
966
967		eError = OMX_GetExtensionIndex(pHandle, "OMX.TI.JPEG.encoder.Config.APP13", (OMX_INDEXTYPE*)&nCustomIndex);
968		if ( eError != OMX_ErrorNone ) {
969			printf("%d::APP_Error at function call: %x\n", __LINE__, eError);
970			eError = OMX_ErrorUndefined;
971			goto EXIT;
972		}
973		eError = OMX_SetConfig(pHandle, nCustomIndex, &sAPP13);
974		if ( eError != OMX_ErrorNone ) {
975			printf("%d::APP_Error at function call: %x\n", __LINE__, eError);
976			eError = OMX_ErrorUndefined;
977			goto EXIT;
978		}
979	}
980
981	/* set comment marker */
982	if (imageinfo->nComment) {
983		eError = OMX_GetExtensionIndex(pHandle, "OMX.TI.JPEG.encoder.Config.CommentFlag", (OMX_INDEXTYPE*)&nCustomIndex);
984		if ( eError != OMX_ErrorNone ) {
985			printf("%d::APP_Error at function call: %x\n", __LINE__, eError);
986			eError = OMX_ErrorUndefined;
987			goto EXIT;
988		}
989		eError = OMX_SetConfig(pHandle, nCustomIndex,  &(imageinfo->nComment));
990		if ( eError != OMX_ErrorNone ) {
991			printf("%d::APP_Error at function call: %x\n", __LINE__, eError);
992			eError = OMX_ErrorUndefined;
993			goto EXIT;
994		}
995
996		eError = OMX_GetExtensionIndex(pHandle, "OMX.TI.JPEG.encoder.Config.CommentString", (OMX_INDEXTYPE*)&nCustomIndex);
997		if ( eError != OMX_ErrorNone ) {
998			printf("%d::APP_Error at function call: %x\n", __LINE__, eError);
999			eError = OMX_ErrorUndefined;
1000			goto EXIT;
1001		}
1002		eError = OMX_SetConfig(pHandle, nCustomIndex, imageinfo->pCommentString);
1003		if ( eError != OMX_ErrorNone ) {
1004			printf("%d::APP_Error at function call: %x\n", __LINE__, eError);
1005			eError = OMX_ErrorUndefined;
1006			goto EXIT;
1007		}
1008	}
1009
1010EXIT:
1011	return eError;
1012}
1013
1014void PrintUsage(void)
1015{
1016    printf("\ni.. Input File\n");
1017    printf("o.. Output File\n");
1018    printf("w.. Width Of Image\n");
1019    printf("h.. Height Of Image\n");
1020    printf("f.. Input Of Image:\n    1.- YUV 420 Planer\n    2.- YUV 422 Interleaved UYVY\n    3.- 32 bit RAW (RGB32)\n    4.- 16 bit RAW (RGB16)\n    5.- YUV 422 Interleaved YUYV\n");
1021    printf("z.. 420p to 422i conversion before encode \n");
1022    printf("q.. Quality Factor Of Image: 1 to 100\n");
1023    printf("b.. Exit Buffer: 1 o 2\n");
1024    printf("c.. Marker Comment: The comment string length should be less than 255 characters\n");
1025    printf("j.. Marker APP0: Contain Information about JFIF\n");
1026    printf("e.. Marker APP1: Contain Information about EXIF\n");
1027    printf("d.. Marker APP5: Contain Miscellaneous  Information\n");
1028    printf("m.. Marker APP13: Contain Miscellaneous  Information\n");
1029    printf("x.. Width of Thumbnail of EXIF (default set to 88)\n");
1030    printf("y.. Height of Thumbnail of EXIF (default set to 72)\n");
1031    printf("s.. Width of Thumbnail of JFIF (default set to 88)\n");
1032    printf("k.. Height of Thumbnail of JFIF (default set to 72)\n");
1033    printf("n.. Width of Thumbnail of APP5 (default set to 88)\n");
1034    printf("p.. Height of Thumbnail of APP5 (default set to 72)\n");
1035    printf("t.. Type of Quantization Table  \n\t 0.-Default Quantization Tables \n\t 1.-Custom Luma And Choma Tables\n");
1036    printf("u.. Type of Huffman Table       \n\t 0.-Default Huffman Table        \n\t 1.-Custom Huffman Table\n");
1037    printf("r.. No. of times to repeat\n");
1038    printf("v.. Crop width value\n");
1039    printf("l.. Crop height value\n");
1040
1041    printf("\na.. Prints this information\n");
1042    printf("\nExample: ./JPEGTestEnc_common -i patterns/JPGE_CONF_003.yuv -o output.jpg -w 176 -h 144 -f 2 -q 100 -b 1 -c JPEG  -j -e -m -x 100 -y 100 -r 1\n\n");
1043}
1044
1045
1046#ifdef UNDER_CE
1047int _tmain(int argc, TCHAR **argv)
1048#else
1049int main(int argc, char** argv)
1050#endif
1051{
1052
1053#ifndef UNDER_CE
1054//mtrace();
1055#endif
1056    OMX_HANDLETYPE pHandle;
1057    OMX_U32 AppData = 100;
1058
1059    OMX_CALLBACKTYPE JPEGCaBa = {(void *)EventHandler,
1060                     (void*) EmptyBufferDone,
1061                     (void*)FillBufferDone};
1062    int retval;
1063    int nWidth;
1064    int nHeight;
1065    int framesent = 0;
1066    int nRepeated = 0;
1067    int maxRepeat = 1;
1068    int inputformat;
1069    int qualityfactor;
1070    int buffertype;
1071    int bSetCustomHuffmanTable=0;
1072    int bSetCustomQuatizationTable=0;
1073    sigset_t set;
1074
1075    OMX_STATETYPE state;
1076    OMX_COMPONENTTYPE *pComponent;
1077    IMAGE_INFO* imageinfo = NULL;
1078    OMX_PORT_PARAM_TYPE* pPortParamType = NULL;
1079    OMX_IMAGE_PARAM_QFACTORTYPE* pQfactorType = NULL;
1080    JPEGENC_CUSTOM_HUFFMANTTABLETYPE *pHuffmanTable = NULL;
1081    OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE *pQuantizationTable = NULL;
1082    OMX_PARAM_PORTDEFINITIONTYPE* pInPortDef = NULL;
1083    OMX_PARAM_PORTDEFINITIONTYPE* pOutPortDef = NULL;
1084    OMX_CONFIG_RECTTYPE sCrop;
1085
1086    OMX_BOOL bConvertion_420pTo422i = OMX_FALSE;
1087
1088#ifdef UNDER_CE
1089    TCHAR* szInFile = NULL;
1090    TCHAR* szOutFile = NULL;
1091    HANDLE fIn = NULL;
1092    HANDLE fOut = NULL;
1093    DWORD dwWritten;
1094#else
1095    char* szInFile = NULL;
1096    char* szOutFile = NULL;
1097
1098    FILE* fIn = NULL;
1099    FILE* fOut = NULL;
1100#endif
1101
1102    OMX_BUFFERHEADERTYPE* pInBuff[NUM_OF_BUFFERSJPEG];
1103    OMX_BUFFERHEADERTYPE* pOutBuff[NUM_OF_BUFFERSJPEG];
1104    int nCounter = 0;
1105    int fdmax;
1106    OMX_U8* pTemp;
1107    OMX_U8* pInBuffer[NUM_OF_BUFFERSJPEG];
1108    OMX_U8* pOutBuffer[NUM_OF_BUFFERSJPEG];
1109    OMX_BUFFERHEADERTYPE* pBuffer;
1110    OMX_BUFFERHEADERTYPE* pBuf;
1111    int nRead;
1112    int done;
1113    OMX_S32 sJPEGEnc_CompID = 300;
1114    int nIndex1= 0;
1115    int nIndex2 = 0;
1116    int nframerecieved = 0;
1117    int nMultFactor = 0;
1118    int nHeightNew, nWidthNew;
1119    OMX_INDEXTYPE nCustomIndex = OMX_IndexMax;
1120    OMX_ERRORTYPE error = OMX_ErrorNone;
1121
1122#ifdef STRESS
1123    int multiload = 0;
1124#endif
1125
1126    int next_option;
1127    const char* const short_options = "i:o:w:h:f:q:b:c:x:y:s:k:t:u:r:v:l:n:p:ajemdvlz";
1128    const struct option long_options[] =
1129    {
1130        { "InputFile",1, NULL, 'i' },
1131        { "OutputFile",1, NULL, 'o' },
1132        { "WidthImage",1, NULL, 'w' },
1133        { "HeightImage",1, NULL, 'h' },
1134        { "inputFormat",1, NULL, 'f' },
1135        { "QualityFactor",1, NULL, 'q' },
1136        { "Ext/IntBuffer",1, NULL, 'b' },
1137        { "MarkerComment",1, NULL, 'c' },
1138        { "EXIFwidthThumbnail",1, NULL, 'x' },
1139        { "EXIFheightThumbnail",1, NULL, 'y' },
1140        { "JFIFwidthThumbnail",1, NULL, 's' },
1141        { "JFIFheightThumbnail",1, NULL, 'k' },
1142        { "APP5heightThumbnail",1, NULL, 'p' },
1143        { "APP5widthThumbnail",1, NULL, 'n' },
1144        { "Repetition",1, NULL, 'r' },
1145 	 {"QuantizationTable",1,NULL,'t'},
1146	 {"HuffmanTable",1,NULL,'u'},
1147        { "help", 0, NULL, 'a' },
1148        { "MarkerAPP0",0,NULL,'j'},
1149        { "MarkerAPP1",0,NULL,'e'},
1150        { "MarkerAPP13",0,NULL,'m'},
1151        { "MarkerAPP5",0,NULL,'d'},
1152        { "CroppedWidth",0,NULL,'v'},
1153        { "CroppedHeight",0,NULL,'l'},
1154        { "420pTo422iConversion",0,NULL,'z'},
1155        { NULL, 0, NULL, 0 }
1156    };
1157
1158    MALLOC(pPortParamType, OMX_PORT_PARAM_TYPE);
1159    MALLOC(pQfactorType, OMX_IMAGE_PARAM_QFACTORTYPE);
1160    MALLOC(pQuantizationTable,OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE);
1161    MALLOC(pHuffmanTable, JPEGENC_CUSTOM_HUFFMANTTABLETYPE);
1162    MALLOC(pInPortDef, OMX_PARAM_PORTDEFINITIONTYPE);
1163    MALLOC(pOutPortDef, OMX_PARAM_PORTDEFINITIONTYPE);
1164    MALLOC(imageinfo, IMAGE_INFO);
1165
1166    /* Setting up default parameters */
1167    szOutFile="output.jpg";
1168    nWidth=176;
1169    nHeight=144;
1170    inputformat=1;
1171    qualityfactor=100;
1172    buffertype=1;
1173
1174    imageinfo->nThumbnailWidth_app0 = 0;
1175    imageinfo->nThumbnailHeight_app0 = 0;
1176    imageinfo->nThumbnailWidth_app1 = 0;
1177    imageinfo->nThumbnailHeight_app1 = 0;
1178    imageinfo->nThumbnailWidth_app5 = 0;
1179    imageinfo->nThumbnailHeight_app5 = 0;
1180    imageinfo->nThumbnailWidth_app13 = 0;
1181    imageinfo->nThumbnailHeight_app13 = 0;
1182
1183    imageinfo->bAPP0 = OMX_FALSE;
1184    imageinfo->bAPP1 = OMX_FALSE;
1185    imageinfo->bAPP5 = OMX_FALSE;
1186    imageinfo->bAPP13 = OMX_FALSE;
1187    imageinfo->nComment = OMX_FALSE;
1188    imageinfo->pCommentString = NULL;
1189
1190    sCrop.nTop = 0;
1191    sCrop.nLeft = 0;
1192    sCrop.nWidth = 0;
1193    sCrop.nHeight = 0;
1194
1195    if (argc <= 1)
1196    {
1197        PrintUsage();
1198        return 0;
1199    }
1200
1201do
1202{
1203    next_option = getopt_long(argc, argv, short_options,long_options, NULL);
1204    switch(next_option)
1205    {
1206        case 'a':
1207            PrintUsage();
1208            return 0;
1209            break;
1210
1211        case 'i':
1212        szInFile=optarg;
1213        break;
1214
1215        case 'o':
1216        szOutFile=optarg;
1217        break;
1218
1219        case 'w':
1220         nWidth = atoi(optarg);
1221        break;
1222
1223        case 'h':
1224        nHeight=atoi(optarg);
1225        break;
1226
1227        case 'f':
1228        inputformat=atoi(optarg);
1229        break;
1230
1231        case 'z':
1232        bConvertion_420pTo422i = OMX_TRUE;
1233        PRINT("\n ********* bConvertion_420pTo422i is set to TRUE \n");
1234        break;
1235
1236        case 'q':
1237        qualityfactor=atoi(optarg);
1238        break;
1239
1240        case 'b':
1241        buffertype=atoi(optarg);
1242        break;
1243
1244        case 'c':
1245        imageinfo->nComment = 1;
1246        imageinfo->pCommentString  = (char *)optarg;
1247        break;
1248
1249	/*EXIF */
1250
1251        case 'e':
1252        imageinfo->bAPP1 = OMX_TRUE;
1253        break;
1254
1255        case 'x':
1256        imageinfo->nThumbnailWidth_app1 = atoi(optarg);
1257        break;
1258
1259        case 'y':
1260        imageinfo->nThumbnailHeight_app1 = atoi(optarg);
1261        break;
1262
1263	/* JFIF */
1264        case 'j':
1265        imageinfo->bAPP0 = OMX_TRUE;
1266        break;
1267
1268        case 's':
1269        imageinfo->nThumbnailWidth_app0 = atoi(optarg);
1270        break;
1271
1272        case 'k':
1273        imageinfo->nThumbnailHeight_app0 = atoi(optarg);
1274        break;
1275
1276
1277        case 'n':
1278        imageinfo->nThumbnailWidth_app5 = atoi(optarg);
1279        break;
1280
1281        case 'p':
1282        imageinfo->nThumbnailHeight_app5 = atoi(optarg);
1283        break;
1284
1285        case 'm':
1286        imageinfo->bAPP13 = OMX_TRUE;
1287        break;
1288
1289        case 'd':
1290        imageinfo->bAPP5 = OMX_TRUE;
1291        break;
1292
1293        case 't':
1294        bSetCustomQuatizationTable=atoi(optarg);
1295        break;
1296
1297        case 'u':
1298        bSetCustomHuffmanTable=atoi(optarg);
1299        break;
1300
1301        case 'r':
1302        maxRepeat = atoi(optarg);
1303        break;
1304
1305        case 'v':
1306        sCrop.nWidth = atoi(optarg);
1307        break;
1308
1309        case 'l':
1310        sCrop.nHeight = atoi(optarg);
1311        break;
1312
1313    }
1314}while (next_option != -1);
1315
1316	printf("\n------------------------------------------------\n");
1317	printf("OMX JPEG Encoder Test App built on " __DATE__ ":" __TIME__ "\n");
1318	printf("------------------------------------------------\n");
1319	printf("Output File Name is %s \n" , szOutFile);
1320
1321#ifdef STRESS
1322
1323	for (multiload = 0; multiload < STRESSMULTILOAD; multiload ++) {
1324	    printf("Stress Test: Iteration %d\n", multiload + 1);
1325#endif
1326
1327
1328#ifdef DSP_MMU_FAULT_HANDLING
1329/* LOAD BASE IMAGE FIRST TIME */
1330        LoadBaseImage();
1331#endif
1332
1333	error = TIOMX_Init();
1334	if ( error != OMX_ErrorNone ) {
1335	    PRINT("Error returned by OMX_Init()\n");
1336	    goto EXIT;
1337	}
1338
1339	printf("OMX_Init Successful!\n");
1340
1341	error = TIOMX_GetHandle(&pHandle,StrJpegEncoder,(void *)&AppData, &JPEGCaBa);
1342	if ( (error != OMX_ErrorNone) || (pHandle == NULL) ) {
1343	    fprintf (stderr,"Error in Get Handle function\n");
1344	    goto EXIT;
1345	}
1346
1347#ifdef STRESS
1348	OMX_U8 i;
1349	for(i=0; i < NSTRESSCASES; i++) {
1350	     printf("Stress test number %d\n",i);
1351#endif
1352
1353	/* Create a pipe used to queue data from the callback. */
1354	retval = pipe(IpBuf_Pipe);
1355	if ( retval != 0 ) {
1356	    fprintf(stderr, "Error:Fill Data Pipe failed to open\n");
1357	    goto EXIT;
1358	}
1359
1360	retval = pipe(OpBuf_Pipe);
1361	if ( retval != 0 ) {
1362	    fprintf(stderr, "Error:Empty Data Pipe failed to open\n");
1363	    goto EXIT;
1364	}
1365
1366	retval = pipe(Event_Pipe);
1367	if ( retval != 0 ) {
1368	    fprintf(stderr, "Error:Empty Data Pipe failed to open\n");
1369	    goto EXIT;
1370	}
1371
1372	PRINT("Input/Output Pipes created\n");
1373
1374	/* save off the "max" of the handles for the selct statement */
1375	fdmax = maxint(IpBuf_Pipe[0], OpBuf_Pipe[0]);
1376	fdmax = maxint(Event_Pipe[0], fdmax);
1377
1378#ifdef UNDER_CE
1379	fIn = CreateFile(szInFile, GENERIC_READ, 0,
1380	                       NULL,OPEN_EXISTING, 0, NULL);
1381	if (INVALID_HANDLE_VALUE == fIn)
1382	{
1383	    PRINT("Error:  failed to open the file %s for " \
1384	         "reading\n", szInFile);
1385	    goto EXIT;
1386	}
1387#else
1388	fIn = fopen(szInFile, "r");
1389	if ( fIn == NULL ) {
1390	    printf("Error: failed to open the file <%s> for reading\n",
1391	          szInFile);
1392	    goto EXIT;
1393	}
1394	PRINT(" File %s opened \n" , szInFile);
1395#endif
1396
1397
1398	error = OMX_GetParameter(pHandle, OMX_IndexParamImageInit, pPortParamType);
1399	if ( error != OMX_ErrorNone ) {
1400	    printf("%d::APP_Error at function call: %x\n", __LINE__, error);
1401	    error = OMX_ErrorBadParameter;
1402	    goto EXIT;
1403	}
1404
1405	nIndex1 = pPortParamType->nStartPortNumber;
1406	nIndex2 = nIndex1 + 1;
1407	pInPortDef->nPortIndex = nIndex1;
1408	error = OMX_GetParameter (pHandle, OMX_IndexParamPortDefinition, pInPortDef);
1409	if ( error != OMX_ErrorNone ) {
1410	    printf("%d::APP_Error at function call: %x\n", __LINE__, error);
1411	    error = OMX_ErrorBadParameter;
1412	    goto EXIT;
1413	}
1414
1415	if (pInPortDef->eDir == nIndex1 ) {
1416	    pInPortDef->nPortIndex = nIndex1;
1417	}
1418	else {
1419	    pInPortDef->nPortIndex = nIndex2;
1420	}
1421
1422	/* Set the component's OMX_PARAM_PORTDEFINITIONTYPE structure (input) */
1423	pInPortDef->nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
1424	pInPortDef->nVersion.s.nVersionMajor = 0x1;
1425	pInPortDef->nVersion.s.nVersionMinor = 0x0;
1426	pInPortDef->nVersion.s.nRevision = 0x0;
1427	pInPortDef->nVersion.s.nStep = 0x0;
1428	pInPortDef->nPortIndex = 0x0;
1429	pInPortDef->eDir = OMX_DirInput;
1430	pInPortDef->nBufferCountActual = NUM_OF_BUFFERSJPEG;
1431	pInPortDef->nBufferCountMin = 1;
1432	pInPortDef->bEnabled = OMX_TRUE;
1433	pInPortDef->bPopulated = OMX_FALSE;
1434	pInPortDef->eDomain = OMX_PortDomainImage;
1435
1436	/* OMX_IMAGE_PORTDEFINITION values for input port */
1437	pInPortDef->format.image.cMIMEType = "JPEGENC";
1438	pInPortDef->format.image.pNativeRender = NULL;
1439	pInPortDef->format.image.nFrameWidth = nWidth;
1440	pInPortDef->format.image.nFrameHeight = nHeight;
1441	pInPortDef->format.image.nSliceHeight = -1;
1442	pInPortDef->format.image.bFlagErrorConcealment = OMX_FALSE;
1443
1444	if ( inputformat == 2) {
1445	     pInPortDef->format.image.eColorFormat =  OMX_COLOR_FormatCbYCrY;
1446	}
1447	else if ( inputformat == 3) {
1448	     pInPortDef->format.image.eColorFormat = OMX_COLOR_Format32bitARGB8888;
1449	}
1450	else if (inputformat == 4) {
1451		pInPortDef->format.image.eColorFormat = OMX_COLOR_Format16bitRGB565;
1452	}
1453	else if ( inputformat == 5) {
1454	     pInPortDef->format.image.eColorFormat = OMX_COLOR_FormatYCbYCr;
1455	}
1456	else {
1457	    pInPortDef->format.image.eColorFormat = OMX_COLOR_FormatYUV420PackedPlanar;
1458	}
1459
1460	pInPortDef->format.image.eCompressionFormat = OMX_IMAGE_CodingUnused;
1461
1462	nMultFactor = (nWidth + 16 - 1)/16;
1463	nWidthNew = (int)(nMultFactor) * 16;
1464
1465	nMultFactor = (nHeight + 16 - 1)/16;
1466	nHeightNew = (int)(nMultFactor) * 16;
1467
1468	if (inputformat == 1) {
1469	    pInPortDef->nBufferSize = (nWidthNew * nHeightNew * 1.5);
1470	    if (pInPortDef->nBufferSize < 1600) {
1471	        pInPortDef->nBufferSize = 1600;
1472	    }
1473	}
1474	else if(inputformat == 3) {
1475		pInPortDef->nBufferSize = (nWidthNew * nHeightNew * 4);
1476	}
1477	else {
1478	    pInPortDef->nBufferSize = (nWidthNew * nHeightNew * 2);
1479	    if (pInPortDef->nBufferSize < 400) {
1480	        pInPortDef->nBufferSize = 400;
1481	    }
1482	}
1483
1484
1485	error = OMX_SetParameter (pHandle, OMX_IndexParamPortDefinition, pInPortDef);
1486	if ( error != OMX_ErrorNone ) {
1487	    printf("%d::APP_Error at function call: %x\n", __LINE__, error);
1488	    error = OMX_ErrorBadParameter;
1489	    goto EXIT;
1490	}
1491
1492	pOutPortDef->nPortIndex = nIndex2;
1493	error = OMX_GetParameter(pHandle, OMX_IndexParamPortDefinition, pOutPortDef);
1494	if ( error != OMX_ErrorNone ) {
1495	    printf("%d::APP_Error at function call: %x\n", __LINE__, error);
1496	    error = OMX_ErrorBadParameter;
1497	    goto EXIT;
1498	}
1499	if (pOutPortDef->eDir == nIndex1 ) {
1500	    pOutPortDef->nPortIndex = nIndex1;
1501	}
1502	else {
1503	    pOutPortDef->nPortIndex = nIndex2;
1504	}
1505	/* Set the component's OMX_PARAM_PORTDEFINITIONTYPE structure (input) */
1506
1507	pOutPortDef->nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
1508	pOutPortDef->nVersion.s.nVersionMajor = 0x1;
1509	pOutPortDef->nVersion.s.nVersionMinor = 0x0;
1510	pOutPortDef->nVersion.s.nRevision = 0x0;
1511	pOutPortDef->nVersion.s.nStep = 0x0;
1512	pOutPortDef->nPortIndex = 0x1;
1513	pOutPortDef->eDir = OMX_DirInput;
1514	pOutPortDef->nBufferCountActual = NUM_OF_BUFFERSJPEG;
1515	pOutPortDef->nBufferCountMin = 1;
1516	pOutPortDef->bEnabled = OMX_TRUE;
1517	pOutPortDef->bPopulated = OMX_FALSE;
1518	pOutPortDef->eDomain = OMX_PortDomainImage;
1519
1520	/* OMX_IMAGE_PORTDEFINITION values for input port */
1521	pOutPortDef->format.image.cMIMEType = "JPEGENC";
1522	pOutPortDef->format.image.pNativeRender = NULL;
1523	pOutPortDef->format.image.nFrameWidth = nWidth;
1524	pOutPortDef->format.image.nFrameHeight = nHeight;
1525	pOutPortDef->format.image.nStride = -1;
1526	pOutPortDef->format.image.nSliceHeight = -1;
1527	pOutPortDef->format.image.bFlagErrorConcealment = OMX_FALSE;
1528
1529	/*Minimum buffer size requirement */
1530	pOutPortDef->nBufferSize = (nWidth*nHeight);
1531	if( qualityfactor < 10){
1532	    pOutPortDef->nBufferSize /=10;
1533	}
1534	else if (qualityfactor <100){
1535	    pOutPortDef->nBufferSize /= (100/qualityfactor);
1536	}
1537
1538	/*Adding memory to include Thumbnail, comments & markers information and header (depends on the app)*/
1539	pOutPortDef->nBufferSize += 12288;
1540
1541
1542	if ( inputformat == 2 || inputformat == 3 || inputformat == 4 ) {
1543	     pOutPortDef->format.image.eColorFormat =  OMX_COLOR_FormatCbYCrY;
1544	}
1545	else if ( inputformat == 1 && bConvertion_420pTo422i ) {
1546	    pOutPortDef->format.image.eColorFormat =  OMX_COLOR_FormatCbYCrY;
1547	}
1548	else {
1549	    pOutPortDef->format.image.eColorFormat = OMX_COLOR_FormatYUV420PackedPlanar;
1550	}
1551
1552	if (imageinfo->bAPP1) {
1553	    pOutPortDef->format.image.eCompressionFormat = OMX_IMAGE_CodingEXIF;
1554	}
1555	else {
1556	    pOutPortDef->format.image.eCompressionFormat = OMX_IMAGE_CodingJPEG;
1557	}
1558
1559	error = OMX_SetParameter (pHandle, OMX_IndexParamPortDefinition, pOutPortDef);
1560	if ( error != OMX_ErrorNone ) {
1561	    printf("%d::APP_Error at function call: %x\n", __LINE__, error);
1562	    error = OMX_ErrorBadParameter;
1563	    goto EXIT;
1564	}
1565
1566	pComponent = (OMX_COMPONENTTYPE *)pHandle;
1567
1568	error = OMX_SetConfig(pHandle, OMX_IndexConfigCommonInputCrop, &sCrop);
1569	if ( error != OMX_ErrorNone ) {
1570	    printf("%d::APP_Error at function call: %x\n", __LINE__, error);
1571	   error = OMX_ErrorBadParameter;
1572	   goto EXIT;
1573	}
1574
1575	error = OMX_SetConfig(pHandle, OMX_IndexCustomColorFormatConvertion_420pTo422i, &bConvertion_420pTo422i);
1576	if ( error != OMX_ErrorNone ) {
1577	    printf("%d::APP_Error at function call: %x\n", __LINE__, error);
1578	   error = OMX_ErrorBadParameter;
1579	   goto EXIT;
1580	}
1581
1582	if (bSetCustomQuatizationTable){
1583
1584		pQuantizationTable->eQuantizationTable = OMX_IMAGE_QuantizationTableLuma;
1585		error = OMX_GetParameter(pHandle, OMX_IndexParamQuantizationTable, pQuantizationTable);
1586	    if ( error != OMX_ErrorNone ) {
1587	        printf("%d::APP_Error at function call: %x\n", __LINE__, error);
1588	       error = OMX_ErrorBadParameter;
1589	       goto EXIT;
1590	    }
1591
1592	    pTemp = (OMX_U8*)memcpy(pQuantizationTable->nQuantizationMatrix, CustomLumaQuantizationTable, sizeof(CustomLumaQuantizationTable));
1593	    if(pTemp == NULL){
1594	        printf("%d::APP_Error at function call\n", __LINE__);
1595	        error = OMX_ErrorUndefined;
1596	        goto EXIT;
1597	    }
1598
1599	    error = OMX_SetParameter(pHandle, OMX_IndexParamQuantizationTable, pQuantizationTable);
1600	    if ( error != OMX_ErrorNone ) {
1601	        printf("%d::APP_Error at function call: %x\n", __LINE__, error);
1602	       error = OMX_ErrorBadParameter;
1603	       goto EXIT;
1604	    }
1605
1606	    pQuantizationTable->eQuantizationTable = OMX_IMAGE_QuantizationTableChroma;
1607	    error = OMX_GetParameter(pHandle, OMX_IndexParamQuantizationTable, pQuantizationTable);
1608	    if ( error != OMX_ErrorNone ) {
1609	        printf("%d::APP_Error at function call: %x\n", __LINE__, error);
1610	       error = OMX_ErrorBadParameter;
1611	       goto EXIT;
1612	    }
1613
1614	    pTemp = (OMX_U8*)memcpy(pQuantizationTable->nQuantizationMatrix, CustomChromaQuantizationTable, sizeof(CustomChromaQuantizationTable));
1615	    if(pTemp == NULL){
1616	        error = OMX_ErrorUndefined;
1617	        goto EXIT;
1618	    }
1619
1620	    error = OMX_SetParameter(pHandle, OMX_IndexParamQuantizationTable, pQuantizationTable);
1621	    if ( error != OMX_ErrorNone ) {
1622	        printf("%d::APP_Error at function call: %x\n", __LINE__, error);
1623	       error = OMX_ErrorBadParameter;
1624	       goto EXIT;
1625	    }
1626	}
1627
1628	if (bSetCustomHuffmanTable){
1629
1630	    error = OMX_GetExtensionIndex(pHandle, "OMX.TI.JPEG.encoder.Config.HuffmanTable", (OMX_INDEXTYPE*)&nCustomIndex);
1631	    if ( error != OMX_ErrorNone ) {
1632	        printf("%d::APP_Error at function call: %x\n", __LINE__, error);
1633	       error = OMX_ErrorBadParameter;
1634	       goto EXIT;
1635	    }
1636
1637		error = OMX_GetParameter(pHandle, nCustomIndex, pHuffmanTable);
1638	    if ( error != OMX_ErrorNone ) {
1639	        printf("%d::APP_Error at function call: %x\n", __LINE__, error);
1640	       error = OMX_ErrorBadParameter;
1641	       goto EXIT;
1642	    }
1643
1644	    pTemp = (OMX_U8*)memcpy(&(pHuffmanTable->sHuffmanTable), &CustomHuffmanTable, sizeof(CustomHuffmanTable));
1645	    if(pTemp == NULL){
1646	        error = OMX_ErrorUndefined;
1647	        goto EXIT;
1648	    }
1649
1650	    error = OMX_SetParameter(pHandle, nCustomIndex, pHuffmanTable);
1651	    if ( error != OMX_ErrorNone ) {
1652	        printf("%d::APP_Error at function call: %x\n", __LINE__, error);
1653	       error = OMX_ErrorBadParameter;
1654	       goto EXIT;
1655	    }
1656	}
1657
1658
1659	pComponent = (OMX_COMPONENTTYPE *)pHandle;
1660	error = OMX_SendCommand(pHandle, OMX_CommandStateSet, OMX_StateIdle ,NULL);
1661	if ( error != OMX_ErrorNone ) {
1662	    fprintf (stderr,"Error from SendCommand-Idle(Init) State function\n");
1663	    goto EXIT;
1664	}
1665
1666	if (buffertype == 1) {
1667
1668	    for (nCounter = 0; nCounter < NUM_OF_BUFFERSJPEG; nCounter++) {
1669	        pTemp=(OMX_U8*)malloc(pInPortDef->nBufferSize+256);
1670	        if(pTemp == NULL){
1671	            error = OMX_ErrorInsufficientResources;
1672	            goto EXIT;
1673	        }
1674	        pTemp+= 128;
1675	        pInBuffer[nCounter] = pTemp;
1676	        pTemp = NULL;
1677
1678	        pTemp= (OMX_U8*)malloc(pOutPortDef->nBufferSize+256);
1679	        if(pTemp == NULL){
1680	            error = OMX_ErrorInsufficientResources;
1681	            goto EXIT;
1682	        }
1683	        pTemp+= 128;
1684	        pOutBuffer[nCounter] = pTemp;
1685	    }
1686
1687	    for (nCounter = 0; nCounter < NUM_OF_BUFFERSJPEG; nCounter++) {
1688	        error = OMX_UseBuffer(pHandle, &pInBuff[nCounter], nIndex1, (void*)&sJPEGEnc_CompID, pInPortDef->nBufferSize,pInBuffer[nCounter]);
1689	    }
1690	    for (nCounter = 0; nCounter < NUM_OF_BUFFERSJPEG; nCounter++) {
1691	        error = OMX_UseBuffer(pHandle, &pOutBuff[nCounter], nIndex2, (void*)&sJPEGEnc_CompID, pOutPortDef->nBufferSize,pOutBuffer[nCounter]);
1692	    }
1693	}
1694
1695	if (buffertype == 2) {
1696	    for (nCounter = 0; nCounter < NUM_OF_BUFFERSJPEG; nCounter++) {
1697	        error = OMX_AllocateBuffer(pHandle, &pInBuff[nCounter], nIndex1, (void *)&sJPEGEnc_CompID, pInPortDef->nBufferSize);
1698	    }
1699	    for (nCounter = 0; nCounter < NUM_OF_BUFFERSJPEG; nCounter++) {
1700	        error = OMX_AllocateBuffer(pHandle, &pOutBuff[nCounter], nIndex2, (void *)&sJPEGEnc_CompID, pOutPortDef->nBufferSize);
1701	    }
1702	}
1703
1704	/* set markers */
1705	error = SetMarkers(pHandle, imageinfo, sCrop, nWidth, nHeight);
1706	if ( error != OMX_ErrorNone ) {
1707		fprintf (stderr,"Error from SetMarkers()  function\n");
1708		goto EXIT;
1709	}
1710
1711	/**
1712	* wait for initialization to complete (as indicated by the statechange
1713	* callback saying that component has been loaded (and is therefore
1714	* initialized.  Note that you should probably handle GUI events
1715	* in the WaitForState method.
1716	**/
1717
1718	PRINT("Waiting for state Idle\n");
1719	error = WaitForState(pHandle, OMX_StateIdle);
1720	if ( error != OMX_ErrorNone ) {
1721	    PRINT("Error: JpegEncoder->WaitForState has timed out or failed %X\n",
1722	          error);
1723	    goto EXIT;
1724	}
1725
1726	pQfactorType->nSize = sizeof(OMX_IMAGE_PARAM_QFACTORTYPE);
1727	pQfactorType->nQFactor = (OMX_U32) qualityfactor;
1728	pQfactorType->nVersion.s.nVersionMajor = 0x1;
1729	pQfactorType->nVersion.s.nVersionMinor = 0x0;
1730	pQfactorType->nVersion.s.nRevision = 0x0;
1731	pQfactorType->nVersion.s.nStep = 0x0;
1732	pQfactorType->nPortIndex = 0x0;
1733
1734	error = OMX_GetExtensionIndex(pHandle, "OMX.TI.JPEG.encoder.Config.QFactor", (OMX_INDEXTYPE*)&nCustomIndex);
1735	if ( error != OMX_ErrorNone ) {
1736	    printf("%d::APP_Error at function call: %x\n", __LINE__, error);
1737	    goto EXIT;
1738	}
1739	error = OMX_SetConfig (pHandle, nCustomIndex, pQfactorType);
1740	if ( error != OMX_ErrorNone ) {
1741	    printf("%d::APP_Error at function call: %x\n", __LINE__, error);
1742	    goto EXIT;
1743	}
1744
1745
1746	/**
1747	 * Open the file of data to be rendered.  Since this is a just sample
1748	 * application, the data is "rendered" to a test mixer.  So, the test
1749	 * file better contain data that can be printed to the terminal w/o
1750	 * problems or you will not be a happy camper.
1751	**/
1752	PRINT("Opening output jpg file\n");
1753#ifdef UNDER_CE
1754	fOut = CreateFile(szOutFile, GENERIC_WRITE, 0,
1755	                       NULL,CREATE_ALWAYS, 0, NULL);
1756	if (INVALID_HANDLE_VALUE == fOut){
1757	    PRINT("Error: failed to open the file <%s> for writing\n",
1758	        szOutFile);
1759	    goto EXIT;
1760	}
1761#else
1762	fOut = fopen(szOutFile, "w");
1763	if ( fOut == NULL ) {
1764	    PRINT("Error: failed to open the file <%s> for writing\n",
1765	          szOutFile);
1766	    goto EXIT;
1767	}
1768#endif
1769
1770	error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateExecuting, NULL);
1771	if ( error != OMX_ErrorNone ) {
1772	    fprintf (stderr,"Error from SendCommand-Executing State function\n");
1773	    goto EXIT;
1774	}
1775	pComponent = (OMX_COMPONENTTYPE *)pHandle;
1776
1777	/**
1778	 * wait for startup to complete (as indicated by the statechange
1779	 * callback saying that component has been loaded (and is therefore
1780	 * initialized.  Note that you should probably handle GUI events
1781	 * in the WaitForState method.
1782	**/
1783
1784	PRINT("Waiting for OMX_StateExcecuting\n");
1785	error = WaitForState(pHandle, OMX_StateExecuting);
1786	if ( error != OMX_ErrorNone ) {
1787	    PRINT("Error:  JpegEncoder->WaitForState has timed out or failed %X\n", error);
1788	    goto EXIT;
1789	}
1790
1791#if 0
1792	if (imageinfo->nDRI) {
1793	    error = OMX_GetExtensionIndex(pHandle, "OMX.TI.JPEG.encoder.Config.DRI", (OMX_INDEXTYPE*)&nCustomIndex);
1794	    if ( error != OMX_ErrorNone ) {
1795	        printf("%d::APP_Error at function call: %x\n", __LINE__, error);
1796	        goto EXIT;
1797	    }
1798	    error = OMX_SetConfig(pHandle, nCustomIndex, &(imageinfo->nDRI));
1799	    if ( error != OMX_ErrorNone ) {
1800	        printf("%d::APP_Error at function call: %x\n", __LINE__, error);
1801	        goto EXIT;
1802	    }
1803	}
1804#endif
1805
1806	/** Handle the component's requests for data until we run out of data.  Do this
1807	 * in a way that will allow the UI to continue to run (if there is a UI, which
1808	 * this sample application does NOT have)
1809	**/
1810
1811	done = 0;
1812	pComponent->GetState(pHandle, &state);
1813	PRINT("Error is %d , cur state is %d ",error, state);
1814
1815
1816	for (nCounter =0; nCounter<1 /*NUM_OF_BUFFERSJPEG*/; nCounter++) {
1817		nRead = fill_data(pInBuff[nCounter], fIn,pInPortDef->nBufferSize);
1818		pComponent->FillThisBuffer(pHandle, pOutBuff[nCounter]);
1819		pComponent->EmptyThisBuffer(pHandle, pInBuff[nCounter]);
1820		framesent++;
1821		PRINT("Sent Frame # %d\n", framesent);
1822		if (pInBuff[nCounter]->nFlags == OMX_BUFFERFLAG_ENDOFFRAME)
1823		    break;
1824	}
1825
1826	while ((error == OMX_ErrorNone) &&
1827	        (state != OMX_StateIdle)) {
1828
1829	        if (bPreempted)
1830	        {
1831			PRINT("Preempted - Forced tp Idle State - Waiting for OMX_StateIdle\n");
1832			error = WaitForState(pHandle, OMX_StateIdle);
1833			if ( error != OMX_ErrorNone ) {
1834				PRINT("Error:  JpegEncoder->WaitForState has timed out or failed %X",  error);
1835				goto EXIT;
1836			}
1837			break;
1838	        }
1839
1840	        fd_set rfds;
1841		sigemptyset(&set);
1842		sigaddset(&set,SIGALRM);
1843
1844	        FD_ZERO(&rfds);
1845	        FD_SET(IpBuf_Pipe[0], &rfds);
1846	        FD_SET(OpBuf_Pipe[0], &rfds);
1847	        FD_SET(Event_Pipe[0], &rfds);
1848	        retval = pselect(fdmax+1, &rfds, NULL, NULL, NULL,&set);
1849	        if ( retval == -1 ) {
1850#ifndef UNDER_CE
1851			perror("select()");
1852#endif
1853			fprintf (stderr, " : Error \n");
1854			break;
1855	        }
1856	        else if ( retval == 0 ) {
1857			PRINT("App Timeout !!!!!!!!!!!\n");
1858	        }
1859
1860        	/**
1861		* If FD_ISSET for Event_Pipe, there is an event remaining on the pipe.  Read it
1862		* and get act accordingly to the event.
1863		**/
1864	        if ( FD_ISSET(Event_Pipe[0], &rfds)) {
1865
1866	            JPEGE_EVENTPRIVATE EventPrivate;
1867	            read(Event_Pipe[0], &EventPrivate, sizeof(JPEGE_EVENTPRIVATE));
1868
1869	            switch(EventPrivate.eEvent) {
1870	                case OMX_EventError:
1871				if(bError) {
1872					error = WaitForState(pHandle, OMX_StateInvalid);
1873					if (error != OMX_ErrorNone) {
1874						printf("APP:: Error:  JpegEncoder->WaitForState has timed out or failed %X\n", error);
1875						goto EXIT;
1876					}
1877					printf("APP:: Component is in Invalid state now.\n");
1878					goto EXIT;
1879				}
1880				break;
1881
1882	                case OMX_EventBufferFlag:
1883		                printf("APP:: EOS flag received\n");
1884		                break;
1885
1886	                default:
1887		                printf("APP:: Non-error event rised. Event -> 0x%x\n", EventPrivate.eEvent);
1888		                break;
1889	            }
1890	        }
1891
1892		/**
1893		* If FD_ISSET for IpBuf_Pipe, then there is an empty buffer available on the pipe.  Read it
1894		* from the pipe, then re-fill the buffer and send it back.
1895		**/
1896		if ( FD_ISSET(IpBuf_Pipe[0], &rfds) && !DEINIT_FLAG ) {
1897
1898			/*read buffer */
1899			read(IpBuf_Pipe[0], &pBuffer, sizeof(pBuffer));
1900
1901			/* re-fill this buffer with data from JPEG file */
1902			nRead = fill_data(pBuffer, fIn,pInPortDef->nBufferSize);
1903
1904			/* call EmptyThisBuffer (send buffer back to component */
1905			OMX_EmptyThisBuffer(pHandle, pBuffer);
1906
1907			/*increment count */
1908			framesent++;
1909			PRINT("Sent Frame # %d\n", framesent);
1910	        }
1911
1912		/**
1913		* If FD_ISSET for OpBuf_Pipe, then there is a filled buffer available on the pipe.  Read it
1914		* and get the buffer data out, write it to a file and then re-empty the buffer and send
1915		* the buffer back to the component.
1916		**/
1917	        if (FD_ISSET(OpBuf_Pipe[0], &rfds)) {
1918
1919			/* read buffer */
1920			read(OpBuf_Pipe[0], &pBuf, sizeof(pBuf));
1921
1922			/* write data to a file, buffer is assumed to be emptied after this*/
1923#ifdef UNDER_CE
1924			WriteFile(fOut, pBuf->pBuffer, pBuf->nFilledLen, &dwWritten, NULL);
1925#else
1926			printf("APP:: Write into file %lu bytes (%d)\n",pBuf->nFilledLen, nframerecieved);
1927			fwrite(pBuf->pBuffer, 1,  (int)pBuf->nFilledLen, fOut);
1928			fflush(fOut);
1929#endif
1930			/*increment count and validate for limits; call FillThisBuffer */
1931			nframerecieved++;
1932			nRepeated++;
1933			PRINT("\n%d***************%d***************%d***************%d***************%d\n", nRepeated, nRepeated, nRepeated, nRepeated, nRepeated);
1934			if (nRepeated >= maxRepeat) {
1935				DEINIT_FLAG = 1;
1936			}
1937			else {
1938				PRINT("Sending another output buffer\n");
1939				pComponent->FillThisBuffer(pHandle,pBuf);
1940			}
1941	        }
1942
1943	        if (DEINIT_FLAG == 1) {
1944                    done = 1;
1945                    pHandle = (OMX_HANDLETYPE *) pComponent;
1946                    error = OMX_SendCommand(pHandle,OMX_CommandStateSet, OMX_StateIdle, NULL);
1947                    if ( error != OMX_ErrorNone ) {
1948                        fprintf (stderr,"APP:: Error from SendCommand-Idle(Stop) State function\n");
1949                        goto EXIT;
1950                    }
1951
1952                    PRINT("Waiting for OMX_StateIdle\n");
1953                    error = WaitForState(pHandle, OMX_StateIdle);
1954                    if ( error != OMX_ErrorNone ) {
1955                        PRINT("Error:  JpegEncoder->WaitForState has timed out %X", error);
1956                        goto EXIT;
1957                    }
1958
1959                    error = OMX_SendCommand(pHandle, OMX_CommandPortDisable, 0, NULL);
1960                    if ( error != OMX_ErrorNone ) {
1961                        PRINT("Error from SendCommand-PortDisable function\n");
1962                        goto EXIT;
1963                    }
1964	        }
1965
1966	        if (done == 1) {
1967                    error = pComponent->GetState(pHandle, &state);
1968                    if ( error != OMX_ErrorNone ){
1969                        fprintf(stderr, "Warning:  JpegEncoder->JPEGENC_GetState has returned status %X\n", error);
1970                        goto EXIT;
1971                    }
1972                    PRINT("After GetState() in while loop.\n");
1973	        }
1974	}
1975
1976
1977
1978
1979#ifdef STRESS
1980      }
1981#endif
1982
1983	printf("\nTest Completed Successfully! Deinitializing ... \n\n");
1984
1985EXIT:
1986
1987	printf("\nClosing application...\n");
1988
1989	/**
1990	*  Freeing memory
1991	**/
1992
1993/*close handles */
1994#ifdef UNDER_CE
1995	CloseHandle(fOut);
1996	CloseHandle(fIn);
1997#else
1998	fclose(fOut);
1999	rewind (fIn);
2000	fclose(fIn);
2001#endif
2002
2003	PRINT("Freeing memory from test app\n");
2004	FREE(pPortParamType);
2005	FREE(pQfactorType);
2006	FREE(pInPortDef);
2007	FREE(pOutPortDef);
2008	FREE(imageinfo);
2009	FREE(pQuantizationTable);
2010	FREE(pHuffmanTable);
2011
2012	if( error != OMX_ErrorNone){
2013		if (buffertype == 1) {
2014			for (nCounter = 0; nCounter < NUM_OF_BUFFERSJPEG; nCounter++) {
2015				pOutBuffer[nCounter]-=128;
2016				pInBuffer[nCounter]-=128;
2017				FREE(pOutBuffer[nCounter]);
2018				FREE(pInBuffer[nCounter]);
2019			}
2020		}
2021		for (nCounter = 0; nCounter < NUM_OF_BUFFERSJPEG; nCounter++) {
2022		    error = OMX_FreeBuffer(pHandle, nIndex1, pInBuff[nCounter]);
2023		    if ( (error != OMX_ErrorNone) ) {
2024		        printf ("Error in OMX_FreeBuffer: %d\n", __LINE__);
2025		    }
2026		    error = OMX_FreeBuffer(pHandle, nIndex2, pOutBuff[nCounter]);
2027		    if ( (error != OMX_ErrorNone) ) {
2028		        printf ("Error in OMX_FreeBuffer: %d\n", __LINE__);
2029		    }
2030		}
2031	}
2032
2033	error = TIOMX_FreeHandle(pHandle);
2034	if ( (error != OMX_ErrorNone) ) {
2035	    printf ("Error in Free Handle function\n");
2036	}
2037
2038#ifdef DSP_MMU_FAULT_HANDLING
2039
2040        if(bError) {
2041            LoadBaseImage();
2042        }
2043
2044#endif
2045
2046	error = TIOMX_Deinit();
2047	if ( error != OMX_ErrorNone ) {
2048	    printf("Error returned by OMX_DeInit()\n");
2049	}
2050
2051#ifdef STRESS
2052
2053} /* end of multiload loop */
2054
2055#endif
2056
2057#ifndef UNDER_CE
2058//muntrace();
2059#endif
2060    PRINT ("Free Handle returned Successfully = %x\n",error);
2061    return error;
2062}
2063
2064#ifdef DSP_MMU_FAULT_HANDLING
2065
2066int LoadBaseImage() {
2067    unsigned int uProcId = 0;	/* default proc ID is 0. */
2068    unsigned int index = 0;
2069
2070    struct DSP_PROCESSORINFO dspInfo;
2071    DSP_HPROCESSOR hProc;
2072    DSP_STATUS status = DSP_SOK;
2073    unsigned int numProcs;
2074    char* argv[2];
2075
2076    argv[0] = "/lib/dsp/baseimage.dof";
2077
2078    status = (DBAPI)DspManager_Open(0, NULL);
2079    if (DSP_FAILED(status)) {
2080        printf("DSPManager_Open failed \n");
2081        return -1;
2082    }
2083    while (DSP_SUCCEEDED(DSPManager_EnumProcessorInfo(index,&dspInfo,
2084        (unsigned int)sizeof(struct DSP_PROCESSORINFO),&numProcs))) {
2085        if ((dspInfo.uProcessorType == DSPTYPE_55) ||
2086            (dspInfo.uProcessorType == DSPTYPE_64)) {
2087            uProcId = index;
2088            status = DSP_SOK;
2089            break;
2090        }
2091        index++;
2092    }
2093    status = DSPProcessor_Attach(uProcId, NULL, &hProc);
2094    if (DSP_SUCCEEDED(status)) {
2095        status = DSPProcessor_Stop(hProc);
2096        if (DSP_SUCCEEDED(status)) {
2097            status = DSPProcessor_Load(hProc,1,(const char **)argv,NULL);
2098            if (DSP_SUCCEEDED(status)) {
2099                status = DSPProcessor_Start(hProc);
2100                if (DSP_SUCCEEDED(status)) {
2101                }
2102                else {
2103                }
2104            }
2105			else {
2106            }
2107            DSPProcessor_Detach(hProc);
2108        }
2109        else {
2110        }
2111    }
2112    else {
2113    }
2114    fprintf(stderr,"Baseimage Loaded\n");
2115
2116    return 0;
2117}
2118#endif
2119