xref: /utopia/UTPA2-700.0.x/modules/njpd/api/njpeg_ex/apiJPEG.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1 //<MStar Software>
2 //******************************************************************************
3 // MStar Software
4 // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5 // All software, firmware and related documentation herein ("MStar Software") are
6 // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7 // law, including, but not limited to, copyright law and international treaties.
8 // Any use, modification, reproduction, retransmission, or republication of all
9 // or part of MStar Software is expressly prohibited, unless prior written
10 // permission has been granted by MStar.
11 //
12 // By accessing, browsing and/or using MStar Software, you acknowledge that you
13 // have read, understood, and agree, to be bound by below terms ("Terms") and to
14 // comply with all applicable laws and regulations:
15 //
16 // 1. MStar shall retain any and all right, ownership and interest to MStar
17 //    Software and any modification/derivatives thereof.
18 //    No right, ownership, or interest to MStar Software and any
19 //    modification/derivatives thereof is transferred to you under Terms.
20 //
21 // 2. You understand that MStar Software might include, incorporate or be
22 //    supplied together with third party`s software and the use of MStar
23 //    Software may require additional licenses from third parties.
24 //    Therefore, you hereby agree it is your sole responsibility to separately
25 //    obtain any and all third party right and license necessary for your use of
26 //    such third party`s software.
27 //
28 // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29 //    MStar`s confidential information and you agree to keep MStar`s
30 //    confidential information in strictest confidence and not disclose to any
31 //    third party.
32 //
33 // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34 //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35 //    without limitation, any warranties of merchantability, non-infringement of
36 //    intellectual property rights, fitness for a particular purpose, error free
37 //    and in conformity with any international standard.  You agree to waive any
38 //    claim against MStar for any loss, damage, cost or expense that you may
39 //    incur related to your use of MStar Software.
40 //    In no event shall MStar be liable for any direct, indirect, incidental or
41 //    consequential damages, including without limitation, lost of profit or
42 //    revenues, lost or damage of data, and unauthorized system use.
43 //    You agree that this Section 4 shall still apply without being affected
44 //    even if MStar Software has been modified by MStar in accordance with your
45 //    request or instruction for your use, except otherwise agreed by both
46 //    parties in writing.
47 //
48 // 5. If requested, MStar may from time to time provide technical supports or
49 //    services in relation with MStar Software to you for your use of
50 //    MStar Software in conjunction with your or your customer`s product
51 //    ("Services").
52 //    You understand and agree that, except otherwise agreed by both parties in
53 //    writing, Services are provided on an "AS IS" basis and the warranty
54 //    disclaimer set forth in Section 4 above shall apply.
55 //
56 // 6. Nothing contained herein shall be construed as by implication, estoppels
57 //    or otherwise:
58 //    (a) conferring any license or right to use MStar name, trademark, service
59 //        mark, symbol or any other identification;
60 //    (b) obligating MStar or any of its affiliates to furnish any person,
61 //        including without limitation, you and your customers, any assistance
62 //        of any kind whatsoever, or any information; or
63 //    (c) conferring any license or right under any intellectual property right.
64 //
65 // 7. These terms shall be governed by and construed in accordance with the laws
66 //    of Taiwan, R.O.C., excluding its conflict of law rules.
67 //    Any and all dispute arising out hereof or related hereto shall be finally
68 //    settled by arbitration referred to the Chinese Arbitration Association,
69 //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70 //    Rules of the Association by three (3) arbitrators appointed in accordance
71 //    with the said Rules.
72 //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73 //    be English.
74 //    The arbitration award shall be final and binding to both parties.
75 //
76 //******************************************************************************
77 //<MStar Software>
78 ////////////////////////////////////////////////////////////////////////////////
79 //
80 // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81 // All rights reserved.
82 //
83 // Unless otherwise stipulated in writing, any and all information contained
84 // herein regardless in any format shall remain the sole proprietary of
85 // MStar Semiconductor Inc. and be kept in strict confidence
86 // ("MStar Confidential Information") by the recipient.
87 // Any unauthorized act including without limitation unauthorized disclosure,
88 // copying, use, reproduction, sale, distribution, modification, disassembling,
89 // reverse engineering and compiling of the contents of MStar Confidential
90 // Information is unlawful and strictly prohibited. MStar hereby reserves the
91 // rights to any and all damages, losses, costs and expenses resulting therefrom.
92 //
93 ////////////////////////////////////////////////////////////////////////////////
94 
95 ///////////////////////////////////////////////////////////////////////////////////////////////////
96 ///
97 /// file    apiJPEG.c
98 /// @brief  JPEG API
99 /// @author MStar Semiconductor Inc.
100 ///////////////////////////////////////////////////////////////////////////////////////////////////
101 
102 
103 //-------------------------------------------------------------------------------------------------
104 //  Include Files
105 //-------------------------------------------------------------------------------------------------
106 #include "MsCommon.h"
107 #include "MsVersion.h"
108 #include "MsOS.h"
109 #include "asmCPU.h"
110 #include "njpeg_def.h"
111 #include "drvNJPD.h"
112 //#include "Utl.h"
113 ////#include "drvUART.h"
114 
115 #ifndef MSOS_TYPE_LINUX_KERNEL
116 #include <setjmp.h>
117 #endif
118 #include "jpeg_memory.h"
119 #include "apiJPEG.h"
120 
121 #ifdef MSOS_TYPE_LINUX_KERNEL
122 #include <linux/string.h>
123 #else
124 #include <string.h>
125 #endif
126 
127 #if SUPPORT_OJPD
128 #include "apiJPEG_OJPD.h"
129 #endif
130 
131 #include "utopia.h"
132 #include "apiJPEG_priv.h"
133 #include "apiJPEG_v2.h"
134 
135 
136 #if (defined CONFIG_MLOG)
137 #include "ULog.h"
138 #endif
139 
140 void* pInstantNJPD = NULL;
141 
142 //-------------------------------------------------------------------------------------------------
143 //  Local Compiler Options
144 //-------------------------------------------------------------------------------------------------
145 #define SUPPORT_PROGRESSIVE_MODE    1UL
146 
147 #define ENABLE_JPEG_NO_SIZE_LOWER_BOUND 0UL
148 
149 #define SUPPORT_PROGRESSIVE_SCLAEDOWN_MODE    1UL //CL82399
150 
151 #define SW_OPTIMIZE         0UL
152 #ifndef MSOS_TYPE_LINUX_KERNEL
153 #define SW_NJPD_RGB_CMYK      0UL
154 #else
155 #define SW_NJPD_RGB_CMYK      0
156 #endif
157 
158 /* Need to check whether OS support jump API or not */
159 #ifdef CMODEL
160 #define NJPD_LONGJUMP_SUPPORT
161 #endif
162 #if 0
163 #if !defined(MSOS_TYPE_ECOS)
164 #define USE_LIBC
165 #endif
166 #ifndef USE_LIBC
167 #define jmp_buf             MS_U32
168 #define setjmp(jmp_state)   FALSE
169 #define longjmp(jmp_state, status)
170 #endif
171 #endif
172 
173 #define MJPEG_SW_PARSING_IN_MIU0      FALSE // TRUE
174 #define PRINT_NJPD_DECODE_TIME   0UL
175 #define LOG_DATA_TO_USB         0UL
176 
177 #ifdef NJPEG_UTOPIA_2K
178     #define VDEC_DRIVER_BASE KERNEL_MODE
179 #else
180     #define VDEC_DRIVER_BASE 0
181 #endif
182 
183 #ifndef CONFIG_MLOG
184 
185 #ifdef MSOS_TYPE_LINUX_KERNEL
186 #undef printf
187 #define printf(format, args...)          printk(format, ##args);
188 #endif
189 
190 #endif
191 
192 #if PRINT_NJPD_DECODE_TIME
193 #include "drvWDT.h"
194 #endif
195 //-------------------------------------------------------------------------------------------------
196 //  Local Defines
197 //-------------------------------------------------------------------------------------------------
198 // Max. allocated blocks
199 #define JPEG_MAXBLOCKS    50UL
200 
201 #define DEFAULT_DECODE_TIMEOUT  100UL
202 
203 //fractional bits in scale factors
204 #define IFAST_SCALE_BITS    2UL
205 
206 #define JPEG_TIFF_SOI_OFFSET                    0x0201UL
207 #define JPEG_TIFF_JPEG_IMG_BYTES                0x0202UL
208 
209 #define JPEG_TIFF_BIG_ENDIAN                    0x4D4DUL
210 #define JPEG_TIFF_LITTLE_ENDIAN                 0x4949UL
211 
212 //EXIF Tag
213 #define JPEG_EXIF_TAG_MANUFACTURER              0x010FUL
214 #define JPEG_EXIF_TAG_MODEL                     0x0110UL
215 #define JPEG_EXIF_TAG_ORIENTATION               0x0112UL
216 #define JPEG_EXIF_TAG_DATETIME_MOD              0x0132UL
217 #define JPEG_EXIF_TAG_EXPOSURE_TIME             0x829AUL
218 #define JPEG_EXIF_TAG_F_NUMBER                  0x829DUL
219 #define JPEG_EXIF_TAG_IFD_POINTER               0x8769UL
220 #define JPEG_EXIF_TAG_EXPOSURE_PROGRAM          0x8822UL
221 #define JPEG_EXIF_TAG_ISO_SPEED_RATING          0x8827UL
222 #define JPEG_EXIF_TAG_DATETIME_ORI              0x9003UL
223 #define JPEG_EXIF_TAG_SHUTTER_SPEED             0x9201UL
224 #define JPEG_EXIF_TAG_APERTURE                  0x9202UL
225 #define JPEG_EXIF_TAG_EXPOSURE_BIAS             0x9204UL
226 #define JPEG_EXIF_TAG_FLASH                     0x9209UL
227 #define JPEG_EXIF_TAG_FOCAL_LENGTH              0x920AUL
228 #define JPEG_EXIF_TAG_IMAGE_WIDTH               0xA002UL
229 #define JPEG_EXIF_TAG_IMAGE_HEIGHT              0xA003UL
230 
231 #define JPEG_MANUFACTURER_SIZE                  32UL
232 #define JPEG_MODEL_SIZE                         128UL
233 
234 #define MIN_READBUFFER_SIZE                     128UL
235 #define MRC_CHECK_COUNT                         5000UL
236 #define MRC_DECODE_TIMEOUT                      3000UL
237 #define WRITE_RLE_TIMEOUT_MS                    10000UL
238 #define WRITE_RLE_TIMEOUT_COUNT                 1000000UL
239 
240 #define MRC_BUFFER_ADDR         pNJPEGContext->_u32ReadBufferAddr[pNJPEGContext->eNJPDNum]
241 #define MRC_BUFFER_SIZE         pNJPEGContext->_u32ReadBufferSize[pNJPEGContext->eNJPDNum]
242 #define MWC_BUFFER_ADDR         pNJPEGContext->_u32WriteBufferAddr[pNJPEGContext->eNJPDNum]
243 #define MWC_BUFFER_SIZE         pNJPEGContext->_u32WriteBufferSize[pNJPEGContext->eNJPDNum]
244 #define INTERNAL_BUFFER_ADDR    pNJPEGContext->_u32InternalBufferAddr[pNJPEGContext->eNJPDNum]
245 #define INTERNAL_BUFFER_SIZE    pNJPEGContext->_u32InternalBufferSize[pNJPEGContext->eNJPDNum]
246 
247 #define HUFF_EXTEND_TBL(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))
248 
249 #define HUFF_EXTEND_P(x,s)  HUFF_EXTEND_TBL(x,s)
250 
251 /* EXIF parsing section */
252 #define EndianChangeL(_x)   \
253     ((((_x) & 0xffUL) << 24) | (((_x) & 0xff00UL) << 8) | (((_x) & 0xff0000UL) >> 8) | (((_x) & 0xff000000UL) >> 24))
254 
255 #define EndianChangeS(_x)   \
256     ((((_x) & 0xffUL) << 8) | (((_x) & 0xff00UL) >> 8))
257 
258 #define JPEG_TAG_EXIF   EndianChangeL(0x45786966UL)
259 
260 #define JPEG_ABS(x)     (((x)>=0UL)?(x):(-(x)))
261 
262 #if 0
263 static APP0_Unit App0_Unit_Data[E_NJPD_NJPD_TOTAL];
264 #endif
265 
266 // No need to do ZAG order in NJPD mode
267 #if SW_NJPD_RGB_CMYK
268 JPEG_STATIC MS_U16 _u16PaddingMcuNumber;
269 
270 MS_U32 u32_Decode_Line;
271 MS_U8 *u8Out_buf;
272 //#define DCTSIZE 8
273 //#define DCTELEM int
274 #define PASS1_BITS  2
275 #define FIX_3_0727  ((MS_S32)25172UL)  /* FIX(3.072711026) */
276 #define FIX_2_5629  ((MS_S32)20995UL)  /* FIX(2.562915447) */
277 #define FIX_2_0531  ((MS_S32)16819UL)  /* FIX(2.053119869) */
278 #define FIX_1_9615  ((MS_S32)16069UL)  /* FIX(1.961570560) */
279 #define FIX_1_8477  ((MS_S32)15137UL)  /* FIX(1.847759065) */
280 #define FIX_1_5013  ((MS_S32)12299UL)  /* FIX(1.501321110) */
281 #define FIX_1_1758  ((MS_S32)9633UL)   /* FIX(1.175875602) */
282 #define FIX_0_8999  ((MS_S32)7373UL)   /* FIX(0.899976223) */
283 #define FIX_0_7653  ((MS_S32)6270UL)   /* FIX(0.765366865) */
284 #define FIX_0_5411  ((MS_S32)4433UL)   /* FIX(0.541196100) */
285 #define FIX_0_3901  ((MS_S32)3196UL)   /* FIX(0.390180644) */
286 #define FIX_0_2986  ((MS_S32)2446UL)   /* FIX(0.298631336) */
287 #define SCALE_DONE ((MS_S32) 1UL)
288 #define DESCALE(a,m)  (((a) + (SCALE_DONE << ((m)-1))) >> (m))
289 #define jpeg_clamp(i) if (i & 0xFF00UL) i = (((~i) >> 15) & 0xFFUL);
290 #define SCALEBITS 16UL
291 #define ONE_HALF ((MS_S32) 1UL << (SCALEBITS-1))
292 #define FIX(x) ((MS_S32) ((x) * (1L<<SCALEBITS) + 0.5))
293 
294 
295 #define HUFF_EXTEND(x,s)    ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))
296 
297 #endif
298 
299 #if LOG_DATA_TO_USB
300 FILE *logBinfp;
301 
302 #define JPEG_DEBUG_API_MSG(format, args...)  do{if(logBinfp) fprintf(logBinfp, format, ##args);}while(0)
303 #define JPEG_DEBUG_API_ERR(format, args...)  do{if(logBinfp)  fprintf(logBinfp, format, ##args);}while(0)
304 #else
305 #if (defined CONFIG_MLOG)
306 
307 #define JPEG_DEBUG_API_MSG(format, args...)  do{if(pNJPEGContext->_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API) ULOGI("NJPD", format, ##args);}while(0)
308 #define JPEG_DEBUG_API_ERR(format, args...)  do{if(pNJPEGContext->_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_ERR) ULOGE("NJPD", format, ##args);}while(0)
309 #define UTOPIA_20_DBG(format, args...)        do{if(gNJPEGContext._u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API) ULOGI("NJPD", format, ##args);}while(0)
310 #define UTOPIA_20_ERR(format, args...)        do{if(gNJPEGContext._u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_ERR) ULOGI("NJPD", format, ##args);}while(0)
311 
312 #else
313 #ifndef ANDROID
314 
315 #ifdef MSOS_TYPE_LINUX_KERNEL
316 #define JPEG_DEBUG_API_MSG(format, args...)  do{if(pNJPEGContext->_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API) printk(format, ##args);}while(0)
317 #define JPEG_DEBUG_API_ERR(format, args...)  do{if(pNJPEGContext->_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_ERR) printk(format, ##args);}while(0)
318 #define UTOPIA_20_DBG(format, args...)        do{if(gNJPEGContext._u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API) printk(format, ##args);}while(0)
319 #define UTOPIA_20_ERR(format, args...)        do{if(gNJPEGContext._u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_ERR) printk(format, ##args);}while(0)
320 #else
321 #define JPEG_DEBUG_API_MSG(format, args...)  do{if(pNJPEGContext->_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API) printf(format, ##args);}while(0)
322 #define JPEG_DEBUG_API_ERR(format, args...)  do{if(pNJPEGContext->_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_ERR) printf(format, ##args);}while(0)
323 #define UTOPIA_20_DBG(format, args...)        do{if(gNJPEGContext._u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API) printf(format, ##args);}while(0)
324 #define UTOPIA_20_ERR(format, args...)        do{if(gNJPEGContext._u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_ERR) printf(format, ##args);}while(0)
325 #endif
326 #else
327 #define LOG_TAG "API_JPEG"
328 #include <cutils/log.h>
329 #ifndef LOGD
330 #define JPEG_DEBUG_API_MSG(format, args...)  do{if(pNJPEGContext->_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API) ALOGI(format, ##args);}while(0)
331 #define JPEG_DEBUG_API_ERR(format, args...)  do{if(pNJPEGContext->_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_ERR) ALOGE(format, ##args);}while(0)
332 #define UTOPIA_20_DBG(format, args...)  do{if(gNJPEGContext._u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API) ALOGE(format, ##args);}while(0)
333 #define UTOPIA_20_ERR(format, args...)  do{if(gNJPEGContext._u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_ERR) ALOGE(format, ##args);}while(0)
334 #else
335 #define JPEG_DEBUG_API_MSG(format, args...)  do{if(pNJPEGContext->_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API) LOGI(format, ##args);}while(0)
336 #define JPEG_DEBUG_API_ERR(format, args...)  do{if(pNJPEGContext->_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_ERR) LOGE(format, ##args);}while(0)
337 #define UTOPIA_20_DBG(format, args...)  do{if(gNJPEGContext._u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API) LOGE(format, ##args);}while(0)
338 #define UTOPIA_20_ERR(format, args...)  do{if(gNJPEGContext._u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_ERR) LOGE(format, ##args);}while(0)
339 #endif
340 #endif
341 
342 #endif
343 
344 
345 #endif
346 //#define printf_red(args...)           do{ printf("\033[1;31m"); printf(args); printf("\033[m"); }while(0)
347 //#define UTOPIA_20_DBG(args...)        //do{ printf("\033[1;31m"); printf(args); printf("\033[m"); }while(0)
348 
349 #define JPEG_OVER_BUFFER_RET(addr, buf_addr, buf_size) \
350 do \
351 { \
352     if(((MS_VIRT)(addr) < (MS_VIRT)(buf_addr)) \
353     || ((MS_VIRT)(addr) >= ((MS_VIRT)(buf_addr) + (MS_U32)(buf_size)))) \
354     { \
355         JPEG_DEBUG_API_ERR("%s [%d] invalid address 0x%tx\n", __FUNCTION__, __LINE__, (ptrdiff_t)(addr)); \
356         return FALSE; \
357     } \
358 } \
359 while(0)
360 
361 #define _NJPEG_SHM_POINTER_CHECK()   \
362     do\
363     {\
364         if (pNJPEGContext == NULL)\
365         {\
366             return;\
367         }\
368     }while(0)
369 
370 #define _NJPEG_SHM_POINTER_CHECK_RETURN(x)   \
371     do\
372     {\
373         if (pNJPEGContext == NULL)\
374         {\
375             return x;\
376         }\
377     }while(0)
378 
379 //-------------------------------------------------------------------------------------------------
380 //  Local Structures
381 //-------------------------------------------------------------------------------------------------
382 //JPEG header marker id
383 typedef enum
384 {
385     E_JPEG_SOF0     = 0xC0
386   , E_JPEG_SOF1     = 0xC1
387   , E_JPEG_SOF2     = 0xC2
388   , E_JPEG_SOF3     = 0xC3
389   , E_JPEG_SOF5     = 0xC5
390   , E_JPEG_SOF6     = 0xC6
391   , E_JPEG_SOF7     = 0xC7
392   , E_JPEG_JPG      = 0xC8
393   , E_JPEG_SOF9     = 0xC9
394   , E_JPEG_SOF10    = 0xCA
395   , E_JPEG_SOF11    = 0xCB
396   , E_JPEG_SOF13    = 0xCD
397   , E_JPEG_SOF14    = 0xCE
398   , E_JPEG_SOF15    = 0xCF
399   , E_JPEG_DHT      = 0xC4
400   , E_JPEG_DAC      = 0xCC
401   , E_JPEG_RST0     = 0xD0
402   , E_JPEG_RST1     = 0xD1
403   , E_JPEG_RST2     = 0xD2
404   , E_JPEG_RST3     = 0xD3
405   , E_JPEG_RST4     = 0xD4
406   , E_JPEG_RST5     = 0xD5
407   , E_JPEG_RST6     = 0xD6
408   , E_JPEG_RST7     = 0xD7
409   , E_JPEG_SOI      = 0xD8
410   , E_JPEG_EOI      = 0xD9
411   , E_JPEG_SOS      = 0xDA
412   , E_JPEG_DQT      = 0xDB
413   , E_JPEG_DNL      = 0xDC
414   , E_JPEG_DRI      = 0xDD
415   , E_JPEG_DHP      = 0xDE
416   , E_JPEG_EXP      = 0xDF
417   , E_JPEG_APP0     = 0xE0
418   , E_JPEG_APP1     = 0xE1
419   , E_JPEG_APP2     = 0xE2
420   , E_JPEG_APP3     = 0xE3
421   , E_JPEG_APP4     = 0xE4
422   , E_JPEG_APP5     = 0xE5
423   , E_JPEG_APP6     = 0xE6
424   , E_JPEG_APP7     = 0xE7
425   , E_JPEG_APP8     = 0xE8
426   , E_JPEG_APP9     = 0xE9
427   , E_JPEG_APP10     = 0xEA
428   , E_JPEG_APP11     = 0xEB
429   , E_JPEG_APP12     = 0xEC
430   , E_JPEG_APP13     = 0xED
431   , E_JPEG_APP14     = 0xEE
432   , E_JPEG_APP15    = 0xEF
433   , E_JPEG_JPG0     = 0xF0
434   , E_JPEG_JPG1     = 0xF1
435   , E_JPEG_JPG2     = 0xF2
436   , E_JPEG_JPG3     = 0xF3
437   , E_JPEG_JPG4     = 0xF4
438   , E_JPEG_JPG5     = 0xF5
439   , E_JPEG_JPG6     = 0xF6
440   , E_JPEG_JPG7     = 0xF7
441   , E_JPEG_JPG8     = 0xF8
442   , E_JPEG_JPG9     = 0xF9
443   , E_JPEG_JPG10     = 0xFA
444   , E_JPEG_JPG11     = 0xFB
445   , E_JPEG_JPG12     = 0xFC
446   , E_JPEG_JPG13    = 0xFD
447   , E_JPEG_COM      = 0xFE
448   , E_JPEG_TEM      = 0x01
449   , E_JPEG_ERROR    = 0x100
450 } JPEG_HdrMarker;
451 
452 //------------------------------------------------------------------------------
453 typedef enum
454 {
455     E_RLE_DC = 0,
456     E_RLE_AC,
457     E_RLE_ZRL,
458     E_RLE_EOB,
459 } JPEG_RLESymbol;
460 //-----------------------------------------------------------------------------
461 /// @brief \b Struct \b Name: JPEG_CoeffBuf
462 /// @brief \b Struct \b Description: The info of coefficient for JPEG decode
463 //-----------------------------------------------------------------------------
464 typedef struct
465 {
466     MS_U8 *pu8Data;         ///<data of coefficient of DC, AC
467     MS_U16 u16Block_num_x;  ///<the number of block for width
468     MS_U16 u16Block_num_y;  ///<the number of block for height
469     MS_U16 u16Block_size;   ///<block size
470     MS_U8 u8Block_len_x;    ///<The width of block
471     MS_U8 u8Block_len_y;    ///<The height of block
472 } JPEG_CoeffBuf, *PJPEG_CoeffBuf;
473 //-----------------------------------------------------------------------------
474 /// @brief \b Struct \b Name: JPEG_SVLD
475 /// @brief \b Struct \b Description: The info of SVLD for JPEG decode
476 //-----------------------------------------------------------------------------
477 #if 0
478 typedef struct
479 {
480     union
481     {
482         struct
483         {
484             MS_U32 amp          :11;    ///<The amplitude of value of VLI
485             MS_U32 sign         :1;     ///<The sign of value of VLI
486             MS_U32 run          :4;     ///<run value
487             MS_U32 sym_type     :2;     ///<symbol type
488             MS_U32 blk_type     :2;     ///<YUV type
489             MS_U32 EOP          :1;     ///<End of picture
490             MS_U32 trash        :11;    ///<reserved
491         };
492 
493         struct
494         {
495             MS_U8 byte0;    ///<byte0 of SVLD
496             MS_U8 byte1;    ///<byte1 of SVLD
497             MS_U8 byte2;    ///<byte2 of SVLD
498             MS_U8 byte3;    ///<byte3 of SVLD
499         };
500     };
501 } JPEG_SVLD;
502 #else //nJPD
503 typedef struct
504 {
505     union
506     {
507         struct
508         {
509             MS_U32 data         :12;  ///<The value of VLI(2's compl & sign-ext)
510             MS_U32 run          :4;   ///<run value
511             MS_U32 EOB          :1;   ///<end of block
512             MS_U32 altzz        :1;   ///<alternative zig-zag
513             MS_U32 zzorder      :1;   ///<zig-zag scan order
514             MS_U32 trash        :13;  ///<reserved
515         };
516 
517         struct
518         {
519             MS_U8 byte0;    ///<byte0 of SVLD
520             MS_U8 byte1;    ///<byte1 of SVLD
521             MS_U8 byte2;    ///<byte2 of SVLD
522             MS_U8 byte3;    ///<byte3 of SVLD
523         };
524     };
525 } JPEG_SVLD;
526 #endif
527 //-----------------------------------------------------------------------------
528 /// @brief \b Struct \b Name: JPEG_HdrChk
529 /// @brief \b Struct \b Description: The info of header checking for JPEG decode
530 //-----------------------------------------------------------------------------
531 typedef union
532 {
533     struct
534     {
535         MS_U8 DQT:1;///<has Quant Table?
536         MS_U8 DHT:1;///<has Huffman Table?
537 //      MS_U8 SOF:1;
538 //      MS_U8 SOS:1;
539     };
540     MS_U8 result;   ///<wildcard for header check
541 } JPEG_HdrChk;
542 //------------------------------------------------------------------------------
543 typedef MS_BOOL ( *Pdecode_block_func )( MS_U8, MS_U16, MS_U16 );
544 
545 
546 #ifndef UTOPIA_STRIP
547 //-------------------------------------------------------------------------------------------------
548 //  Global Variables
549 //-------------------------------------------------------------------------------------------------
550 typedef struct
551 {
552 APP0_Unit App0_Unit_Data[E_NJPD_NJPD_TOTAL];
553 
554 MS_U16 JPEG_MAX_HEIGHT[E_NJPD_NJPD_TOTAL];
555 MS_U16 JPEG_MAX_WIDTH[E_NJPD_NJPD_TOTAL];
556 
557 // max progressive resolution setting
558 MS_U16 JPEG_PRO_MAX_HEIGHT[E_NJPD_NJPD_TOTAL];
559 MS_U16 JPEG_PRO_MAX_WIDTH[E_NJPD_NJPD_TOTAL];
560 
561 MS_U16 MAX_JPEG_WIDTH_HD[E_NJPD_NJPD_TOTAL];
562 MS_U16 MAX_JPEG_HEIGHT_HD[E_NJPD_NJPD_TOTAL];
563 
564 #if SUPPORT_MPO_FORMAT
565 MS_U16 JPEG_MPO_MAX_HEIGHT[E_NJPD_NJPD_TOTAL];
566 MS_U16 JPEG_MPO_MAX_WIDTH[E_NJPD_NJPD_TOTAL];
567 MS_U16 JPEG_MPO_PRO_MAX_HEIGHT[E_NJPD_NJPD_TOTAL];
568 MS_U16 JPEG_MPO_PRO_MAX_WIDTH[E_NJPD_NJPD_TOTAL];
569 #endif
570 
571 MS_VIRT _u32ReadBufferAddr[E_NJPD_NJPD_TOTAL];
572 MS_PHY _u32ReadBufferAddr_PA[E_NJPD_NJPD_TOTAL];
573 MS_U32 _u32ReadBufferSize[E_NJPD_NJPD_TOTAL];
574 #ifndef MSOS_TYPE_LINUX_KERNEL
575 MS_VIRT _u32WriteBufferAddr[E_NJPD_NJPD_TOTAL];
576 #endif
577 MS_PHY _u32WriteBufferAddr_PA[E_NJPD_NJPD_TOTAL];
578 MS_U32 _u32WriteBufferSize[E_NJPD_NJPD_TOTAL];
579 MS_VIRT _u32InternalBufferAddr[E_NJPD_NJPD_TOTAL];
580 MS_U32 _u32InternalBufferSize[E_NJPD_NJPD_TOTAL];
581 MS_PHY _u32InternalBufferAddr_PA[E_NJPD_NJPD_TOTAL];
582 
583 MS_U32 _u32RLEOffset[E_NJPD_NJPD_TOTAL];   // offset to record the current RLE access address, progressive use only
584 
585 JPEG_HdrChk _HeadCheck[E_NJPD_NJPD_TOTAL];
586 
587 JPEG_BLOCK_TYPE _s16dc_pred[E_NJPD_NJPD_TOTAL][3];
588 
589 // The width/height may be the thumbnail or original image size, it based on decoding mode
590 MS_U16 _u16Image_x_size[E_NJPD_NJPD_TOTAL];
591 MS_U16 _u16Image_y_size[E_NJPD_NJPD_TOTAL];
592 
593 // The original size of this JPEG file after alignment
594 MS_U16 _u16OriginalImage_x_size[E_NJPD_NJPD_TOTAL];
595 MS_U16 _u16OriginalImage_y_size[E_NJPD_NJPD_TOTAL];
596 
597 // The original size before alignment
598 MS_U16 _u16NonAlignmentImage_x_size[E_NJPD_NJPD_TOTAL];
599 MS_U16 _u16NonAlignmentImage_y_size[E_NJPD_NJPD_TOTAL];
600 
601 // The width/height/pitch of image for displaying.
602 MS_U16 _u16AlignedImageWidth[E_NJPD_NJPD_TOTAL];
603 MS_U16 _u16AlignedImagePitch[E_NJPD_NJPD_TOTAL];
604 MS_U16 _u16AlignedImageHeight[E_NJPD_NJPD_TOTAL];
605 MS_U16 _u16AlignedImagePitch_H[E_NJPD_NJPD_TOTAL];
606 
607 // Scale Down Factor
608 MS_U8 _u8ScaleDownFactor[E_NJPD_NJPD_TOTAL];
609 
610 MS_U8 _u8DecodeType[E_NJPD_NJPD_TOTAL];
611 MS_BOOL _bProgressive_flag[E_NJPD_NJPD_TOTAL];
612 
613 MS_U8 _u8DownScaleRatio[E_NJPD_NJPD_TOTAL];
614 
615 MS_BOOL _bFirstRLE[E_NJPD_NJPD_TOTAL];
616 
617 /******* Thumbnail related *******/
618 MS_BOOL _bThumbnailFound[E_NJPD_NJPD_TOTAL];
619 MS_BOOL _bThumbnailAccessMode[E_NJPD_NJPD_TOTAL];
620 MS_U32 _u32ThumbnailOffset[E_NJPD_NJPD_TOTAL];
621 MS_U16 _u16ThumbnailSize[E_NJPD_NJPD_TOTAL];
622 MS_BOOL _bTiffBigEndian[E_NJPD_NJPD_TOTAL];
623 
624 MS_U32 _u32ThumbnailBufferOffset[E_NJPD_NJPD_TOTAL];   // keep track of thumb buffer access address
625 MS_U32 _u16ThumbnailBufferSize[E_NJPD_NJPD_TOTAL];   // keep track of thumb buffer size
626 /*****************************/
627 
628 JPEG_HuffInfo _Huff_info[E_NJPD_NJPD_TOTAL][JPEG_MAXHUFFTABLES];
629 
630 JPEG_QuantTbl _QuantTables[E_NJPD_NJPD_TOTAL][JPEG_MAXQUANTTABLES]; /* pointer to quantization tables */
631 
632 MS_U8 _u8Comps_in_frame[E_NJPD_NJPD_TOTAL];                             /* # of components in frame */
633 MS_U8 _u8Comp_h_samp[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];     /* component's horizontal sampling factor */
634 MS_U8 _u8Comp_v_samp[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];     /* component's vertical sampling factor */
635 MS_U8 _u8Comp_quant[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];      /* component's quantization table selector */
636 MS_U8 _u8Comp_ident[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];      /* component's ID */
637 
638 // The Luma and Chroma (YU) component ID, default is 1 & 2
639 MS_U8 _u8LumaCi[E_NJPD_NJPD_TOTAL];
640 MS_U8 _u8ChromaCi[E_NJPD_NJPD_TOTAL];
641 MS_U8 _u8Chroma2Ci[E_NJPD_NJPD_TOTAL];
642 
643 MS_U16 _u16Comp_h_blocks[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];
644 MS_U16 _u16Comp_v_blocks[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];
645 
646 MS_U8 _u8Comps_in_scan[E_NJPD_NJPD_TOTAL];                  /* # of components in scan */
647 MS_U8 _u8Comp_list[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPSINSCAN];      /* components in this scan */
648 MS_U8 _u8Comp_dc_tab[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];     /* component's DC Huffman coding table selector */
649 MS_U8 _u8Comp_ac_tab[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];     /* component's AC Huffman coding table selector */
650 
651 MS_U8 _u8Spectral_start[E_NJPD_NJPD_TOTAL];                 /* spectral selection start */
652 MS_U8 _u8Spectral_end[E_NJPD_NJPD_TOTAL];                   /* spectral selection end   */
653 MS_U8 _u8Successive_low[E_NJPD_NJPD_TOTAL];                 /* successive approximation low */
654 MS_U8 _u8Successive_high[E_NJPD_NJPD_TOTAL];                /* successive approximation high */
655 
656 MS_U8 _u8Blocks_per_mcu[E_NJPD_NJPD_TOTAL];
657 MS_U32 _u32Max_blocks_per_row[E_NJPD_NJPD_TOTAL];
658 MS_U16 _u16Mcus_per_row[E_NJPD_NJPD_TOTAL];
659 MS_U16 _u16Mcus_per_col[E_NJPD_NJPD_TOTAL];
660 
661 MS_U8 _u8Mcu_org[E_NJPD_NJPD_TOTAL][JPEG_MAXBLOCKSPERMCU];
662 
663 MS_U8 gu8Max_mcu_x_size[E_NJPD_NJPD_TOTAL];          /* MCU's max. X size in pixels */
664 MS_U8 gu8Max_mcu_y_size[E_NJPD_NJPD_TOTAL];                 /* MCU's max. Y size in pixels */
665 MS_U16 gu16Max_mcus_per_row[E_NJPD_NJPD_TOTAL];
666 
667 #if SUPPORT_PROGRESSIVE_MODE
668 MS_U16 _u16Total_lines_left[E_NJPD_NJPD_TOTAL];               /* total # lines left in image */
669 MS_U32 _u32Block_y_mcu[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];
670 JPEG_HuffTbl _Huff_tbls[E_NJPD_NJPD_TOTAL][JPEG_MAXHUFFTABLES];
671 PJPEG_CoeffBuf _DC_Coeffs[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];
672 PJPEG_CoeffBuf _AC_Coeffs[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];
673 MS_U32 _u32Last_dc_val[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];
674 MS_U32 _u32EOB_run[E_NJPD_NJPD_TOTAL];
675 #endif
676 
677 MS_U16 _u16Max_blocks_per_mcu[E_NJPD_NJPD_TOTAL];
678 MS_U16 _u16Max_mcus_per_col[E_NJPD_NJPD_TOTAL];
679 
680 MS_U8 gu8Scan_type[E_NJPD_NJPD_TOTAL];                 /* Grey, Yh1v1, Yh1v2, Yh2v1, Yh2v2,
681                                        CMYK111, CMYK4114 */
682 MS_U8 *_pu8In_buf_ofs[E_NJPD_NJPD_TOTAL];
683 MS_U32 _u32In_buf_left[E_NJPD_NJPD_TOTAL];
684 MS_U8 _u8Tem_flag[E_NJPD_NJPD_TOTAL];
685 MS_BOOL _bEOF_flag[E_NJPD_NJPD_TOTAL];
686 
687 MS_U8 *_pu8In_buf[E_NJPD_NJPD_TOTAL];
688 
689 MS_S16 _s16Bits_left[E_NJPD_NJPD_TOTAL];
690 MS_U32 _u32Bit_buf[E_NJPD_NJPD_TOTAL];
691 
692 MS_U16 _u16Restart_interval[E_NJPD_NJPD_TOTAL];
693 MS_U16 _u16Restarts_left[E_NJPD_NJPD_TOTAL];
694 MS_U16 _u16Next_restart_num[E_NJPD_NJPD_TOTAL];
695 
696 void *_pBlocks[E_NJPD_NJPD_TOTAL][JPEG_MAXBLOCKS];         /* list of all dynamically allocated blocks */
697 
698 JPEG_ErrCode _Error_code[E_NJPD_NJPD_TOTAL];
699 
700 
701 MS_U32 _u32Total_bytes_read[E_NJPD_NJPD_TOTAL];
702 
703 //JPEG_STATIC MS_U8 *_pu32ExifHeaderAddr;
704 
705 JPEG_FillHdrFunc _pFillHdrFunc[E_NJPD_NJPD_TOTAL];
706 
707 MS_U8 _u8JPEG_ApiDbgLevel;
708 MS_BOOL bMHEG5[E_NJPD_NJPD_TOTAL];
709 
710 MS_BOOL _Progressive_ROI_flag[E_NJPD_NJPD_TOTAL]; //CL82399
711 MS_U16 ROI_width[E_NJPD_NJPD_TOTAL]; //CL82399
712 
713 JPEG_BuffLoadType u8PreLHFlag[E_NJPD_NJPD_TOTAL];
714 
715 MS_U32 u32MRCheckCount[E_NJPD_NJPD_TOTAL];
716 
717 MS_BOOL _bIsInit[E_NJPD_NJPD_TOTAL];
718 
719 ///JPEG_STATIC MS_U32 jpeg_input = 0;
720 ///#define JPEG_GO     do{scanf("%d", &jpeg_input);}while(0)
721 
722 #if SW_NJPD_RGB_CMYK
723 JPEG_BLOCK_TYPE *_ps16Block_seg[JPEG_MAXBLOCKSPERROW];
724 MS_U8 _u8Block_max_zag_set[JPEG_MAXBLOCKSPERROW];
725 MS_U8 *gpu8Sample_buf;
726 MS_S32 gs32Crr[256];
727 MS_S32 gs32Cbb[256];
728 MS_S32 gs32Crg[256];
729 MS_S32 gs32Cbg[256];
730 
731 MS_U8 *pgu8Scan_line_0;
732 MS_U8 *pgu8scan_line_1;
733 
734 //JPEG_STATIC MS_U16 _u16Real_dest_bytes_per_scan_line;
735 MS_U16 _u16Dest_bytes_per_scan_line;        /* rounded up */
736 MS_U8 _u8Dest_bytes_per_pixel;            /* currently, 4 (RGB) or 1 (Y) */
737 
738 #if ( ! SUPPORT_PROGRESSIVE_MODE)
739 MS_U16 _u16Total_lines_left[E_NJPD_NJPD_TOTAL];               /* total # lines left in image */
740 MS_U32 _u32Block_y_mcu[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];
741 #endif
742 #endif
743 
744 /*===========================================================================*/
745 MS_BOOL __bIsMjpeg[E_NJPD_NJPD_TOTAL];
746 MS_U32 __u32RealMjpegBase[E_NJPD_NJPD_TOTAL];
747 MS_U32 __u32TrickyMjpegBase[E_NJPD_NJPD_TOTAL];
748 /*===========================================================================*/
749 
750 //The info of JPEG EXIF
751 JPEG_EXIF_DateTime _stEXIF_DateTime[E_NJPD_NJPD_TOTAL];
752 JPEG_EXIF_Orientation _eEXIF_Orientation[E_NJPD_NJPD_TOTAL];
753 
754 #if SUPPORT_EXIF_EXTRA_INFO
755 MS_U8 _u8EXIF_Manufacturer[E_NJPD_NJPD_TOTAL][JPEG_MANUFACTURER_SIZE];
756 MS_U8 _u8EXIF_Model[E_NJPD_NJPD_TOTAL][JPEG_MODEL_SIZE];
757 MS_U16 _u16EXIF_Exposureprogram[E_NJPD_NJPD_TOTAL];
758 MS_U16 _u16EXIF_Flash[E_NJPD_NJPD_TOTAL];
759 MS_U32 _u32EXIF_ISOSpeedRatings[E_NJPD_NJPD_TOTAL];
760 JPEG_RATIONAL _stEXIF_ExposureTime[E_NJPD_NJPD_TOTAL];
761 JPEG_RATIONAL _stEXIF_FNumber[E_NJPD_NJPD_TOTAL];
762 JPEG_RATIONAL _stEXIF_ShutterSpeedValue[E_NJPD_NJPD_TOTAL];
763 JPEG_RATIONAL _stEXIF_ApertureValue[E_NJPD_NJPD_TOTAL];
764 JPEG_RATIONAL _stEXIF_ExposureBiasValue[E_NJPD_NJPD_TOTAL];
765 JPEG_RATIONAL _stEXIF_FocalLength[E_NJPD_NJPD_TOTAL];
766 MS_U32 _u32EXIF_ImageWidth[E_NJPD_NJPD_TOTAL];
767 MS_U32 _u32EXIF_ImageHeight[E_NJPD_NJPD_TOTAL];
768 #endif
769 
770 //record data offset
771 MS_U32 u32DataOffset[E_NJPD_NJPD_TOTAL];
772 MS_U32 u32SOFOffset[E_NJPD_NJPD_TOTAL]; //for SEC request, they need to know the offset of SOF marker
773 
774 MS_BOOL bIs3HuffTbl[E_NJPD_NJPD_TOTAL];
775 #if SUPPORT_HIGH_LOW_REVERSE
776 MS_BOOL bHighLowReverse[E_NJPD_NJPD_TOTAL];
777 #else
778 MS_BOOL bDifferentHL[E_NJPD_NJPD_TOTAL];
779 #endif
780 
781 JPD_Number eNJPDNum;
782 
783 #if SW_NJPD_RGB_CMYK
784 MS_BOOL bEnableCMYK = TRUE;
785 MS_BOOL bEnableRGB = TRUE;
786 #endif
787 
788 
789 #if SUPPORT_MPO_FORMAT
790 //MPO buffer
791 MS_U8 *_pu8In_buf_MPO_ofs[E_NJPD_NJPD_TOTAL];
792 MS_U32 _u32In_buf_MPO_left[E_NJPD_NJPD_TOTAL];
793 
794 MS_BOOL mpo_load_data[E_NJPD_NJPD_TOTAL];  //check whether load data when start decode or fill buffer.
795 MS_BOOL bIsMPOFormat[E_NJPD_NJPD_TOTAL];
796 MS_U32 u32MPFOffset[E_NJPD_NJPD_TOTAL];
797 
798 JPEG_MPO_INDEX_INFO _stMPOIndex[E_NJPD_NJPD_TOTAL];
799 JPEG_MPO_ATTRIBUTE_INFO _stMPOAttri[E_NJPD_NJPD_TOTAL][JPEG_MPO_MAX_SUPPORT_IMAGE];
800 MS_VIRT _u32App2MarkerOffset[E_NJPD_NJPD_TOTAL];
801 #endif
802 
803 #if PRINT_NJPD_DECODE_TIME
804 MS_U32 u32MeasureDecodeTime[E_NJPD_NJPD_TOTAL];
805 MS_U32 u32MeasureDecodeTimeSW[E_NJPD_NJPD_TOTAL];
806 MS_U32 u32MeasureDecodeTimeHW[E_NJPD_NJPD_TOTAL];
807 MS_U32 u32MeasureDecodeTimeTable[E_NJPD_NJPD_TOTAL];
808 #endif
809 
810 MS_BOOL bUseOJPD;
811 MS_BOOL bOJPDOn;
812 MS_BOOL bForceNJPD2;
813 
814 } NJPEG_EX_CTX;
815 
816 //#ifndef VDEC_UTOPIA_2K
817 NJPEG_EX_CTX* pNJPEGContext = NULL;
818 //#endif
819 NJPEG_EX_CTX gNJPEGContext;
820 
821 #ifdef CONFIG_UTOPIA_PROC_DBG_SUPPORT
822 #include "utopia_dapi.h"
823 
824 typedef enum
825 {
826     E_JPEG_YUV444,
827     E_JPEG_YUV422,
828     E_JPEG_YUV420,
829     E_JPEG_YUV411,
830     E_JPEG_YUV440,
831     E_JPEG_YUV400,
832     E_JPEG_CMYK_FORMAT,
833     E_JPEG_RGB_FORMAT,
834 } JPEG_Color_Format;
835 
836 
837 typedef struct
838 {
839 MS_VIRT _u32ReadBufferAddr;
840 MS_PHY _u32ReadBufferAddr_PA;
841 MS_U32 _u32ReadBufferSize;
842 #ifndef MSOS_TYPE_LINUX_KERNEL
843 MS_VIRT _u32WriteBufferAddr;
844 #endif
845 MS_PHY _u32WriteBufferAddr_PA;
846 MS_U32 _u32WriteBufferSize;
847 MS_VIRT _u32InternalBufferAddr;
848 MS_U32 _u32InternalBufferSize;
849 MS_PHY _u32InternalBufferAddr_PA;
850 
851 MS_U16 _u16Image_x_size;
852 MS_U16 _u16Image_y_size;
853 MS_BOOL _bProgressive_flag;
854 JPEG_Color_Format eJPEGColorFormat;
855 MS_U8 _u8ScaleDownFactor;
856 MS_U32 _u32HWStartTime;
857 MS_U32 _u32HWEndTime;
858 JPEG_ErrCode _Error_code;
859 
860 }NJPEG_EX_MDebug;
861 
862 NJPEG_EX_MDebug gNJPEGMDebug;
863 
864 #endif
865 //-------------------------------------------------------------------------------------------------
866 //  Local Variables
867 //-------------------------------------------------------------------------------------------------
868 #if 0
869 static APP0_Unit App0_Unit_Data[E_NJPD_NJPD_TOTAL];
870 
871 JPEG_STATIC MS_U16 JPEG_MAX_HEIGHT[E_NJPD_NJPD_TOTAL] = {1080, 1080};
872 JPEG_STATIC MS_U16 JPEG_MAX_WIDTH[E_NJPD_NJPD_TOTAL] = {1920, 1920};
873 
874 // max progressive resolution setting
875 JPEG_STATIC MS_U16 JPEG_PRO_MAX_HEIGHT[E_NJPD_NJPD_TOTAL] = {768, 768};
876 JPEG_STATIC MS_U16 JPEG_PRO_MAX_WIDTH[E_NJPD_NJPD_TOTAL] = {1024, 1024};
877 
878 JPEG_STATIC MS_U16 MAX_JPEG_WIDTH_HD[E_NJPD_NJPD_TOTAL] ={0, 0};
879 JPEG_STATIC MS_U16 MAX_JPEG_HEIGHT_HD[E_NJPD_NJPD_TOTAL] ={0, 0};
880 
881 #if SUPPORT_MPO_FORMAT
882 JPEG_STATIC MS_U16 JPEG_MPO_MAX_HEIGHT[E_NJPD_NJPD_TOTAL] = {1080, 1080};
883 JPEG_STATIC MS_U16 JPEG_MPO_MAX_WIDTH[E_NJPD_NJPD_TOTAL] = {1920, 1920};
884 JPEG_STATIC MS_U16 JPEG_MPO_PRO_MAX_HEIGHT[E_NJPD_NJPD_TOTAL] ={768, 768};
885 JPEG_STATIC MS_U16 JPEG_MPO_PRO_MAX_WIDTH[E_NJPD_NJPD_TOTAL] = {1024, 1024};
886 #endif
887 #endif
888 
889 /* entry n is (-1 << n) + 1 */
890 static const MS_S32 extend_offset[16] =
891 {
892     0, (( -1)<<1)+1, ((-1)<<2)+1, ((-1)<<3) + 1, ((-1)<<4)+1, ((-1)<<5)+1,
893     ((-1)<<6)+1, ((-1)<<7)+1, ((-1)<<8)+1, ((-1)<<9)+1, ((-1) <<10)+1,
894     ((-1)<<11)+1, ((-1)<<12)+1, ((-1)<<13)+1, ((-1)<<14)+1, ((-1)<<15)+1
895 };
896 
897 /* entry n is 2**(n-1) */
898 static const MS_S32 extend_test[16] =
899 {
900     0, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000
901 };
902 
903 static const MS_S32 extend_mask[] =
904 {
905     0, (1<<0), (1<<1), (1<<2), (1<<3), (1<<4), (1<<5), (1<<6), (1<<7), (1<<8),
906     (1<<9), (1<<10), (1<<11), (1<<12), (1<<13), (1<<14), (1<<15), (1<<16),
907 };
908 
909 
910 #if 0
911 JPEG_STATIC MS_VIRT _u32ReadBufferAddr[E_NJPD_NJPD_TOTAL];
912 JPEG_STATIC MS_PHY _u32ReadBufferAddr_PA[E_NJPD_NJPD_TOTAL];
913 JPEG_STATIC MS_U32 _u32ReadBufferSize[E_NJPD_NJPD_TOTAL];
914 #ifndef MSOS_TYPE_LINUX_KERNEL
915 JPEG_STATIC MS_VIRT _u32WriteBufferAddr[E_NJPD_NJPD_TOTAL];
916 #endif
917 JPEG_STATIC MS_PHY _u32WriteBufferAddr_PA[E_NJPD_NJPD_TOTAL];
918 JPEG_STATIC MS_U32 _u32WriteBufferSize[E_NJPD_NJPD_TOTAL];
919 JPEG_STATIC MS_VIRT _u32InternalBufferAddr[E_NJPD_NJPD_TOTAL];
920 JPEG_STATIC MS_U32 _u32InternalBufferSize[E_NJPD_NJPD_TOTAL];
921 JPEG_STATIC MS_PHY _u32InternalBufferAddr_PA[E_NJPD_NJPD_TOTAL];
922 
923 JPEG_STATIC MS_U32 _u32RLEOffset[E_NJPD_NJPD_TOTAL];   // offset to record the current RLE access address, progressive use only
924 
925 JPEG_STATIC JPEG_HdrChk _HeadCheck[E_NJPD_NJPD_TOTAL];
926 
927 JPEG_STATIC JPEG_BLOCK_TYPE _s16dc_pred[E_NJPD_NJPD_TOTAL][3];
928 
929 // The width/height may be the thumbnail or original image size, it based on decoding mode
930 JPEG_STATIC MS_U16 _u16Image_x_size[E_NJPD_NJPD_TOTAL];
931 JPEG_STATIC MS_U16 _u16Image_y_size[E_NJPD_NJPD_TOTAL];
932 
933 // The original size of this JPEG file after alignment
934 JPEG_STATIC MS_U16 _u16OriginalImage_x_size[E_NJPD_NJPD_TOTAL];
935 JPEG_STATIC MS_U16 _u16OriginalImage_y_size[E_NJPD_NJPD_TOTAL];
936 
937 // The original size before alignment
938 JPEG_STATIC MS_U16 _u16NonAlignmentImage_x_size[E_NJPD_NJPD_TOTAL];
939 JPEG_STATIC MS_U16 _u16NonAlignmentImage_y_size[E_NJPD_NJPD_TOTAL];
940 
941 // The width/height/pitch of image for displaying.
942 JPEG_STATIC MS_U16 _u16AlignedImageWidth[E_NJPD_NJPD_TOTAL];
943 JPEG_STATIC MS_U16 _u16AlignedImagePitch[E_NJPD_NJPD_TOTAL];
944 JPEG_STATIC MS_U16 _u16AlignedImageHeight[E_NJPD_NJPD_TOTAL];
945 JPEG_STATIC MS_U16 _u16AlignedImagePitch_H[E_NJPD_NJPD_TOTAL];
946 
947 // Scale Down Factor
948 JPEG_STATIC MS_U8 _u8ScaleDownFactor[E_NJPD_NJPD_TOTAL];
949 
950 ////JPEG_STATIC PJPEG_FILE_FileSystem_t _pStream;
951 
952 JPEG_STATIC MS_U8 _u8DecodeType[E_NJPD_NJPD_TOTAL];
953 JPEG_STATIC MS_BOOL _bProgressive_flag[E_NJPD_NJPD_TOTAL];
954 
955 JPEG_STATIC MS_U8 _u8DownScaleRatio[E_NJPD_NJPD_TOTAL];
956 
957 JPEG_STATIC MS_BOOL _bFirstRLE[E_NJPD_NJPD_TOTAL];
958 
959 /******* Thumbnail related *******/
960 JPEG_STATIC MS_BOOL _bThumbnailFound[E_NJPD_NJPD_TOTAL];
961 JPEG_STATIC MS_BOOL _bThumbnailAccessMode[E_NJPD_NJPD_TOTAL];
962 JPEG_STATIC MS_U32 _u32ThumbnailOffset[E_NJPD_NJPD_TOTAL];
963 JPEG_STATIC MS_U16 _u16ThumbnailSize[E_NJPD_NJPD_TOTAL];
964 JPEG_STATIC MS_BOOL _bTiffBigEndian[E_NJPD_NJPD_TOTAL];
965 
966 JPEG_STATIC MS_U32 _u32ThumbnailBufferOffset[E_NJPD_NJPD_TOTAL];   // keep track of thumb buffer access address
967 JPEG_STATIC MS_U32 _u16ThumbnailBufferSize[E_NJPD_NJPD_TOTAL];   // keep track of thumb buffer size
968 /*****************************/
969 
970 JPEG_STATIC JPEG_HuffInfo _Huff_info[E_NJPD_NJPD_TOTAL][JPEG_MAXHUFFTABLES];
971 
972 JPEG_STATIC JPEG_QuantTbl _QuantTables[E_NJPD_NJPD_TOTAL][JPEG_MAXQUANTTABLES]; /* pointer to quantization tables */
973 
974 JPEG_STATIC MS_U8 _u8Comps_in_frame[E_NJPD_NJPD_TOTAL];                             /* # of components in frame */
975 JPEG_STATIC MS_U8 _u8Comp_h_samp[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];     /* component's horizontal sampling factor */
976 JPEG_STATIC MS_U8 _u8Comp_v_samp[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];     /* component's vertical sampling factor */
977 JPEG_STATIC MS_U8 _u8Comp_quant[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];      /* component's quantization table selector */
978 JPEG_STATIC MS_U8 _u8Comp_ident[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];      /* component's ID */
979 
980 // The Luma and Chroma (YU) component ID, default is 1 & 2
981 JPEG_STATIC MS_U8 _u8LumaCi[E_NJPD_NJPD_TOTAL];
982 JPEG_STATIC MS_U8 _u8ChromaCi[E_NJPD_NJPD_TOTAL];
983 JPEG_STATIC MS_U8 _u8Chroma2Ci[E_NJPD_NJPD_TOTAL];
984 
985 JPEG_STATIC MS_U16 _u16Comp_h_blocks[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];
986 JPEG_STATIC MS_U16 _u16Comp_v_blocks[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];
987 
988 JPEG_STATIC MS_U8 _u8Comps_in_scan[E_NJPD_NJPD_TOTAL];                  /* # of components in scan */
989 JPEG_STATIC MS_U8 _u8Comp_list[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPSINSCAN];      /* components in this scan */
990 JPEG_STATIC MS_U8 _u8Comp_dc_tab[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];     /* component's DC Huffman coding table selector */
991 JPEG_STATIC MS_U8 _u8Comp_ac_tab[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];     /* component's AC Huffman coding table selector */
992 
993 JPEG_STATIC MS_U8 _u8Spectral_start[E_NJPD_NJPD_TOTAL];                 /* spectral selection start */
994 JPEG_STATIC MS_U8 _u8Spectral_end[E_NJPD_NJPD_TOTAL];                   /* spectral selection end   */
995 JPEG_STATIC MS_U8 _u8Successive_low[E_NJPD_NJPD_TOTAL];                 /* successive approximation low */
996 JPEG_STATIC MS_U8 _u8Successive_high[E_NJPD_NJPD_TOTAL];                /* successive approximation high */
997 
998 JPEG_STATIC MS_U8 _u8Blocks_per_mcu[E_NJPD_NJPD_TOTAL];
999 JPEG_STATIC MS_U32 _u32Max_blocks_per_row[E_NJPD_NJPD_TOTAL];
1000 JPEG_STATIC MS_U16 _u16Mcus_per_row[E_NJPD_NJPD_TOTAL];
1001 JPEG_STATIC MS_U16 _u16Mcus_per_col[E_NJPD_NJPD_TOTAL];
1002 
1003 JPEG_STATIC MS_U8 _u8Mcu_org[E_NJPD_NJPD_TOTAL][JPEG_MAXBLOCKSPERMCU];
1004 
1005 JPEG_STATIC MS_U8 gu8Max_mcu_x_size[E_NJPD_NJPD_TOTAL];          /* MCU's max. X size in pixels */
1006 JPEG_STATIC MS_U8 gu8Max_mcu_y_size[E_NJPD_NJPD_TOTAL];                 /* MCU's max. Y size in pixels */
1007 JPEG_STATIC MS_U16 gu16Max_mcus_per_row[E_NJPD_NJPD_TOTAL];
1008 
1009 #if SUPPORT_PROGRESSIVE_MODE
1010 JPEG_STATIC MS_U16 _u16Total_lines_left[E_NJPD_NJPD_TOTAL];               /* total # lines left in image */
1011 JPEG_STATIC MS_U32 _u32Block_y_mcu[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];
1012 JPEG_STATIC JPEG_HuffTbl _Huff_tbls[E_NJPD_NJPD_TOTAL][JPEG_MAXHUFFTABLES];
1013 JPEG_STATIC PJPEG_CoeffBuf _DC_Coeffs[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];
1014 JPEG_STATIC PJPEG_CoeffBuf _AC_Coeffs[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];
1015 JPEG_STATIC MS_U32 _u32Last_dc_val[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];
1016 JPEG_STATIC MS_U32 _u32EOB_run[E_NJPD_NJPD_TOTAL];
1017 #endif
1018 
1019 JPEG_STATIC MS_U16 _u16Max_blocks_per_mcu[E_NJPD_NJPD_TOTAL];
1020 JPEG_STATIC MS_U16 _u16Max_mcus_per_col[E_NJPD_NJPD_TOTAL];
1021 
1022 JPEG_STATIC MS_U8 gu8Scan_type[E_NJPD_NJPD_TOTAL];                 /* Grey, Yh1v1, Yh1v2, Yh2v1, Yh2v2,
1023                                        CMYK111, CMYK4114 */
1024 JPEG_STATIC MS_U8 *_pu8In_buf_ofs[E_NJPD_NJPD_TOTAL];
1025 JPEG_STATIC MS_U32 _u32In_buf_left[E_NJPD_NJPD_TOTAL];
1026 JPEG_STATIC MS_U8 _u8Tem_flag[E_NJPD_NJPD_TOTAL];
1027 JPEG_STATIC MS_BOOL _bEOF_flag[E_NJPD_NJPD_TOTAL];
1028 
1029 JPEG_STATIC MS_U8 *_pu8In_buf[E_NJPD_NJPD_TOTAL];
1030 
1031 JPEG_STATIC MS_S16 _s16Bits_left[E_NJPD_NJPD_TOTAL];
1032 JPEG_STATIC MS_U32 _u32Bit_buf[E_NJPD_NJPD_TOTAL];
1033 
1034 JPEG_STATIC MS_U16 _u16Restart_interval[E_NJPD_NJPD_TOTAL];
1035 JPEG_STATIC MS_U16 _u16Restarts_left[E_NJPD_NJPD_TOTAL];
1036 JPEG_STATIC MS_U16 _u16Next_restart_num[E_NJPD_NJPD_TOTAL];
1037 
1038 JPEG_STATIC void *_pBlocks[E_NJPD_NJPD_TOTAL][JPEG_MAXBLOCKS];         /* list of all dynamically allocated blocks */
1039 
1040 JPEG_STATIC JPEG_ErrCode _Error_code[E_NJPD_NJPD_TOTAL];
1041 #endif
1042 
1043 //#ifdef USE_LIBC
1044 #ifdef NJPD_LONGJUMP_SUPPORT
1045 JPEG_STATIC jmp_buf _jmp_state;
1046 #endif
1047 //#endif
1048 
1049 ////JPEG_STATIC MS_S32 _Total_Decoded_Size = 0;
1050 #if 0 // not implement for new MDDI - harold
1051 JPEG_STATIC MS_U32  NumPics;
1052 #endif
1053 
1054 #if 0
1055 JPEG_STATIC MS_U32 _u32Total_bytes_read[E_NJPD_NJPD_TOTAL];
1056 
1057 //JPEG_STATIC MS_U8 *_pu32ExifHeaderAddr;
1058 
1059 JPEG_STATIC JPEG_FillHdrFunc _pFillHdrFunc[E_NJPD_NJPD_TOTAL];
1060 #endif
1061 
1062 #if SW_NJPD_RGB_CMYK
1063 static const MS_U8 _u8ZAG[64+1] =
1064 {
1065     0, 1, 8, 16, 9, 2, 3, 10,
1066     17, 24, 32, 25, 18, 11, 4, 5,
1067     12, 19, 26, 33, 40, 48, 41, 34,
1068     27, 20, 13, 6, 7, 14, 21, 28,
1069     35, 42, 49, 56, 57, 50, 43, 36,
1070     29, 22, 15, 23, 30, 37, 44, 51,
1071     58, 59, 52, 45, 38, 31, 39, 46,
1072     53, 60, 61, 54, 47, 55, 62, 63
1073     ,0
1074 };
1075 #endif
1076 
1077 JPEG_STATIC MSIF_Version _api_jpeg_version =
1078 {
1079     .DDI = { JPEG_API_VERSION },
1080 };
1081 
1082 #if 0
1083 JPEG_STATIC MS_U8 _u8JPEG_ApiDbgLevel = E_JPEG_DEBUG_NONE;
1084 JPEG_STATIC MS_BOOL bMHEG5[E_NJPD_NJPD_TOTAL] = {FALSE, FALSE};
1085 
1086 JPEG_STATIC MS_BOOL _Progressive_ROI_flag[E_NJPD_NJPD_TOTAL]; //CL82399
1087 JPEG_STATIC MS_U16 ROI_width[E_NJPD_NJPD_TOTAL]; //CL82399
1088 
1089 JPEG_STATIC JPEG_BuffLoadType u8PreLHFlag[E_NJPD_NJPD_TOTAL];
1090 
1091 JPEG_STATIC MS_U32 u32MRCheckCount[E_NJPD_NJPD_TOTAL];
1092 
1093 JPEG_STATIC MS_BOOL _bIsInit[E_NJPD_NJPD_TOTAL];
1094 
1095 ///JPEG_STATIC MS_U32 jpeg_input = 0;
1096 ///#define JPEG_GO     do{scanf("%d", &jpeg_input);}while(0)
1097 
1098 #if SW_NJPD_RGB_CMYK
1099 JPEG_BLOCK_TYPE *_ps16Block_seg[JPEG_MAXBLOCKSPERROW];
1100 MS_U8 _u8Block_max_zag_set[JPEG_MAXBLOCKSPERROW];
1101 MS_U8 *gpu8Sample_buf;
1102 MS_S32 gs32Crr[256];
1103 MS_S32 gs32Cbb[256];
1104 MS_S32 gs32Crg[256];
1105 MS_S32 gs32Cbg[256];
1106 
1107 MS_U8 *pgu8Scan_line_0;
1108 MS_U8 *pgu8scan_line_1;
1109 
1110 //JPEG_STATIC MS_U16 _u16Real_dest_bytes_per_scan_line;
1111 JPEG_STATIC MS_U16 _u16Dest_bytes_per_scan_line;        /* rounded up */
1112 JPEG_STATIC MS_U8 _u8Dest_bytes_per_pixel;            /* currently, 4 (RGB) or 1 (Y) */
1113 
1114 #if ( ! SUPPORT_PROGRESSIVE_MODE)
1115 JPEG_STATIC MS_U16 _u16Total_lines_left[E_NJPD_NJPD_TOTAL];               /* total # lines left in image */
1116 JPEG_STATIC MS_U32 _u32Block_y_mcu[E_NJPD_NJPD_TOTAL][JPEG_MAXCOMPONENTS];
1117 //JPEG_STATIC MS_U16 gu16Mcu_lines_left;                 /* total # lines left in this MCU */
1118 #endif
1119 #endif
1120 
1121 /*===========================================================================*/
1122 JPEG_STATIC MS_BOOL __bIsMjpeg[E_NJPD_NJPD_TOTAL];
1123 JPEG_STATIC MS_U32 __u32RealMjpegBase[E_NJPD_NJPD_TOTAL];
1124 JPEG_STATIC MS_U32 __u32TrickyMjpegBase[E_NJPD_NJPD_TOTAL];
1125 /*===========================================================================*/
1126 
1127 //The info of JPEG EXIF
1128 JPEG_STATIC JPEG_EXIF_DateTime _stEXIF_DateTime[E_NJPD_NJPD_TOTAL];
1129 JPEG_STATIC JPEG_EXIF_Orientation _eEXIF_Orientation[E_NJPD_NJPD_TOTAL];
1130 
1131 #if SUPPORT_EXIF_EXTRA_INFO
1132 JPEG_STATIC MS_U8 _u8EXIF_Manufacturer[E_NJPD_NJPD_TOTAL][JPEG_MANUFACTURER_SIZE];
1133 JPEG_STATIC MS_U8 _u8EXIF_Model[E_NJPD_NJPD_TOTAL][JPEG_MODEL_SIZE];
1134 JPEG_STATIC MS_U16 _u16EXIF_Exposureprogram[E_NJPD_NJPD_TOTAL];
1135 JPEG_STATIC MS_U16 _u16EXIF_Flash[E_NJPD_NJPD_TOTAL];
1136 JPEG_STATIC MS_U32 _u32EXIF_ISOSpeedRatings[E_NJPD_NJPD_TOTAL];
1137 JPEG_STATIC JPEG_RATIONAL _stEXIF_ExposureTime[E_NJPD_NJPD_TOTAL];
1138 JPEG_STATIC JPEG_RATIONAL _stEXIF_FNumber[E_NJPD_NJPD_TOTAL];
1139 JPEG_STATIC JPEG_RATIONAL _stEXIF_ShutterSpeedValue[E_NJPD_NJPD_TOTAL];
1140 JPEG_STATIC JPEG_RATIONAL _stEXIF_ApertureValue[E_NJPD_NJPD_TOTAL];
1141 JPEG_STATIC JPEG_RATIONAL _stEXIF_ExposureBiasValue[E_NJPD_NJPD_TOTAL];
1142 JPEG_STATIC JPEG_RATIONAL _stEXIF_FocalLength[E_NJPD_NJPD_TOTAL];
1143 JPEG_STATIC MS_U32 _u32EXIF_ImageWidth[E_NJPD_NJPD_TOTAL];
1144 JPEG_STATIC MS_U32 _u32EXIF_ImageHeight[E_NJPD_NJPD_TOTAL];
1145 #endif
1146 
1147 //record data offset
1148 JPEG_STATIC MS_U32 u32DataOffset[E_NJPD_NJPD_TOTAL];
1149 JPEG_STATIC MS_U32 u32SOFOffset[E_NJPD_NJPD_TOTAL]; //for SEC request, they need to know the offset of SOF marker
1150 
1151 JPEG_STATIC MS_BOOL bIs3HuffTbl[E_NJPD_NJPD_TOTAL];
1152 #if SUPPORT_HIGH_LOW_REVERSE
1153 JPEG_STATIC MS_BOOL bHighLowReverse[E_NJPD_NJPD_TOTAL];
1154 #else
1155 JPEG_STATIC MS_BOOL bDifferentHL[E_NJPD_NJPD_TOTAL];
1156 #endif
1157 
1158 JPEG_STATIC JPD_Number eNJPDNum = E_NJPD_NJPD1;
1159 
1160 #if SW_NJPD_RGB_CMYK
1161 JPEG_STATIC MS_BOOL bEnableCMYK = TRUE;
1162 JPEG_STATIC MS_BOOL bEnableRGB = TRUE;
1163 #endif
1164 
1165 
1166 #if SUPPORT_MPO_FORMAT
1167 //MPO buffer
1168 static MS_U8 *_pu8In_buf_MPO_ofs[E_NJPD_NJPD_TOTAL];
1169 static MS_U32 _u32In_buf_MPO_left[E_NJPD_NJPD_TOTAL] = {0xFFFFFFFFUL, 0xFFFFFFFFUL};
1170 
1171 static MS_BOOL mpo_load_data[E_NJPD_NJPD_TOTAL];  //check whether load data when start decode or fill buffer.
1172 static MS_BOOL bIsMPOFormat[E_NJPD_NJPD_TOTAL];
1173 static MS_U32 u32MPFOffset[E_NJPD_NJPD_TOTAL];
1174 #endif
1175 
1176 #if PRINT_NJPD_DECODE_TIME
1177 static MS_U32 u32MeasureDecodeTime[E_NJPD_NJPD_TOTAL];
1178 static MS_U32 u32MeasureDecodeTimeSW[E_NJPD_NJPD_TOTAL];
1179 static MS_U32 u32MeasureDecodeTimeHW[E_NJPD_NJPD_TOTAL];
1180 static MS_U32 u32MeasureDecodeTimeTable[E_NJPD_NJPD_TOTAL];
1181 #endif
1182 #endif
1183 
1184 //-------------------------------------------------------------------------------------------------
1185 //  API Layer Mutex function
1186 //-------------------------------------------------------------------------------------------------
1187 
1188 #ifdef  MSOS_TYPE_LINUX
1189 MS_S32 s32NJPEGMutexID[E_NJPD_NJPD_TOTAL] = {-1, -1};
1190 static char _u8NJPEG_Mutex[E_NJPD_NJPD_TOTAL][20]={"NJPD0_API_Mutex", "NJPD1_API_Mutex"};
1191 
1192 #define  _NJPEG_EX_API_MutexLock(u8Idx)\
1193 {\
1194     JPEG_DEBUG_API_MSG("%s, Mutex Lock\n", __FUNCTION__);\
1195     if(s32NJPEGMutexID[u8Idx]!=-1)\
1196     {\
1197         MsOS_ObtainMutex(s32NJPEGMutexID[u8Idx], MSOS_WAIT_FOREVER);\
1198     }\
1199 }
1200 
1201 #define _NJPEG_EX_API_MutexUnlock(u8Idx)\
1202 {\
1203     JPEG_DEBUG_API_MSG("%s, Mutex Unlock\n", __FUNCTION__);\
1204     if(s32NJPEGMutexID[u8Idx]!=-1)\
1205     {\
1206         MsOS_ReleaseMutex(s32NJPEGMutexID[u8Idx]);\
1207     }\
1208 }
1209 
_NJPEG_EX_API_MutexCreate(MS_U8 u8Idx)1210 static MS_BOOL _NJPEG_EX_API_MutexCreate(MS_U8 u8Idx)
1211 {
1212     JPEG_DEBUG_API_MSG("Mutex Create\n");
1213     s32NJPEGMutexID[u8Idx] = MsOS_CreateMutex(E_MSOS_FIFO,
1214                                       (char *) _u8NJPEG_Mutex[u8Idx],
1215                                       MSOS_PROCESS_SHARED);
1216 
1217     if (s32NJPEGMutexID[u8Idx] < 0)
1218     {
1219         return FALSE;
1220     }
1221     return TRUE;
1222 }
1223 #if 0
1224 static MS_BOOL _NJPEG_EX_API_MutexDelete(MS_U8 u8Idx)
1225 {
1226     if (s32NJPEGMutexID[u8Idx] != -1)
1227     {
1228         JPEG_DEBUG_API_MSG("Mutex Delete\n");
1229         s32NJPEGMutexID[u8Idx] = -1;
1230         return MsOS_DeleteMutex(s32NJPEGMutexID[u8Idx]);
1231     }
1232     else
1233     {
1234         return FALSE;
1235     }
1236 }
1237 #endif
1238 
1239 #else
1240 MS_S32 s32NJPEGMutexID[E_NJPD_NJPD_TOTAL] = {-1, -1};
_NJPEG_EX_API_MutexCreate(MS_U8 u8Idx)1241 static MS_BOOL _NJPEG_EX_API_MutexCreate(MS_U8 u8Idx)
1242 {
1243     s32NJPEGMutexID[u8Idx] = 1;
1244     return TRUE;
1245 }
1246 #define  _NJPEG_EX_API_MutexLock(u8Idx)
1247 #define _NJPEG_EX_API_MutexUnlock(u8Idx)
1248 #endif
1249 
1250 #ifndef MSOS_TYPE_LINUX_KERNEL
1251 static MS_U32  u32CRC;
1252 
verJPD_CRC32_Init(void)1253 static void verJPD_CRC32_Init(void)
1254 {
1255     u32CRC = 0xFFFFFFFFUL;
1256 }
1257 
1258 
verJPD_CRC32_GetResult(void)1259 static MS_U32 verJPD_CRC32_GetResult(void)
1260 {
1261     return (~u32CRC);
1262 }
1263 
1264 
verJPD_Init_CRC_Table(MS_U32 * u32CRCtemptable)1265 static void verJPD_Init_CRC_Table(MS_U32 *u32CRCtemptable)
1266 {
1267 
1268     MS_U32 i,j,tmp, result;
1269 
1270     for(i=0;i<=0xFF;i++)
1271     {
1272         tmp=i;
1273         result=0;
1274 
1275         for(j=1;j<9;j++)
1276         {
1277              if(tmp & 1)
1278              {
1279                         result |= (1 << (8 - j));
1280              }
1281              tmp >>= 1;
1282         }
1283 
1284         u32CRCtemptable[i]=result<<24;
1285         for(j=0; j<8; j++)
1286         {
1287             u32CRCtemptable[i] = (u32CRCtemptable[i] << 1) ^ ((u32CRCtemptable[i] & (1 << 31)) ? 0x04C11DB7 : 0);
1288         }
1289 
1290         tmp=u32CRCtemptable[i];
1291         result=0;
1292 
1293         for(j=1;j<33;j++)
1294         {
1295              if(tmp & 1)
1296              {
1297                 result |= (1 << (32 - j));
1298              }
1299              tmp >>= 1;
1300         }
1301         u32CRCtemptable[i]=result;
1302         }
1303 }
1304 
verJPD_CRC32_Update(const MS_U8 * pu8Data,MS_U32 u32Size)1305 static void verJPD_CRC32_Update(const MS_U8 *pu8Data, MS_U32 u32Size)
1306 {
1307     MS_U32 u32CRCTable[256];
1308     MS_U32  u32LoopCounter;
1309 
1310     if (pu8Data == NULL || u32Size == 0) return;
1311 
1312     verJPD_Init_CRC_Table(u32CRCTable);
1313 
1314     #if 0
1315         MS_U32 i;
1316         for(i = 0;i<256;i++)
1317         {
1318             printf("0x%08x,\n", u32CRCTable[i]);
1319         }
1320     #endif
1321 
1322     for (u32LoopCounter=0; u32LoopCounter<u32Size; u32LoopCounter++)
1323     {
1324         u32CRC = (u32CRC >> 8) ^ u32CRCTable[ pu8Data[u32LoopCounter] ^ (MS_U8)(u32CRC & 0xFF) ];
1325     }
1326 }
1327 #endif
1328 
1329 //-------------------------------------------------------------------------------------------------
1330 // Local Function Prototypes
1331 //-------------------------------------------------------------------------------------------------
1332 #if 0 // not implement for new MDDI - harold
1333 JPEG_STATIC void MSAPI_MJPEG_Get_Pics(void);
1334 #endif // not implement for new MDDI - harold
1335 
1336 JPEG_STATIC void JPEG_terminate(JPEG_ErrCode status);
1337 
1338 JPEG_STATIC MS_BOOL JPEG_decode_init(void);
1339 
1340 JPEG_STATIC MS_BOOL JPEG_StartDecode(void);
1341 
1342 JPEG_STATIC void JPEG_GetAlignedResolution(MS_U16 *width, MS_U16 *height);
1343 
1344 #if SW_NJPD_RGB_CMYK
1345 JPEG_STATIC MS_BOOL msAPI_JPEG_transform_row( void );
1346 JPEG_STATIC JPEG_Result msAPI_JPEG_Baseline_Decode(void);
1347 #endif //SW_NJPD_RGB_CMYK
1348 
1349 JPEG_STATIC MS_VIRT JPEG_GetECS(void);
1350 static JPEG_Result _JPEG_Init_Share_Mem(void);
1351 
1352 //-------------------------------------------------------------------------------------------------
1353 //  Debug Functions
1354 //-------------------------------------------------------------------------------------------------
1355 
1356 //-------------------------------------------------------------------------------------------------
1357 //  Local Functions
1358 //-------------------------------------------------------------------------------------------------
1359 
1360 #ifdef VDEC_UTOPIA_2K
1361 #ifndef JPEG_STACK_SIZE
1362 #define JPEG_STACK_SIZE 4096
1363 #endif
1364 MS_S32 _s32JPEG_Callback_TaskId = -1;
1365 MS_U8   u8JpegCallbackStack[JPEG_STACK_SIZE];
1366 MS_BOOL bJpegCallbackTaskRunning = FALSE;
1367 
1368 JPEG_IsrFuncCb gIsrCB;
1369 
1370 MS_BOOL _MApi_JPEG_Create_Callback_task(void);
1371 MS_BOOL _MApi_JPEG_Delete_Callback_task(void);
1372 void _MApi_JPEG_Callback_Proc(void);
1373 #endif
1374 
1375 #ifdef MSOS_TYPE_LINUX_KERNEL
1376 MS_S32 s32FillHdrIdx = -1;
1377 MS_S32 s32FillHdrRes = 0;
1378 MS_PHY FillHdrPhyAddr[E_NJPD_NJPD_TOTAL];
1379 MS_U32 u32FillHdrLength[E_NJPD_NJPD_TOTAL];
1380 MS_BOOL JPEG_Get_ISR(void);
1381 void JPEG_Set_ISR(MS_BOOL val);
JPEG_FillHdrFunc_KernlDummy(MS_PHY BufAddr,MS_U32 BufLength)1382 MS_S32 JPEG_FillHdrFunc_KernlDummy(MS_PHY BufAddr, MS_U32 BufLength)
1383 {
1384     return 0;
1385 }
1386 #endif
1387 
JPEG_FillHeaderFunction(MS_PHY mFillHdrPhyAddr,MS_U32 mu32FillHdrLength)1388 MS_U32 JPEG_FillHeaderFunction(MS_PHY mFillHdrPhyAddr,MS_U32 mu32FillHdrLength)//kernel
1389 {
1390 #ifdef MSOS_TYPE_LINUX_KERNEL
1391     if(pNJPEGContext->eNJPDNum < 0)
1392     {
1393         JPEG_DEBUG_API_ERR("%s [%d] [FATAL][ERROR] invalid pNJPEGContext->eNJPDNum for array\n", __FUNCTION__, __LINE__);
1394         pNJPEGContext->eNJPDNum = 0;
1395     }
1396     FillHdrPhyAddr[pNJPEGContext->eNJPDNum] = mFillHdrPhyAddr;
1397     u32FillHdrLength[pNJPEGContext->eNJPDNum] = mu32FillHdrLength;
1398     s32FillHdrIdx = pNJPEGContext->eNJPDNum;
1399     int timeout = 1000;
1400     while(s32FillHdrIdx != -1)
1401     {
1402         timeout--;
1403         MsOS_DelayTask(1);
1404         if(timeout<=0)
1405         {
1406             s32FillHdrIdx = -1;
1407             s32FillHdrRes = -1;
1408         }
1409     }
1410     return s32FillHdrRes;
1411 #else
1412     return pNJPEGContext->_pFillHdrFunc[pNJPEGContext->eNJPDNum](mFillHdrPhyAddr,mu32FillHdrLength);
1413 #endif
1414 }
1415 
1416 #ifdef MSOS_TYPE_LINUX_KERNEL
JPEG_Get_ISR()1417 MS_BOOL JPEG_Get_ISR()//kernel
1418 {
1419     return MDrv_NJPD_Get_ISR();
1420 }
1421 
JPEG_Set_ISR(MS_BOOL val)1422 void JPEG_Set_ISR(MS_BOOL val)
1423 {
1424     MDrv_NJPD_Set_ISR(val);
1425 }
1426 #endif
1427 
JPEG_OVER_BUFFER(MS_VIRT addr,MS_VIRT buf_addr,MS_U32 buf_size)1428 JPEG_STATIC MS_BOOL JPEG_OVER_BUFFER(MS_VIRT addr, MS_VIRT buf_addr, MS_U32 buf_size)
1429 {
1430     if((addr < buf_addr)
1431     || (addr >= (buf_addr+ buf_size)))
1432     {
1433         JPEG_DEBUG_API_ERR("%s [%d] invalid address 0x%tx\n", __FUNCTION__, __LINE__, (ptrdiff_t)addr);
1434         return TRUE;
1435     }
1436     return FALSE;
1437 }
1438 
1439 
1440 //------------------------------------------------------------------------------
1441 // Refill the input buffer.
1442 // This method will sit in a loop until (A) the buffer is full or (B)
1443 // the stream's read() method reports an end of file condition.
JPEG_fill_read_buffer(void)1444 JPEG_STATIC MS_BOOL JPEG_fill_read_buffer(void)
1445 {
1446     JPEG_DEBUG_API_MSG("JPEG_fill_read_buffer:\n");
1447     pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum] = 0;
1448     pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum] = pNJPEGContext->_pu8In_buf[pNJPEGContext->eNJPDNum];
1449 
1450     if(pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum]
1451     && (FALSE == pNJPEGContext->_bThumbnailAccessMode[pNJPEGContext->eNJPDNum]))
1452     {
1453         JPEG_DEBUG_API_MSG("JPEG_fill_read_buffer : EOF!!!\n");
1454         return TRUE;
1455     }
1456 
1457     if(pNJPEGContext->_bThumbnailAccessMode[pNJPEGContext->eNJPDNum])
1458     {
1459         JPEG_DEBUG_API_MSG("Fill Thumbnail, buffer left = %td, buffer offset = %td\n", (ptrdiff_t)pNJPEGContext->_u16ThumbnailBufferSize[pNJPEGContext->eNJPDNum], (ptrdiff_t)pNJPEGContext->_u32ThumbnailBufferOffset[pNJPEGContext->eNJPDNum]);
1460         if(pNJPEGContext->_u16ThumbnailBufferSize[pNJPEGContext->eNJPDNum]>=MRC_BUFFER_SIZE)
1461         {
1462             JPEG_memcpy((void *)((pNJPEGContext->_pu8In_buf[pNJPEGContext->eNJPDNum] + pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum])), (void *)((MS_VIRT)(INTERNAL_BUFFER_ADDR + pNJPEGContext->_u32ThumbnailBufferOffset[pNJPEGContext->eNJPDNum])), MRC_BUFFER_SIZE);
1463             pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum] = MRC_BUFFER_SIZE;
1464             pNJPEGContext->_u32ThumbnailBufferOffset[pNJPEGContext->eNJPDNum] += MRC_BUFFER_SIZE;
1465             pNJPEGContext->_u16ThumbnailBufferSize[pNJPEGContext->eNJPDNum] -= MRC_BUFFER_SIZE;
1466         }
1467         else
1468         {
1469             JPEG_memcpy((void *)((pNJPEGContext->_pu8In_buf[pNJPEGContext->eNJPDNum] + pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum])), (void *)((MS_VIRT)(INTERNAL_BUFFER_ADDR + pNJPEGContext->_u32ThumbnailBufferOffset[pNJPEGContext->eNJPDNum])), pNJPEGContext->_u16ThumbnailBufferSize[pNJPEGContext->eNJPDNum]);
1470             pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum] = TRUE;
1471             pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16ThumbnailBufferSize[pNJPEGContext->eNJPDNum];
1472             pNJPEGContext->_u32ThumbnailBufferOffset[pNJPEGContext->eNJPDNum] += pNJPEGContext->_u16ThumbnailBufferSize[pNJPEGContext->eNJPDNum];
1473             pNJPEGContext->_u16ThumbnailBufferSize[pNJPEGContext->eNJPDNum] = 0;
1474         }
1475     }
1476     else
1477     {
1478         if(pNJPEGContext->_pFillHdrFunc[pNJPEGContext->eNJPDNum])
1479         {
1480             MS_S32 byte_read = JPEG_FillHeaderFunction((MS_PHY)MS_VA2PA((MS_VIRT)pNJPEGContext->_pu8In_buf[pNJPEGContext->eNJPDNum]), MRC_BUFFER_SIZE);
1481             if(byte_read < 0)
1482             {
1483                 JPEG_terminate(E_JPEG_STREAM_READ);
1484                 return FALSE;
1485             }
1486             pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum] = byte_read;
1487         }
1488         else
1489         {
1490             JPEG_DEBUG_API_MSG("pNJPEGContext->_pFillHdrFunc[pNJPEGContext->eNJPDNum] is not registered!!\n");
1491             if (pNJPEGContext->bMHEG5[pNJPEGContext->eNJPDNum])
1492             {
1493                 pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum] = MRC_BUFFER_SIZE;
1494             }
1495             else
1496             {
1497                 JPEG_terminate(E_JPEG_NOT_ENOUGH_HEADER_INFO);
1498                 return FALSE;
1499             }
1500         }
1501     }
1502 #if 0
1503     else
1504     {
1505         do
1506         {
1507             MS_S32 bytes_read = _pStream->read( _pu8In_buf[pNJPEGContext->eNJPDNum] + _u32In_buf_left[pNJPEGContext->eNJPDNum], MRC_BUFFER_SIZE - _u32In_buf_left[pNJPEGContext->eNJPDNum], &_bEOF_flag[pNJPEGContext->eNJPDNum], _pStream);//, 0 );
1508             if ( bytes_read == -1 )
1509             {
1510                 JPEG_terminate( E_JPEG_STREAM_READ );
1511             }
1512             _u32In_buf_left[pNJPEGContext->eNJPDNum] += bytes_read;
1513 ////            _Total_Decoded_Size += bytes_read;
1514         } while ( ( _u32In_buf_left[pNJPEGContext->eNJPDNum] < MRC_BUFFER_SIZE ) && ( !_bEOF_flag[pNJPEGContext->eNJPDNum] ) );
1515     }
1516 
1517     _u32Total_bytes_read[pNJPEGContext->eNJPDNum] += _u32In_buf_left[pNJPEGContext->eNJPDNum];
1518 #endif
1519 
1520     pNJPEGContext->u32DataOffset[pNJPEGContext->eNJPDNum] += MRC_BUFFER_SIZE;
1521     return TRUE;
1522 }
1523 
1524 
JPEG_force_fill_read_buffer(MS_U32 u32Size)1525 JPEG_STATIC MS_BOOL JPEG_force_fill_read_buffer(MS_U32 u32Size)
1526 {
1527     JPEG_DEBUG_API_MSG("JPEG_fill_read_buffer:\n");
1528     pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum] = u32Size;
1529     pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum] = pNJPEGContext->_pu8In_buf[pNJPEGContext->eNJPDNum];
1530 
1531     if(pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum])
1532     {
1533         JPEG_DEBUG_API_MSG("JPEG_fill_read_buffer : EOF!!!\n");
1534         return TRUE;
1535     }
1536 
1537     if(pNJPEGContext->_pFillHdrFunc[pNJPEGContext->eNJPDNum])
1538     {
1539         MS_S32 byte_read = 0;
1540         if((MRC_BUFFER_SIZE-u32Size) > 0)
1541         {
1542             JPEG_DEBUG_API_MSG("[VA] _pu8In_buf[pNJPEGContext->eNJPDNum]=0x%tx\n",(ptrdiff_t) pNJPEGContext->_pu8In_buf[pNJPEGContext->eNJPDNum]);
1543             JPEG_DEBUG_API_MSG("[PA] _pu8In_buf[pNJPEGContext->eNJPDNum]=0x%tx\n", (ptrdiff_t)MS_VA2PA((MS_VIRT)pNJPEGContext->_pu8In_buf[pNJPEGContext->eNJPDNum]));
1544             JPEG_DEBUG_API_MSG("[PA] callback addr=0x%tx\n", (ptrdiff_t)(MS_VA2PA((MS_VIRT)pNJPEGContext->_pu8In_buf[pNJPEGContext->eNJPDNum])+u32Size));
1545             byte_read  = JPEG_FillHeaderFunction((MS_PHY)(MS_VA2PA((MS_VIRT)pNJPEGContext->_pu8In_buf[pNJPEGContext->eNJPDNum])+u32Size), MRC_BUFFER_SIZE-u32Size);
1546             JPEG_DEBUG_API_MSG("@@@fill byte_read=0x%tx\n", (ptrdiff_t)byte_read);
1547         }
1548 
1549         if(byte_read < 0)
1550         {
1551             JPEG_terminate(E_JPEG_STREAM_READ);
1552             return FALSE;
1553         }
1554         pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum] += byte_read;
1555     }
1556     else
1557     {
1558         JPEG_DEBUG_API_MSG("pNJPEGContext->_pFillHdrFunc[pNJPEGContext->eNJPDNum] is not registered!!\n");
1559         return FALSE;
1560     }
1561 
1562     return TRUE;
1563 }
1564 //------------------------------------------------------------------------------
1565 // Logical rotate left operation.
JPEG_rol(MS_U32 i,MS_U8 j)1566 JPEG_STATIC MS_U32 JPEG_rol(MS_U32 i, MS_U8 j)
1567 {
1568     return ( ( i << j ) | ( i >> ( 32 - j ) ) );
1569 }
1570 //------------------------------------------------------------------------------
1571 // Retrieve one character from the input stream.
JPEG_get_char(void)1572 JPEG_STATIC MS_U8 JPEG_get_char(void)
1573 {
1574     MS_U8 c;
1575 
1576     // Any bytes remaining in buffer?
1577     if ( !pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum] )
1578     {
1579         // Try to get more bytes.
1580         if(!JPEG_fill_read_buffer())
1581         {
1582             JPEG_DEBUG_API_MSG("JPEG_get_char : JPEG_fill_read_buffer failed!!!\n");
1583             pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum] = 0;
1584         }
1585         // Still nothing to get?
1586         if ( !pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum] )
1587         {
1588             // Padd the end of the stream with 0xFF 0xD9 (EOI marker)
1589             // FIXME: Is there a better padding pattern to use?
1590             MS_U8 t = pNJPEGContext->_u8Tem_flag[pNJPEGContext->eNJPDNum];
1591             pNJPEGContext->_u8Tem_flag[pNJPEGContext->eNJPDNum] ^= 1;
1592             if ( t )
1593             {
1594                 return ( 0xD9 );
1595             }
1596             else
1597             {
1598                 return ( 0xFF );
1599             }
1600         }
1601     }
1602 
1603     c = *pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum]++;
1604     pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum]--;
1605 
1606     return ( c );
1607 }
1608 //------------------------------------------------------------------------------
1609 // Same as previus method, except can indicate if the character is
1610 // a "padd" character or not.
JPEG_get_charP(MS_BOOL * Ppadding_flag)1611 JPEG_STATIC MS_U8 JPEG_get_charP(MS_BOOL *Ppadding_flag)
1612 {
1613     MS_U8 c;
1614 
1615     if ( !pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum] )
1616     {
1617         if(!JPEG_fill_read_buffer())
1618         {
1619             JPEG_DEBUG_API_MSG("JPEG_get_charP : JPEG_fill_read_buffer failed!!!\n");
1620             pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum] = 0;
1621         }
1622 
1623         if ( !pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum] )
1624         {
1625             *Ppadding_flag = TRUE;
1626 #if 1
1627             pNJPEGContext->_u8Tem_flag[pNJPEGContext->eNJPDNum] ^= 1;
1628             // This function is called during when progressive huffman decoding
1629             // Should not padding 0xFFD9 at this state
1630             return 0;
1631 #else
1632             MS_U8 t;
1633             t = _u8Tem_flag[pNJPEGContext->eNJPDNum];
1634             _u8Tem_flag[pNJPEGContext->eNJPDNum] ^= 1;
1635             if ( t )
1636             {
1637                 return ( 0xD9 );
1638             }
1639             else
1640             {
1641                 return ( 0xFF );
1642             }
1643 #endif
1644         }
1645     }
1646 
1647     *Ppadding_flag = FALSE;
1648 
1649     c = *pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum]++;
1650     pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum]--;
1651 
1652     return ( c );
1653 }
1654 //------------------------------------------------------------------------------
1655 // Inserts a previously retrieved character back into the input buffer.
JPEG_stuff_char(MS_U8 q)1656 JPEG_STATIC void JPEG_stuff_char(MS_U8 q)
1657 {
1658     *( --pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum] ) = q;
1659     pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum]++;
1660 }
1661 //------------------------------------------------------------------------------
1662 // Retrieves one character from the input stream, but does
1663 // not read past markers. Will continue to return 0xFF when a
1664 // marker is encountered.
1665 // FIXME: Bad name?
JPEG_get_octet(void)1666 JPEG_STATIC MS_U8 JPEG_get_octet(void)
1667 {
1668     MS_BOOL padding_flag;
1669     MS_U8 c = JPEG_get_charP( &padding_flag );
1670 
1671     if ( c == 0xFF )
1672     {
1673         if ( padding_flag )
1674         {
1675             return ( 0xFF );
1676         }
1677 
1678         c = JPEG_get_charP( &padding_flag );
1679         if ( padding_flag )
1680         {
1681             JPEG_stuff_char( 0xFF );
1682             return ( 0xFF );
1683         }
1684 
1685         if ( c == 0x00 )
1686         {
1687             return ( 0xFF );
1688         }
1689         else
1690         {
1691             JPEG_stuff_char( c );
1692             JPEG_stuff_char( 0xFF );
1693             return ( 0xFF );
1694         }
1695     }
1696 
1697     return ( c );
1698 }
1699 //------------------------------------------------------------------------------
1700 // Retrieves a variable number of bits from the input stream.
1701 // Markers will not be read into the input bit buffer. Instead,
1702 // an infinite number of all 1's will be returned when a marker
1703 // is encountered.
1704 // FIXME: Is it better to return all 0's instead, like the older implementation?
JPEG_get_bits_2(MS_U8 numbits)1705 JPEG_STATIC MS_U32 JPEG_get_bits_2(MS_U8 numbits)
1706 {
1707     MS_U32 i, c1, c2;
1708 
1709     i = ( pNJPEGContext->_u32Bit_buf[pNJPEGContext->eNJPDNum] >> ( 16 - numbits ) ) & ( ( 1 << numbits ) - 1 );
1710 
1711     pNJPEGContext->_s16Bits_left[pNJPEGContext->eNJPDNum] -= numbits;
1712     if ( pNJPEGContext->_s16Bits_left[pNJPEGContext->eNJPDNum] <= 0 )
1713     {
1714         pNJPEGContext->_u32Bit_buf[pNJPEGContext->eNJPDNum] = JPEG_rol( pNJPEGContext->_u32Bit_buf[pNJPEGContext->eNJPDNum], numbits += pNJPEGContext->_s16Bits_left[pNJPEGContext->eNJPDNum] );
1715 
1716         c1 = JPEG_get_octet();
1717         c2 = JPEG_get_octet();
1718 
1719         pNJPEGContext->_u32Bit_buf[pNJPEGContext->eNJPDNum] = ( pNJPEGContext->_u32Bit_buf[pNJPEGContext->eNJPDNum] & 0xFFFFUL ) | ( ( ( MS_U32 )c1 ) << 24 ) | ( ( ( MS_U32 )c2 ) << 16 );
1720 
1721         pNJPEGContext->_u32Bit_buf[pNJPEGContext->eNJPDNum] = JPEG_rol( pNJPEGContext->_u32Bit_buf[pNJPEGContext->eNJPDNum], -pNJPEGContext->_s16Bits_left[pNJPEGContext->eNJPDNum] );
1722 
1723         pNJPEGContext->_s16Bits_left[pNJPEGContext->eNJPDNum] += 16;
1724     }
1725     else
1726     {
1727         pNJPEGContext->_u32Bit_buf[pNJPEGContext->eNJPDNum] = JPEG_rol( pNJPEGContext->_u32Bit_buf[pNJPEGContext->eNJPDNum], numbits );
1728     }
1729 
1730     return i;
1731 }
1732 //------------------------------------------------------------------------------
1733 // Decodes a Huffman encoded symbol.
JPEG_huff_decode(JPEG_HuffTbl * Ph)1734 JPEG_STATIC MS_S32 JPEG_huff_decode(JPEG_HuffTbl *Ph)
1735 {
1736     MS_S32 symbol;
1737 
1738     // Check first 8-bits: do we have a complete symbol?
1739     symbol = Ph->s16Look_up[( pNJPEGContext->_u32Bit_buf[pNJPEGContext->eNJPDNum] >> 8 ) & 0xFF];
1740     if ( symbol < 0 )
1741     {
1742         // Decode more bits, use a tree traversal to find symbol.
1743         JPEG_get_bits_2( 8 );
1744 
1745         do
1746         {
1747             symbol = Ph->s16Tree[~symbol + ( 1 - JPEG_get_bits_2( 1 ) )];
1748         }
1749         while ( symbol < 0 );
1750     }
1751     else
1752     {
1753         JPEG_get_bits_2( Ph->u8Code_size[symbol] );
1754     }
1755 
1756     return symbol;
1757 }
1758 //------------------------------------------------------------------------------
1759 // Unconditionally frees all allocated blocks.
JPEG_free_all_blocks(void)1760 JPEG_STATIC void JPEG_free_all_blocks(void)
1761 {
1762     MS_U8 i;
1763 #if 0
1764     if ( _pStream )
1765     {
1766         _pStream = NULL;
1767     }
1768 #endif
1769     for ( i = 0; i < JPEG_MAXBLOCKS; i++ )
1770     {
1771         if(pNJPEGContext->_pBlocks[pNJPEGContext->eNJPDNum][i]!=NULL)
1772             JPEG_MEMORY_free( pNJPEGContext->_pBlocks[pNJPEGContext->eNJPDNum][i] );
1773 
1774         pNJPEGContext->_pBlocks[pNJPEGContext->eNJPDNum][i] = NULL;
1775     }
1776 }
1777 //------------------------------------------------------------------------------
1778 // This method handles all errors.
1779 // It could easily be changed to use C++ exceptions.
JPEG_terminate(JPEG_ErrCode status)1780 JPEG_STATIC void JPEG_terminate(JPEG_ErrCode status)
1781 {
1782     pNJPEGContext->_Error_code[pNJPEGContext->eNJPDNum] = status;
1783 
1784     JPEG_free_all_blocks();
1785 
1786     JPEG_DEBUG_API_ERR("%s:ERROR= %d\n", __FUNCTION__, pNJPEGContext->_Error_code[pNJPEGContext->eNJPDNum]);
1787 #ifdef NJPD_LONGJUMP_SUPPORT
1788     longjmp( _jmp_state, status );
1789 #endif
1790 }
1791 //------------------------------------------------------------------------------
1792 // Allocate a block of memory-- store block's address in list for
1793 // later deallocation by JPEG_free_all_blocks().
JPEG_alloc(MS_U32 n)1794 JPEG_STATIC void * JPEG_alloc(MS_U32 n)
1795 {
1796     MS_U8 i;
1797     void *q;
1798 
1799     // Find a free slot. The number of allocated slots will
1800     // always be very low, so a linear search is good enough.
1801     for ( i = 0; i < JPEG_MAXBLOCKS; i++ )
1802     {
1803         if ( pNJPEGContext->_pBlocks[pNJPEGContext->eNJPDNum][i] == NULL )
1804         {
1805             break;
1806         }
1807     }
1808 
1809     if ( i >= JPEG_MAXBLOCKS )
1810     {
1811         JPEG_terminate( E_JPEG_TOO_MANY_BLOCKS );
1812         return NULL;
1813     }
1814 
1815     //FixMe: eCos does not support aligned allocate ???
1816     q = JPEG_MEMORY_malloc( n + 8 );
1817     //q = MsOS_AllocateAlignedMemory(n+8, 8, gs32CachedPoolID);
1818     //q = MsOS_AllocateMemory(n+8, gs32CachedPoolID);
1819 
1820     if ( q == NULL )
1821     {
1822         JPEG_terminate( E_JPEG_NOTENOUGHMEM );
1823         return NULL;
1824     }
1825 
1826     JPEG_memset((void *)q, 0, n + 8 );
1827 
1828     pNJPEGContext->_pBlocks[pNJPEGContext->eNJPDNum][i] = q;
1829 
1830     JPEG_DEBUG_API_MSG("JPEG %td bytes allocated\n", (ptrdiff_t)n);
1831 
1832     return ( ( void* )q );
1833 }
1834 //------------------------------------------------------------------------------
JPEG_Tiff_EndianChangeL(MS_U32 u32Val)1835 JPEG_STATIC MS_U32 JPEG_Tiff_EndianChangeL(MS_U32 u32Val)
1836 {
1837     if (pNJPEGContext->_bTiffBigEndian[pNJPEGContext->eNJPDNum])
1838         return EndianChangeL(u32Val);
1839     else
1840         return u32Val;
1841 }
1842 //------------------------------------------------------------------------------
JPEG_Tiff_EndianChangeS(MS_U16 u16Val)1843 JPEG_STATIC MS_U16 JPEG_Tiff_EndianChangeS(MS_U16 u16Val)
1844 {
1845     if (pNJPEGContext->_bTiffBigEndian[pNJPEGContext->eNJPDNum])
1846         return EndianChangeS(u16Val);
1847     else
1848         return u16Val;
1849 }
1850 //------------------------------------------------------------------------------
JPEG_GetU16(MS_U8 * data)1851 JPEG_STATIC MS_U16 JPEG_GetU16(MS_U8 *data)
1852 {
1853     MS_S8 i;
1854     MS_U16 val = 0;
1855 
1856     for(i = 1; i>=0; i--)
1857         val = (val << 8) + (MS_U8) *(data + i);
1858 
1859 
1860     return val;
1861 }
1862 //------------------------------------------------------------------------------
JPEG_GetU32(MS_U8 * data)1863 JPEG_STATIC MS_U32 JPEG_GetU32(MS_U8 *data)
1864 {
1865     MS_S8 i;
1866     MS_U32 val = 0;
1867 
1868     for(i = 3; i>=0; i--)
1869         val = (val << 8) + (MS_U8) *(data + i);
1870 
1871     return val;
1872 }
1873 //------------------------------------------------------------------------------
1874 //***************************************************
1875 //Parse EXIF header
1876 //***************************************************
JPEG_DecodeExifInfo(MS_U8 * data,MS_U32 data_length)1877 JPEG_STATIC MS_BOOL JPEG_DecodeExifInfo(MS_U8 *data, MS_U32 data_length)
1878 {
1879     MS_U8 *pJpegBuff = data;
1880 //    MS_U32 u32tmp, u32Len;
1881     MS_U32 u32tmp;
1882     MS_U16 u16Marker, u16Len, u16NumOfEntry, i;
1883     MS_U8  *pTiffHdrPtr, *pNextIfd;
1884     MS_U32 u32DataValue;
1885     MS_U8 *pExifHdr = NULL, *pExifHdrOffet = NULL;
1886     MS_BOOL bIFD_pt_found = FALSE;
1887 
1888     u32tmp = JPEG_GetU32(pJpegBuff);
1889     if (JPEG_TAG_EXIF != u32tmp)
1890     {
1891         return FALSE;
1892     }
1893 
1894     // Exif starts here
1895     pJpegBuff += 6;
1896     pExifHdr = pJpegBuff;
1897     u16Marker = JPEG_GetU16(pJpegBuff);
1898     if (JPEG_TIFF_BIG_ENDIAN == u16Marker)
1899         pNJPEGContext->_bTiffBigEndian[pNJPEGContext->eNJPDNum] = TRUE;
1900     else if (JPEG_TIFF_LITTLE_ENDIAN == u16Marker)
1901         pNJPEGContext->_bTiffBigEndian[pNJPEGContext->eNJPDNum] = FALSE;
1902     else
1903         return FALSE;
1904 
1905     pNJPEGContext->_u32ThumbnailOffset[pNJPEGContext->eNJPDNum] += 6;
1906     pTiffHdrPtr = pJpegBuff;
1907 
1908     pJpegBuff += 2;
1909     u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
1910     if (u16Marker != 0x002A)
1911         return FALSE;
1912 
1913     pJpegBuff += 2;
1914     u16Len = (MS_U16)JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
1915     pJpegBuff += (u16Len - 4); //ENDIAN(2byte) + 0x002A(2byte)
1916 
1917     // 0th IFD start here
1918     u16NumOfEntry = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
1919     pJpegBuff += 2;
1920 
1921     // Boundary check, prevent from buffer over-run
1922     if((((MS_VIRT) pJpegBuff) - INTERNAL_BUFFER_ADDR + u16NumOfEntry*12)>=data_length)
1923     {
1924         return FALSE;
1925     }
1926 
1927 //    pJpegBuff += 12*u16NumOfEntry;
1928 
1929     JPEG_DEBUG_API_MSG("IFD0 : u16NumOfEntry = %d\n", u16NumOfEntry);
1930 
1931     //Retrieve orientation
1932     for(i = 0; i < u16NumOfEntry; i++)
1933     {
1934         u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
1935         pJpegBuff += 8;
1936 
1937         if((JPEG_EXIF_TAG_ORIENTATION == u16Marker)
1938         && (E_JPEG_EXIF_ORIENT_NOT_FOUND == pNJPEGContext->_eEXIF_Orientation[pNJPEGContext->eNJPDNum]))
1939         {
1940             //The datatype of orientation is short
1941             u32DataValue = (MS_U32)JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
1942             if((E_JPEG_EXIF_ORIENT_ROTATE_0 > u32DataValue)
1943             || (E_JPEG_EXIF_ORIENT_ROTATE_270 < u32DataValue))
1944             {
1945                 pNJPEGContext->_eEXIF_Orientation[pNJPEGContext->eNJPDNum] = E_JPEG_EXIF_ORIENT_RESERVED;
1946             }
1947             else
1948             {
1949                 pNJPEGContext->_eEXIF_Orientation[pNJPEGContext->eNJPDNum] = (JPEG_EXIF_Orientation)u32DataValue;
1950             }
1951             JPEG_DEBUG_API_MSG("JPEG EXIF Orientation = %d\n", pNJPEGContext->_eEXIF_Orientation[pNJPEGContext->eNJPDNum]);
1952         }
1953         else if(JPEG_EXIF_TAG_IFD_POINTER == u16Marker)
1954         {
1955             bIFD_pt_found = TRUE;
1956             //datavalue is an offset from exif marker for datetime
1957             u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
1958             pExifHdrOffet = pExifHdr + u32DataValue;
1959             JPEG_OVER_BUFFER_RET(pExifHdrOffet, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
1960             JPEG_DEBUG_API_MSG("Exif IFD pointer = 0x%tx\n", (ptrdiff_t)pExifHdrOffet);
1961         }
1962 #if SUPPORT_EXIF_EXTRA_INFO
1963         else if(JPEG_EXIF_TAG_MANUFACTURER == u16Marker)
1964         {
1965             MS_U8 *pIFDPtrOffset;
1966             pIFDPtrOffset = pJpegBuff;
1967             u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pIFDPtrOffset));
1968             JPEG_DEBUG_API_MSG("MANUFACTURER Offset = 0x%tx\n", (ptrdiff_t)u32DataValue);
1969             pIFDPtrOffset = pExifHdr + u32DataValue;
1970             if(JPEG_OVER_BUFFER((MS_VIRT)pIFDPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE))
1971             {
1972                 pJpegBuff += 4;
1973                 continue;
1974             }
1975             //JPEG_DEBUG_API_MSG("MANUFACTURER addr = 0x%lx\n", (MS_U32)pIFDPtrOffset);
1976             MS_U8 u8i=0;
1977             while(*(pIFDPtrOffset+u8i) && u8i<JPEG_MANUFACTURER_SIZE)
1978             {
1979                 pNJPEGContext->_u8EXIF_Manufacturer[pNJPEGContext->eNJPDNum][u8i] = *(pIFDPtrOffset+u8i);
1980                 u8i++;
1981             }
1982         }
1983         else if(JPEG_EXIF_TAG_MODEL== u16Marker)
1984         {
1985             MS_U8 *pIFDPtrOffset;
1986             pIFDPtrOffset = pJpegBuff;
1987             u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pIFDPtrOffset));
1988             JPEG_DEBUG_API_MSG("MODEL Offset = 0x%tx\n", (ptrdiff_t)u32DataValue);
1989             pIFDPtrOffset = pExifHdr + u32DataValue;
1990             if(JPEG_OVER_BUFFER((MS_VIRT)pIFDPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE))
1991             {
1992                 pJpegBuff += 4;
1993                 continue;
1994             }
1995             //JPEG_DEBUG_API_MSG("MODEL addr = 0x%lx\n", (MS_U32)pIFDPtrOffset);
1996             MS_U8 u8i=0;
1997             while(*(pIFDPtrOffset+u8i) && u8i<JPEG_MODEL_SIZE)
1998             {
1999                 pNJPEGContext->_u8EXIF_Model[pNJPEGContext->eNJPDNum][u8i] = *(pIFDPtrOffset+u8i);
2000                 u8i++;
2001             }
2002         }
2003 #endif
2004 #if 0
2005         else if((JPEG_EXIF_TAG_DATETIME_MOD == u16Marker)
2006         && (FALSE == pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].bHasDataTime))
2007         {
2008             pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].bHasDataTime = TRUE;
2009             //datavalue is an offset from exif marker for datetime
2010             u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2011             pNJPEGContext->pExifOffset = pExifHdr + u32DataValue;
2012             printf("pExifOffset1 = 0x%lx\n", (MS_U32)pNJPEGContext->pExifOffset);
2013             JPEG_AtoU32(pNJPEGContext->pExifOffset, pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Year);
2014             pNJPEGContext->pExifOffset++;
2015             JPEG_AtoU32(pNJPEGContext->pExifOffset, pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Month);
2016             pNJPEGContext->pExifOffset++;
2017             JPEG_AtoU32(pNJPEGContext->pExifOffset, pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Day);
2018             pNJPEGContext->pExifOffset++;
2019             JPEG_AtoU32(pNJPEGContext->pExifOffset, pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Hour);
2020             pNJPEGContext->pExifOffset++;
2021             JPEG_AtoU32(pNJPEGContext->pExifOffset, pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Minute);
2022             pNJPEGContext->pExifOffset++;
2023             JPEG_AtoU32(pNJPEGContext->pExifOffset, pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Second);
2024             JPEG_DEBUG_API_MSG("JPEG EXIF Orientation = %d\n", pNJPEGContext->_eEXIF_Orientation[pNJPEGContext->eNJPDNum]);
2025             JPEG_DEBUG_API_MSG("=======JPEG EXIF DateTime======= Exist = %d, Original = %d \n", pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].bHasDataTime, pNJPEGContext->bOriDateTimeFound);
2026             JPEG_DEBUG_API_MSG("Year = %ld, Month = %ld, Day = %ld\n", pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Year, pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Month, pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Day);
2027             JPEG_DEBUG_API_MSG("Hour = %ld, Minute = %ld, Second = %ld\n", pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Hour, pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Minute, pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Second);
2028         }
2029 #endif
2030         pJpegBuff += 4;
2031     }
2032 
2033     if(TRUE == bIFD_pt_found)
2034     {
2035         u16NumOfEntry = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifHdrOffet));
2036         pExifHdrOffet += 2;
2037         JPEG_DEBUG_API_MSG("EXIF IFD : u16NumOfEntry = %d\n", u16NumOfEntry);
2038 
2039         for(i = 0; i < u16NumOfEntry; i++)
2040         {
2041             u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifHdrOffet));
2042 #if (SUPPORT_EXIF_EXTRA_INFO==FALSE)
2043             if(JPEG_EXIF_TAG_DATETIME_ORI == u16Marker)
2044             {
2045                 pExifHdrOffet += 8;
2046                 pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].bHasDataTime = TRUE;
2047                 //datavalue is an offset from exif marker for datetime
2048                 u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifHdrOffet));;
2049                 pExifHdrOffet = pExifHdr + u32DataValue;
2050                 JPEG_OVER_BUFFER_RET(pExifHdrOffet, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2051                 JPEG_DEBUG_API_MSG("pExifOriDateTime Offset = 0x%tx\n", (ptrdiff_t)pExifHdrOffet);
2052                 JPEG_AtoU32(pExifHdrOffet, pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Year);
2053                 pExifHdrOffet++;
2054                 JPEG_AtoU32(pExifHdrOffet, pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Month);
2055                 pExifHdrOffet++;
2056                 JPEG_AtoU32(pExifHdrOffet, pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Day);
2057                 pExifHdrOffet++;
2058                 JPEG_AtoU32(pExifHdrOffet, pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Hour);
2059                 pExifHdrOffet++;
2060                 JPEG_AtoU32(pExifHdrOffet, pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Minute);
2061                 pExifHdrOffet++;
2062                 JPEG_AtoU32(pExifHdrOffet, pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Second);
2063                 JPEG_DEBUG_API_MSG("=======JPEG EXIF DateTime=======\n");
2064                 JPEG_DEBUG_API_MSG("Year = %td, Month = %td, Day = %td\n", (ptrdiff_t)pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Year, (ptrdiff_t)pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Month, (ptrdiff_t)pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Day);
2065                 JPEG_DEBUG_API_MSG("Hour = %td, Minute = %td, Second = %td\n", (ptrdiff_t)pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Hour, (ptrdiff_t)pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Minute, (ptrdiff_t)pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Second);
2066                 break;
2067             }
2068 #else
2069             MS_U8 *pExifPtrOffset;
2070             MS_U16 u16Type;
2071             MS_U32 u32Count;
2072             switch(u16Marker)
2073             {
2074                 case JPEG_EXIF_TAG_DATETIME_ORI:
2075                     pExifPtrOffset = pExifHdrOffet + 8;
2076                     pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].bHasDataTime = TRUE;
2077                     //datavalue is an offset from exif marker for datetime
2078                     u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2079                     pExifPtrOffset = pExifHdr + u32DataValue;
2080                     JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2081                     JPEG_DEBUG_API_MSG("pExifOriDateTime Offset = 0x%tx\n", (ptrdiff_t)pExifPtrOffset);
2082                     JPEG_AtoU32(pExifPtrOffset, pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Year);
2083                     pExifPtrOffset++;
2084                     JPEG_AtoU32(pExifPtrOffset, pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Month);
2085                     pExifPtrOffset++;
2086                     JPEG_AtoU32(pExifPtrOffset, pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Day);
2087                     pExifPtrOffset++;
2088                     JPEG_AtoU32(pExifPtrOffset, pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Hour);
2089                     pExifPtrOffset++;
2090                     JPEG_AtoU32(pExifPtrOffset, pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Minute);
2091                     pExifPtrOffset++;
2092                     JPEG_AtoU32(pExifPtrOffset, pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Second);
2093                     JPEG_DEBUG_API_MSG("=======JPEG EXIF DateTime=======\n");
2094                     JPEG_DEBUG_API_MSG("Year = %td, Month = %td, Day = %td\n", (ptrdiff_t)pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Year, (ptrdiff_t)pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Month, (ptrdiff_t)pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Day);
2095                     JPEG_DEBUG_API_MSG("Hour = %td, Minute = %td, Second = %td\n", (ptrdiff_t)pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Hour, (ptrdiff_t)pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Minute, (ptrdiff_t)pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Second);
2096                     break;
2097                 case JPEG_EXIF_TAG_ISO_SPEED_RATING:
2098                     pExifPtrOffset = pExifHdrOffet + 2;
2099                     u16Type = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2100                     pExifPtrOffset = pExifHdrOffet + 4;
2101                     u32Count = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2102                     pExifPtrOffset = pExifHdrOffet + 8;
2103                     if(u16Type==3)
2104                     {
2105                         if(u32Count==2)
2106                         {
2107                             pNJPEGContext->_u32EXIF_ISOSpeedRatings[pNJPEGContext->eNJPDNum]=JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2108                         }
2109                         else if(u32Count==1)
2110                         {
2111                             pNJPEGContext->_u32EXIF_ISOSpeedRatings[pNJPEGContext->eNJPDNum]=JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2112                         }
2113                     }
2114                     else if(u16Type==4)
2115                     {
2116                         if(u32Count==1)
2117                         {
2118                             pNJPEGContext->_u32EXIF_ISOSpeedRatings[pNJPEGContext->eNJPDNum]=JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2119                         }
2120                     }
2121                     JPEG_DEBUG_API_MSG("ISO Speed Rating=%td\n", (ptrdiff_t)pNJPEGContext->_u32EXIF_ISOSpeedRatings[pNJPEGContext->eNJPDNum]);
2122                     break;
2123                 case JPEG_EXIF_TAG_EXPOSURE_TIME:
2124                     pExifPtrOffset = pExifHdrOffet + 8;
2125                     u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2126                     JPEG_DEBUG_API_MSG("ExposureTime Offset = 0x%tx\n", (ptrdiff_t)u32DataValue);
2127                     pExifPtrOffset = pExifHdr + u32DataValue;
2128                     //JPEG_DEBUG_API_MSG("ExposureTime addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2129                     JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2130                     pNJPEGContext->_stEXIF_ExposureTime[pNJPEGContext->eNJPDNum].numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2131                     pExifPtrOffset+=4;
2132                     pNJPEGContext->_stEXIF_ExposureTime[pNJPEGContext->eNJPDNum].denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2133                     JPEG_DEBUG_API_MSG("ExposureTime numerator=%td, denominator=%td\n", (ptrdiff_t)pNJPEGContext->_stEXIF_ExposureTime[pNJPEGContext->eNJPDNum].numerator, (ptrdiff_t)pNJPEGContext->_stEXIF_ExposureTime[pNJPEGContext->eNJPDNum].denominator);
2134                     break;
2135                 case JPEG_EXIF_TAG_F_NUMBER:
2136                     pExifPtrOffset = pExifHdrOffet + 8;
2137                     u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2138                     JPEG_DEBUG_API_MSG("FNumber Offset = 0x%tx\n", (ptrdiff_t)u32DataValue);
2139                     pExifPtrOffset = pExifHdr + u32DataValue;
2140                     //JPEG_DEBUG_API_MSG("FNumber addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2141                     JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2142                     pNJPEGContext->_stEXIF_FNumber[pNJPEGContext->eNJPDNum].numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2143                     pExifPtrOffset+=4;
2144                     pNJPEGContext->_stEXIF_FNumber[pNJPEGContext->eNJPDNum].denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2145                     JPEG_DEBUG_API_MSG("FNumber numerator=%td, denominator=%td\n", (ptrdiff_t)pNJPEGContext->_stEXIF_FNumber[pNJPEGContext->eNJPDNum].numerator, (ptrdiff_t)pNJPEGContext->_stEXIF_FNumber[pNJPEGContext->eNJPDNum].denominator);
2146                     break;
2147 
2148                 case JPEG_EXIF_TAG_SHUTTER_SPEED:
2149                     pExifPtrOffset = pExifHdrOffet + 8;
2150                     u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2151                     JPEG_DEBUG_API_MSG("ShutterSpeedValue Offset = 0x%tx\n", (ptrdiff_t)u32DataValue);
2152                     pExifPtrOffset = pExifHdr + u32DataValue;
2153                     JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2154                     //JPEG_DEBUG_API_MSG("ShutterSpeedValue addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2155                     pNJPEGContext->_stEXIF_ShutterSpeedValue[pNJPEGContext->eNJPDNum].s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2156                     pExifPtrOffset+=4;
2157                     pNJPEGContext->_stEXIF_ShutterSpeedValue[pNJPEGContext->eNJPDNum].s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2158                     JPEG_DEBUG_API_MSG("ShutterSpeedValue numerator=%td, denominator=%td\n", (ptrdiff_t)pNJPEGContext->_stEXIF_ShutterSpeedValue[pNJPEGContext->eNJPDNum].s_numerator, (ptrdiff_t)pNJPEGContext->_stEXIF_ShutterSpeedValue[pNJPEGContext->eNJPDNum].s_denominator);
2159                     break;
2160                 case JPEG_EXIF_TAG_APERTURE:
2161                     pExifPtrOffset = pExifHdrOffet + 8;
2162                     u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2163                     JPEG_DEBUG_API_MSG("ApertureValue Offset = 0x%tx\n", (ptrdiff_t)u32DataValue);
2164                     pExifPtrOffset = pExifHdr + u32DataValue;
2165                     //JPEG_DEBUG_API_MSG("ApertureValue addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2166                     JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2167                     pNJPEGContext->_stEXIF_ApertureValue[pNJPEGContext->eNJPDNum].numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2168                     pExifPtrOffset+=4;
2169                     pNJPEGContext->_stEXIF_ApertureValue[pNJPEGContext->eNJPDNum].denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2170                     JPEG_DEBUG_API_MSG("ApertureValue numerator=%td, denominator=%td\n", (ptrdiff_t)pNJPEGContext->_stEXIF_ApertureValue[pNJPEGContext->eNJPDNum].numerator, (ptrdiff_t)pNJPEGContext->_stEXIF_ApertureValue[pNJPEGContext->eNJPDNum].denominator);
2171                     break;
2172                 case JPEG_EXIF_TAG_EXPOSURE_BIAS:
2173                     pExifPtrOffset = pExifHdrOffet + 8;
2174                     u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2175                     JPEG_DEBUG_API_MSG("ExposureBiasValue Offset = 0x%tx\n", (ptrdiff_t)u32DataValue);
2176                     pExifPtrOffset = pExifHdr + u32DataValue;
2177                     JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2178                     //JPEG_DEBUG_API_MSG("ExposureBiasValue addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2179                     pNJPEGContext->_stEXIF_ExposureBiasValue[pNJPEGContext->eNJPDNum].s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2180                     pExifPtrOffset+=4;
2181                     pNJPEGContext->_stEXIF_ExposureBiasValue[pNJPEGContext->eNJPDNum].s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2182                     JPEG_DEBUG_API_MSG("ExposureBiasValue numerator=%td, denominator=%td\n", (ptrdiff_t)pNJPEGContext->_stEXIF_ExposureBiasValue[pNJPEGContext->eNJPDNum].s_numerator, (ptrdiff_t)pNJPEGContext->_stEXIF_ExposureBiasValue[pNJPEGContext->eNJPDNum].s_denominator);
2183                     break;
2184                 case JPEG_EXIF_TAG_FLASH:
2185                     pExifPtrOffset = pExifHdrOffet + 8;
2186                     pNJPEGContext->_u16EXIF_Flash[pNJPEGContext->eNJPDNum] = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2187                     JPEG_DEBUG_API_MSG("EXIF_Flash=0x%x\n", pNJPEGContext->_u16EXIF_Flash[pNJPEGContext->eNJPDNum]);
2188                     break;
2189                 case JPEG_EXIF_TAG_FOCAL_LENGTH:
2190                     pExifPtrOffset = pExifHdrOffet + 8;
2191                     u32DataValue = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2192                     JPEG_DEBUG_API_MSG("FocalLength Offset = 0x%tx\n", (ptrdiff_t)u32DataValue);
2193                     pExifPtrOffset = pExifHdr + u32DataValue;
2194                     JPEG_OVER_BUFFER_RET(pExifPtrOffset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2195                     //JPEG_DEBUG_API_MSG("FocalLength addr = 0x%lx\n", (MS_U32)pExifPtrOffset);
2196                     pNJPEGContext->_stEXIF_FocalLength[pNJPEGContext->eNJPDNum].numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2197                     pExifPtrOffset+=4;
2198                     pNJPEGContext->_stEXIF_FocalLength[pNJPEGContext->eNJPDNum].denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2199                     JPEG_DEBUG_API_MSG("FocalLength numerator=%td, denominator=%td\n", (ptrdiff_t)pNJPEGContext->_stEXIF_FocalLength[pNJPEGContext->eNJPDNum].numerator, (ptrdiff_t)pNJPEGContext->_stEXIF_FocalLength[pNJPEGContext->eNJPDNum].denominator);
2200                     break;
2201                 case JPEG_EXIF_TAG_IMAGE_WIDTH:
2202                     pExifPtrOffset = pExifHdrOffet + 2;
2203                     u16Type = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2204                     pExifPtrOffset = pExifHdrOffet + 8;
2205                     if(u16Type==3)
2206                     {
2207                         pNJPEGContext->_u32EXIF_ImageWidth[pNJPEGContext->eNJPDNum] = (MS_U32)JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2208                     }
2209                     else
2210                     {
2211                         pNJPEGContext->_u32EXIF_ImageWidth[pNJPEGContext->eNJPDNum] = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2212                     }
2213                     JPEG_DEBUG_API_MSG("EXIF_ImageWidth=%td\n", (ptrdiff_t)pNJPEGContext->_u32EXIF_ImageWidth[pNJPEGContext->eNJPDNum]);
2214                     break;
2215                 case JPEG_EXIF_TAG_IMAGE_HEIGHT:
2216                     pExifPtrOffset = pExifHdrOffet + 2;
2217                     u16Type = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2218                     pExifPtrOffset = pExifHdrOffet + 8;
2219                     if(u16Type==3)
2220                     {
2221                         pNJPEGContext->_u32EXIF_ImageHeight[pNJPEGContext->eNJPDNum] = (MS_U32)JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2222                     }
2223                     else
2224                     {
2225                         pNJPEGContext->_u32EXIF_ImageHeight[pNJPEGContext->eNJPDNum] = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pExifPtrOffset));
2226                     }
2227                     JPEG_DEBUG_API_MSG("EXIF_ImageHeight=%td\n", (ptrdiff_t)pNJPEGContext->_u32EXIF_ImageHeight[pNJPEGContext->eNJPDNum]);
2228                     break;
2229                 case JPEG_EXIF_TAG_EXPOSURE_PROGRAM:
2230                     pExifPtrOffset = pExifHdrOffet + 8;
2231                     pNJPEGContext->_u16EXIF_Exposureprogram[pNJPEGContext->eNJPDNum] = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pExifPtrOffset));
2232                     JPEG_DEBUG_API_MSG("EXIF_Exposureprogram=0x%x\n", pNJPEGContext->_u16EXIF_Exposureprogram[pNJPEGContext->eNJPDNum]);
2233                     break;
2234                 default:
2235                     break;
2236             }
2237 #endif
2238             pExifHdrOffet += 12;
2239         }
2240     }
2241 
2242     if(E_JPEG_TYPE_THUMBNAIL != pNJPEGContext->_u8DecodeType[pNJPEGContext->eNJPDNum])
2243     {
2244         JPEG_DEBUG_API_MSG("decode type is not thumbnail...\n");
2245         return FALSE;
2246     }
2247 
2248     // 1th IFD
2249     u32tmp = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2250     if (u32tmp == 0)
2251         return FALSE;
2252     else
2253     {
2254         if(u32tmp >= data_length)
2255         {
2256             JPEG_DEBUG_API_ERR("u32tmp = %td is invalid > %td\n", (ptrdiff_t)u32tmp,(ptrdiff_t)data_length);
2257             return FALSE;
2258         }
2259         pNextIfd = &pTiffHdrPtr[u32tmp];
2260         JPEG_DEBUG_API_MSG("1st IFD pNextIfd = 0x%tx, u32tmp = %td\n", (ptrdiff_t)pNextIfd, (ptrdiff_t)u32tmp);
2261     }
2262 
2263     u16NumOfEntry = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pNextIfd));
2264     pNextIfd += 2;
2265 
2266     // Boundary check, prevent from buffer over-run
2267     if((((MS_VIRT) pNextIfd) - INTERNAL_BUFFER_ADDR + u16NumOfEntry*12)>=data_length)
2268     {
2269         return FALSE;
2270     }
2271 
2272     for (i = 0; i < u16NumOfEntry; i++)
2273     {
2274         u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pNextIfd));
2275 //        u32Len = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pNextIfd + 4));
2276         u32tmp = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pNextIfd + 8));
2277 
2278         switch (u16Marker)
2279         {
2280             case JPEG_TIFF_JPEG_IMG_BYTES:
2281                 pNJPEGContext->_u16ThumbnailSize[pNJPEGContext->eNJPDNum] = u32tmp;
2282                 break;
2283             case JPEG_TIFF_SOI_OFFSET:
2284                 JPEG_DEBUG_API_MSG("Thumbnail marker found in 0x%tx!!\n", (ptrdiff_t)pNextIfd);
2285                 pNJPEGContext->_bThumbnailFound[pNJPEGContext->eNJPDNum] = TRUE;
2286                 pNJPEGContext->_u32ThumbnailOffset[pNJPEGContext->eNJPDNum] += u32tmp;
2287                 break;
2288             default:
2289                 break;
2290         }
2291 
2292         pNextIfd += 12;
2293     }
2294 
2295     // Boundary check, prevent from buffer over-run
2296     if(pNJPEGContext->_bThumbnailFound[pNJPEGContext->eNJPDNum])
2297     {
2298         if((pNJPEGContext->_u32ThumbnailOffset[pNJPEGContext->eNJPDNum] + pNJPEGContext->_u16ThumbnailSize[pNJPEGContext->eNJPDNum]) > data_length)
2299             pNJPEGContext->_bThumbnailFound[pNJPEGContext->eNJPDNum] = FALSE;
2300 
2301         // means it only contains SOI header..
2302         if(pNJPEGContext->_u16ThumbnailSize[pNJPEGContext->eNJPDNum]<=2)
2303             pNJPEGContext->_bThumbnailFound[pNJPEGContext->eNJPDNum] = FALSE;
2304     }
2305 
2306     return pNJPEGContext->_bThumbnailFound[pNJPEGContext->eNJPDNum];
2307 }
2308 
2309 // Used to skip unrecognized markers.
JPEG_skip_bytes(MS_U32 count)2310 JPEG_STATIC void JPEG_skip_bytes(MS_U32 count)
2311 {
2312     while(count!=0)
2313     {
2314         // Any bytes remaining in buffer?
2315         if ( !pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum] )
2316         {
2317             // Try to get more bytes.
2318             if(!JPEG_fill_read_buffer())
2319             {
2320                 JPEG_DEBUG_API_MSG("JPEG_fill_read_buffer failed!!!\n");
2321                 pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum] = 0;
2322             }
2323             // Still nothing to get?
2324             if ( !pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum] )
2325             {
2326                 // should not happen
2327                 break;
2328             }
2329         }
2330 
2331         if(count<pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum])
2332         {
2333             pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum] -= count;
2334             pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum] += count;
2335             count = 0;
2336         }
2337         else
2338         {
2339             count -= pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum];
2340             pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum] = 0;
2341         }
2342     }
2343 }
2344 //------------------------------------------------------------------------------
2345 #if SUPPORT_MPO_FORMAT
2346 #define JPEG_TAG_MPO                EndianChangeL(0x4D504600)
2347 #define JPEG_MPO_TAG_MPF_VERSION        0xB000
2348 #define JPEG_MPO_TAG_NUM_OF_IMAGES      0xB001
2349 #define JPEG_MPO_TAG_MP_ENTRY           0xB002
2350 
2351 #if 0
2352 static JPEG_MPO_INDEX_INFO _stMPOIndex[E_NJPD_NJPD_TOTAL];
2353 static JPEG_MPO_ATTRIBUTE_INFO _stMPOAttri[E_NJPD_NJPD_TOTAL][JPEG_MPO_MAX_SUPPORT_IMAGE];
2354 //For start of offset of MPO(only for first MPO picture)
2355 static MS_VIRT _u32App2MarkerOffset[E_NJPD_NJPD_TOTAL];
2356 #endif
2357 
2358 typedef enum
2359 {
2360     E_JPEG_MPO_ATTR_IMAGE_NO            = 0xB101
2361   , E_JPEG_MPO_ATTR_PAN_ORIENTATION     = 0xB201
2362   , E_JPEG_MPO_ATTR_PAN_OVERLAP_H       = 0xB202
2363   , E_JPEG_MPO_ATTR_PAN_OVERLAP_V       = 0xB203
2364   , E_JPEG_MPO_ATTR_BASE_VIEWPOINT_NO   = 0xB204
2365   , E_JPEG_MPO_ATTR_CONVERGENCE_ANGLE   = 0xB205
2366   , E_JPEG_MPO_ATTR_BASELINE_LENGTH     = 0xB206
2367   , E_JPEG_MPO_ATTR_DIVERGENCE_ANGLE    = 0xB207
2368   , E_JPEG_MPO_ATTR_AXIS_DISTANCE_X     = 0xB208
2369   , E_JPEG_MPO_ATTR_AXIS_DISTANCE_Y     = 0xB209
2370   , E_JPEG_MPO_ATTR_AXIS_DISTANCE_Z     = 0xB20A
2371   , E_JPEG_MPO_ATTR_YAW_ANGLE           = 0xB20B
2372   , E_JPEG_MPO_ATTR_PITCH_ANGLE         = 0xB20C
2373   , E_JPEG_MPO_ATTR_ROLL_ANGLE          = 0xB20D
2374 } JPEG_MPO_ATTR_TAG;
2375 
2376 #define MAX_MPO_ATTR_TAG_NUM        14          // from E_JPEG_MPO_ATTR_IMAGE_NO to E_JPEG_MPO_ATTR_ROLL_ANGLE
2377 
2378 //***************************************************
2379 //Initialize EXIF MPO database
2380 //***************************************************
JPEG_InitMPO(void)2381 static void JPEG_InitMPO(void)
2382 {
2383     MS_U32 i = 0;
2384 
2385     //init MPO Index structure
2386     pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].num_of_image = 1;
2387     for(i = 0; i < JPEG_MPO_MAX_SUPPORT_IMAGE; i++)
2388     {
2389         pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].mp_entry[i].attribute = 0;
2390         pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].mp_entry[i].size = 0;
2391         pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].mp_entry[i].offset = 0;
2392         pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].mp_entry[i].image1_no = 0;
2393         pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].mp_entry[i].image2_no = 0;
2394     }
2395 
2396     // init MPO Attribute structure
2397     for(i = 0; i < JPEG_MPO_MAX_SUPPORT_IMAGE; i++)
2398     {
2399         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].MPIndividualNum = 0;
2400         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].PanOrientation= 0;
2401         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].PanOverlap_H.numerator = 0;
2402         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].PanOverlap_H.denominator = 0;
2403         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].PanOverlap_V.numerator = 0;
2404         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].PanOverlap_V.denominator = 0;
2405         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].BaseViewpointNum = 0;
2406         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].ConvergenceAngle.s_numerator = 0;
2407         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].ConvergenceAngle.s_denominator = 0;
2408         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].BaselineLength.numerator = 0;
2409         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].BaselineLength.denominator = 0;
2410         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].VerticalDivergence.s_numerator = 0;
2411         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].VerticalDivergence.s_denominator = 0;
2412         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].AxisDistance_X.s_numerator = 0;
2413         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].AxisDistance_X.s_denominator = 0;
2414         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].AxisDistance_Y.s_numerator = 0;
2415         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].AxisDistance_Y.s_denominator = 0;
2416         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].AxisDistance_Z.s_numerator = 0;
2417         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].AxisDistance_Z.s_denominator = 0;
2418         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].YawAngle.s_numerator = 0;
2419         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].YawAngle.s_denominator = 0;
2420         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].PitchAngle.s_numerator = 0;
2421         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].PitchAngle.s_denominator = 0;
2422         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].RollAngle.s_numerator = 0;
2423         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].RollAngle.s_denominator = 0;
2424         pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].used = FALSE;
2425     }
2426 }
2427 //***************************************************
2428 //Parse EXIF MPO Attribute header
2429 //***************************************************
JPEG_DecodeMPAttrIFD(MS_U8 * data,MS_U8 * start_of_offset,MS_U32 count)2430 static MS_BOOL JPEG_DecodeMPAttrIFD(MS_U8 *data, MS_U8 *start_of_offset, MS_U32 count)
2431 {
2432     MS_U8 *pMPOAttrPtr = data;
2433     MS_U8 *pMPO_offset;
2434     MS_U16 u16Marker, i = 0, image_idx = 0;
2435 
2436     JPEG_DEBUG_API_MSG("JPEG_DecodeMPAttrIFD, count = %td\n", (ptrdiff_t)count);
2437 
2438     if(count >MAX_MPO_ATTR_TAG_NUM)
2439     {
2440         JPEG_DEBUG_API_ERR("Warning!!!unreasonable attribute IFD number !!!\n");
2441         return TRUE;
2442     }
2443 
2444     for(i = 0; i < JPEG_MPO_MAX_SUPPORT_IMAGE; i++)
2445     {
2446         if(FALSE == pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].used)
2447         {
2448             image_idx = i;
2449             break;
2450         }
2451     }
2452 
2453     if(JPEG_MPO_MAX_SUPPORT_IMAGE <= i)
2454     {
2455         JPEG_DEBUG_API_MSG("Not support too much images in MPO!!\n");
2456         return FALSE;
2457     }
2458 
2459     pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].used = TRUE;
2460 
2461     for(i = 0; i < count; i++)
2462     {
2463         u16Marker = (JPEG_MPO_ATTR_TAG)JPEG_Tiff_EndianChangeS(JPEG_GetU16(pMPOAttrPtr));
2464         pMPOAttrPtr += 8;
2465         switch(u16Marker)
2466         {
2467             case E_JPEG_MPO_ATTR_IMAGE_NO:
2468                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].MPIndividualNum = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2469                 break;
2470             case E_JPEG_MPO_ATTR_PAN_ORIENTATION:
2471                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].PanOrientation = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2472                 break;
2473             case E_JPEG_MPO_ATTR_PAN_OVERLAP_H:
2474                 pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2475                 JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2476                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].PanOverlap_H.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2477                 pMPO_offset += 4;
2478                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].PanOverlap_H.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2479                 break;
2480             case E_JPEG_MPO_ATTR_PAN_OVERLAP_V:
2481                 pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2482                 JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2483                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].PanOverlap_V.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2484                 pMPO_offset += 4;
2485                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].PanOverlap_V.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2486                 break;
2487             case E_JPEG_MPO_ATTR_BASE_VIEWPOINT_NO:
2488                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].BaseViewpointNum = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2489                 break;
2490             case E_JPEG_MPO_ATTR_CONVERGENCE_ANGLE:
2491                 pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2492                 JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2493                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].ConvergenceAngle.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2494                 pMPO_offset += 4;
2495                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].ConvergenceAngle.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2496                 break;
2497             case E_JPEG_MPO_ATTR_BASELINE_LENGTH:
2498                 pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2499                 JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2500                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].BaselineLength.numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2501                 pMPO_offset += 4;
2502                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].BaselineLength.denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2503                 break;
2504             case E_JPEG_MPO_ATTR_DIVERGENCE_ANGLE:
2505                 pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2506                 JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2507                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].VerticalDivergence.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2508                 pMPO_offset += 4;
2509                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].VerticalDivergence.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2510                 break;
2511             case E_JPEG_MPO_ATTR_AXIS_DISTANCE_X:
2512                 pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2513                 JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2514                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].AxisDistance_X.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2515                 pMPO_offset += 4;
2516                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].AxisDistance_X.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2517                 break;
2518             case E_JPEG_MPO_ATTR_AXIS_DISTANCE_Y:
2519                 pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2520                 JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2521                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].AxisDistance_Y.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2522                 pMPO_offset += 4;
2523                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].AxisDistance_Y.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2524                 break;
2525             case E_JPEG_MPO_ATTR_AXIS_DISTANCE_Z:
2526                 pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2527                 JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2528                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].AxisDistance_Z.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2529                 pMPO_offset += 4;
2530                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].AxisDistance_Z.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2531                 break;
2532             case E_JPEG_MPO_ATTR_YAW_ANGLE:
2533                 pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2534                 JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2535                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].YawAngle.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2536                 pMPO_offset += 4;
2537                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].YawAngle.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2538                 break;
2539             case E_JPEG_MPO_ATTR_PITCH_ANGLE:
2540                 pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2541                 JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2542                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].PitchAngle.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2543                 pMPO_offset += 4;
2544                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].PitchAngle.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2545                 break;
2546             case E_JPEG_MPO_ATTR_ROLL_ANGLE:
2547                 pMPO_offset = start_of_offset + JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPOAttrPtr));
2548                 JPEG_OVER_BUFFER_RET(pMPO_offset, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2549                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].RollAngle.s_numerator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2550                 pMPO_offset += 4;
2551                 pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_idx].RollAngle.s_denominator = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pMPO_offset));
2552                 break;
2553             default:
2554                 JPEG_DEBUG_API_ERR("Unknown MPO attribute marker =0x%x!!!!!!\n", u16Marker);
2555                 break;
2556         }
2557         pMPOAttrPtr += 4;
2558     }
2559     return TRUE;
2560 }
2561 //***************************************************
2562 //Parse EXIF MPO header
2563 //***************************************************
JPEG_DecodeMPOInfo(MS_U8 * data)2564 static MS_BOOL JPEG_DecodeMPOInfo(MS_U8 *data)
2565 {
2566     MS_U8 *pJpegBuff = data;
2567     MS_U8 *pMPOHdrPtr;
2568     MS_U32 u32tmp, u32Len;
2569     MS_U16 u16Marker, u16NumOfEntry, i;
2570 
2571     u32tmp = JPEG_GetU32(pJpegBuff);
2572     if (u32tmp != JPEG_TAG_MPO)
2573     {
2574         return FALSE;
2575     }
2576 
2577     // mpo header start from here
2578     pJpegBuff += 4;
2579     u16Marker = JPEG_GetU16(pJpegBuff);
2580     if (u16Marker == JPEG_TIFF_BIG_ENDIAN)
2581         pNJPEGContext->_bTiffBigEndian[pNJPEGContext->eNJPDNum] = TRUE;
2582     else if (u16Marker == JPEG_TIFF_LITTLE_ENDIAN)
2583         pNJPEGContext->_bTiffBigEndian[pNJPEGContext->eNJPDNum] = FALSE;
2584     else
2585         return FALSE;
2586 
2587 //    _u32ThumbnailOffset[pNJPEGContext->eNJPDNum] += 4;
2588     pMPOHdrPtr = pJpegBuff;
2589 
2590     pJpegBuff += 2;
2591     u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2592     if (u16Marker != 0x002A)
2593         return FALSE;
2594 
2595     //offset to 1st MPO IFD
2596     pJpegBuff += 2;
2597     u32Len = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2598 
2599     //1st MPO IFD start from here(either MP Index IFD or MP Attribute IFD)
2600     //Count Info
2601     pJpegBuff = pMPOHdrPtr + u32Len;
2602     JPEG_OVER_BUFFER_RET(pJpegBuff, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2603 
2604     u16NumOfEntry = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2605 
2606     JPEG_DEBUG_API_MSG("num of entry = %d\n", u16NumOfEntry);
2607 
2608     //MPFVersion
2609     pJpegBuff += 2;
2610     u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2611     if(u16Marker == JPEG_MPO_TAG_MPF_VERSION)
2612     {
2613         pJpegBuff += 12;
2614         u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2615         if(u16Marker == JPEG_MPO_TAG_NUM_OF_IMAGES)
2616         {
2617             //It is a MP Index IFD
2618             //Check number of images
2619             pJpegBuff += 8;
2620             u32tmp = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2621 
2622             if(JPEG_MPO_MAX_SUPPORT_IMAGE < u32tmp)
2623             {
2624                 JPEG_DEBUG_API_MSG("Not support %td images in MPO!!\n", (ptrdiff_t)u32tmp);
2625                 pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].num_of_image = 0xFFFFFFFFUL;
2626                 return FALSE;
2627             }
2628 
2629             //Init MPO database
2630             JPEG_InitMPO();
2631 
2632             //start of offset for every individual picture
2633             pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].start_of_offset = pNJPEGContext->_u32App2MarkerOffset[pNJPEGContext->eNJPDNum] + 8 - MRC_BUFFER_ADDR;
2634 
2635             //the numbers of image
2636             pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].num_of_image = u32tmp;
2637 
2638             JPEG_DEBUG_API_MSG("detected pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].num_of_image=0x%tx\n", (ptrdiff_t)pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].num_of_image);
2639             //MP Entry
2640             pJpegBuff += 4;
2641             u16Marker = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2642             if(u16Marker != JPEG_MPO_TAG_MP_ENTRY)
2643             {
2644                 JPEG_DEBUG_API_MSG("No MP Entry in MP index IFD!!\n");
2645                 return FALSE;
2646             }
2647 
2648             //offset to next IFD(MP Attribute IFD)
2649             pJpegBuff = pMPOHdrPtr + 10 + u16NumOfEntry*12;
2650             u32Len = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2651             JPEG_DEBUG_API_MSG("pJpegBuff = %tx, u32Len = %td\n", (ptrdiff_t)pJpegBuff, (ptrdiff_t)u32Len);
2652 
2653             //MP Entry Internal Fields
2654             pJpegBuff += 4;
2655             for(i = 0; i < pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].num_of_image; i++)
2656             {
2657                 //Image Attribute
2658                 pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].mp_entry[i].attribute = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2659                 //Image size
2660                 pJpegBuff += 4;
2661                 pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].mp_entry[i].size = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2662                 //Image size
2663                 pJpegBuff += 4;
2664                 pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].mp_entry[i].offset = JPEG_Tiff_EndianChangeL(JPEG_GetU32(pJpegBuff));
2665                 //Image size
2666                 pJpegBuff += 4;
2667                 pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].mp_entry[i].image1_no = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2668                 //Image size
2669                 pJpegBuff += 2;
2670                 pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].mp_entry[i].image2_no = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2671                 pJpegBuff += 2;
2672                 JPEG_DEBUG_API_MSG("%d th : attribute = %tx\n", i, (ptrdiff_t)pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].mp_entry[i].attribute);
2673                 JPEG_DEBUG_API_MSG("%d th : size = %tx\n", i, (ptrdiff_t)pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].mp_entry[i].size);
2674                 JPEG_DEBUG_API_MSG("%d th : offset = %tx\n", i, (ptrdiff_t)pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].mp_entry[i].offset);
2675                 JPEG_DEBUG_API_MSG("%d th : image1_no = %tx\n", i, (ptrdiff_t)pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].mp_entry[i].image1_no);
2676                 JPEG_DEBUG_API_MSG("%d th : image2_no = %tx\n", i, (ptrdiff_t)pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].mp_entry[i].image2_no);
2677             }
2678 
2679             //get MPO Attribute count
2680             pJpegBuff = pMPOHdrPtr + u32Len;
2681             JPEG_OVER_BUFFER_RET(pJpegBuff, INTERNAL_BUFFER_ADDR, INTERNAL_BUFFER_SIZE);
2682 
2683             u16NumOfEntry = JPEG_Tiff_EndianChangeS(JPEG_GetU16(pJpegBuff));
2684 
2685             pJpegBuff += 2;
2686         }
2687     }
2688 
2689     //Decode MP Attr header
2690     return JPEG_DecodeMPAttrIFD(pJpegBuff, pMPOHdrPtr, u16NumOfEntry);
2691 }
2692 
2693 
2694 #endif
2695 
2696 // Parse APP0 to get X&Y density.
JPEG_read_app0_marker(void)2697 static MS_BOOL JPEG_read_app0_marker( void )
2698 {
2699 
2700     MS_U32 left;
2701     MS_U8 u8Xthumbnail, u8Ythumbnail;
2702     JPEG_DEBUG_API_MSG("APP0\n");
2703 
2704     //Get APP0 length
2705     left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
2706 
2707     left-= 2;
2708 
2709     if(left < 8)
2710     {
2711         JPEG_terminate( E_JPEG_BAD_APP0_MARKER );
2712         return FALSE;
2713     }
2714 
2715     //Skip Block ID "JFIF"
2716     JPEG_skip_bytes(5);
2717 
2718     left-= 5;
2719 
2720     //Skip Version Number
2721     JPEG_skip_bytes(2);
2722 
2723     left-= 2;
2724 
2725     //Get units
2726     pNJPEGContext->App0_Unit_Data[pNJPEGContext->eNJPDNum].u8Unit = JPEG_get_char();
2727     pNJPEGContext->App0_Unit_Data[pNJPEGContext->eNJPDNum].u16Xdensity= (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
2728     pNJPEGContext->App0_Unit_Data[pNJPEGContext->eNJPDNum].u16Ydensity= (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
2729 
2730     left-= 5;
2731 
2732     //Get thumbnail x,y
2733     u8Xthumbnail = JPEG_get_char();
2734     u8Ythumbnail = JPEG_get_char();
2735 
2736     left-= 2;
2737 
2738     //Skip Version Number
2739     JPEG_skip_bytes(3*u8Xthumbnail*u8Ythumbnail);
2740 
2741     left-= 3*u8Xthumbnail*u8Ythumbnail;
2742 
2743     JPEG_DEBUG_API_MSG("APP0 : unit : %d\n",(MS_U16)pNJPEGContext->App0_Unit_Data[pNJPEGContext->eNJPDNum].u8Unit);
2744     JPEG_DEBUG_API_MSG("APP0 : Xdensity : %d\n",pNJPEGContext->App0_Unit_Data[pNJPEGContext->eNJPDNum].u16Xdensity);
2745     JPEG_DEBUG_API_MSG("APP0 : Ydensity : %d\n",pNJPEGContext->App0_Unit_Data[pNJPEGContext->eNJPDNum].u16Ydensity);
2746 
2747     if(left > 0)
2748         JPEG_skip_bytes(left);
2749 
2750     return TRUE;
2751 }
2752 
_msAPI_JPEG_get_APP0_info(MS_U8 * unit,MS_U16 * x,MS_U16 * y)2753 void _msAPI_JPEG_get_APP0_info( MS_U8 *unit, MS_U16 *x, MS_U16 *y )
2754 {
2755     *unit = pNJPEGContext->App0_Unit_Data[pNJPEGContext->eNJPDNum].u8Unit;
2756     *x = pNJPEGContext->App0_Unit_Data[pNJPEGContext->eNJPDNum].u16Xdensity;
2757     *y = pNJPEGContext->App0_Unit_Data[pNJPEGContext->eNJPDNum].u16Ydensity;
2758 }
2759 //------------------------------------------------------------------------------
2760 // Read exif info
JPEG_read_app1_marker(void)2761 JPEG_STATIC MS_BOOL JPEG_read_app1_marker(void)
2762 {
2763     MS_U16 length;
2764     MS_U8 *exif_buffer = (MS_U8 *)(MS_VIRT) INTERNAL_BUFFER_ADDR;
2765     MS_U16 i = 0;
2766 
2767     JPEG_DEBUG_API_MSG("APP1\n");
2768 
2769     length = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
2770 
2771     if ( length < 2 )
2772     {
2773         JPEG_terminate( E_JPEG_BAD_APP1_MARKER );
2774         return FALSE;
2775     }
2776 
2777     length -= 2;
2778 
2779 #if SUPPORT_MPO_FORMAT
2780     pNJPEGContext->u32MPFOffset[pNJPEGContext->eNJPDNum] = length;
2781     JPEG_DEBUG_API_MSG("u32MPFOffset[pNJPEGContext->eNJPDNum]=0x%tx\n", (ptrdiff_t)pNJPEGContext->u32MPFOffset[pNJPEGContext->eNJPDNum]);
2782 #endif
2783     while((length - i)!=0)
2784     {
2785         exif_buffer[i] = (MS_U8) JPEG_get_char();
2786         i++;
2787     }
2788 
2789     if(JPEG_DecodeExifInfo(exif_buffer, length) == TRUE)
2790     {
2791         JPEG_DEBUG_API_MSG("FOUND THUMBNAIL!\n");
2792         pNJPEGContext->_u32ThumbnailBufferOffset[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u32ThumbnailOffset[pNJPEGContext->eNJPDNum];
2793         pNJPEGContext->_u16ThumbnailBufferSize[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16ThumbnailSize[pNJPEGContext->eNJPDNum];
2794     }
2795     else
2796     {
2797         JPEG_DEBUG_API_MSG("NO THUMBNAIL!\n");
2798     }
2799     return TRUE;
2800 }
2801 
2802 #if SUPPORT_MPO_FORMAT
2803 
2804 // Read exif app2 info
JPEG_read_app2_marker(void)2805 static MS_BOOL JPEG_read_app2_marker( void )
2806 {
2807     MS_U16 length;
2808     MS_U8 *exif_buffer = (MS_U8 *) (MS_VIRT)(INTERNAL_BUFFER_ADDR + pNJPEGContext->u32MPFOffset[pNJPEGContext->eNJPDNum]);
2809     MS_U16 i = 0;
2810 
2811     JPEG_DEBUG_API_MSG("APP2\n");
2812 
2813     //For start of offset of MPO(only for first MPO picture)
2814     JPEG_DEBUG_API_MSG("_pu8In_buf_ofs[pNJPEGContext->eNJPDNum] = %tx\n", (ptrdiff_t)pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum]);
2815     pNJPEGContext->_u32App2MarkerOffset[pNJPEGContext->eNJPDNum] = (MS_VIRT)(pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum] - 2);
2816 
2817     length = (MS_U16)((JPEG_get_char()<<8)+JPEG_get_char());
2818 
2819     if ( length < 2 )
2820     {
2821         JPEG_terminate( E_JPEG_BAD_APP2_MARKER );
2822         return FALSE;
2823     }
2824 
2825     length -= 2;
2826 
2827     if(length > INTERNAL_BUFFER_SIZE - pNJPEGContext->u32MPFOffset[pNJPEGContext->eNJPDNum])
2828     {
2829         JPEG_terminate( E_JPEG_NOTENOUGHMEM );
2830         return FALSE;
2831     }
2832 
2833     while((length - i)!=0)
2834     {
2835         exif_buffer[i] = (MS_U8) JPEG_get_char();
2836         i++;
2837     }
2838 
2839     if(JPEG_DecodeMPOInfo(exif_buffer)==TRUE)
2840     {
2841         JPEG_DEBUG_API_MSG("FOUND MPO!\n");
2842         pNJPEGContext->bIsMPOFormat[pNJPEGContext->eNJPDNum] = TRUE;
2843         pNJPEGContext->u32MPFOffset[pNJPEGContext->eNJPDNum] = 0;           // Reset to zero after FOUND MPO
2844 
2845         //// TODO: MPO format not support thumbnail now....
2846         //_u8DecodeType[pNJPEGContext->eNJPDNum] = E_JPEG_TYPE_MAIN;
2847         //JPEG_DEBUG_API_MSG("NOTE: MPO not support thumbnail now!!!\n");
2848     }
2849     else
2850     {
2851         JPEG_DEBUG_API_MSG("NO MPO!\n");
2852         // Not clear num_of_image for the image with 2 app2 marker
2853         //pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].num_of_image = 0;
2854     }
2855     return TRUE;
2856 }
2857 
2858 
2859 #endif
2860 
2861 static const MS_U8 default_dht[] = {
2862     0x01, 0xa2, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01,
2863     0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
2864     0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04,
2865     0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x10,
2866     0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03,
2867     0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7d,
2868     0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
2869     0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
2870     0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
2871     0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
2872     0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
2873     0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
2874     0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
2875     0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
2876     0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
2877     0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
2878     0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
2879     0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
2880     0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
2881     0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
2882     0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
2883     0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
2884     0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
2885     0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
2886     0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
2887     0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
2888     0xf9, 0xfa, 0x01, 0x00, 0x03, 0x01, 0x01, 0x01,
2889     0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00,
2890     0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04,
2891     0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x11,
2892     0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04,
2893     0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77,
2894     0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
2895     0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
2896     0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
2897     0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
2898     0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
2899     0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
2900     0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
2901     0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
2902     0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
2903     0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
2904     0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
2905     0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
2906     0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
2907     0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
2908     0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
2909     0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
2910     0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
2911     0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
2912     0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
2913     0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
2914     0xf9, 0xfa
2915 };
2916 
JPEG_read_default_dht(void)2917 JPEG_STATIC MS_BOOL JPEG_read_default_dht(void)
2918 {
2919     MS_U16 i, index, count;
2920     MS_U32 left;
2921     MS_U8 u8Huff_num[17];
2922     MS_U8 u8Huff_val[256];
2923     MS_U8 u8Valid[17];
2924     MS_U32 u32DefaultDHTIndex=0;
2925 
2926     JPEG_DEBUG_API_MSG("Default DHT\n");
2927 
2928     left = (MS_U16) ((default_dht[u32DefaultDHTIndex]<<8) + default_dht[u32DefaultDHTIndex+1]);
2929     u32DefaultDHTIndex+=2;
2930 
2931     if ( left < 2 )
2932     {
2933         JPEG_terminate( E_JPEG_BAD_DHT_MARKER );
2934         return FALSE;
2935     }
2936 
2937     left -= 2;
2938 
2939     while ( left )
2940     {
2941         // set it to zero, initialize
2942         JPEG_memset((void *)u8Huff_num, 0, 17);
2943         JPEG_memset((void *)u8Valid, 0, 17);
2944         JPEG_memset((void *)u8Huff_val, 0, 256);
2945 
2946         index = default_dht[u32DefaultDHTIndex];
2947         u32DefaultDHTIndex++;
2948 
2949         u8Huff_num[0] = 0;
2950 
2951         count = 0;
2952 
2953         for ( i = 1; i <= 16; i++ )
2954         {
2955             u8Huff_num[i] = default_dht[u32DefaultDHTIndex];
2956             u32DefaultDHTIndex++;
2957             count += u8Huff_num[i];
2958         }
2959 
2960         if ( count > 255 )
2961         {
2962             JPEG_terminate( E_JPEG_BAD_DHT_COUNTS );
2963             return FALSE;
2964         }
2965 
2966         for ( i = 0; i < count; i++ )
2967         {
2968             u8Huff_val[i] = default_dht[u32DefaultDHTIndex];
2969             u32DefaultDHTIndex++;
2970         }
2971 
2972         i = 1 + 16 + count;
2973 
2974         if ( left < ( MS_U32 )i )
2975         {
2976             JPEG_terminate( E_JPEG_BAD_DHT_MARKER );
2977             return FALSE;
2978         }
2979 
2980         left -= i;
2981 
2982         index = ( index & 0x0F ) + ( ( index & 0x10 ) >> 4 ) * ( JPEG_MAXHUFFTABLES >> 1 ); //???
2983 
2984         if ( index >= JPEG_MAXHUFFTABLES )
2985         {
2986             JPEG_terminate( E_JPEG_BAD_DHT_INDEX );
2987             return FALSE;
2988         }
2989 
2990         pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][index].u8SymbolCnt = count;
2991 
2992         if(pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][index].bValid==FALSE)
2993             pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][index].bValid = TRUE;
2994 
2995         JPEG_memcpy( (void *)pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][index].u8Huff_num, (void *)u8Huff_num, 17 );
2996         JPEG_memcpy( (void *)pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][index].u8Huff_val, (void *)u8Huff_val, 256 );
2997 
2998         // Compute the inverse order of HuffNum. this step is only needed in NJPD mode (baseline)
2999         for(i = 1; i<=16; i++)
3000         {
3001             if(u8Huff_num[17 - i]!=0)
3002             {
3003                 count = count - u8Huff_num[17 - i];
3004                 u8Huff_num[17 - i] = count;
3005                 u8Valid[17 - i]=1;
3006             }
3007             else
3008             {
3009                 count = count - u8Huff_num[17 - i];
3010                 u8Huff_num[17 - i] = count;
3011                 u8Valid[17 - i]=0;
3012             }
3013         }
3014 
3015         JPEG_memcpy( (void *)pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][index].u8Symbol, (void *)u8Huff_num, 17 );
3016         JPEG_memcpy( (void *)pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][index].u8Valid, (void *)u8Valid, 17 );
3017     }
3018     return TRUE;
3019 }
3020 
3021 
3022 /* END OF EXIF PARSING SECTION */
3023 //------------------------------------------------------------------------------
3024 // Read a Huffman code table.
JPEG_read_dht_marker(void)3025 JPEG_STATIC MS_BOOL JPEG_read_dht_marker(void)
3026 {
3027     MS_U16 i, indextmp, count;
3028     MS_U32 left;
3029     MS_U8 u8Huff_num[17];
3030     MS_U8 u8Huff_val[256];
3031     MS_U8 u8Valid[17];
3032 
3033     JPEG_DEBUG_API_MSG("DHT\n");
3034 
3035     left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3036 
3037     if ( left < 2 )
3038     {
3039         JPEG_terminate( E_JPEG_BAD_DHT_MARKER );
3040         return FALSE;
3041     }
3042 
3043     left -= 2;
3044 
3045     while ( left )
3046     {
3047         // set it to zero, initialize
3048         JPEG_memset((void *)u8Huff_num, 0, 17);
3049         JPEG_memset((void *)u8Valid, 0, 17);
3050         JPEG_memset((void *)u8Huff_val, 0, 256);
3051 
3052         indextmp = JPEG_get_char();
3053 
3054         u8Huff_num[0] = 0;
3055 
3056         count = 0;
3057 
3058         for ( i = 1; i <= 16; i++ )
3059         {
3060             u8Huff_num[i] = JPEG_get_char();
3061             count += u8Huff_num[i];
3062         }
3063 
3064         if ( count > 255 )
3065         {
3066             JPEG_terminate( E_JPEG_BAD_DHT_COUNTS );
3067             return FALSE;
3068         }
3069 
3070         for ( i = 0; i < count; i++ )
3071         {
3072             u8Huff_val[i] = JPEG_get_char();
3073         }
3074 
3075         i = 1 + 16 + count;
3076 
3077         if ( left < ( MS_U32 )i )
3078         {
3079             JPEG_terminate( E_JPEG_BAD_DHT_MARKER );
3080             return FALSE;
3081         }
3082 
3083         left -= i;
3084 
3085         indextmp = ( indextmp & 0x0F ) + ( ( indextmp & 0x10 ) >> 4 ) * ( JPEG_MAXHUFFTABLES >> 1 ); //???
3086 
3087         if ( indextmp >= JPEG_MAXHUFFTABLES )
3088         {
3089             JPEG_terminate( E_JPEG_BAD_DHT_INDEX );
3090             return FALSE;
3091         }
3092 
3093         pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][indextmp].u8SymbolCnt = count;
3094 
3095         if(pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][indextmp].bValid==FALSE)
3096             pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][indextmp].bValid = TRUE;
3097 
3098         JPEG_memcpy( (void *)pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][indextmp].u8Huff_num, (void *)u8Huff_num, 17 );
3099         JPEG_memcpy( (void *)pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][indextmp].u8Huff_val, (void *)u8Huff_val, 256 );
3100 
3101         // Compute the inverse order of HuffNum. this step is only needed in NJPD mode (baseline)
3102         for(i = 1; i<=16; i++)
3103         {
3104             if(u8Huff_num[17 - i]!=0)
3105             {
3106                 count = count - u8Huff_num[17 - i];
3107                 u8Huff_num[17 - i] = count;
3108                 u8Valid[17 - i]=1;
3109             }
3110             else
3111             {
3112                 count = count - u8Huff_num[17 - i];
3113                 u8Huff_num[17 - i] = count;
3114                 u8Valid[17 - i]=0;
3115             }
3116         }
3117 
3118         JPEG_memcpy( (void *)pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][indextmp].u8Symbol, (void *)u8Huff_num, 17 );
3119         JPEG_memcpy( (void *)pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][indextmp].u8Valid, (void *)u8Valid, 17 );
3120     }
3121     return TRUE;
3122 }
3123 //------------------------------------------------------------------------------
3124 // Read a quantization table.
JPEG_read_dqt_marker(void)3125 JPEG_STATIC MS_BOOL JPEG_read_dqt_marker(void)
3126 {
3127     MS_U16 n, i, prec;
3128     MS_U32 left;
3129     MS_U32 temp;
3130 
3131     JPEG_DEBUG_API_MSG("DQT\n");
3132 
3133     left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3134 
3135     if ( left < 2 )
3136     {
3137         JPEG_terminate( E_JPEG_BAD_DQT_MARKER );
3138         return FALSE;
3139     }
3140 
3141     left -= 2;
3142 
3143     while ( left )
3144     {
3145         n = JPEG_get_char();
3146         prec = n >> 4;
3147         n &= 0x0F;
3148 
3149         if ( n >= JPEG_MAXQUANTTABLES )
3150         {
3151             JPEG_terminate( E_JPEG_BAD_DQT_TABLE );
3152             return FALSE;
3153         }
3154 
3155         if(pNJPEGContext->_QuantTables[pNJPEGContext->eNJPDNum][n].bValid == FALSE)
3156             pNJPEGContext->_QuantTables[pNJPEGContext->eNJPDNum][n].bValid = TRUE;
3157 
3158         // read quantization entries, in zag order
3159         for ( i = 0; i < 64; i++ )
3160         {
3161             temp = JPEG_get_char();
3162 
3163             if ( prec )
3164             {
3165                 temp = ( temp << 8 ) + JPEG_get_char();
3166             }
3167 
3168             pNJPEGContext->_QuantTables[pNJPEGContext->eNJPDNum][n].s16Value[i] = temp;
3169         }
3170 
3171         i = 64 + 1;
3172 
3173         if ( prec )
3174         {
3175             i += 64;
3176         }
3177 
3178         if ( left < ( MS_U32 )i )
3179         {
3180             JPEG_terminate( E_JPEG_BAD_DQT_LENGTH );
3181             return FALSE;
3182         }
3183 
3184         left -= i;
3185     }
3186     return TRUE;
3187 }
3188 //------------------------------------------------------------------------------
3189 // Read the start of frame (SOF) marker.
JPEG_read_sof_marker(void)3190 JPEG_STATIC MS_BOOL JPEG_read_sof_marker(void)
3191 {
3192     MS_U8 i;
3193     MS_U32 left;
3194     MS_U16 JpegMaxWidth, JpegMaxHeight;
3195     MS_U8 c1;
3196 
3197     JPEG_DEBUG_API_MSG("SOF\n");
3198 
3199     left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3200 
3201     if ( JPEG_get_char() != 8 )   /* precision: sorry, only 8-bit precision is supported right now */
3202     {
3203         JPEG_terminate( E_JPEG_BAD_PRECISION );
3204         return FALSE;
3205     }
3206 
3207     pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum] = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3208     pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3209 
3210     // save the original image size
3211     pNJPEGContext->_u16OriginalImage_x_size[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum];
3212     pNJPEGContext->_u16OriginalImage_y_size[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum];
3213 
3214     if((pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum])
3215     && (E_JPEG_TYPE_MAIN == pNJPEGContext->_u8DecodeType[pNJPEGContext->eNJPDNum]))
3216     {
3217        //Define MAX picture size for progressive, 8 is the max factor of scale down
3218         JpegMaxWidth  = pNJPEGContext->JPEG_PRO_MAX_WIDTH[pNJPEGContext->eNJPDNum] * 8;
3219         JpegMaxHeight = pNJPEGContext->JPEG_PRO_MAX_HEIGHT[pNJPEGContext->eNJPDNum] * 8;
3220 
3221         //Calculate Internal Buffer size
3222         //check needed buffer for progressive jpeg decoding, for worst case:
3223         MS_U32 buff_size = pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum]*pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum]*3*2
3224                          + pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum]*pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum]*3*2/64
3225                          + JPEG_DEFAULT_EXIF_SIZE
3226                          + 8*1024;
3227 //        if( (MS_U32)(_u16Image_x_size[pNJPEGContext->eNJPDNum]*_u16Image_y_size[pNJPEGContext->eNJPDNum]*3*2) > (MS_U32)(INTERNAL_BUFFER_SIZE - JPEG_DEFAULT_EXIF_SIZE) )
3228         if( buff_size > INTERNAL_BUFFER_SIZE )
3229         {
3230             JPEG_DEBUG_API_ERR("Progressive image size too big... do not handle it\n");
3231             JPEG_terminate( E_JPEG_NOTENOUGHMEM );
3232             return FALSE;
3233         }
3234     }
3235     else
3236     {
3237         //Define MAX picture size for Baseline, 8 is the max factor of scale down
3238         JpegMaxWidth  = pNJPEGContext->JPEG_MAX_WIDTH[pNJPEGContext->eNJPDNum]*8;
3239         JpegMaxHeight = pNJPEGContext->JPEG_MAX_HEIGHT[pNJPEGContext->eNJPDNum]*8;
3240     }
3241 
3242     if ((pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum] < 1) || (pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum] > JpegMaxHeight))
3243     {
3244         JPEG_DEBUG_API_MSG("_u16Image_y_size[pNJPEGContext->eNJPDNum]=%d, JpegMaxHeight=%d\n", pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum], JpegMaxHeight);
3245         JPEG_terminate(E_JPEG_BAD_HEIGHT);
3246         return FALSE;
3247     }
3248 
3249     if ((pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] < 1) || (pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] > JpegMaxWidth))
3250     {
3251         JPEG_DEBUG_API_MSG("_u16Image_x_size[pNJPEGContext->eNJPDNum]=%d, JpegMaxWidth=%d\n", pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum], JpegMaxWidth);
3252         JPEG_terminate(E_JPEG_BAD_WIDTH);
3253         return FALSE;
3254     }
3255 
3256     pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum] = JPEG_get_char();
3257 
3258     if ( pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum] > JPEG_MAXCOMPONENTS )
3259     {
3260         JPEG_terminate( E_JPEG_TOO_MANY_COMPONENTS );
3261         return FALSE;
3262     }
3263 
3264     if ( left != ( MS_U32 )( pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum] * 3 + 8 ) )
3265     {
3266         JPEG_terminate( E_JPEG_BAD_SOF_LENGTH );
3267         return FALSE;
3268     }
3269 
3270     for ( i = 0; i < pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum]; i++ )
3271     {
3272         pNJPEGContext->_u8Comp_ident[pNJPEGContext->eNJPDNum][i] = JPEG_get_char();
3273         if(pNJPEGContext->_u8Comp_ident[pNJPEGContext->eNJPDNum][i]==0)     // The component ID is start from 0 (0 1 2). The normal case is start from 1 (1 2 3) for YUV
3274         {
3275             pNJPEGContext->_u8LumaCi[pNJPEGContext->eNJPDNum] = 0;
3276             pNJPEGContext->_u8ChromaCi[pNJPEGContext->eNJPDNum] = 1;
3277             pNJPEGContext->_u8Chroma2Ci[pNJPEGContext->eNJPDNum] = 2;
3278         }
3279 
3280         c1 = JPEG_get_char();
3281 
3282         pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][i] = (c1 & 0xf0)>>4;
3283         pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][i] = (c1 & 0x0f);
3284         pNJPEGContext->_u8Comp_quant[pNJPEGContext->eNJPDNum][i] = JPEG_get_char();
3285 
3286         // patch from LG driver for the file with the following problem:
3287         // only has one component, but its sampling factor is 1x2
3288         // Per the JPEG spec A.2.2 (see the attached file, "regardless of the values of H1 and V1"),
3289         // please always set H=1 & V=1 to hw, when mono image.
3290         if(pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum]==1)    //allen.chang 2011/6/16 patch
3291         {
3292             pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][0] =1;
3293             pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][0] =1;
3294         }
3295 
3296     }
3297     return TRUE;
3298 }
3299 //------------------------------------------------------------------------------
3300 // Used to skip unrecognized markers.
JPEG_skip_variable_marker(void)3301 JPEG_STATIC MS_BOOL JPEG_skip_variable_marker(void)
3302 {
3303     MS_U32 left;
3304 
3305     JPEG_DEBUG_API_MSG("SKIP markers\n");
3306 
3307     left = (MS_U32)((JPEG_get_char()<<8)|JPEG_get_char());
3308 
3309     if ( left < 2 )
3310     {
3311         JPEG_terminate( E_JPEG_BAD_VARIABLE_MARKER );
3312         return FALSE;
3313     }
3314 
3315     left -= 2;
3316 
3317     JPEG_skip_bytes(left);
3318     return TRUE;
3319 }
3320 //------------------------------------------------------------------------------
3321 // Read a define restart interval (DRI) marker.
JPEG_read_dri_marker(void)3322 JPEG_STATIC MS_BOOL JPEG_read_dri_marker(void)
3323 {
3324     JPEG_DEBUG_API_MSG("DRI\n");
3325 
3326     if ( (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char()) != 4 )
3327     {
3328         JPEG_terminate( E_JPEG_BAD_DRI_LENGTH );
3329         return FALSE;
3330     }
3331 
3332     pNJPEGContext->_u16Restart_interval[pNJPEGContext->eNJPDNum] = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3333     return TRUE;
3334 }
3335 //------------------------------------------------------------------------------
3336 // Read a start of scan (SOS) marker.
JPEG_read_sos_marker(void)3337 JPEG_STATIC MS_BOOL JPEG_read_sos_marker(void)
3338 {
3339     MS_U32 left;
3340     MS_U16 i, ci, n, c, cc;
3341     MS_U8 c1;
3342 
3343     JPEG_DEBUG_API_MSG("SOS\n");
3344 
3345     left = (MS_U16) ((JPEG_get_char()<<8) + JPEG_get_char());
3346 
3347     n = JPEG_get_char();
3348 
3349     pNJPEGContext->_u8Comps_in_scan[pNJPEGContext->eNJPDNum] = n;
3350 
3351     left -= 3;
3352 
3353     if ( ( left != ( MS_U32 )( n * 2 + 3 ) ) || ( n < 1 ) || ( n > JPEG_MAXCOMPSINSCAN ) )
3354     {
3355         JPEG_terminate( E_JPEG_BAD_SOS_LENGTH );
3356         return FALSE;
3357     }
3358 
3359     for ( i = 0; i < n; i++ )
3360     {
3361         cc = JPEG_get_char();
3362         c = JPEG_get_char();
3363         left -= 2;
3364 
3365         for ( ci = 0; ci < pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum]; ci++ )
3366         {
3367             if ( cc == pNJPEGContext->_u8Comp_ident[pNJPEGContext->eNJPDNum][ci] )
3368             {
3369                 break;
3370             }
3371         }
3372 
3373         if ( ci >= pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum] )
3374         {
3375             JPEG_terminate( E_JPEG_BAD_SOS_COMP_ID );
3376             return FALSE;
3377         }
3378 
3379         pNJPEGContext->_u8Comp_list[pNJPEGContext->eNJPDNum][i] = ci;
3380         pNJPEGContext->_u8Comp_dc_tab[pNJPEGContext->eNJPDNum][ci] = ( c >> 4 ) & 15;
3381         pNJPEGContext->_u8Comp_ac_tab[pNJPEGContext->eNJPDNum][ci] = ( c & 15 ) + ( JPEG_MAXHUFFTABLES >> 1 );
3382     }
3383 
3384     //HW limitation, for baseline JPEG, U.V need to refer to the same DC and AC huffman table.
3385     if(!pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum] && (pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum] == 3)) //Y.U.V.
3386     {
3387         if((pNJPEGContext->_u8Comp_dc_tab[pNJPEGContext->eNJPDNum][1] != pNJPEGContext->_u8Comp_dc_tab[pNJPEGContext->eNJPDNum][2])
3388         || (pNJPEGContext->_u8Comp_ac_tab[pNJPEGContext->eNJPDNum][1] != pNJPEGContext->_u8Comp_ac_tab[pNJPEGContext->eNJPDNum][2]))
3389         {
3390             JPEG_DEBUG_API_MSG("U, V use different Huffman table~~\n");
3391             pNJPEGContext->bIs3HuffTbl[pNJPEGContext->eNJPDNum] = TRUE;
3392         }
3393     }
3394 
3395     pNJPEGContext->_u8Spectral_start[pNJPEGContext->eNJPDNum] = JPEG_get_char();
3396     pNJPEGContext->_u8Spectral_end[pNJPEGContext->eNJPDNum] = JPEG_get_char();
3397     c1 = JPEG_get_char();
3398     pNJPEGContext->_u8Successive_high[pNJPEGContext->eNJPDNum] = (c1 & 0xf0)>>4;
3399     pNJPEGContext->_u8Successive_low[pNJPEGContext->eNJPDNum] = (c1 & 0x0f);
3400 
3401     if ( !pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum] )
3402     {
3403         pNJPEGContext->_u8Spectral_start[pNJPEGContext->eNJPDNum] = 0;
3404         pNJPEGContext->_u8Spectral_end[pNJPEGContext->eNJPDNum] = 63;
3405     }
3406 
3407     left -= 3;
3408 
3409     JPEG_skip_bytes(left);    /* read past whatever is left */
3410     return TRUE;
3411 }
3412 //------------------------------------------------------------------------------
3413 // Finds the next marker.
JPEG_next_marker(void)3414 JPEG_STATIC MS_U32 JPEG_next_marker(void) //ok
3415 {
3416     MS_U32 c, bytes;
3417 
3418     bytes = 0;
3419 
3420     do
3421     {
3422         do
3423         {
3424             bytes++;
3425 
3426             c = JPEG_get_char();
3427             //JPEG_DEBUG_API_MSG("c = %X\n",c);
3428         }
3429         while ( c != 0xFF );
3430 
3431         do
3432         {
3433             c = JPEG_get_char();
3434             //JPEG_DEBUG_API_MSG("c = %X\n",c);
3435         }
3436         while ( c == 0xFF );
3437     }
3438     while ( c == 0 );
3439 
3440     // If bytes > 0 here, there where extra bytes before the marker (not good).
3441 
3442     return c;
3443 }
3444 //------------------------------------------------------------------------------
3445 // Process markers. Returns when an SOFx, SOI, EOI, or SOS marker is
3446 // encountered.
JPEG_process_markers(void)3447 JPEG_STATIC MS_U32 JPEG_process_markers(void)
3448 {
3449     MS_U32 c;
3450 
3451     JPEG_DEBUG_API_MSG("JPEG_process_markers:\n");
3452     for ( ; ; )
3453     {
3454         c = JPEG_next_marker();
3455 
3456         switch ( c )
3457         {
3458             case E_JPEG_APP1:
3459                 // Prevent from there's thumbnail in thumbnail... & multiple APP1
3460                 // Although it's impossible.. =_=
3461 //                if((E_JPEG_TYPE_THUMBNAIL == _u8DecodeType[pNJPEGContext->eNJPDNum])
3462 //                && (FALSE == _bThumbnailFound[pNJPEGContext->eNJPDNum]))
3463                 // We need to get EXIF info for decoding main picture or thumbnail.
3464                 if((pNJPEGContext->__bIsMjpeg[pNJPEGContext->eNJPDNum] == FALSE)
3465                 && (FALSE == pNJPEGContext->_bThumbnailFound[pNJPEGContext->eNJPDNum]))
3466                 {
3467                     if( !JPEG_read_app1_marker() )
3468                         return FALSE;
3469                 }
3470                 else
3471                 {
3472                     if( !JPEG_skip_variable_marker() )
3473                         return FALSE;
3474                 }
3475                 break;
3476 #if SUPPORT_MPO_FORMAT
3477             case E_JPEG_APP2:
3478                 if( !JPEG_read_app2_marker() )
3479                     return FALSE;
3480                 break;
3481 
3482 #endif
3483             case E_JPEG_SOF0:
3484             case E_JPEG_SOF1:
3485             case E_JPEG_SOF2:
3486             case E_JPEG_SOF3:
3487             case E_JPEG_SOF5:
3488             case E_JPEG_SOF6:
3489             case E_JPEG_SOF7:
3490                 //      case E_JPEG_JPG:
3491             case E_JPEG_SOF9:
3492             case E_JPEG_SOF10:
3493             case E_JPEG_SOF11:
3494             case E_JPEG_SOF13:
3495             case E_JPEG_SOF14:
3496             case E_JPEG_SOF15:
3497             case E_JPEG_SOI:
3498             case E_JPEG_EOI:
3499             case E_JPEG_SOS:
3500                 {
3501                     return c;
3502                 }
3503             case E_JPEG_DHT:
3504                 {
3505                     if( !JPEG_read_dht_marker() )
3506                         return FALSE;
3507                     pNJPEGContext->_HeadCheck[pNJPEGContext->eNJPDNum].DHT = TRUE;
3508                     break;
3509                 }
3510                 // Sorry, no arithmitic support at this time. Dumb patents!
3511             case E_JPEG_DAC:
3512                 {
3513                     JPEG_terminate( E_JPEG_NO_ARITHMETIC_SUPPORT );
3514                     return FALSE;
3515                     break;
3516                 }
3517             case E_JPEG_DQT:
3518                 {
3519                     if( !JPEG_read_dqt_marker() )
3520                         return FALSE;
3521                     pNJPEGContext->_HeadCheck[pNJPEGContext->eNJPDNum].DQT = TRUE;
3522                     break;
3523                 }
3524             case E_JPEG_DRI:
3525                 {
3526                     if( !JPEG_read_dri_marker() )
3527                         return FALSE;
3528                     break;
3529                 }
3530                 //case E_JPEG_APP0:  /* no need to read the JFIF marker */
3531 
3532             case E_JPEG_JPG:
3533             case E_JPEG_RST0:
3534                 /* no parameters */
3535             case E_JPEG_RST1:
3536             case E_JPEG_RST2:
3537             case E_JPEG_RST3:
3538             case E_JPEG_RST4:
3539             case E_JPEG_RST5:
3540             case E_JPEG_RST6:
3541             case E_JPEG_RST7:
3542             case E_JPEG_TEM:
3543                 {
3544                     JPEG_terminate( E_JPEG_UNEXPECTED_MARKER );
3545                     return FALSE;
3546                     break;
3547                 }
3548             case E_JPEG_APP0:
3549                 if (!pNJPEGContext->bMHEG5[pNJPEGContext->eNJPDNum])
3550                 {
3551                     if(!JPEG_skip_variable_marker())
3552                     {
3553                         return FALSE;
3554                     }
3555                     break;
3556                 }
3557                 if(!JPEG_read_app0_marker())
3558                 {
3559                     return FALSE;
3560                 }
3561                 break;
3562             case E_JPEG_DNL:
3563             case E_JPEG_DHP:
3564             case E_JPEG_EXP:
3565 #if (SUPPORT_MPO_FORMAT == 0)
3566             case E_JPEG_APP2:
3567 #endif
3568             case E_JPEG_APP3:
3569             case E_JPEG_APP4:
3570             case E_JPEG_APP5:
3571             case E_JPEG_APP6:
3572             case E_JPEG_APP7:
3573             case E_JPEG_APP8:
3574             case E_JPEG_APP9:
3575             case E_JPEG_APP10:
3576             case E_JPEG_APP11:
3577             case E_JPEG_APP12:
3578             case E_JPEG_APP13:
3579             case E_JPEG_APP14:
3580             case E_JPEG_APP15:
3581             case E_JPEG_JPG0:
3582             case E_JPEG_JPG1:
3583             case E_JPEG_JPG2:
3584             case E_JPEG_JPG3:
3585             case E_JPEG_JPG4:
3586             case E_JPEG_JPG5:
3587             case E_JPEG_JPG6:
3588             case E_JPEG_JPG7:
3589             case E_JPEG_JPG8:
3590             case E_JPEG_JPG9:
3591             case E_JPEG_JPG10:
3592             case E_JPEG_JPG11:
3593             case E_JPEG_JPG12:
3594             case E_JPEG_JPG13:
3595             case E_JPEG_COM:
3596                 /* must be DNL, DHP, EXP, APPn, JPGn, COM, or RESn or APP0 */
3597                 {
3598                     if(!JPEG_skip_variable_marker())
3599                     {
3600                         return FALSE;
3601                     }
3602                     break;
3603                 }
3604             default:
3605                 break;
3606         }
3607     }
3608     return TRUE;
3609 }
3610 //------------------------------------------------------------------------------
3611 // Finds the start of image (SOI) marker.
3612 // This code is rather defensive: it only checks the first 512 bytes to avoid
3613 // FALSE positives.
JPEG_locate_soi_marker(void)3614 JPEG_STATIC MS_BOOL JPEG_locate_soi_marker(void)
3615 {
3616     MS_U32 lastchar, thischar;
3617     MS_U32 bytesleft;
3618 
3619     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
3620 
3621     lastchar = JPEG_get_char();
3622 
3623     //JPEG_DEBUG_API_MSG("0x%lx\n", lastchar);
3624     thischar = JPEG_get_char();
3625 
3626     //JPEG_DEBUG_API_MSG("0x%lx\n", thischar);
3627     /* ok if it's a normal JPEG file without a special header */
3628 
3629     if ((0xFF == lastchar)
3630     && (E_JPEG_SOI == thischar))
3631     {
3632         //JPEG_DEBUG_API_MSG("SOI\n");
3633         return TRUE;
3634     }
3635 
3636     // Set this value to 0x1000 for 4k alignment MPO case when parse 2nd/3rd/... JPEG file
3637     bytesleft = 0x1000; //Fix this number from 512 -> 640 for some cases
3638 
3639     for ( ; ; )
3640     {
3641         if ( --bytesleft == 0 )
3642         {
3643             JPEG_terminate( E_JPEG_NOT_JPEG );
3644             return FALSE;
3645         }
3646 
3647         lastchar = thischar;
3648 
3649         thischar = JPEG_get_char();
3650 
3651         //JPEG_DEBUG_API_MSG("%x ", (MS_U8)thischar);
3652         //if(bytesleft%8==0)
3653         //    JPEG_DEBUG_API_MSG("\n");
3654 
3655         if ((0xFF == lastchar)
3656         && (E_JPEG_SOI == thischar))
3657         {
3658             //JPEG_DEBUG_API_MSG("SOI\n");
3659             break;
3660         }
3661     }
3662 
3663     /* Check the next character after marker: if it's not 0xFF, it can't
3664        be the start of the next marker, so it probably isn't a JPEG */
3665 /*  need to check for more detail, currently _u32Bit_buf[pNJPEGContext->eNJPDNum] is not updated during JPEG_get_char()
3666     thischar = ( _u32Bit_buf[pNJPEGContext->eNJPDNum] >> 8 ) & 0xFF;
3667 
3668     if ( thischar != 0xFF )
3669     {
3670         JPEG_terminate( E_JPEG_NOT_JPEG );
3671         return FALSE;
3672     }
3673 */
3674     return TRUE;
3675 }
3676 //------------------------------------------------------------------------------
3677 // Find a start of frame (SOF) marker.
JPEG_locate_sof_marker(void)3678 JPEG_STATIC MS_BOOL JPEG_locate_sof_marker(void)
3679 {
3680     MS_U32 c;
3681     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
3682 
3683     JPEG_DEBUG_API_MSG("_pu8In_buf_ofs[pNJPEGContext->eNJPDNum]=0x%tx(VA), 0x%tx(PA)=========\n",
3684         (ptrdiff_t)pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum], (ptrdiff_t)MS_VA2PA((MS_VIRT)pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum]));
3685     JPEG_DEBUG_API_MSG("%02x %02x %02x %02x %02x %02x %02x %02x \n", *pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum], *(pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum]+1),
3686         *(pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum]+2),*(pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum]+3),
3687         *(pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum]+4),*(pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum]+5),
3688         *(pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum]+6),*(pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum]+7)
3689         );
3690 
3691     if(!JPEG_locate_soi_marker())
3692         return FALSE;
3693 
3694     c = JPEG_process_markers();
3695 
3696     if( c == FALSE )
3697         return FALSE;
3698 
3699     switch ( c )
3700     {
3701         case E_JPEG_SOF2:
3702             {
3703                 JPEG_DEBUG_API_MSG("Progressive\n");
3704                 pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum] = TRUE;
3705 #ifdef CONFIG_UTOPIA_PROC_DBG_SUPPORT
3706                 gNJPEGMDebug._bProgressive_flag = pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum];
3707 #endif
3708                 pNJPEGContext->u32SOFOffset[pNJPEGContext->eNJPDNum] = pNJPEGContext->u32DataOffset[pNJPEGContext->eNJPDNum] + JPEG_GetECS() - 2;
3709                 if(!JPEG_read_sof_marker())
3710                     return FALSE;
3711                 break;
3712             }
3713         case E_JPEG_SOF0:
3714             /* baseline DCT */
3715         case E_JPEG_SOF1:
3716             /* extended sequential DCT */
3717             {
3718                 JPEG_DEBUG_API_MSG("Baseline\n");
3719                 pNJPEGContext->u32SOFOffset[pNJPEGContext->eNJPDNum] = pNJPEGContext->u32DataOffset[pNJPEGContext->eNJPDNum] + JPEG_GetECS() - 2;
3720                 if(!JPEG_read_sof_marker())
3721                     return FALSE;
3722                 break;
3723             }
3724         case E_JPEG_SOF9:
3725             /* Arithmitic coding */
3726             {
3727                 JPEG_terminate( E_JPEG_NO_ARITHMETIC_SUPPORT );
3728                 return FALSE;
3729                 break;
3730             }
3731 
3732         default:
3733             {
3734                 JPEG_DEBUG_API_MSG("parsed unsupported marker = 0x%04tx\n", (ptrdiff_t)c);
3735                 JPEG_terminate( E_JPEG_UNSUPPORTED_MARKER );
3736                 return FALSE;
3737                 break;
3738             }
3739     }
3740     return TRUE;
3741 }
3742 //------------------------------------------------------------------------------
3743 // Find a start of scan (SOS) marker.
JPEG_locate_sos_marker(void)3744 JPEG_STATIC MS_BOOL JPEG_locate_sos_marker(void)
3745 {
3746     MS_U32 c;
3747 
3748     c = JPEG_process_markers();
3749 
3750     if ( c == E_JPEG_EOI )
3751     {
3752         return FALSE;
3753     }
3754     else if ( c != E_JPEG_SOS )
3755     {
3756         JPEG_terminate( E_JPEG_UNEXPECTED_MARKER );
3757         return FALSE;
3758     }
3759 
3760     if(!JPEG_read_sos_marker())
3761         return FALSE;
3762 
3763     JPEG_DEBUG_API_MSG(" _pu8In_buf_MPO_ofs[pNJPEGContext->eNJPDNum]=0x%tx, _u32In_buf_MPO_left[pNJPEGContext->eNJPDNum]=0x%tx===========================\n", (ptrdiff_t)pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum], (ptrdiff_t)pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum]);
3764     JPEG_DEBUG_API_MSG("%02x %02x %02x %02x %02x %02x %02x %02x \n",
3765     *pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum], *(pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum]+1), *(pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum]+2), *(pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum]+3),
3766     *(pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum]+4), *(pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum]+5), *(pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum]+6), *(pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum]+7)
3767     );
3768 
3769     return TRUE;
3770 }
3771 //------------------------------------------------------------------------------
3772 // Reset thumbnail parameters
JPEG_init_thumbnail(void)3773 JPEG_STATIC void JPEG_init_thumbnail(void)
3774 {
3775     pNJPEGContext->_bThumbnailFound[pNJPEGContext->eNJPDNum] = FALSE;
3776     pNJPEGContext->_u32ThumbnailOffset[pNJPEGContext->eNJPDNum] = 0;
3777     pNJPEGContext->_u16ThumbnailSize[pNJPEGContext->eNJPDNum] = 0;
3778     pNJPEGContext->_bTiffBigEndian[pNJPEGContext->eNJPDNum] = FALSE;
3779 
3780     pNJPEGContext->_u32ThumbnailBufferOffset[pNJPEGContext->eNJPDNum] = 0;
3781     pNJPEGContext->_u16ThumbnailSize[pNJPEGContext->eNJPDNum] = 0;
3782     pNJPEGContext->_bThumbnailAccessMode[pNJPEGContext->eNJPDNum] = FALSE;
3783 
3784     pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].bHasDataTime = FALSE;
3785     pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Year = 0;
3786     pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Month = 0;
3787     pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Day = 0;
3788     pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Hour = 0;
3789     pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Minute = 0;
3790     pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Second = 0;
3791     pNJPEGContext->_eEXIF_Orientation[pNJPEGContext->eNJPDNum] = E_JPEG_EXIF_ORIENT_NOT_FOUND;
3792 
3793 
3794 #if SUPPORT_EXIF_EXTRA_INFO
3795     JPEG_memset((void *)pNJPEGContext->_u8EXIF_Manufacturer[pNJPEGContext->eNJPDNum], 0, JPEG_MANUFACTURER_SIZE);
3796     JPEG_memset((void *)pNJPEGContext->_u8EXIF_Model[pNJPEGContext->eNJPDNum], 0, JPEG_MODEL_SIZE);
3797     pNJPEGContext->_u16EXIF_Flash[pNJPEGContext->eNJPDNum] = 0;
3798     pNJPEGContext->_u16EXIF_Exposureprogram[pNJPEGContext->eNJPDNum] = 0;
3799     pNJPEGContext->_u32EXIF_ISOSpeedRatings[pNJPEGContext->eNJPDNum] = 0;
3800     pNJPEGContext->_stEXIF_ShutterSpeedValue[pNJPEGContext->eNJPDNum].numerator = 0;
3801     pNJPEGContext->_stEXIF_ShutterSpeedValue[pNJPEGContext->eNJPDNum].denominator= 0;
3802     pNJPEGContext->_stEXIF_ApertureValue[pNJPEGContext->eNJPDNum].s_numerator= 0;
3803     pNJPEGContext->_stEXIF_ApertureValue[pNJPEGContext->eNJPDNum].s_denominator= 0;
3804     pNJPEGContext->_stEXIF_ExposureBiasValue[pNJPEGContext->eNJPDNum].numerator= 0;
3805     pNJPEGContext->_stEXIF_ExposureBiasValue[pNJPEGContext->eNJPDNum].denominator= 0;
3806     pNJPEGContext->_stEXIF_FocalLength[pNJPEGContext->eNJPDNum].s_numerator= 0;
3807     pNJPEGContext->_stEXIF_FocalLength[pNJPEGContext->eNJPDNum].s_denominator= 0;
3808     pNJPEGContext->_u32EXIF_ImageWidth[pNJPEGContext->eNJPDNum] = 0;
3809     pNJPEGContext->_u32EXIF_ImageHeight[pNJPEGContext->eNJPDNum] = 0;
3810     pNJPEGContext->_stEXIF_ExposureTime[pNJPEGContext->eNJPDNum].numerator = 0;
3811     pNJPEGContext->_stEXIF_ExposureTime[pNJPEGContext->eNJPDNum].denominator =0;
3812     pNJPEGContext->_stEXIF_FNumber[pNJPEGContext->eNJPDNum].numerator = 0;
3813     pNJPEGContext->_stEXIF_FNumber[pNJPEGContext->eNJPDNum].denominator =0;
3814 #endif
3815 }
3816 //------------------------------------------------------------------------------
3817 // Reset everything to default/uninitialized state.
JPEG_init(void)3818 JPEG_STATIC MS_BOOL JPEG_init(void)
3819 {
3820     MS_U16 i;
3821     JPEG_DEBUG_API_MSG("%s!!\n", __FUNCTION__);
3822 
3823     pNJPEGContext->_u8LumaCi[pNJPEGContext->eNJPDNum] = 1;
3824     pNJPEGContext->_u8ChromaCi[pNJPEGContext->eNJPDNum] = 2;
3825     pNJPEGContext->_u8Chroma2Ci[pNJPEGContext->eNJPDNum] = 3;
3826     pNJPEGContext->bIs3HuffTbl[pNJPEGContext->eNJPDNum] = FALSE;
3827 #if SUPPORT_HIGH_LOW_REVERSE
3828     pNJPEGContext->bHighLowReverse[pNJPEGContext->eNJPDNum] = FALSE;
3829 #else
3830     pNJPEGContext->bDifferentHL[pNJPEGContext->eNJPDNum] = FALSE;
3831 #endif
3832 
3833     pNJPEGContext->_Error_code[pNJPEGContext->eNJPDNum] = E_JPEG_NO_ERROR;
3834 
3835     pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum] = 0;
3836     pNJPEGContext->_u16OriginalImage_x_size[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16OriginalImage_y_size[pNJPEGContext->eNJPDNum] = 0;
3837     pNJPEGContext->_u16AlignedImageWidth[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16AlignedImagePitch[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16AlignedImageHeight[pNJPEGContext->eNJPDNum] = 0;
3838     pNJPEGContext->_u16AlignedImagePitch_H[pNJPEGContext->eNJPDNum] = 0;
3839 
3840 ////    _pStream = _Pstream;
3841 
3842     pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum] = FALSE;
3843     pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum] = E_NJPD_DOWNSCALE_ORG;
3844     pNJPEGContext->_u32RLEOffset[pNJPEGContext->eNJPDNum] = 0;
3845     pNJPEGContext->_bFirstRLE[pNJPEGContext->eNJPDNum] = TRUE;
3846 
3847     pNJPEGContext->_s16dc_pred[pNJPEGContext->eNJPDNum][0] = pNJPEGContext->_s16dc_pred[pNJPEGContext->eNJPDNum][1] = pNJPEGContext->_s16dc_pred[pNJPEGContext->eNJPDNum][2] = 0;
3848 
3849     pNJPEGContext->_Progressive_ROI_flag[pNJPEGContext->eNJPDNum] = FALSE; //CL82399
3850     pNJPEGContext->ROI_width[pNJPEGContext->eNJPDNum] = 0; //CL82399
3851     pNJPEGContext->u8PreLHFlag[pNJPEGContext->eNJPDNum] = E_JPEG_BUFFER_NONE;
3852 
3853     pNJPEGContext->u32MRCheckCount[pNJPEGContext->eNJPDNum] = 0;
3854 
3855     for(i = 0; i<JPEG_MAXHUFFTABLES; i++)
3856     {
3857         pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][i].bValid = FALSE;
3858         JPEG_memset((void *)pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][i].u8Huff_num, 0, 17);
3859         JPEG_memset((void *)pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][i].u8Huff_val, 0, 256);
3860         JPEG_memset((void *)pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][i].u8Symbol, 0, 17);
3861         JPEG_memset((void *)pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][i].u16Code, 0, 17);
3862         JPEG_memset((void *)pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][i].u8Valid, 0, 17);
3863     }
3864 
3865     for(i = 0; i<JPEG_MAXQUANTTABLES; i++)
3866     {
3867         pNJPEGContext->_QuantTables[pNJPEGContext->eNJPDNum][i].bValid = FALSE;
3868         JPEG_memset(pNJPEGContext->_QuantTables[pNJPEGContext->eNJPDNum][i].s16Value, 0, 64);
3869     }
3870 
3871     pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum] = E_JPEG_GRAYSCALE;
3872 
3873     pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum] = 0;
3874 
3875     JPEG_memset((void *)pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum], 0, sizeof( pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum] ) );
3876     JPEG_memset((void *)pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum], 0, sizeof( pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum] ) );
3877     JPEG_memset((void *)pNJPEGContext->_u8Comp_quant[pNJPEGContext->eNJPDNum], 0, sizeof( pNJPEGContext->_u8Comp_quant[pNJPEGContext->eNJPDNum] ) );
3878     JPEG_memset((void *)pNJPEGContext->_u8Comp_ident[pNJPEGContext->eNJPDNum], 0, sizeof( pNJPEGContext->_u8Comp_ident[pNJPEGContext->eNJPDNum] ) );
3879     JPEG_memset((void *)pNJPEGContext->_u16Comp_h_blocks[pNJPEGContext->eNJPDNum], 0, sizeof( pNJPEGContext->_u16Comp_h_blocks[pNJPEGContext->eNJPDNum] ) );
3880     JPEG_memset((void *)pNJPEGContext->_u16Comp_v_blocks[pNJPEGContext->eNJPDNum], 0, sizeof( pNJPEGContext->_u16Comp_v_blocks[pNJPEGContext->eNJPDNum] ) );
3881 
3882     pNJPEGContext->_u8Comps_in_scan[pNJPEGContext->eNJPDNum] = 0;
3883     JPEG_memset((void *)pNJPEGContext->_u8Comp_list[pNJPEGContext->eNJPDNum], 0, sizeof( pNJPEGContext->_u8Comp_list[pNJPEGContext->eNJPDNum] ) );
3884     JPEG_memset((void *)pNJPEGContext->_u8Comp_dc_tab[pNJPEGContext->eNJPDNum], 0, sizeof( pNJPEGContext->_u8Comp_dc_tab[pNJPEGContext->eNJPDNum] ) );
3885     JPEG_memset((void *)pNJPEGContext->_u8Comp_ac_tab[pNJPEGContext->eNJPDNum], 0, sizeof( pNJPEGContext->_u8Comp_ac_tab[pNJPEGContext->eNJPDNum] ) );
3886 
3887     pNJPEGContext->_u8Spectral_start[pNJPEGContext->eNJPDNum] = 0;
3888     pNJPEGContext->_u8Spectral_end[pNJPEGContext->eNJPDNum] = 0;
3889     pNJPEGContext->_u8Successive_low[pNJPEGContext->eNJPDNum] = 0;
3890     pNJPEGContext->_u8Successive_high[pNJPEGContext->eNJPDNum] = 0;
3891 
3892     pNJPEGContext->gu8Max_mcu_x_size[pNJPEGContext->eNJPDNum] = 0;
3893     pNJPEGContext->gu8Max_mcu_y_size[pNJPEGContext->eNJPDNum] = 0;
3894 
3895     pNJPEGContext->_u8Blocks_per_mcu[pNJPEGContext->eNJPDNum] = 0;
3896     pNJPEGContext->_u32Max_blocks_per_row[pNJPEGContext->eNJPDNum] = 0;
3897     pNJPEGContext->_u16Mcus_per_row[pNJPEGContext->eNJPDNum] = 0;
3898     pNJPEGContext->_u16Mcus_per_col[pNJPEGContext->eNJPDNum] = 0;
3899 
3900     JPEG_memset((void *)pNJPEGContext->_u8Mcu_org[pNJPEGContext->eNJPDNum], 0, sizeof( pNJPEGContext->_u8Mcu_org[pNJPEGContext->eNJPDNum] ) );
3901 
3902     JPEG_memset((void *)pNJPEGContext->_pBlocks[pNJPEGContext->eNJPDNum], 0, sizeof( pNJPEGContext->_pBlocks[pNJPEGContext->eNJPDNum] ) );
3903 
3904 #if SUPPORT_PROGRESSIVE_MODE
3905     pNJPEGContext->_u16Total_lines_left[pNJPEGContext->eNJPDNum] = 0;
3906     JPEG_memset((void *)pNJPEGContext->_u32Block_y_mcu[pNJPEGContext->eNJPDNum], 0, sizeof( pNJPEGContext->_u32Block_y_mcu[pNJPEGContext->eNJPDNum] ) );
3907     JPEG_memset((void *)pNJPEGContext->_Huff_tbls[pNJPEGContext->eNJPDNum], 0, sizeof( pNJPEGContext->_Huff_tbls[pNJPEGContext->eNJPDNum] ) );
3908     JPEG_memset((void *)pNJPEGContext->_DC_Coeffs[pNJPEGContext->eNJPDNum], 0, sizeof( pNJPEGContext->_DC_Coeffs[pNJPEGContext->eNJPDNum] ) );
3909     JPEG_memset((void *)pNJPEGContext->_AC_Coeffs[pNJPEGContext->eNJPDNum], 0, sizeof( pNJPEGContext->_AC_Coeffs[pNJPEGContext->eNJPDNum] ) );
3910     JPEG_memset((void *)pNJPEGContext->_u32Last_dc_val[pNJPEGContext->eNJPDNum], 0, sizeof( pNJPEGContext->_u32Last_dc_val[pNJPEGContext->eNJPDNum] ) );
3911 
3912     pNJPEGContext->_u32EOB_run[pNJPEGContext->eNJPDNum] = 0;
3913 #endif
3914 
3915     pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum] = pNJPEGContext->_pu8In_buf[pNJPEGContext->eNJPDNum];
3916 ////    _u32In_buf_left[pNJPEGContext->eNJPDNum] = 0;
3917 ////    _bEOF_flag[pNJPEGContext->eNJPDNum] = FALSE;
3918     pNJPEGContext->_u8Tem_flag[pNJPEGContext->eNJPDNum] = 0;
3919 
3920     //sharon JPEG_memset((void *)_pu8In_buf[pNJPEGContext->eNJPDNum], 0, sizeof(MS_U8)*(MRC_BUFFER_SIZE + 128) );
3921 
3922     pNJPEGContext->_u16Restart_interval[pNJPEGContext->eNJPDNum] = 0;
3923     pNJPEGContext->_u16Restarts_left[pNJPEGContext->eNJPDNum] = 0;
3924     pNJPEGContext->_u16Next_restart_num[pNJPEGContext->eNJPDNum] = 0;
3925 
3926     pNJPEGContext->gu16Max_mcus_per_row[pNJPEGContext->eNJPDNum] = 0;
3927     pNJPEGContext->_u16Max_blocks_per_mcu[pNJPEGContext->eNJPDNum] = 0;
3928     pNJPEGContext->_u16Max_mcus_per_col[pNJPEGContext->eNJPDNum] = 0;
3929 
3930 #if SW_NJPD_RGB_CMYK
3931     JPEG_memset( pNJPEGContext->_ps16Block_seg, 0, sizeof( pNJPEGContext->_ps16Block_seg ) );
3932     pNJPEGContext->gpu8Sample_buf = NULL;
3933 #endif
3934 
3935     // Tell the stream we're going to use it.
3936     //_pStream->attach();
3937 
3938     // Ready the input buffer.
3939     if(pNJPEGContext->_bThumbnailAccessMode[pNJPEGContext->eNJPDNum])
3940     {
3941         // It means that thumbnail is found and re-call JPEG_init()
3942         // to re-fill thumbnail data to internal buffer.
3943         if(!JPEG_fill_read_buffer())
3944         {
3945             JPEG_DEBUG_API_MSG("JPEG_init : JPEG_fill_read_buffer failed!!!\n");
3946             return FALSE;
3947         }
3948     }
3949     else
3950     {
3951 ////        _u32In_buf_left[pNJPEGContext->eNJPDNum] = MRC_BUFFER_SIZE;  //sharon
3952 ////        _Total_Decoded_Size = MRC_BUFFER_SIZE;  //sharon
3953 ////        _u32Total_bytes_read[pNJPEGContext->eNJPDNum] = MRC_BUFFER_SIZE;  //sharon
3954         pNJPEGContext->_u32Total_bytes_read[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum];
3955     }
3956 
3957     // Prime the bit buffer.
3958     pNJPEGContext->_s16Bits_left[pNJPEGContext->eNJPDNum] = 0;
3959     pNJPEGContext->_u32Bit_buf[pNJPEGContext->eNJPDNum] = 0;
3960 
3961 //    _pu32ExifHeaderAddr = 0;
3962 
3963 #if SW_NJPD_RGB_CMYK
3964     for ( i = 0; i < JPEG_MAXBLOCKSPERROW; i++ )
3965     {
3966         pNJPEGContext->_u8Block_max_zag_set[i] = 64;
3967     }
3968 #endif
3969     return TRUE;
3970 }
3971 //------------------------------------------------------------------------------
3972 // The coeff_buf series of methods originally stored the coefficients
3973 // into a "virtual" file which was located in EMS, XMS, or a disk file. A cache
3974 // was used to make this process more efficient. Now, we can store the entire
3975 // thing in RAM.
JPEG_coeff_buf_open(MS_U16 block_num_x,MS_U16 block_num_y,MS_U8 block_len_x,MS_U8 block_len_y)3976 JPEG_STATIC PJPEG_CoeffBuf JPEG_coeff_buf_open(MS_U16 block_num_x, MS_U16 block_num_y, MS_U8 block_len_x, MS_U8 block_len_y)
3977 {
3978     PJPEG_CoeffBuf cb = ( PJPEG_CoeffBuf )JPEG_alloc( sizeof( JPEG_CoeffBuf ) );
3979 
3980     if(cb == NULL)
3981         return NULL;
3982 
3983     cb->u16Block_num_x = block_num_x;
3984     cb->u16Block_num_y = block_num_y;
3985 
3986     cb->u8Block_len_x = block_len_x;
3987     cb->u8Block_len_y = block_len_y;
3988 
3989     cb->u16Block_size = ( block_len_x * block_len_y ) * sizeof( JPEG_BLOCK_TYPE );
3990 
3991     cb->pu8Data = ( MS_U8 * )JPEG_alloc( cb->u16Block_size * block_num_x * block_num_y );
3992 
3993     if(cb->pu8Data == NULL)
3994         return NULL;
3995 
3996     return cb;
3997 }
3998 //------------------------------------------------------------------------------
JPEG_coeff_buf_getp(PJPEG_CoeffBuf cb,MS_U16 block_x,MS_U16 block_y)3999 JPEG_STATIC JPEG_BLOCK_TYPE * JPEG_coeff_buf_getp( PJPEG_CoeffBuf cb, MS_U16 block_x, MS_U16 block_y )
4000 {
4001     if ( block_x >= cb->u16Block_num_x )
4002     {
4003         JPEG_terminate( E_JPEG_ASSERTION_ERROR );
4004         return NULL;
4005     }
4006 
4007     if ( block_y >= cb->u16Block_num_y )
4008     {
4009         JPEG_terminate( E_JPEG_ASSERTION_ERROR );
4010         return NULL;
4011     }
4012 
4013     return ( JPEG_BLOCK_TYPE * )((MS_VIRT)( cb->pu8Data + block_x * cb->u16Block_size
4014                                             + block_y * (cb->u16Block_size * cb->u16Block_num_x)));
4015 }
4016 //------------------------------------------------------------------------------
4017 // Creates the tables needed for efficient Huffman decoding.
JPEG_make_huff_table(MS_U8 indextmp)4018 JPEG_STATIC MS_BOOL JPEG_make_huff_table(MS_U8 indextmp)
4019 {
4020     MS_U16 p, i, l, si;
4021     MS_U8 huffsize[257];
4022     MS_U16 huffcode[257];
4023     MS_U16 _code;
4024     MS_U16 subtree;
4025     MS_U16 code_size;
4026     MS_U16 lastp;
4027 #if SUPPORT_PROGRESSIVE_MODE
4028     MS_S16 nextfreeentry;
4029 #endif
4030     MS_S16 currententry;
4031 
4032 #if SUPPORT_PROGRESSIVE_MODE
4033     JPEG_HuffTbl *hs = &pNJPEGContext->_Huff_tbls[pNJPEGContext->eNJPDNum][indextmp];
4034 #endif
4035 
4036     JPEG_memset((void *)huffsize, 0, sizeof(huffsize));
4037     JPEG_memset((void *)huffcode, 0, sizeof(huffcode));
4038 
4039     p = 0;
4040 
4041     for ( l = 1; l <= 16; l++ )
4042     {
4043         for ( i = 1; i <= pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][indextmp].u8Huff_num[l]; i++ )
4044         {
4045             huffsize[p++] = l;
4046 
4047             //kevinhuang, add protection
4048             if ( p >= 257 )
4049             {
4050                 JPEG_terminate( E_JPEG_UNDEFINED_HUFF_TABLE );
4051                 return FALSE;
4052             }
4053         }
4054     }
4055 
4056     huffsize[p] = 0;
4057 
4058     lastp = p;
4059 
4060     _code = 0;
4061     si = huffsize[0];
4062     p = 0;
4063 
4064     while ( huffsize[p] )
4065     {
4066         while ( huffsize[p] == si )
4067         {
4068             huffcode[p++] = _code;
4069             _code++;
4070 
4071             //kevinhuang, add protection
4072             if ( p >= 257 )
4073             {
4074                 JPEG_terminate( E_JPEG_UNDEFINED_HUFF_TABLE );
4075                 return FALSE;
4076             }
4077         }
4078 
4079         _code <<= 1;
4080         si++;
4081     }
4082 
4083     // Calculate the min code
4084     for(i = 1; i<=16; i++)
4085     {
4086         pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][indextmp].u16Code[i] = huffcode[pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][indextmp].u8Symbol[i]];
4087     }
4088 
4089 
4090 
4091 #if SUPPORT_PROGRESSIVE_MODE
4092     // In NJPD mode, SW doesn't need huff table when baseline decoding
4093 #if SW_NJPD_RGB_CMYK
4094     if((E_JPEG_CMYK != pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum])
4095     && (E_JPEG_RGB != pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum]))
4096 #endif
4097     {
4098         if(pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum]==FALSE)
4099             return TRUE;
4100     }
4101 
4102     JPEG_DEBUG_API_MSG("Make HUFF TABLE\n");
4103 
4104     JPEG_memset((void *)(hs->s16Look_up), 0, sizeof( hs->s16Look_up ) );
4105     JPEG_memset((void *)(hs->s16Tree), 0, sizeof( hs->s16Tree ) );
4106     JPEG_memset((void *)(hs->u8Code_size), 0, sizeof( hs->u8Code_size ) );
4107 
4108     nextfreeentry = -1;
4109 
4110     p = 0;
4111 
4112     while ( p < lastp )
4113     {
4114         i = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][indextmp].u8Huff_val[p];
4115         _code = huffcode[p];
4116         code_size = huffsize[p];
4117 
4118         hs->u8Code_size[i] = code_size;
4119 
4120         if ( code_size <= 8 )
4121         {
4122             _code <<= ( 8 - code_size );
4123 
4124             for ( l = 1 << ( 8 - code_size ); l > 0; l-- )
4125             {
4126                 hs->s16Look_up[_code] = i;
4127                 _code++;
4128             }
4129         }
4130         else
4131         {
4132             subtree = ( _code >> ( code_size - 8 ) ) & 0xFF;
4133 
4134             currententry = hs->s16Look_up[subtree];
4135 
4136             if ( currententry == 0 )
4137             {
4138                 hs->s16Look_up[subtree] = currententry = nextfreeentry;
4139 
4140                 nextfreeentry -= 2;
4141             }
4142 
4143             _code <<= ( 16 - ( code_size - 8 ) );
4144 
4145             for ( l = code_size; l > 9; l-- )
4146             {
4147                 if ( ( _code & 0x8000 ) == 0 )
4148                 {
4149                     currententry--;
4150                 }
4151 
4152                 if ( hs->s16Tree[-currententry - 1] == 0 )
4153                 {
4154                     hs->s16Tree[-currententry - 1] = nextfreeentry;
4155 
4156                     currententry = nextfreeentry;
4157 
4158                     nextfreeentry -= 2;
4159                 }
4160                 else
4161                 {
4162                     currententry = hs->s16Tree[-currententry - 1];
4163                 }
4164 
4165                 _code <<= 1;
4166             }
4167 
4168             if ( ( _code & 0x8000 ) == 0 )
4169             {
4170                 currententry--;
4171             }
4172 
4173             hs->s16Tree[-currententry - 1] = i;
4174         }
4175 
4176         p++;
4177     }
4178 #endif  //SUPPORT_PROGRESSIVE_MODE
4179     return TRUE;
4180 }
4181 //------------------------------------------------------------------------------
4182 // Verifies the quantization tables needed for this scan are available.
JPEG_check_quant_tables(void)4183 JPEG_STATIC MS_BOOL JPEG_check_quant_tables( void ) //ok
4184 {
4185     MS_U8 i;
4186 
4187     for ( i = 0; i < pNJPEGContext->_u8Comps_in_scan[pNJPEGContext->eNJPDNum]; i++ )
4188     {
4189         if ( pNJPEGContext->_QuantTables[pNJPEGContext->eNJPDNum][pNJPEGContext->_u8Comp_quant[pNJPEGContext->eNJPDNum][pNJPEGContext->_u8Comp_list[pNJPEGContext->eNJPDNum][i]]].bValid==FALSE )
4190         {
4191             JPEG_terminate( E_JPEG_UNDEFINED_QUANT_TABLE );
4192             return FALSE;
4193         }
4194     }
4195     return TRUE;
4196 }
4197 //------------------------------------------------------------------------------
4198 // Verifies that all the Huffman tables needed for this scan are available.
JPEG_check_huff_tables(void)4199 JPEG_STATIC MS_BOOL JPEG_check_huff_tables( void )
4200 {
4201     MS_U8 i;
4202 
4203     for ( i = 0; i < pNJPEGContext->_u8Comps_in_scan[pNJPEGContext->eNJPDNum]; i++ )
4204     {
4205         if ( ( pNJPEGContext->_u8Spectral_start[pNJPEGContext->eNJPDNum] == 0 ) && ( pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][pNJPEGContext->_u8Comp_dc_tab[pNJPEGContext->eNJPDNum][pNJPEGContext->_u8Comp_list[pNJPEGContext->eNJPDNum][i]]].bValid== FALSE ) )
4206         {
4207             JPEG_terminate( E_JPEG_UNDEFINED_HUFF_TABLE );
4208             return FALSE;
4209         }
4210 
4211         if ( ( pNJPEGContext->_u8Spectral_end[pNJPEGContext->eNJPDNum] > 0 ) && ( pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][pNJPEGContext->_u8Comp_ac_tab[pNJPEGContext->eNJPDNum][pNJPEGContext->_u8Comp_list[pNJPEGContext->eNJPDNum][i]]].bValid== FALSE ) )
4212         {
4213             JPEG_terminate( E_JPEG_UNDEFINED_HUFF_TABLE );
4214             return FALSE;
4215         }
4216     }
4217 
4218     for ( i = 0; i < JPEG_MAXHUFFTABLES; i++ )
4219     {
4220         if ( pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][i].bValid )
4221         {
4222             if(!JPEG_make_huff_table(i))
4223                 return FALSE;
4224         }
4225     }
4226     return TRUE;
4227 }
4228 //------------------------------------------------------------------------------
4229 // Determines the component order inside each MCU.
4230 // Also calcs how many MCU's are on each row, etc.
JPEG_calc_mcu_block_order(void)4231 JPEG_STATIC void JPEG_calc_mcu_block_order( void ) //ok
4232 {
4233     MS_U8 component_num, component_id;
4234     MS_U8 max_h_samp = 0, max_v_samp = 0;
4235 
4236     for ( component_id = 0; component_id < pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum]; component_id++ )
4237     {
4238         if ( pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][component_id] > max_h_samp )
4239         {
4240             max_h_samp = pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][component_id];
4241         }
4242 
4243         if ( pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][component_id] > max_v_samp )
4244         {
4245             max_v_samp = pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][component_id];
4246         }
4247     }
4248 
4249     if((max_h_samp == 0) || (max_v_samp == 0))
4250     {
4251         JPEG_terminate( E_JPEG_NOT_ENOUGH_HEADER_INFO );
4252         return;
4253     }
4254 
4255     for ( component_id = 0; component_id < pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum]; component_id++ )
4256     {
4257         pNJPEGContext->_u16Comp_h_blocks[pNJPEGContext->eNJPDNum][component_id] = ( ( ( ( pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] * pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][component_id] ) + ( max_h_samp - 1 ) ) / max_h_samp ) + 7 ) / 8;
4258         pNJPEGContext->_u16Comp_v_blocks[pNJPEGContext->eNJPDNum][component_id] = ( ( ( ( pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum] * pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][component_id] ) + ( max_v_samp - 1 ) ) / max_v_samp ) + 7 ) / 8;
4259     }
4260 
4261     if ( pNJPEGContext->_u8Comps_in_scan[pNJPEGContext->eNJPDNum] == 1 )
4262     {
4263         pNJPEGContext->_u16Mcus_per_row[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16Comp_h_blocks[pNJPEGContext->eNJPDNum][pNJPEGContext->_u8Comp_list[pNJPEGContext->eNJPDNum][0]];
4264         pNJPEGContext->_u16Mcus_per_col[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16Comp_v_blocks[pNJPEGContext->eNJPDNum][pNJPEGContext->_u8Comp_list[pNJPEGContext->eNJPDNum][0]];
4265     }
4266     else
4267     {
4268         pNJPEGContext->_u16Mcus_per_row[pNJPEGContext->eNJPDNum] = ( ( ( pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] + 7 ) / 8 ) + ( max_h_samp - 1 ) ) / max_h_samp;
4269         pNJPEGContext->_u16Mcus_per_col[pNJPEGContext->eNJPDNum] = ( ( ( pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum] + 7 ) / 8 ) + ( max_v_samp - 1 ) ) / max_v_samp;
4270     }
4271 
4272     if ( pNJPEGContext->_u8Comps_in_scan[pNJPEGContext->eNJPDNum] == 1 )
4273     {
4274         pNJPEGContext->_u8Mcu_org[pNJPEGContext->eNJPDNum][0] = pNJPEGContext->_u8Comp_list[pNJPEGContext->eNJPDNum][0];
4275 
4276         pNJPEGContext->_u8Blocks_per_mcu[pNJPEGContext->eNJPDNum] = 1;
4277     }
4278     else
4279     {
4280         pNJPEGContext->_u8Blocks_per_mcu[pNJPEGContext->eNJPDNum] = 0;
4281 
4282         for ( component_num = 0; component_num < pNJPEGContext->_u8Comps_in_scan[pNJPEGContext->eNJPDNum]; component_num++ )
4283         {
4284             MS_U8 num_blocks;
4285 
4286             component_id = pNJPEGContext->_u8Comp_list[pNJPEGContext->eNJPDNum][component_num];
4287 
4288             num_blocks = pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][component_id] * pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][component_id];
4289 
4290             while ( num_blocks-- )
4291             {
4292                 pNJPEGContext->_u8Mcu_org[pNJPEGContext->eNJPDNum][pNJPEGContext->_u8Blocks_per_mcu[pNJPEGContext->eNJPDNum]++] = component_id;
4293             }
4294         }
4295     }
4296 }
4297 //------------------------------------------------------------------------------
4298 /* Get current access byte address in MRC buffer relative to MRC start address */
JPEG_GetECS(void)4299 JPEG_STATIC MS_VIRT JPEG_GetECS(void)
4300 {
4301     MS_VIRT data_end_addr = (MS_VIRT)pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum];
4302     MS_VIRT data_start_addr =(MS_VIRT) pNJPEGContext->_pu8In_buf[pNJPEGContext->eNJPDNum];
4303 
4304     return (data_end_addr - data_start_addr);
4305 }
4306 //------------------------------------------------------------------------------
4307 //*************************************************
4308 //write symbol table
4309 //*************************************************
4310 //------------------------------------------------------------------------------
JPEG_WriteSymidx(void)4311 JPEG_STATIC void JPEG_WriteSymidx(void)
4312 {
4313     MS_U16 ac_tbl_num_luma = 0, ac_tbl_num_chroma = 0;
4314     MS_U16 dc_tbl_num_luma = 0, dc_tbl_num_chroma = 0;
4315     MS_U8 ci, luma_ci = 0, chroma_ci = 0;
4316     MS_U16 ac_tbl_num_chroma2 = 0;
4317     MS_U16 dc_tbl_num_chroma2 = 0;
4318     MS_U8 chroma2_ci = 0;
4319     NJPD_Symidx structSymidx;
4320 
4321     JPEG_memset((void *)(&structSymidx), 0, sizeof(structSymidx));
4322 
4323     if (pNJPEGContext->_HeadCheck[pNJPEGContext->eNJPDNum].DHT)
4324     {
4325         for(ci = 0; ci<pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum]; ci++)
4326         {
4327             if(pNJPEGContext->_u8LumaCi[pNJPEGContext->eNJPDNum]==pNJPEGContext->_u8Comp_ident[pNJPEGContext->eNJPDNum][ci])
4328             {
4329                 luma_ci = ci;
4330                 break;
4331             }
4332         }
4333 
4334         for(ci = 0; ci<pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum]; ci++)
4335         {
4336             if(pNJPEGContext->_u8ChromaCi[pNJPEGContext->eNJPDNum]==pNJPEGContext->_u8Comp_ident[pNJPEGContext->eNJPDNum][ci])
4337             {
4338                 chroma_ci = ci;
4339                 break;
4340             }
4341         }
4342 
4343         if(TRUE == pNJPEGContext->bIs3HuffTbl[pNJPEGContext->eNJPDNum])
4344         {
4345             for(ci = 0; ci<pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum]; ci++)
4346             {
4347                 if(pNJPEGContext->_u8Chroma2Ci[pNJPEGContext->eNJPDNum]==pNJPEGContext->_u8Comp_ident[pNJPEGContext->eNJPDNum][ci])
4348                 {
4349                     chroma2_ci = ci;
4350                     break;
4351                 }
4352             }
4353         }
4354 
4355         ac_tbl_num_luma = pNJPEGContext->_u8Comp_ac_tab[pNJPEGContext->eNJPDNum][luma_ci];
4356         ac_tbl_num_chroma = pNJPEGContext->_u8Comp_ac_tab[pNJPEGContext->eNJPDNum][chroma_ci];
4357 
4358 
4359         dc_tbl_num_luma = pNJPEGContext->_u8Comp_dc_tab[pNJPEGContext->eNJPDNum][luma_ci];
4360         dc_tbl_num_chroma = pNJPEGContext->_u8Comp_dc_tab[pNJPEGContext->eNJPDNum][chroma_ci];
4361         if(TRUE == pNJPEGContext->bIs3HuffTbl[pNJPEGContext->eNJPDNum])
4362         {
4363             ac_tbl_num_chroma2 = pNJPEGContext->_u8Comp_ac_tab[pNJPEGContext->eNJPDNum][chroma2_ci];
4364             dc_tbl_num_chroma2 = pNJPEGContext->_u8Comp_dc_tab[pNJPEGContext->eNJPDNum][chroma2_ci];
4365         }
4366     }
4367 
4368     structSymidx.DHT = pNJPEGContext->_HeadCheck[pNJPEGContext->eNJPDNum].DHT;
4369     structSymidx.bUVHuffman = pNJPEGContext->bIs3HuffTbl[pNJPEGContext->eNJPDNum];
4370     structSymidx.u8DcLumaHuffVal = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][dc_tbl_num_luma].u8Huff_val;
4371     structSymidx.u8DcChromaHuffVal = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][dc_tbl_num_chroma].u8Huff_val;
4372     structSymidx.u8AcLumaHuffVal = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][ac_tbl_num_luma].u8Huff_val;
4373     structSymidx.u8AcChromaHuffVal = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][ac_tbl_num_chroma].u8Huff_val;
4374     if(TRUE == pNJPEGContext->bIs3HuffTbl[pNJPEGContext->eNJPDNum])
4375     {
4376         structSymidx.u8DcChroma2HuffVal = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][dc_tbl_num_chroma2].u8Huff_val;
4377         structSymidx.u8AcChroma2HuffVal = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][ac_tbl_num_chroma2].u8Huff_val;
4378     }
4379     MDrv_NJPD_WriteSymidx(structSymidx);
4380 }
4381 //------------------------------------------------------------------------------
4382 //***************************************************
4383 //write quantization table
4384 //***************************************************
JPEG_WriteIQTbl(void)4385 JPEG_STATIC void JPEG_WriteIQTbl(void)
4386 {
4387     //MS_U8 i, j;
4388     MS_U8 i;
4389     MS_U8 com_num = 0;
4390     MS_U8 comp[JPEG_MAXCOMPONENTS];
4391     NJPD_IQTbl structIqtbl;
4392 
4393     JPEG_memset((void *)&structIqtbl, 0, sizeof(structIqtbl));
4394 
4395     if (pNJPEGContext->_HeadCheck[pNJPEGContext->eNJPDNum].DQT)
4396     {
4397         // Calculate how many valid quantization tables
4398         JPEG_memset((void *)comp, 0, JPEG_MAXCOMPONENTS);
4399         for(i = 0; i<pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum]; i++)
4400         {
4401             comp[pNJPEGContext->_u8Comp_quant[pNJPEGContext->eNJPDNum][i]] = 1;
4402         }
4403 
4404         for(i = 0; i<JPEG_MAXCOMPONENTS; i++)
4405         {
4406             if(comp[i]==1)
4407                 com_num++;
4408         }
4409 
4410     }
4411 
4412     structIqtbl.DQT = pNJPEGContext->_HeadCheck[pNJPEGContext->eNJPDNum].DQT;
4413     structIqtbl.u8CompNum = com_num;
4414     structIqtbl.u8CompQuant = pNJPEGContext->_u8Comp_quant[pNJPEGContext->eNJPDNum];
4415     structIqtbl.QuantTables = (NJPD_QuanTbl *)pNJPEGContext->_QuantTables[pNJPEGContext->eNJPDNum];
4416     MDrv_NJPD_WriteIQTbl(structIqtbl);
4417 }
4418 //------------------------------------------------------------------------------
4419 //*************************************************
4420 //write group information
4421 //*************************************************
JPEG_WriteGrpinf(void)4422 JPEG_STATIC void JPEG_WriteGrpinf(void) //type : luma=>0  chroma=>1
4423 {
4424     MS_U16 ci, dc_tbl_num_luma = 0, dc_tbl_num_chroma = 0;
4425     MS_U16 ac_tbl_num_luma = 0, ac_tbl_num_chroma = 0;
4426     MS_U8 luma_ci = 0, chroma_ci = 0;
4427     MS_U16 dc_tbl_num_chroma2 = 0;
4428     MS_U16 ac_tbl_num_chroma2 = 0;
4429     MS_U8 chroma2_ci = 0;
4430     NJPD_Grpinf structGrpinf;
4431 
4432     JPEG_memset((void *)&structGrpinf, 0, sizeof(structGrpinf));
4433 
4434     if (pNJPEGContext->_HeadCheck[pNJPEGContext->eNJPDNum].DHT)
4435     {
4436         for(ci = 0; ci<pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum]; ci++)
4437         {
4438             if(pNJPEGContext->_u8LumaCi[pNJPEGContext->eNJPDNum]==pNJPEGContext->_u8Comp_ident[pNJPEGContext->eNJPDNum][ci])
4439             {
4440                 luma_ci = ci;
4441                 break;
4442             }
4443         }
4444 
4445         for(ci = 0; ci<pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum]; ci++)
4446         {
4447             if(pNJPEGContext->_u8ChromaCi[pNJPEGContext->eNJPDNum]==pNJPEGContext->_u8Comp_ident[pNJPEGContext->eNJPDNum][ci])
4448             {
4449                 chroma_ci = ci;
4450                 break;
4451             }
4452         }
4453 
4454         if(TRUE == pNJPEGContext->bIs3HuffTbl[pNJPEGContext->eNJPDNum])
4455         {
4456             for(ci = 0; ci<pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum]; ci++)
4457             {
4458                 if(pNJPEGContext->_u8Chroma2Ci[pNJPEGContext->eNJPDNum]==pNJPEGContext->_u8Comp_ident[pNJPEGContext->eNJPDNum][ci])
4459                 {
4460                     chroma2_ci = ci;
4461                     break;
4462                 }
4463             }
4464         }
4465 
4466         dc_tbl_num_luma = pNJPEGContext->_u8Comp_dc_tab[pNJPEGContext->eNJPDNum][luma_ci];
4467         dc_tbl_num_chroma = pNJPEGContext->_u8Comp_dc_tab[pNJPEGContext->eNJPDNum][chroma_ci];
4468 
4469         ac_tbl_num_luma = pNJPEGContext->_u8Comp_ac_tab[pNJPEGContext->eNJPDNum][luma_ci];
4470         ac_tbl_num_chroma = pNJPEGContext->_u8Comp_ac_tab[pNJPEGContext->eNJPDNum][chroma_ci];
4471 
4472         if(TRUE == pNJPEGContext->bIs3HuffTbl[pNJPEGContext->eNJPDNum])
4473         {
4474             dc_tbl_num_chroma2 = pNJPEGContext->_u8Comp_dc_tab[pNJPEGContext->eNJPDNum][chroma2_ci];
4475             ac_tbl_num_chroma2 = pNJPEGContext->_u8Comp_ac_tab[pNJPEGContext->eNJPDNum][chroma2_ci];
4476         }
4477     }
4478 
4479     structGrpinf.DHT = pNJPEGContext->_HeadCheck[pNJPEGContext->eNJPDNum].DHT;
4480     structGrpinf.bUVHuffman = pNJPEGContext->bIs3HuffTbl[pNJPEGContext->eNJPDNum];
4481     structGrpinf.u8DcLumaValid= pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][dc_tbl_num_luma].u8Valid;
4482     structGrpinf.u8DcLumaSymbol = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][dc_tbl_num_luma].u8Symbol;
4483     structGrpinf.u16DcLumaCode = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][dc_tbl_num_luma].u16Code;
4484     structGrpinf.u8DcChromaValid= pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][dc_tbl_num_chroma].u8Valid;
4485     structGrpinf.u8DcChromaSymbol = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][dc_tbl_num_chroma].u8Symbol;
4486     structGrpinf.u16DcChromaCode = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][dc_tbl_num_chroma].u16Code;
4487     structGrpinf.u8AcLumaValid= pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][ac_tbl_num_luma].u8Valid;
4488     structGrpinf.u8AcLumaSymbol = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][ac_tbl_num_luma].u8Symbol;
4489     structGrpinf.u16AcLumaCode = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][ac_tbl_num_luma].u16Code;
4490     structGrpinf.u8AcChromaValid= pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][ac_tbl_num_chroma].u8Valid;
4491     structGrpinf.u8AcChromaSymbol = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][ac_tbl_num_chroma].u8Symbol;
4492     structGrpinf.u16AcChromaCode = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][ac_tbl_num_chroma].u16Code;
4493     structGrpinf.u8DcLumaCnt = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][dc_tbl_num_luma].u8SymbolCnt;
4494     structGrpinf.u8DcChromaCnt = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][dc_tbl_num_chroma].u8SymbolCnt;
4495     structGrpinf.u8AcLumaCnt = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][ac_tbl_num_luma].u8SymbolCnt;
4496     structGrpinf.u8AcChromaCnt = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][ac_tbl_num_chroma].u8SymbolCnt;
4497     if(TRUE == pNJPEGContext->bIs3HuffTbl[pNJPEGContext->eNJPDNum])
4498     {
4499         structGrpinf.u8DcChroma2Valid= pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][dc_tbl_num_chroma2].u8Valid;
4500         structGrpinf.u8DcChroma2Symbol = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][dc_tbl_num_chroma2].u8Symbol;
4501         structGrpinf.u16DcChroma2Code = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][dc_tbl_num_chroma2].u16Code;
4502         structGrpinf.u8AcChroma2Valid= pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][ac_tbl_num_chroma2].u8Valid;
4503         structGrpinf.u8AcChroma2Symbol = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][ac_tbl_num_chroma2].u8Symbol;
4504         structGrpinf.u16AcChroma2Code = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][ac_tbl_num_chroma2].u16Code;
4505         structGrpinf.u8DcChroma2Cnt = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][dc_tbl_num_chroma2].u8SymbolCnt;
4506         structGrpinf.u8AcChroma2Cnt = pNJPEGContext->_Huff_info[pNJPEGContext->eNJPDNum][ac_tbl_num_chroma2].u8SymbolCnt;
4507     }
4508     MDrv_NJPD_WriteGrpinf(structGrpinf);
4509 }
4510 //------------------------------------------------------------------------------
4511 // Write RLE result
JPEG_write_RLE(JPEG_SVLD * pVld,MS_BOOL bDecodeNow)4512 JPEG_STATIC MS_BOOL JPEG_write_RLE(JPEG_SVLD *pVld, MS_BOOL bDecodeNow)
4513 {
4514     MS_U8 *mrc_buffer = (MS_U8 *) (MS_VIRT)MRC_BUFFER_ADDR;
4515     MS_U16 status;
4516     MS_U32 start_time;
4517 
4518     JPEG_memcpy((void *)(mrc_buffer + pNJPEGContext->_u32RLEOffset[pNJPEGContext->eNJPDNum]), (void *)pVld, 4);
4519     pNJPEGContext->_u32RLEOffset[pNJPEGContext->eNJPDNum] += 4;
4520 
4521     // Check if buffer full
4522     if((MRC_BUFFER_SIZE == pNJPEGContext->_u32RLEOffset[pNJPEGContext->eNJPDNum])
4523     || (TRUE == bDecodeNow))
4524     {
4525         JPEG_DEBUG_API_MSG("Do RLE, LENG 0x%tx, bDecodeNow = %td\n", (ptrdiff_t)pNJPEGContext->_u32RLEOffset[pNJPEGContext->eNJPDNum], (ptrdiff_t)bDecodeNow);
4526         JPEG_DEBUG_API_MSG("CPU Sync and Flush Memory~~~~\n");
4527         MAsm_CPU_Sync();
4528         MsOS_FlushMemory();
4529 
4530         if(pNJPEGContext->_bFirstRLE[pNJPEGContext->eNJPDNum] == TRUE)
4531         {
4532             // Trigger NJPD decoding
4533             if(!JPEG_StartDecode())
4534                 return FALSE;
4535             pNJPEGContext->_bFirstRLE[pNJPEGContext->eNJPDNum] = FALSE;
4536         }
4537         if(MDrv_NJPD_IsNeedToPatch(E_NJPD_EAGLE_SW_PATCH))
4538         {
4539 
4540     // part 1
4541             {
4542                 // clear MRC low/high portion read complete event
4543                 MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC0_EMPTY);
4544 
4545                 if(MRC_BUFFER_SIZE/2 >= pNJPEGContext->_u32RLEOffset[pNJPEGContext->eNJPDNum])
4546                 {
4547                     if(TRUE == bDecodeNow)
4548                     {
4549                         JPEG_DEBUG_API_MSG("last one bit enable~~1\n");
4550                         MDrv_NJPD_ReadLastBuffer();
4551                     }
4552                     else
4553                     {
4554                         JPEG_DEBUG_API_ERR("something strange~~~\n");
4555                     }
4556                     MDrv_NJPD_SetMRC_Valid(NJPD_MRC0_VALID);
4557                 }
4558                 else
4559                 {
4560                     MDrv_NJPD_SetMRC_Valid(NJPD_MRC0_VALID);
4561 
4562                     if(TRUE == bDecodeNow)
4563                     {
4564                         JPEG_DEBUG_API_MSG("last one bit enable~~2\n");
4565                         MDrv_NJPD_ReadLastBuffer();
4566                     }
4567                 }
4568             }
4569 
4570     #if MSOS_GET_SYSTEM_TIME
4571             start_time = MsOS_GetSystemTime();
4572     #else
4573             start_time = 0;
4574     #endif
4575 
4576     #if 0
4577             if( bDecodeNow )
4578             {
4579                 return TRUE;  //wait done in main loop
4580             }
4581     #endif
4582 
4583             while(1)
4584             {
4585                 //status = MDrv_NJPD_ReadNJPDStatus();
4586                 status = MDrv_NJPD_GetEventFlag();
4587                 if(status & E_NJPD_EVENT_DEC_DONE)
4588                 {
4589                     if(MDrv_NJPD_IsNeedToPatch(E_NJPD_MIU_LAST_Z_PATCH))
4590                     {
4591                         MsOS_DelayTask(1);
4592                     }
4593                     JPEG_DEBUG_API_MSG("P deocde done\n");
4594                     break;
4595                 }
4596 
4597                 if((status & E_NJPD_EVENT_MINICODE_ERR) || (status & E_NJPD_EVENT_INV_SCAN_ERR)
4598                     || (status & E_NJPD_EVENT_RES_MARKER_ERR) || (status & E_NJPD_EVENT_RMID_ERR)
4599     //                || (status & E_NJPD_EVENT_WRITE_PROTECT)
4600                     )
4601                 {
4602                     // temp patch for protect NJPD from writing to illegal memory
4603                     JPEG_DEBUG_API_MSG("CurRow = %d, CurCol = %d ",
4604                             MDrv_NJPD_GetCurRow(),
4605                             MDrv_NJPD_GetCurCol());
4606                     JPEG_DEBUG_API_MSG("CurMRCAddr = 0x%tx\n", (ptrdiff_t)MDrv_NJPD_GetCurMRCAddr());
4607                     MDrv_NJPD_Debug();
4608     //                while(1);
4609                     MDrv_NJPD_Rst();
4610 
4611                     JPEG_terminate( E_JPEG_JPD_DECODE_ERROR );
4612                     return FALSE;
4613                 }
4614 
4615                 if(status & E_NJPD_EVENT_MRC0_EMPTY)
4616                 {
4617                     JPEG_DEBUG_API_MSG("E_NJPD_EVENT_MRC0_EMPTY\n");
4618                     break;
4619                 }
4620 
4621     #if MSOS_GET_SYSTEM_TIME
4622                 if((MsOS_GetSystemTime() - start_time) >= WRITE_RLE_TIMEOUT_MS)
4623     #else
4624                 if(start_time++ > WRITE_RLE_TIMEOUT_COUNT)
4625     #endif
4626                 {
4627                     JPEG_DEBUG_API_MSG("Partial SVLD decode time out\n");
4628                     // temp patch for protect NJPD from writing to illegal memory
4629                     JPEG_DEBUG_API_MSG("CurRow = %d, CurCol = %d ",
4630                             MDrv_NJPD_GetCurRow(),
4631                             MDrv_NJPD_GetCurCol());
4632                     JPEG_DEBUG_API_MSG("CurMRCAddr = 0x%tx\n", (ptrdiff_t)MDrv_NJPD_GetCurMRCAddr());
4633                     MDrv_NJPD_Debug();
4634                     MDrv_NJPD_Rst();
4635 
4636                     JPEG_terminate( E_JPEG_JPD_DECODE_ERROR );
4637                     return FALSE;
4638                 }
4639             }
4640 
4641     // part 2
4642             {
4643                 // clear MRC low/high portion read complete event
4644                 MDrv_NJPD_SetEventFlag( E_NJPD_EVENT_MRC1_EMPTY);
4645 
4646                 if(MRC_BUFFER_SIZE/2 >= pNJPEGContext->_u32RLEOffset[pNJPEGContext->eNJPDNum])
4647                 {
4648                     // Whether it is last buffer or not, the last buffer status had been set in part 1
4649                     // So, we do not need to do anything here
4650                 }
4651                 else
4652                 {
4653                     MDrv_NJPD_SetMRC_Valid(NJPD_MRC1_VALID);
4654                 }
4655             }
4656 
4657     #if MSOS_GET_SYSTEM_TIME
4658             start_time = MsOS_GetSystemTime();
4659     #else
4660             start_time = 0;
4661     #endif
4662 
4663             if( bDecodeNow )
4664             {
4665                 return TRUE;  //wait done in main loop
4666             }
4667 
4668             while(1)
4669             {
4670                 //status = MDrv_NJPD_ReadNJPDStatus();
4671                 status = MDrv_NJPD_GetEventFlag();
4672                 if(status & E_NJPD_EVENT_DEC_DONE)
4673                 {
4674                     if(MDrv_NJPD_IsNeedToPatch(E_NJPD_MIU_LAST_Z_PATCH))
4675                     {
4676                         MsOS_DelayTask(1);
4677                     }
4678                     JPEG_DEBUG_API_MSG("P deocde done\n");
4679                     break;
4680                 }
4681 
4682                 if((status & E_NJPD_EVENT_MINICODE_ERR) || (status & E_NJPD_EVENT_INV_SCAN_ERR)
4683                     || (status & E_NJPD_EVENT_RES_MARKER_ERR) || (status & E_NJPD_EVENT_RMID_ERR)
4684     //                || (status & E_NJPD_EVENT_WRITE_PROTECT)
4685                     )
4686                 {
4687                     // temp patch for protect NJPD from writing to illegal memory
4688                     JPEG_DEBUG_API_MSG("CurRow = %d, CurCol = %d ",
4689                             MDrv_NJPD_GetCurRow(),
4690                             MDrv_NJPD_GetCurCol());
4691                     JPEG_DEBUG_API_MSG("CurMRCAddr = 0x%tx\n", (ptrdiff_t)MDrv_NJPD_GetCurMRCAddr());
4692                     MDrv_NJPD_Debug();
4693     //                while(1);
4694                     MDrv_NJPD_Rst();
4695 
4696                     JPEG_terminate( E_JPEG_JPD_DECODE_ERROR );
4697                     return FALSE;
4698                 }
4699 
4700                 if(status & E_NJPD_EVENT_MRC1_EMPTY)
4701                 {
4702                     JPEG_DEBUG_API_MSG("E_NJPD_EVENT_MRC1_EMPTY\n");
4703                     JPEG_DEBUG_API_MSG("Partial SVLD decode done\n");
4704                     break;
4705                 }
4706 
4707     #if MSOS_GET_SYSTEM_TIME
4708                 if((MsOS_GetSystemTime() - start_time) >= WRITE_RLE_TIMEOUT_MS)
4709     #else
4710                 if(start_time++ > WRITE_RLE_TIMEOUT_COUNT)
4711     #endif
4712                 {
4713                     JPEG_DEBUG_API_MSG("Partial SVLD decode time out\n");
4714                     // temp patch for protect NJPD from writing to illegal memory
4715                     JPEG_DEBUG_API_MSG("CurRow = %d, CurCol = %d ",
4716                             MDrv_NJPD_GetCurRow(),
4717                             MDrv_NJPD_GetCurCol());
4718                     JPEG_DEBUG_API_MSG("CurMRCAddr = 0x%tx\n", (ptrdiff_t)MDrv_NJPD_GetCurMRCAddr());
4719                     MDrv_NJPD_Debug();
4720                     MDrv_NJPD_Rst();
4721 
4722                     JPEG_terminate( E_JPEG_JPD_DECODE_ERROR );
4723                     return FALSE;
4724                 }
4725             }
4726 
4727 
4728         }
4729         else
4730         {
4731     #if 0 //progressive buffer vld will set here, not in startdecode
4732             else
4733     #endif
4734             {
4735                 // clear MRC low/high portion read complete event
4736                 MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC0_EMPTY | E_NJPD_EVENT_MRC1_EMPTY);
4737 
4738                 if(MRC_BUFFER_SIZE/2 >= pNJPEGContext->_u32RLEOffset[pNJPEGContext->eNJPDNum])
4739                 {
4740                     if(TRUE == bDecodeNow)
4741                     {
4742                         JPEG_DEBUG_API_MSG("last one bit enable~~ 1\n");
4743                         MDrv_NJPD_ReadLastBuffer();
4744                     }
4745                     else
4746                     {
4747                         JPEG_DEBUG_API_ERR("something strange~~~\n");
4748                     }
4749                     MDrv_NJPD_SetMRC_Valid(NJPD_MRC0_VALID);
4750                     MsOS_DelayTaskUs(100);
4751                     JPEG_DEBUG_API_MSG("MRC0 Delay~~~~ 1\n");
4752                 }
4753                 else
4754                 {
4755                     MDrv_NJPD_SetMRC_Valid(NJPD_MRC0_VALID);
4756                     MsOS_DelayTaskUs(100);
4757                     JPEG_DEBUG_API_MSG("MRC0 Delay~~~~ 2\n");
4758 
4759                     if(TRUE == bDecodeNow)
4760                     {
4761                         JPEG_DEBUG_API_MSG("last one bit enable~~ 2\n");
4762                         MDrv_NJPD_ReadLastBuffer();
4763                     }
4764                     MDrv_NJPD_SetMRC_Valid(NJPD_MRC1_VALID);
4765                 }
4766             }
4767 
4768     #if MSOS_GET_SYSTEM_TIME
4769             start_time = MsOS_GetSystemTime();
4770     #else
4771             start_time = 0;
4772     #endif
4773 
4774             if( bDecodeNow )
4775             {
4776                 return TRUE;  //wait done in main loop
4777             }
4778 
4779             while(1)
4780             {
4781                 //status = MDrv_NJPD_ReadNJPDStatus();
4782                 status = MDrv_NJPD_GetEventFlag();
4783                 if(status & E_NJPD_EVENT_DEC_DONE)
4784                 {
4785                     if(MDrv_NJPD_IsNeedToPatch(E_NJPD_MIU_LAST_Z_PATCH))
4786                     {
4787                         MsOS_DelayTask(1);
4788                     }
4789                     JPEG_DEBUG_API_MSG("P deocde done\n");
4790                     break;
4791                 }
4792 
4793                 if((status & E_NJPD_EVENT_MINICODE_ERR) || (status & E_NJPD_EVENT_INV_SCAN_ERR)
4794                     || (status & E_NJPD_EVENT_RES_MARKER_ERR) || (status & E_NJPD_EVENT_RMID_ERR)
4795     //                || (status & E_NJPD_EVENT_WRITE_PROTECT)
4796                     )
4797                 {
4798                     // temp patch for protect NJPD from writing to illegal memory
4799                     JPEG_DEBUG_API_MSG("CurRow = %d, CurCol = %d ",
4800                             MDrv_NJPD_GetCurRow(),
4801                             MDrv_NJPD_GetCurCol());
4802                     JPEG_DEBUG_API_MSG("CurMRCAddr = 0x%tx\n", (ptrdiff_t)MDrv_NJPD_GetCurMRCAddr());
4803                     MDrv_NJPD_Rst();
4804 
4805                     JPEG_terminate( E_JPEG_JPD_DECODE_ERROR );
4806                     return FALSE;
4807                 }
4808 
4809                 if((status & E_NJPD_EVENT_MRC0_EMPTY) && (status & E_NJPD_EVENT_MRC1_EMPTY))
4810                 {
4811                     JPEG_DEBUG_API_MSG("Partial SVLD decode done\n");
4812                     break;
4813                 }
4814 
4815     #if MSOS_GET_SYSTEM_TIME
4816                 if((MsOS_GetSystemTime() - start_time) >= WRITE_RLE_TIMEOUT_MS)
4817     #else
4818                 if(start_time++ > WRITE_RLE_TIMEOUT_COUNT)
4819     #endif
4820                 {
4821                     JPEG_DEBUG_API_MSG("Partial SVLD decode time out\n");
4822                     // temp patch for protect NJPD from writing to illegal memory
4823                     JPEG_DEBUG_API_MSG("CurRow = %d, CurCol = %d ",
4824                             MDrv_NJPD_GetCurRow(),
4825                             MDrv_NJPD_GetCurCol());
4826                     JPEG_DEBUG_API_MSG("CurMRCAddr = 0x%tx\n", (ptrdiff_t)MDrv_NJPD_GetCurMRCAddr());
4827                     MDrv_NJPD_Rst();
4828 
4829                     JPEG_terminate( E_JPEG_JPD_DECODE_ERROR );
4830                     return FALSE;
4831                 }
4832             }
4833         }
4834         pNJPEGContext->_u32RLEOffset[pNJPEGContext->eNJPDNum] = 0;
4835     }
4836     return TRUE;
4837 }
4838 //------------------------------------------------------------------------------
4839 // Do run length encode of coefficient buffer
4840 //JPEG_STATIC void JPEG_do_RLE(JPEG_BLOCK_TYPE *p, MS_BOOL eop, MS_U8 comp_id)
4841 #if 0
4842 JPEG_STATIC MS_BOOL JPEG_do_RLE(JPEG_BLOCK_TYPE *p, MS_BOOL eop, MS_U8 comp_id, MS_BOOL BlockInRange)
4843 {
4844     JPEG_SVLD my_vld;
4845     MS_U8 counter;
4846     MS_S16 value;
4847     MS_U16 run;
4848     MS_U8 cur_blk;
4849     JPEG_BLOCK_TYPE predictor;
4850 
4851     if(comp_id==0)
4852         cur_blk = 1;     // Y
4853     else if(comp_id==1)
4854         cur_blk = 3;    // U
4855     else
4856         cur_blk = 2;    // V
4857 
4858     predictor = _s16dc_pred[pNJPEGContext->eNJPDNum][cur_blk - 1];
4859 
4860     run = 0;
4861     my_vld.byte0 = my_vld.byte1 = my_vld.byte2 = my_vld.byte3 = 0;
4862     my_vld.blk_type = cur_blk;
4863 
4864     //sent DC info
4865 ////    my_vld.run = 8;
4866     if( BlockInRange )//Current block is within display range.
4867         my_vld.run = 8;
4868     else
4869         my_vld.run = 0;
4870 
4871     value = (p[0] - predictor);
4872     my_vld.sign = (value<0)?1:0;
4873     my_vld.amp = JPEG_ABS(value);
4874     my_vld.sym_type = E_RLE_DC;
4875     if(!JPEG_write_RLE(&my_vld, FALSE))
4876         return FALSE;
4877 
4878     if( BlockInRange == FALSE )//Current block is not within display range.
4879         return TRUE;
4880 
4881     my_vld.byte0 = my_vld.byte1 =my_vld.byte2 = my_vld.byte3= 0;
4882     my_vld.blk_type = cur_blk;
4883 
4884     for(counter = 1;counter<64; counter++)
4885     {
4886         if(p[counter]==0)
4887         {
4888             run++;
4889         }
4890         else
4891         {
4892             while(run>15)
4893             {
4894                 my_vld.sign = 0;
4895                 my_vld.amp = 0;
4896                 my_vld.sym_type = E_RLE_ZRL;
4897                 my_vld.run = 15;
4898                 if(!JPEG_write_RLE(&my_vld, FALSE))
4899                     return FALSE;
4900                 my_vld.byte0 = my_vld.byte1 = my_vld.byte2 = my_vld.byte3 = 0;
4901                 my_vld.blk_type = cur_blk;
4902                 run -= 16;
4903             }
4904 
4905             my_vld.sign = (p[counter]<0)?1:0;
4906             my_vld.amp = JPEG_ABS(p[counter]);
4907             my_vld.sym_type = E_RLE_AC;
4908             my_vld.run = run;
4909 
4910             // Check if the last byte is non-zero. If it's non-zero & EOP, add the EOP flag
4911             if(counter==63&&eop&&p[63]!=0)
4912             {
4913                 my_vld.EOP = 1;
4914                 if(!JPEG_write_RLE(&my_vld, TRUE))
4915                     return FALSE;
4916 
4917                 _s16dc_pred[pNJPEGContext->eNJPDNum][cur_blk - 1] = p[0];//update predictor
4918                 return TRUE;
4919             }
4920             else
4921             {
4922                 if(!JPEG_write_RLE(&my_vld, FALSE))
4923                     return FALSE;
4924             }
4925 
4926             my_vld.byte0 = my_vld.byte1 = my_vld.byte2 = my_vld.byte3 = 0;
4927             my_vld.blk_type = cur_blk;
4928             run = 0;
4929         }
4930     }
4931 
4932     counter = 63;
4933 
4934     if(p[counter]==0)
4935     {
4936         my_vld.amp = JPEG_ABS(p[counter]);
4937         my_vld.sign = p[counter]<0?1:0;
4938         my_vld.sym_type = E_RLE_EOB;
4939         my_vld.run = 0;
4940         if(eop)
4941         {
4942             my_vld.EOP = 1;
4943             if(!JPEG_write_RLE(&my_vld, TRUE))
4944                 return FALSE;
4945         }
4946         else
4947         {
4948             if(!JPEG_write_RLE(&my_vld, FALSE))
4949                 return FALSE;
4950         }
4951     }
4952 
4953     _s16dc_pred[pNJPEGContext->eNJPDNum][cur_blk - 1] = p[0];//update predictor
4954     return TRUE;
4955 }
4956 #else //nJPD
JPEG_do_RLE(JPEG_BLOCK_TYPE * p,MS_BOOL eop,MS_U8 comp_id,MS_BOOL BlockInRange)4957 JPEG_STATIC MS_BOOL JPEG_do_RLE(JPEG_BLOCK_TYPE *p, MS_BOOL eop, MS_U8 comp_id, MS_BOOL BlockInRange)
4958 {
4959     JPEG_SVLD my_vld;
4960     MS_U8 counter;
4961     MS_S16 value;
4962     MS_U16 run;
4963     MS_U8 cur_blk;
4964     JPEG_BLOCK_TYPE predictor;
4965 
4966     if(comp_id==0)
4967         cur_blk = 1;    // Y
4968     else if(comp_id==1)
4969         cur_blk = 3;    // U
4970     else
4971         cur_blk = 2;    // V
4972 
4973     predictor = pNJPEGContext->_s16dc_pred[pNJPEGContext->eNJPDNum][cur_blk - 1];
4974 
4975     run = 0;
4976     my_vld.byte0 = my_vld.byte1 = my_vld.byte2 = my_vld.byte3 = 0;
4977 
4978     //sent DC info
4979 ////    my_vld.run = 8;
4980     if( BlockInRange )//Current block is within display range.
4981         my_vld.run = 8;
4982     else
4983         my_vld.run = 0;
4984 
4985     value = (p[0] - predictor);
4986     my_vld.data = value;
4987 
4988     if(!JPEG_write_RLE(&my_vld, FALSE))
4989         return FALSE;
4990 
4991     if( BlockInRange == FALSE )//Current block is not within display range.
4992         return TRUE;
4993 
4994     my_vld.byte0 = my_vld.byte1 = my_vld.byte2 = my_vld.byte3 = 0;
4995 
4996     for(counter = 1; counter < 64; counter++)
4997     {
4998         if(p[counter]==0)
4999         {
5000             run++;
5001         }
5002         else
5003         {
5004             while(run>15)
5005             {
5006                 my_vld.data = 0;
5007                 my_vld.run = 15;
5008 
5009                 if(!JPEG_write_RLE(&my_vld, FALSE))
5010                     return FALSE;
5011                 my_vld.byte0 = my_vld.byte1 = my_vld.byte2 = my_vld.byte3 = 0;
5012                 run -= 16;
5013             }
5014 
5015             my_vld.data = p[counter];
5016             my_vld.run = run;
5017 
5018             // Check if the last byte is non-zero. If it's non-zero & EOP, add the EOP flag
5019             if(counter==63&&eop&&p[63]!=0)
5020             {
5021                 if(!JPEG_write_RLE(&my_vld, TRUE))
5022                     return FALSE;
5023 
5024                 pNJPEGContext->_s16dc_pred[pNJPEGContext->eNJPDNum][cur_blk - 1] = p[0];//update predictor
5025                 return TRUE;
5026             }
5027             else
5028             {
5029                 if(!JPEG_write_RLE(&my_vld, FALSE))
5030                     return FALSE;
5031             }
5032 
5033             my_vld.byte0 = my_vld.byte1 = my_vld.byte2 = my_vld.byte3 = 0;
5034             run = 0;
5035         }
5036     }
5037 
5038     counter = 63;
5039 
5040     if(p[counter]==0)
5041     {
5042         my_vld.data = p[counter];
5043         my_vld.EOB = 1;
5044         my_vld.run = 0;
5045         if(eop)
5046         {
5047             if(!JPEG_write_RLE(&my_vld, TRUE))
5048                 return FALSE;
5049         }
5050         else
5051         {
5052             if(!JPEG_write_RLE(&my_vld, FALSE))
5053                 return FALSE;
5054         }
5055     }
5056 
5057     pNJPEGContext->_s16dc_pred[pNJPEGContext->eNJPDNum][cur_blk - 1] = p[0];//update predictor
5058     return TRUE;
5059 }
5060 #endif
5061 
5062 //------------------------------------------------------------------------------
5063 // Starts a new scan.
JPEG_init_scan(void)5064 JPEG_STATIC MS_BOOL JPEG_init_scan(void)
5065 {
5066     if (!JPEG_locate_sos_marker())
5067         return FALSE;
5068 
5069     JPEG_calc_mcu_block_order();
5070 
5071     if(pNJPEGContext->_HeadCheck[pNJPEGContext->eNJPDNum].DHT == 0)
5072     {
5073         JPEG_read_default_dht();
5074         pNJPEGContext->_HeadCheck[pNJPEGContext->eNJPDNum].DHT = TRUE;
5075     }
5076 
5077     if (pNJPEGContext->_HeadCheck[pNJPEGContext->eNJPDNum].DHT)
5078     {
5079         if(!JPEG_check_huff_tables())
5080             return FALSE;
5081     }
5082 
5083     if (pNJPEGContext->_HeadCheck[pNJPEGContext->eNJPDNum].DQT)
5084     {
5085         if(!JPEG_check_quant_tables())
5086             return FALSE;
5087     }
5088 
5089 #if SUPPORT_PROGRESSIVE_MODE
5090     JPEG_memset((void *)pNJPEGContext->_u32Last_dc_val[pNJPEGContext->eNJPDNum], 0, pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum] * sizeof( MS_U32 ) );
5091 
5092     pNJPEGContext->_u32EOB_run[pNJPEGContext->eNJPDNum] = 0;
5093 #endif
5094 
5095     if ( pNJPEGContext->_u16Restart_interval[pNJPEGContext->eNJPDNum] )
5096     {
5097         pNJPEGContext->_u16Restarts_left[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16Restart_interval[pNJPEGContext->eNJPDNum];
5098         pNJPEGContext->_u16Next_restart_num[pNJPEGContext->eNJPDNum] = 0;
5099     }
5100 
5101 ////    _Total_Decoded_Size = (MS_S32)JPEG_GetECS();
5102 
5103     {
5104 #if SW_NJPD_RGB_CMYK
5105         if(pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum]
5106         || (E_JPEG_CMYK == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum])
5107         || (E_JPEG_RGB == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum]))
5108 #else
5109         if(pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum])
5110 #endif
5111         {
5112             // pre-fill bit buffer for later decoding
5113             pNJPEGContext->_s16Bits_left[pNJPEGContext->eNJPDNum] = 16;
5114             JPEG_get_bits_2( 16 );
5115             JPEG_get_bits_2( 16 );
5116         }
5117     }
5118 
5119     JPEG_DEBUG_API_MSG("JPEG_init_scan:ECS 0x%08tx\n", (ptrdiff_t)JPEG_GetECS());
5120 
5121     return TRUE;
5122 }
5123 
5124 #if SW_NJPD_RGB_CMYK
5125 //------------------------------------------------------------------------------
5126 // Create a few tables that allow us to quickly convert YCbCr to RGB.
msAPI_JPEG_create_look_ups(void)5127 JPEG_STATIC void msAPI_JPEG_create_look_ups( void )
5128 {
5129     MS_S16 i, k;
5130     //kevinhuang, modify
5131     /*
5132     for (i = 0; i <= 255; i++)
5133     {
5134       //k = (i * 2) - 255;
5135         k = (i * 2) - 256; // Dec. 28 2001- change so table[128] == 0
5136       gs32Crr[i] = ( FIX(1.40200/2)  * k + ONE_HALF) >> SCALEBITS;
5137       gs32Cbb[i] = ( FIX(1.77200/2)  * k + ONE_HALF) >> SCALEBITS;
5138       gs32Crg[i] = (-FIX(0.71414/2)) * k;
5139       gs32Cbg[i] = (-FIX(0.34414/2)) * k + ONE_HALF;
5140     }
5141     */
5142     for ( i = 0; i <= 255; i++ )
5143     {
5144         k = i - 128;
5145 
5146         pNJPEGContext->gs32Crr[i] = ( FIX( 1.40200 ) * k + ONE_HALF ) >> SCALEBITS;
5147         pNJPEGContext->gs32Cbb[i] = ( FIX( 1.77200 ) * k + ONE_HALF ) >> SCALEBITS;
5148 
5149         pNJPEGContext->gs32Crg[i] = ( -FIX( 0.71414 ) ) * k ; //+ ONE_HALF) >> SCALEBITS;???
5150         pNJPEGContext->gs32Cbg[i] = ( -FIX( 0.34414 ) ) * k + ONE_HALF; //>> SCALEBITS;???
5151 
5152     }
5153 }
5154 
5155 #endif //SW_NJPD_RGB_CMYK
5156 //------------------------------------------------------------------------------
5157 // Starts a frame. Determines if the number of components or sampling factors
5158 // are supported.
JPEG_init_frame(void)5159 JPEG_STATIC MS_BOOL JPEG_init_frame(void) //ok
5160 {
5161 #if SW_NJPD_RGB_CMYK
5162     MS_U32 i;
5163     MS_U8 *q;
5164 #endif
5165 
5166     JPEG_DEBUG_API_MSG("JPEG_init_frame:\n");
5167     if ( pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum] == 1 )
5168     {
5169         pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum] = E_JPEG_GRAYSCALE;
5170 
5171         pNJPEGContext->_u16Max_blocks_per_mcu[pNJPEGContext->eNJPDNum] = 1;
5172 
5173         pNJPEGContext->gu8Max_mcu_x_size[pNJPEGContext->eNJPDNum] = 8;
5174         pNJPEGContext->gu8Max_mcu_y_size[pNJPEGContext->eNJPDNum] = 8;
5175     }
5176     else if ( pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum] == 3 )
5177     {
5178         if ( ( ( pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][1] != 1 ) || ( pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][1] != 1 ) ) ||   //support only U_H1V1 & V_H1V1
5179             ( ( pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][2] != 1 ) || ( pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][2] != 1 ) ) )
5180         {
5181             JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
5182             return FALSE;
5183         }
5184 
5185         if ( ( pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][0] == 1 ) && ( pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][0] == 1 ) )
5186         {
5187             //set RGB based jpeg flag
5188             if(pNJPEGContext->_u8Comp_ident[pNJPEGContext->eNJPDNum][0] == 82 || pNJPEGContext->_u8Comp_ident[pNJPEGContext->eNJPDNum][0] == 71 || pNJPEGContext->_u8Comp_ident[pNJPEGContext->eNJPDNum][0] == 66)
5189             {
5190 #if SW_NJPD_RGB_CMYK
5191                 if( FALSE == pNJPEGContext->bEnableRGB )
5192                 {
5193                     JPEG_terminate( E_JPEG_UNSUPPORTED_COLORSPACE );
5194                     return FALSE;
5195                 }
5196                 JPEG_DEBUG_API_MSG("Get JPEG_RGB\n");
5197                 pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum] = E_JPEG_RGB; //RGB
5198 #else
5199                 JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
5200                 return FALSE;
5201 #endif
5202             }
5203             else
5204             {
5205                 JPEG_DEBUG_API_MSG("Get JPEG_YH1V1\n");
5206                 pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum] = E_JPEG_YH1V1; //4:4:4
5207             }
5208 
5209             pNJPEGContext->_u16Max_blocks_per_mcu[pNJPEGContext->eNJPDNum] = 3;
5210 
5211             pNJPEGContext->gu8Max_mcu_x_size[pNJPEGContext->eNJPDNum] = 8;
5212             pNJPEGContext->gu8Max_mcu_y_size[pNJPEGContext->eNJPDNum] = 8;
5213         }
5214         else if ( ( pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][0] == 2 ) && ( pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][0] == 1 ) )
5215         {
5216             pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum] = E_JPEG_YH2V1; //4:2:2
5217 
5218             pNJPEGContext->_u16Max_blocks_per_mcu[pNJPEGContext->eNJPDNum] = 4;
5219 
5220             pNJPEGContext->gu8Max_mcu_x_size[pNJPEGContext->eNJPDNum] = 16;
5221             pNJPEGContext->gu8Max_mcu_y_size[pNJPEGContext->eNJPDNum] = 8;
5222         }
5223         else if ( ( pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][0] == 1 ) && ( pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][0] == 2 ) )
5224         {
5225             pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum] = E_JPEG_YH1V2;
5226 
5227             pNJPEGContext->_u16Max_blocks_per_mcu[pNJPEGContext->eNJPDNum] = 4;
5228 
5229             pNJPEGContext->gu8Max_mcu_x_size[pNJPEGContext->eNJPDNum] = 8;
5230             pNJPEGContext->gu8Max_mcu_y_size[pNJPEGContext->eNJPDNum] = 16;
5231         }
5232         else if ( ( pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][0] == 2 ) && ( pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][0] == 2 ) )
5233         {
5234             pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum] = E_JPEG_YH2V2; //4:2:0
5235 
5236             pNJPEGContext->_u16Max_blocks_per_mcu[pNJPEGContext->eNJPDNum] = 6;
5237 
5238             pNJPEGContext->gu8Max_mcu_x_size[pNJPEGContext->eNJPDNum] = 16;
5239             pNJPEGContext->gu8Max_mcu_y_size[pNJPEGContext->eNJPDNum] = 16;
5240         }
5241         else if ( ( pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][0] == 4 ) && ( pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][0] == 1 ) )
5242         {
5243             // 4:1:1
5244             pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum] = E_JPEG_YH4V1;
5245 
5246             pNJPEGContext->_u16Max_blocks_per_mcu[pNJPEGContext->eNJPDNum] = 6;
5247 
5248             pNJPEGContext->gu8Max_mcu_x_size[pNJPEGContext->eNJPDNum] = 32;
5249             pNJPEGContext->gu8Max_mcu_y_size[pNJPEGContext->eNJPDNum] = 8;
5250         }
5251         else
5252         {
5253             JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
5254             return FALSE;
5255         }
5256     }
5257 #if SW_NJPD_RGB_CMYK
5258     else if(pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum] == 4) //handle YCCK & CMYK case, must distinguish YCCK and CMYK later
5259     {
5260         if( FALSE == pNJPEGContext->bEnableCMYK )
5261         {
5262             JPEG_terminate( E_JPEG_UNSUPPORTED_COLORSPACE );
5263             return FALSE;
5264         }
5265 
5266         if ( ( pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][0] == 1 ) && ( pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][0] == 1 ) )
5267         {
5268             JPEG_DEBUG_API_MSG("Get JPEG_CMYK\n");
5269             pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum] = E_JPEG_CMYK;
5270 
5271             pNJPEGContext->_u16Max_blocks_per_mcu[pNJPEGContext->eNJPDNum] = 4;
5272 
5273             pNJPEGContext->gu8Max_mcu_x_size[pNJPEGContext->eNJPDNum] = 8;
5274             pNJPEGContext->gu8Max_mcu_y_size[pNJPEGContext->eNJPDNum] = 8;
5275         }
5276         else
5277         {
5278             JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
5279             return FALSE;
5280         }
5281     }
5282 #endif
5283     else
5284     {
5285         JPEG_terminate( E_JPEG_UNSUPPORTED_COLORSPACE );
5286         return FALSE;
5287     }
5288 
5289     JPEG_DEBUG_API_MSG("JPEG_init_frame:gu8Scan_type[pNJPEGContext->eNJPDNum] = %d\n", pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum]);
5290 
5291     pNJPEGContext->gu16Max_mcus_per_row[pNJPEGContext->eNJPDNum] = ( pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] + ( pNJPEGContext->gu8Max_mcu_x_size[pNJPEGContext->eNJPDNum] - 1 ) ) / pNJPEGContext->gu8Max_mcu_x_size[pNJPEGContext->eNJPDNum];
5292     pNJPEGContext->_u16Max_mcus_per_col[pNJPEGContext->eNJPDNum] = ( pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum] + ( pNJPEGContext->gu8Max_mcu_y_size[pNJPEGContext->eNJPDNum] - 1 ) ) / pNJPEGContext->gu8Max_mcu_y_size[pNJPEGContext->eNJPDNum];
5293 
5294 #if SW_NJPD_RGB_CMYK
5295     if((E_JPEG_CMYK == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum])
5296     || (E_JPEG_RGB == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum]))
5297     {
5298         /* these values are for the *destination* pixels: after conversion */
5299 
5300         //Reset image x size by new Max_mcus
5301         pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] = pNJPEGContext->gu16Max_mcus_per_row[pNJPEGContext->eNJPDNum]*pNJPEGContext->gu8Max_mcu_x_size[pNJPEGContext->eNJPDNum];
5302 
5303         pNJPEGContext->_u16NonAlignmentImage_x_size[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum];
5304 
5305         if ( E_JPEG_GRAYSCALE == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum] )
5306         {
5307             pNJPEGContext->_u8Dest_bytes_per_pixel = 1;
5308         }
5309         else
5310             //kevinhuang, ToDo 4 -> 3 later
5311         {
5312             pNJPEGContext->_u8Dest_bytes_per_pixel = 4;
5313         }
5314 
5315         pNJPEGContext->_u16Dest_bytes_per_scan_line = ( ( pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] + 15 ) & 0xFFF0 ) * pNJPEGContext->_u8Dest_bytes_per_pixel;
5316 //        _u16Real_dest_bytes_per_scan_line = ( _u16Image_x_size[pNJPEGContext->eNJPDNum] * _u8Dest_bytes_per_pixel );
5317 
5318         // Initialize two scan line buffers.
5319         // FIXME: Only the V2 sampling factors need two buffers.
5320         #define DC_ALIGNMENT    16
5321         //pgu8Scan_line_0         = (U8 *)alloc(_u16Dest_bytes_per_scan_line + 8);
5322         pNJPEGContext->pgu8Scan_line_0 = ( MS_U8 * )JPEG_alloc( pNJPEGContext->_u16Dest_bytes_per_scan_line + DC_ALIGNMENT * 4 );
5323         if(pNJPEGContext->pgu8Scan_line_0 == NULL)
5324             return FALSE;
5325         JPEG_memset( pNJPEGContext->pgu8Scan_line_0, 0x7F, pNJPEGContext->_u16Dest_bytes_per_scan_line ); //kevinhuang, write dummy bytes for DC pitch alignment to display right border in certain color thru VE
5326 
5327         //pgu8scan_line_1         = (U8 *)alloc(_u16Dest_bytes_per_scan_line + 8);
5328         pNJPEGContext->pgu8scan_line_1 = ( MS_U8 * )JPEG_alloc( pNJPEGContext->_u16Dest_bytes_per_scan_line + DC_ALIGNMENT * 4 );
5329         if(pNJPEGContext->pgu8scan_line_1 == NULL)
5330             return FALSE;
5331         JPEG_memset( pNJPEGContext->pgu8scan_line_1, 0x7F, pNJPEGContext->_u16Dest_bytes_per_scan_line ); //kevinhuang, write dummy bytes for DC pitch alignment to display right border in certain color thru VE
5332     }
5333 #endif
5334 
5335     pNJPEGContext->_u32Max_blocks_per_row[pNJPEGContext->eNJPDNum] = pNJPEGContext->gu16Max_mcus_per_row[pNJPEGContext->eNJPDNum] * pNJPEGContext->_u16Max_blocks_per_mcu[pNJPEGContext->eNJPDNum];
5336 
5337     // Should never happen
5338     if ( pNJPEGContext->_u32Max_blocks_per_row[pNJPEGContext->eNJPDNum] > JPEG_MAXBLOCKSPERROW )
5339     {
5340         JPEG_terminate( E_JPEG_ASSERTION_ERROR );
5341         return FALSE;
5342     }
5343 
5344 #if SW_NJPD_RGB_CMYK
5345     if((E_JPEG_CMYK == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum])
5346     || (E_JPEG_RGB == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum]))
5347     {
5348         // Allocate the coefficient buffer, enough for one row's worth of MCU's
5349         q = ( MS_U8 * )JPEG_alloc( pNJPEGContext->_u32Max_blocks_per_row[pNJPEGContext->eNJPDNum] * 64 * sizeof( JPEG_BLOCK_TYPE ) + 8 );
5350         if(q == NULL)
5351             return FALSE;
5352 
5353         // Align to 8-byte boundry, for MMX code
5354         q = ( MS_U8 * )( ( ( MS_VIRT )q + 7 ) & ~7 );
5355 
5356         // The _ps16Block_seg[] array's name dates back to the
5357         // 16-bit assembler implementation. "seg" stood for "segment".
5358         for ( i = 0; i < pNJPEGContext->_u32Max_blocks_per_row[pNJPEGContext->eNJPDNum]; i++ )
5359         {
5360             pNJPEGContext->_ps16Block_seg[i] = ( JPEG_BLOCK_TYPE * )( (MS_VIRT)q + i * 64 * sizeof( JPEG_BLOCK_TYPE ) );
5361         }
5362 
5363         for ( i = 0; i < pNJPEGContext->_u32Max_blocks_per_row[pNJPEGContext->eNJPDNum]; i++ )
5364         {
5365             pNJPEGContext->_u8Block_max_zag_set[i] = 64;
5366         }
5367 
5368         pNJPEGContext->gpu8Sample_buf = ( MS_U8 * )( ( ( MS_VIRT )JPEG_alloc( pNJPEGContext->_u32Max_blocks_per_row[pNJPEGContext->eNJPDNum] * 64 + 8 ) + 7 ) & ~7 );
5369         if(pNJPEGContext->gpu8Sample_buf == NULL)
5370             return FALSE;
5371 
5372         pNJPEGContext->_u16Total_lines_left[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum];
5373 
5374         msAPI_JPEG_create_look_ups();
5375     }
5376 #endif
5377 
5378 #if SUPPORT_PROGRESSIVE_MODE
5379     pNJPEGContext->_u16Total_lines_left[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16Max_mcus_per_col[pNJPEGContext->eNJPDNum] * pNJPEGContext->gu8Max_mcu_y_size[pNJPEGContext->eNJPDNum];
5380 #endif
5381     return TRUE;
5382 }
5383 //------------------------------------------------------------------------------
5384 #if SUPPORT_PROGRESSIVE_MODE
5385 //------------------------------------------------------------------------------
5386 // Restart interval processing.
JPEG_process_restart(void)5387 JPEG_STATIC MS_BOOL JPEG_process_restart(void)
5388 {
5389     MS_U16 i, c = 0;
5390 
5391     // Let's scan a little bit to find the marker, but not _too_ far.
5392     // 1536 is a "fudge factor" that determines how much to scan.
5393     for ( i = 1536; i > 0; i-- )
5394     {
5395         if ( JPEG_get_char() == 0xFF )
5396         {
5397             break;
5398         }
5399     }
5400 
5401     if ( i == 0 )
5402     {
5403         JPEG_terminate( E_JPEG_BAD_RESTART_MARKER );
5404         return FALSE;
5405     }
5406 
5407     for ( ; i > 0; i-- )
5408     {
5409         c = JPEG_get_char();
5410         if ( c != 0xFF )
5411         {
5412             break;
5413         }
5414     }
5415 
5416     if ( i == 0 )
5417     {
5418         JPEG_terminate( E_JPEG_BAD_RESTART_MARKER );
5419         return FALSE;
5420     }
5421 
5422     // Is it the expected marker? If not, something bad happened.
5423     if ( c != ( pNJPEGContext->_u16Next_restart_num[pNJPEGContext->eNJPDNum] + E_JPEG_RST0 ) )
5424     {
5425         JPEG_terminate( E_JPEG_BAD_RESTART_MARKER );
5426         return FALSE;
5427     }
5428 
5429     // Reset each component's DC prediction values.
5430     JPEG_memset((void *)&pNJPEGContext->_u32Last_dc_val[pNJPEGContext->eNJPDNum], 0, pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum] * sizeof( MS_U32 ) );
5431 
5432     pNJPEGContext->_u32EOB_run[pNJPEGContext->eNJPDNum] = 0;
5433 
5434     pNJPEGContext->_u16Restarts_left[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16Restart_interval[pNJPEGContext->eNJPDNum];
5435 
5436     pNJPEGContext->_u16Next_restart_num[pNJPEGContext->eNJPDNum] = ( pNJPEGContext->_u16Next_restart_num[pNJPEGContext->eNJPDNum] + 1 ) & 7;
5437 
5438     // Get the bit buffer going again...
5439     {
5440         pNJPEGContext->_s16Bits_left[pNJPEGContext->eNJPDNum] = 16;
5441         JPEG_get_bits_2( 16 );
5442         JPEG_get_bits_2( 16 );
5443     }
5444     return TRUE;
5445 }
5446 //------------------------------------------------------------------------------
5447 // The following methods decode the various types of blocks encountered
5448 // in progressively encoded images.
JPEG_decode_block_dc_first(MS_U8 component_id,MS_U16 block_x,MS_U16 block_y)5449 JPEG_STATIC MS_BOOL JPEG_decode_block_dc_first(//JPEG_DECODER *Pd,
5450   MS_U8 component_id, MS_U16 block_x, MS_U16 block_y)
5451 {
5452     MS_S32 s, r;
5453     JPEG_BLOCK_TYPE *p = JPEG_coeff_buf_getp( pNJPEGContext->_DC_Coeffs[pNJPEGContext->eNJPDNum][component_id], block_x, block_y );
5454 
5455     if(p == NULL)
5456     {
5457         JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
5458         return FALSE;
5459     }
5460 
5461     s = JPEG_huff_decode( &pNJPEGContext->_Huff_tbls[pNJPEGContext->eNJPDNum][pNJPEGContext->_u8Comp_dc_tab[pNJPEGContext->eNJPDNum][component_id]] );
5462     if ( s != 0 )
5463     {
5464         r = JPEG_get_bits_2( s );
5465         s = HUFF_EXTEND_P( r, s );
5466     }
5467 
5468     // In NJPD mode, the DC coefficient is the difference of nearest DC
5469     pNJPEGContext->_u32Last_dc_val[pNJPEGContext->eNJPDNum][component_id] = ( s += pNJPEGContext->_u32Last_dc_val[pNJPEGContext->eNJPDNum][component_id] );
5470 
5471     p[0] = s << pNJPEGContext->_u8Successive_low[pNJPEGContext->eNJPDNum];
5472     return TRUE;
5473 }
5474 //------------------------------------------------------------------------------
JPEG_decode_block_dc_refine(MS_U8 component_id,MS_U16 block_x,MS_U16 block_y)5475 JPEG_STATIC MS_BOOL JPEG_decode_block_dc_refine(//JPEG_DECODER *Pd,
5476   MS_U8 component_id, MS_U16 block_x, MS_U16 block_y)
5477 {
5478     if ( JPEG_get_bits_2( 1 ) )
5479     {
5480         JPEG_BLOCK_TYPE *p = JPEG_coeff_buf_getp( pNJPEGContext->_DC_Coeffs[pNJPEGContext->eNJPDNum][component_id], block_x, block_y );
5481 
5482         if(p == NULL)
5483         {
5484             JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
5485             return FALSE;
5486         }
5487 
5488         p[0] |= ( 1 << pNJPEGContext->_u8Successive_low[pNJPEGContext->eNJPDNum] );
5489     }
5490     return TRUE;
5491 }
5492 //------------------------------------------------------------------------------
JPEG_decode_block_ac_first(MS_U8 component_id,MS_U16 block_x,MS_U16 block_y)5493 JPEG_STATIC MS_BOOL JPEG_decode_block_ac_first(//JPEG_DECODER *Pd,
5494   MS_U8 component_id, MS_U16 block_x, MS_U16 block_y)
5495 {
5496     JPEG_BLOCK_TYPE *p;
5497     MS_S32 k, s, r;
5498 
5499     if ( pNJPEGContext->_u32EOB_run[pNJPEGContext->eNJPDNum] )
5500     {
5501         pNJPEGContext->_u32EOB_run[pNJPEGContext->eNJPDNum]--;
5502         return TRUE;
5503     }
5504 
5505     p = JPEG_coeff_buf_getp( pNJPEGContext->_AC_Coeffs[pNJPEGContext->eNJPDNum][component_id], block_x, block_y );
5506 
5507     if(p == NULL)
5508     {
5509         JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
5510         return FALSE;
5511     }
5512 
5513     for ( k = pNJPEGContext->_u8Spectral_start[pNJPEGContext->eNJPDNum]; k <= pNJPEGContext->_u8Spectral_end[pNJPEGContext->eNJPDNum]; k++ )
5514     {
5515         s = JPEG_huff_decode( &pNJPEGContext->_Huff_tbls[pNJPEGContext->eNJPDNum][pNJPEGContext->_u8Comp_ac_tab[pNJPEGContext->eNJPDNum][component_id]] );
5516 
5517         r = s >> 4;
5518         s &= 15;
5519 
5520         if ( s )
5521         {
5522             k += r;
5523             if ( k > 63 )
5524             {
5525                 JPEG_terminate( E_JPEG_DECODE_ERROR );
5526                 return FALSE;
5527             }
5528 
5529             r = JPEG_get_bits_2( s );
5530             s = HUFF_EXTEND_P( r, s );
5531 
5532             // No need to do ZAG order in NJPD mode
5533 #if SW_NJPD_RGB_CMYK
5534             if((E_JPEG_CMYK == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum])
5535             || (E_JPEG_RGB == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum]))
5536             {
5537                 p[_u8ZAG[k]] = s << pNJPEGContext->_u8Successive_low[pNJPEGContext->eNJPDNum];
5538             }
5539             else
5540 #endif
5541             {
5542                 p[k] = s << pNJPEGContext->_u8Successive_low[pNJPEGContext->eNJPDNum];
5543             }
5544         }
5545         else
5546         {
5547             if ( r == 15 )
5548             {
5549                 k += 15;
5550                 if ( k > 63 )
5551                 {
5552                     JPEG_terminate( E_JPEG_DECODE_ERROR );
5553                     return FALSE;
5554                 }
5555             }
5556             else
5557             {
5558                 pNJPEGContext->_u32EOB_run[pNJPEGContext->eNJPDNum] = 1 << r;
5559 
5560                 if ( r )
5561                 {
5562                     pNJPEGContext->_u32EOB_run[pNJPEGContext->eNJPDNum] += JPEG_get_bits_2( r );
5563                 }
5564 
5565                 pNJPEGContext->_u32EOB_run[pNJPEGContext->eNJPDNum]--;
5566 
5567                 break;
5568             }
5569         }
5570     }
5571     return TRUE;
5572 }
5573 //------------------------------------------------------------------------------
JPEG_decode_block_ac_refine(MS_U8 component_id,MS_U16 block_x,MS_U16 block_y)5574 JPEG_STATIC MS_BOOL JPEG_decode_block_ac_refine(//JPEG_DECODER *Pd,
5575   MS_U8 component_id, MS_U16 block_x, MS_U16 block_y)
5576 {
5577     MS_S32 s, k, r;
5578     MS_S32 p1 = 1 << pNJPEGContext->_u8Successive_low[pNJPEGContext->eNJPDNum];
5579     MS_S32 m1 = ( -1 ) << pNJPEGContext->_u8Successive_low[pNJPEGContext->eNJPDNum];
5580     JPEG_BLOCK_TYPE *p = JPEG_coeff_buf_getp( pNJPEGContext->_AC_Coeffs[pNJPEGContext->eNJPDNum][component_id], block_x, block_y );
5581 
5582     if(p == NULL)
5583     {
5584         JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
5585         return FALSE;
5586     }
5587 
5588     k = pNJPEGContext->_u8Spectral_start[pNJPEGContext->eNJPDNum];
5589 
5590     if ( pNJPEGContext->_u32EOB_run[pNJPEGContext->eNJPDNum] == 0 )
5591     {
5592         for ( ; (k <= pNJPEGContext->_u8Spectral_end[pNJPEGContext->eNJPDNum]) && ( k < 64 ); k++ )
5593         {
5594             s = JPEG_huff_decode( &pNJPEGContext->_Huff_tbls[pNJPEGContext->eNJPDNum][pNJPEGContext->_u8Comp_ac_tab[pNJPEGContext->eNJPDNum][component_id]] );
5595 
5596             r = s >> 4;
5597             s &= 15;
5598 
5599             if ( s )
5600             {
5601                 if ( s != 1 )
5602                 {
5603                     JPEG_terminate( E_JPEG_DECODE_ERROR );
5604                     return FALSE;
5605                 }
5606 
5607                 if ( JPEG_get_bits_2( 1 ) )
5608                 {
5609                     s = p1;
5610                 }
5611                 else
5612                 {
5613                     s = m1;
5614                 }
5615             }
5616             else
5617             {
5618                 if ( r != 15 )
5619                 {
5620                     pNJPEGContext->_u32EOB_run[pNJPEGContext->eNJPDNum] = 1 << r;
5621 
5622                     if ( r )
5623                     {
5624                         pNJPEGContext->_u32EOB_run[pNJPEGContext->eNJPDNum] += JPEG_get_bits_2( r );
5625                     }
5626 
5627                     break;
5628                 }
5629             }
5630 
5631             do
5632             {
5633                 // No need to do ZAG order in NJPD mode
5634                 JPEG_BLOCK_TYPE *this_coef;
5635 #if SW_NJPD_RGB_CMYK
5636                 if((E_JPEG_CMYK == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum])
5637                 || (E_JPEG_RGB == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum]))
5638                 {
5639                     this_coef = p + _u8ZAG[k];
5640                 }
5641                 else
5642 #endif
5643                 {
5644                     this_coef = p + k;
5645                 }
5646 
5647                 if ( *this_coef != 0 )
5648                 {
5649                     if ( JPEG_get_bits_2( 1 ) )
5650                     {
5651                         if ( ( *this_coef & p1 ) == 0 )
5652                         {
5653                             if ( *this_coef >= 0 )
5654                             {
5655                                 *this_coef += p1;
5656                             }
5657                             else
5658                             {
5659                                 *this_coef += m1;
5660                             }
5661                         }
5662                     }
5663                 }
5664                 else
5665                 {
5666                     if ( --r < 0 )
5667                     {
5668                         break;
5669                     }
5670                 }
5671 
5672                 k++;
5673             }
5674             while ( (k <= pNJPEGContext->_u8Spectral_end[pNJPEGContext->eNJPDNum]) && ( k < 64 ) );
5675 
5676             if ( ( s ) && ( k < 64 ) )
5677             {
5678                 // No need to do ZAG order in NJPD mode
5679 #if SW_NJPD_RGB_CMYK
5680                 if((E_JPEG_CMYK == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum])
5681                 || (E_JPEG_RGB == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum]))
5682                 {
5683                     p[_u8ZAG[k]] = s;
5684                 }
5685                 else
5686 #endif
5687                 {
5688                     p[k] = s;
5689                 }
5690             }
5691         }
5692     }
5693 
5694     if ( pNJPEGContext->_u32EOB_run[pNJPEGContext->eNJPDNum] > 0 )
5695     {
5696         for ( ; (k <= pNJPEGContext->_u8Spectral_end[pNJPEGContext->eNJPDNum]) && ( k < 64 ); k++ )
5697         {
5698             // No need to do ZAG order in NJPD mode
5699             JPEG_BLOCK_TYPE *this_coef;
5700 #if SW_NJPD_RGB_CMYK
5701             if((E_JPEG_CMYK == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum])
5702             || (E_JPEG_RGB == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum]))
5703             {
5704                 this_coef = p + _u8ZAG[k];
5705             }
5706             else
5707 #endif
5708             {
5709                 this_coef = p + k;
5710             }
5711 
5712             if ( *this_coef != 0 )
5713             {
5714                 if ( JPEG_get_bits_2( 1 ) )
5715                 {
5716                     if ( ( *this_coef & p1 ) == 0 )
5717                     {
5718                         if ( *this_coef >= 0 )
5719                         {
5720                             *this_coef += p1;
5721                         }
5722                         else
5723                         {
5724                             *this_coef += m1;
5725                         }
5726                     }
5727                 }
5728             }
5729         }
5730 
5731         pNJPEGContext->_u32EOB_run[pNJPEGContext->eNJPDNum]--;
5732     }
5733     return TRUE;
5734 }
5735 //------------------------------------------------------------------------------
5736 // Decode a scan in a progressively encoded image.
JPEG_decode_scan(Pdecode_block_func decode_block_func)5737 JPEG_STATIC MS_BOOL JPEG_decode_scan(Pdecode_block_func decode_block_func)
5738 {
5739     MS_U16 mcu_row, mcu_col, mcu_block;
5740     MS_U32 block_x_mcu[JPEG_MAXCOMPONENTS], block_y_mcu[JPEG_MAXCOMPONENTS];
5741 
5742     JPEG_memset((void *)block_y_mcu, 0, sizeof( block_y_mcu ) );
5743 
5744     for ( mcu_col = 0; mcu_col < pNJPEGContext->_u16Mcus_per_col[pNJPEGContext->eNJPDNum]; mcu_col++ )
5745     {
5746         MS_U32 component_num, component_id;
5747 
5748         JPEG_memset((void *)block_x_mcu, 0, sizeof( block_x_mcu ) );
5749 
5750         for ( mcu_row = 0; mcu_row < pNJPEGContext->_u16Mcus_per_row[pNJPEGContext->eNJPDNum]; mcu_row++ )
5751         {
5752             MS_U8 block_x_mcu_ofs = 0, block_y_mcu_ofs = 0;
5753 
5754             if ( ( pNJPEGContext->_u16Restart_interval[pNJPEGContext->eNJPDNum] ) && ( pNJPEGContext->_u16Restarts_left[pNJPEGContext->eNJPDNum] == 0 ) )
5755             {
5756                 if(!JPEG_process_restart())
5757                     return FALSE;
5758             }
5759 
5760             for ( mcu_block = 0; mcu_block < pNJPEGContext->_u8Blocks_per_mcu[pNJPEGContext->eNJPDNum]; mcu_block++ )
5761             {
5762                 component_id = pNJPEGContext->_u8Mcu_org[pNJPEGContext->eNJPDNum][mcu_block];
5763 
5764                 if(!decode_block_func( component_id, block_x_mcu[component_id] + block_x_mcu_ofs, block_y_mcu[component_id] + block_y_mcu_ofs ))
5765                 {
5766                     JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
5767                     return FALSE;
5768                 }
5769 
5770                 if ( pNJPEGContext->_u8Comps_in_scan[pNJPEGContext->eNJPDNum] == 1 )
5771                 {
5772                     block_x_mcu[component_id]++;
5773                 }
5774                 else
5775                 {
5776                     if ( ++block_x_mcu_ofs == pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][component_id] )
5777                     {
5778                         block_x_mcu_ofs = 0;
5779 
5780                         if ( ++block_y_mcu_ofs == pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][component_id] )
5781                         {
5782                             block_y_mcu_ofs = 0;
5783 
5784                             block_x_mcu[component_id] += pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][component_id];
5785                         }
5786                     }
5787                 }
5788             }
5789 
5790             pNJPEGContext->_u16Restarts_left[pNJPEGContext->eNJPDNum]--;
5791         }
5792 
5793         if ( pNJPEGContext->_u8Comps_in_scan[pNJPEGContext->eNJPDNum] == 1 )
5794         {
5795             block_y_mcu[pNJPEGContext->_u8Comp_list[pNJPEGContext->eNJPDNum][0]]++;
5796         }
5797         else
5798         {
5799             for ( component_num = 0; component_num < pNJPEGContext->_u8Comps_in_scan[pNJPEGContext->eNJPDNum]; component_num++ )
5800             {
5801                 component_id = pNJPEGContext->_u8Comp_list[pNJPEGContext->eNJPDNum][component_num];
5802 
5803                 block_y_mcu[component_id] += pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][component_id];
5804             }
5805         }
5806     }
5807     return TRUE;
5808 }
5809 //------------------------------------------------------------------------------
5810 // Decode a progressively encoded image.
JPEG_init_progressive(void)5811 JPEG_STATIC MS_BOOL JPEG_init_progressive(void)
5812 {
5813     MS_U8 i;
5814 
5815     if ( pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum] == 4 )
5816     {
5817         JPEG_terminate( E_JPEG_UNSUPPORTED_COLORSPACE );
5818         return FALSE;
5819     }
5820 
5821     // Allocate the coefficient buffers.
5822     for ( i = 0; i < pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum]; i++ )
5823     {
5824         pNJPEGContext->_DC_Coeffs[pNJPEGContext->eNJPDNum][i] = JPEG_coeff_buf_open( ((pNJPEGContext->gu16Max_mcus_per_row[pNJPEGContext->eNJPDNum]+0x1)& ~0x1) * pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][i], ((pNJPEGContext->_u16Max_mcus_per_col[pNJPEGContext->eNJPDNum]+0x1)& ~0x1) * pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][i], 1, 1 );
5825         if(pNJPEGContext->_DC_Coeffs[pNJPEGContext->eNJPDNum][i] == NULL)
5826         {
5827             return FALSE;
5828         }
5829 
5830         pNJPEGContext->_AC_Coeffs[pNJPEGContext->eNJPDNum][i] = JPEG_coeff_buf_open( ((pNJPEGContext->gu16Max_mcus_per_row[pNJPEGContext->eNJPDNum]+0x1)& ~0x1) * pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][i], ((pNJPEGContext->_u16Max_mcus_per_col[pNJPEGContext->eNJPDNum]+0x1)& ~0x1) * pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][i], 8, 8 );
5831         if(pNJPEGContext->_AC_Coeffs[pNJPEGContext->eNJPDNum][i] == NULL)
5832         {
5833             return FALSE;
5834         }
5835     }
5836 
5837     for ( ; ; )
5838     {
5839         MS_BOOL dc_only_scan, refinement_scan;
5840         Pdecode_block_func decode_block_func;
5841 
5842         if (!JPEG_init_scan())
5843         {
5844             break;
5845         }
5846 
5847         dc_only_scan = ( pNJPEGContext->_u8Spectral_start[pNJPEGContext->eNJPDNum] == 0 );
5848         refinement_scan = ( pNJPEGContext->_u8Successive_high[pNJPEGContext->eNJPDNum] != 0 );
5849 
5850         if ( ( pNJPEGContext->_u8Spectral_start[pNJPEGContext->eNJPDNum] > pNJPEGContext->_u8Spectral_end[pNJPEGContext->eNJPDNum] ) || ( pNJPEGContext->_u8Spectral_end[pNJPEGContext->eNJPDNum] > 63 ) )
5851         {
5852             JPEG_terminate( E_JPEG_BAD_SOS_SPECTRAL );
5853             return FALSE;
5854         }
5855 
5856         if ( dc_only_scan )
5857         {
5858             if ( pNJPEGContext->_u8Spectral_end[pNJPEGContext->eNJPDNum] )
5859             {
5860                 JPEG_terminate( E_JPEG_BAD_SOS_SPECTRAL );
5861                 return FALSE;
5862             }
5863         }
5864         else if ( pNJPEGContext->_u8Comps_in_scan[pNJPEGContext->eNJPDNum] != 1 )  /* AC scans can only contain one component */
5865         {
5866             JPEG_terminate( E_JPEG_BAD_SOS_SPECTRAL );
5867             return FALSE;
5868         }
5869 
5870         if ( ( refinement_scan ) && ( pNJPEGContext->_u8Successive_low[pNJPEGContext->eNJPDNum] != pNJPEGContext->_u8Successive_high[pNJPEGContext->eNJPDNum] - 1 ) )
5871         {
5872             JPEG_terminate( E_JPEG_BAD_SOS_SUCCESSIVE );
5873             return FALSE;
5874         }
5875 
5876         if ( dc_only_scan )
5877         {
5878             if ( refinement_scan )
5879             {
5880                 decode_block_func = JPEG_decode_block_dc_refine;
5881             }
5882             else
5883             {
5884                 decode_block_func = JPEG_decode_block_dc_first;
5885             }
5886         }
5887         else
5888         {
5889             if ( refinement_scan )
5890             {
5891                 decode_block_func = JPEG_decode_block_ac_refine;
5892             }
5893             else
5894             {
5895                 decode_block_func = JPEG_decode_block_ac_first;
5896             }
5897         }
5898 
5899         if(!JPEG_decode_scan( decode_block_func ))
5900             return FALSE;
5901 
5902         pNJPEGContext->_s16Bits_left[pNJPEGContext->eNJPDNum] = 0;
5903     }
5904 
5905     pNJPEGContext->_u8Comps_in_scan[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum];
5906 
5907     for ( i = 0; i < pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum]; i++ )
5908     {
5909         pNJPEGContext->_u8Comp_list[pNJPEGContext->eNJPDNum][i] = i;
5910     }
5911 
5912     JPEG_calc_mcu_block_order();
5913     return TRUE;
5914 }
5915 #endif
5916 //------------------------------------------------------------------------------
JPEG_init_sequential(void)5917 JPEG_STATIC MS_BOOL JPEG_init_sequential(void)
5918 {
5919     if ( !JPEG_init_scan() )
5920     {
5921         JPEG_DEBUG_API_ERR("JPEG_init_scan - E_JPEG_UNEXPECTED_MARKER\n");
5922         JPEG_terminate( E_JPEG_UNEXPECTED_MARKER );
5923         return FALSE;
5924     }
5925     return TRUE;
5926 }
5927 //------------------------------------------------------------------------------
5928 #if 0
5929 JPEG_STATIC void JPEG_decode_start(void)
5930 {
5931     JPEG_init_frame();
5932 
5933     if ( _bProgressive_flag[pNJPEGContext->eNJPDNum] )
5934     {
5935         JPEG_init_progressive();
5936     }
5937     else
5938     {
5939         JPEG_init_sequential();
5940     }
5941 }
5942 #endif
5943 //------------------------------------------------------------------------------
5944 // Find the start of the JPEG file and reads enough data to determine
5945 // its size, number of components, etc.
JPEG_decode_init(void)5946 JPEG_STATIC MS_BOOL JPEG_decode_init(void)
5947 {
5948     MS_U16 pic_width, pic_height;
5949 
5950     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
5951 
5952     pNJPEGContext->_HeadCheck[pNJPEGContext->eNJPDNum].result = 0;
5953 
5954     if(!JPEG_init())
5955         return FALSE;
5956 
5957 #if SUPPORT_MPO_FORMAT
5958     pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum] = pNJPEGContext->_pu8In_buf_MPO_ofs[pNJPEGContext->eNJPDNum];
5959     pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u32In_buf_MPO_left[pNJPEGContext->eNJPDNum];
5960     JPEG_DEBUG_API_MSG("JPEG_decode_init(), set _pu8In_buf_ofs[pNJPEGContext->eNJPDNum]=0x%tx, _u32In_buf_left[pNJPEGContext->eNJPDNum]=0x%tx========\n", (ptrdiff_t)pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum], (ptrdiff_t)pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum]);
5961 #endif
5962 
5963     if(!JPEG_locate_sof_marker())
5964         return FALSE;
5965 
5966     if (pNJPEGContext->bMHEG5[pNJPEGContext->eNJPDNum])
5967     {
5968     if(pNJPEGContext->_Error_code[pNJPEGContext->eNJPDNum] == E_JPEG_UNSUPPORTED_MARKER)
5969         {
5970             return TRUE;
5971         }
5972     }
5973 
5974     if(pNJPEGContext->_u8DecodeType[pNJPEGContext->eNJPDNum] == E_JPEG_TYPE_THUMBNAIL)
5975     {
5976         if(pNJPEGContext->_bThumbnailFound[pNJPEGContext->eNJPDNum])
5977         {
5978             pNJPEGContext->_bThumbnailAccessMode[pNJPEGContext->eNJPDNum] = TRUE;
5979             ////MApi_JPEG_Finalize(); //replace with JPEG_free_all_blocks()
5980             JPEG_free_all_blocks();
5981 
5982             if(!JPEG_init())
5983                 return FALSE;
5984 
5985             // save the original image size, because msAPI_JPEG_init will reset all variables to 0
5986             if(!JPEG_locate_sof_marker())
5987                 return FALSE;
5988 
5989             if(pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum])
5990             {
5991                 JPEG_DEBUG_API_ERR("Progressive image in thumbnail... do not handle it\n");
5992                 JPEG_terminate( E_JPEG_BAD_APP1_MARKER );
5993                 return FALSE;
5994             }
5995         }
5996         else
5997         {
5998             JPEG_terminate( E_JPEG_NO_THUMBNAIL );
5999             return FALSE;
6000         }
6001     }
6002 
6003     // calculate aligned resolution
6004     JPEG_GetAlignedResolution(&pic_width, &pic_height);
6005     JPEG_DEBUG_API_MSG("pic_width = %d, pic_height = %d\n",pic_width, pic_height);
6006 
6007     pNJPEGContext->_u16AlignedImagePitch[pNJPEGContext->eNJPDNum] = pic_width;
6008     pNJPEGContext->_u16AlignedImagePitch_H[pNJPEGContext->eNJPDNum] = pic_height;
6009     pNJPEGContext->_u16AlignedImageWidth[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum];
6010     pNJPEGContext->_u16AlignedImageHeight[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum];
6011 
6012 #if SUPPORT_MPO_FORMAT
6013     if(pNJPEGContext->bIsMPOFormat[pNJPEGContext->eNJPDNum])
6014     {
6015         pNJPEGContext->JPEG_PRO_MAX_WIDTH[pNJPEGContext->eNJPDNum] = pNJPEGContext->JPEG_MPO_PRO_MAX_WIDTH[pNJPEGContext->eNJPDNum];
6016         pNJPEGContext->JPEG_PRO_MAX_HEIGHT[pNJPEGContext->eNJPDNum] = pNJPEGContext->JPEG_MPO_PRO_MAX_HEIGHT[pNJPEGContext->eNJPDNum];
6017         pNJPEGContext->JPEG_MAX_WIDTH[pNJPEGContext->eNJPDNum]  = pNJPEGContext->JPEG_MPO_MAX_WIDTH[pNJPEGContext->eNJPDNum];
6018         pNJPEGContext->JPEG_MAX_HEIGHT[pNJPEGContext->eNJPDNum]   = pNJPEGContext->JPEG_MPO_MAX_HEIGHT[pNJPEGContext->eNJPDNum];
6019     }
6020 #endif
6021 
6022     if(pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum])
6023     {
6024         pNJPEGContext->MAX_JPEG_WIDTH_HD[pNJPEGContext->eNJPDNum] = pNJPEGContext->JPEG_PRO_MAX_WIDTH[pNJPEGContext->eNJPDNum];
6025         pNJPEGContext->MAX_JPEG_HEIGHT_HD[pNJPEGContext->eNJPDNum] = pNJPEGContext->JPEG_PRO_MAX_HEIGHT[pNJPEGContext->eNJPDNum];
6026     }
6027     else
6028     {
6029         pNJPEGContext->MAX_JPEG_WIDTH_HD[pNJPEGContext->eNJPDNum] = pNJPEGContext->JPEG_MAX_WIDTH[pNJPEGContext->eNJPDNum];
6030         pNJPEGContext->MAX_JPEG_HEIGHT_HD[pNJPEGContext->eNJPDNum] = pNJPEGContext->JPEG_MAX_HEIGHT[pNJPEGContext->eNJPDNum];
6031     }
6032 
6033     // calculate down scale factor
6034     if ((pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] > pNJPEGContext->MAX_JPEG_WIDTH_HD[pNJPEGContext->eNJPDNum] * 4) || (pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum] > pNJPEGContext->MAX_JPEG_HEIGHT_HD[pNJPEGContext->eNJPDNum] * 4))
6035     {
6036         JPEG_DEBUG_API_MSG("down scale 1/8!!\n");
6037         pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum] = E_NJPD_DOWNSCALE_EIGHTH;
6038         pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] = 8;
6039     }
6040     else if ((pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] > pNJPEGContext->MAX_JPEG_WIDTH_HD[pNJPEGContext->eNJPDNum] * 2) || (pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum] > pNJPEGContext->MAX_JPEG_HEIGHT_HD[pNJPEGContext->eNJPDNum] * 2))
6041     {
6042         JPEG_DEBUG_API_MSG("down scale 1/4!!\n");
6043         pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum] = E_NJPD_DOWNSCALE_FOURTH;
6044         pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] = 4;
6045     }
6046     else if ((pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] > pNJPEGContext->MAX_JPEG_WIDTH_HD[pNJPEGContext->eNJPDNum]) || (pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum] > pNJPEGContext->MAX_JPEG_HEIGHT_HD[pNJPEGContext->eNJPDNum]))
6047     {
6048         JPEG_DEBUG_API_MSG("down scale 1/2!!\n");
6049         pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum] = E_NJPD_DOWNSCALE_HALF;
6050         pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] = 2;
6051     }
6052     else
6053     {
6054         JPEG_DEBUG_API_MSG("down scale 1/1!!\n");
6055         pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum] = E_NJPD_DOWNSCALE_ORG;
6056         pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] = 1;
6057     }
6058 
6059 #if (ENABLE_TEST_11_NJPEGScaleDownFunctionTest_2==TRUE) \
6060     || (ENABLE_TEST_11_NJPEGScaleDownFunctionTest_4==TRUE) \
6061     || (ENABLE_TEST_11_NJPEGScaleDownFunctionTest_8==TRUE)
6062     //downscale test(only for unit test)
6063 
6064     #if (ENABLE_TEST_11_NJPEGScaleDownFunctionTest_2==TRUE)
6065     pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum] = E_NJPD_DOWNSCALE_HALF;
6066     #elif (ENABLE_TEST_11_NJPEGScaleDownFunctionTest_4==TRUE)
6067     pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum] = E_NJPD_DOWNSCALE_FOURTH;
6068     #elif (ENABLE_TEST_11_NJPEGScaleDownFunctionTest_8==TRUE)
6069     pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum] = E_NJPD_DOWNSCALE_EIGHTH;
6070     #else
6071     pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum] = E_NJPD_DOWNSCALE_ORG;
6072     #endif
6073 
6074     if(pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum] == E_NJPD_DOWNSCALE_HALF)
6075     {
6076         pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] = 2;
6077     }
6078     else if(pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum] == E_NJPD_DOWNSCALE_FOURTH)
6079     {
6080         pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] = 4;
6081     }
6082     else if(pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum] == E_NJPD_DOWNSCALE_EIGHTH)
6083     {
6084         pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] = 8;
6085     }
6086 #else
6087     if(MDrv_NJPD_GetVerificationMode()==E_NJPD25_DOWNSCALE_1_2
6088         || MDrv_NJPD_GetVerificationMode()==E_NJPD25_DOWNSCALE_1_4
6089         || MDrv_NJPD_GetVerificationMode()==E_NJPD25_DOWNSCALE_1_8)
6090     {
6091         if(MDrv_NJPD_GetVerificationMode()==E_NJPD25_DOWNSCALE_1_2)
6092         {
6093             pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum] = E_NJPD_DOWNSCALE_HALF;
6094         }
6095         else if(MDrv_NJPD_GetVerificationMode()==E_NJPD25_DOWNSCALE_1_4)
6096         {
6097             pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum] = E_NJPD_DOWNSCALE_FOURTH;
6098         }
6099         else if(MDrv_NJPD_GetVerificationMode()==E_NJPD25_DOWNSCALE_1_8)
6100         {
6101             pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum] = E_NJPD_DOWNSCALE_EIGHTH;
6102         }
6103         else
6104         {
6105             pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum] = E_NJPD_DOWNSCALE_ORG;
6106         }
6107 
6108         if(pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum] == E_NJPD_DOWNSCALE_HALF)
6109         {
6110             pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] = 2;
6111         }
6112         else if(pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum] == E_NJPD_DOWNSCALE_FOURTH)
6113         {
6114             pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] = 4;
6115         }
6116         else if(pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum] == E_NJPD_DOWNSCALE_EIGHTH)
6117         {
6118             pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] = 8;
6119         }
6120     }
6121 #endif
6122 
6123     if (E_NJPD_DOWNSCALE_ORG != pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum])
6124     {
6125         pNJPEGContext->_u16AlignedImagePitch[pNJPEGContext->eNJPDNum] = pic_width / pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum];
6126         pNJPEGContext->_u16AlignedImagePitch_H[pNJPEGContext->eNJPDNum] =
6127             ((pic_height + ((MS_U32)pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] - 1)) & (~((MS_U32)pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] - 1)))/ pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum];
6128         pNJPEGContext->_u16AlignedImageWidth[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] / pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum];
6129         pNJPEGContext->_u16AlignedImageHeight[pNJPEGContext->eNJPDNum] =
6130                 ((pNJPEGContext->_u16AlignedImageHeight[pNJPEGContext->eNJPDNum] + ((MS_U32)pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] - 1)) & (~((MS_U32)pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] - 1))) / pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum];
6131     }
6132 
6133     switch (pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum])
6134     {
6135         case E_NJPD_DOWNSCALE_HALF:
6136             pNJPEGContext->ROI_width[pNJPEGContext->eNJPDNum] = (pic_width / 16) * 16;
6137             break;
6138 
6139         case E_NJPD_DOWNSCALE_FOURTH:
6140             pNJPEGContext->ROI_width[pNJPEGContext->eNJPDNum] = (pic_width / 32) * 32;
6141             break;
6142 
6143         case E_NJPD_DOWNSCALE_EIGHTH:
6144             pNJPEGContext->ROI_width[pNJPEGContext->eNJPDNum] = (pic_width / 64) * 64;
6145             break;
6146 
6147         default:
6148             pNJPEGContext->ROI_width[pNJPEGContext->eNJPDNum] = pic_width;
6149             break;
6150     }
6151     JPEG_DEBUG_API_MSG("Original ROI_width[pNJPEGContext->eNJPDNum] = %d \n", pNJPEGContext->ROI_width[pNJPEGContext->eNJPDNum]);
6152 
6153     if (pNJPEGContext->ROI_width[pNJPEGContext->eNJPDNum] != pic_width)
6154     {
6155         pNJPEGContext->_u16AlignedImagePitch[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16AlignedImageWidth[pNJPEGContext->eNJPDNum] = pNJPEGContext->ROI_width[pNJPEGContext->eNJPDNum] / pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum];
6156 
6157         if(pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum])
6158             pNJPEGContext->_Progressive_ROI_flag[pNJPEGContext->eNJPDNum] = TRUE;
6159     }
6160     return TRUE;
6161 }
6162 #if 0 // not implement for new MDDI - harold
6163 //------------------------------------------------------------------------------
6164 JPEG_STATIC void msAPI_MJPEG_decode_init(PJPEG_FILE_FileSystem_t Pstream)
6165 {
6166     JPEG_init( Pstream );
6167     MSAPI_MJPEG_Get_Pics();
6168     JPEG_locate_sof_marker();
6169 
6170     if(_u8DecodeType[pNJPEGContext->eNJPDNum] == E_JPEG_TYPE_THUMBNAIL)
6171     {
6172         if(_bThumbnailFound[pNJPEGContext->eNJPDNum])
6173         {
6174             _bThumbnailAccessMode[pNJPEGContext->eNJPDNum] = TRUE;
6175             ////MApi_JPEG_Finalize(); //replace with JPEG_free_all_blocks()
6176             JPEG_free_all_blocks();
6177             JPEG_init( Pstream );
6178 
6179             JPEG_locate_sof_marker();
6180 
6181             if(_bProgressive_flag[pNJPEGContext->eNJPDNum])
6182             {
6183                 JPEG_DEBUG_API_MSG("Progressive image in thumbnail... do not handle it\n");
6184                 JPEG_terminate( E_JPEG_BAD_APP1_MARKER );
6185             }
6186         }
6187         else
6188         {
6189             JPEG_terminate( E_JPEG_NO_THUMBNAIL );
6190         }
6191     }
6192 }
6193 //------------------------------------------------------------------------------
6194 // Parse header of MJPEG to get total num of pics in the file
6195 JPEG_STATIC void MSAPI_MJPEG_Get_Pics(void)
6196 {
6197     //Num of pics located at Byte 49~52, hence we need to offset 48 bytes
6198     MS_U8 ByteOffset, ByteSkip = 48;
6199 
6200     //Total num of pics
6201     NumPics = 0;
6202 
6203     for(ByteOffset = 0; ByteOffset < ByteSkip; ByteOffset++)
6204     {
6205         JPEG_get_char();
6206     }
6207 
6208     //Handle Little-Ending
6209     NumPics += (JPEG_get_char());
6210     NumPics += (JPEG_get_char() << 8);
6211     NumPics += (JPEG_get_char() << 16);
6212     NumPics += (JPEG_get_char() << 24);
6213 
6214     JPEG_DEBUG_API_MSG("NumPics = %ld\n",NumPics);
6215 }
6216 #endif // not implement for new MDDI - harold
6217 
6218 #if SUPPORT_PROGRESSIVE_MODE
6219 //------------------------------------------------------------------------------
6220 // Loads and dequantizes the next row of (already decoded) coefficients.
6221 // Progressive images only.
JPEG_load_next_row(void)6222 JPEG_STATIC MS_BOOL JPEG_load_next_row(void)
6223 {
6224     JPEG_BLOCK_TYPE p[64];
6225     MS_BOOL EOF_Flag = FALSE; //CL82399
6226 
6227     MS_U16 mcu_row, mcu_block;
6228     MS_U8 component_num, component_id;
6229     MS_U16 block_x_mcu[JPEG_MAXCOMPONENTS];
6230 
6231     JPEG_memset((void *)block_x_mcu, 0, JPEG_MAXCOMPONENTS * sizeof( MS_U16 ) );
6232 
6233     for ( mcu_row = 0; mcu_row < pNJPEGContext->_u16Mcus_per_row[pNJPEGContext->eNJPDNum]; mcu_row++ )
6234     {
6235         MS_U16 block_x_mcu_ofs = 0, block_y_mcu_ofs = 0;
6236 
6237         for ( mcu_block = 0; mcu_block < pNJPEGContext->_u8Blocks_per_mcu[pNJPEGContext->eNJPDNum]; mcu_block++ )
6238         {
6239             JPEG_BLOCK_TYPE *pAC;
6240             JPEG_BLOCK_TYPE *pDC;
6241 
6242             component_id = pNJPEGContext->_u8Mcu_org[pNJPEGContext->eNJPDNum][mcu_block];
6243 
6244             pAC = JPEG_coeff_buf_getp( pNJPEGContext->_AC_Coeffs[pNJPEGContext->eNJPDNum][component_id], block_x_mcu[component_id] + block_x_mcu_ofs, pNJPEGContext->_u32Block_y_mcu[pNJPEGContext->eNJPDNum][component_id] + block_y_mcu_ofs );
6245             if(pAC == NULL)
6246             {
6247                 JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
6248                 return FALSE;
6249             }
6250 
6251             pDC = JPEG_coeff_buf_getp( pNJPEGContext->_DC_Coeffs[pNJPEGContext->eNJPDNum][component_id], block_x_mcu[component_id] + block_x_mcu_ofs, pNJPEGContext->_u32Block_y_mcu[pNJPEGContext->eNJPDNum][component_id] + block_y_mcu_ofs );
6252             if(pDC == NULL)
6253             {
6254                 JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
6255                 return FALSE;
6256             }
6257             p[0] = pDC[0];
6258 #if 0
6259             JPEG_memcpy((void *)&p[1], (void *)&pAC[1], 63 * sizeof( JPEG_BLOCK_TYPE ) );
6260 #else
6261             MS_U8 u8i;
6262             for(u8i =1; u8i<64; u8i++)
6263             {
6264                 p[u8i] = pAC[u8i];
6265             }
6266 #endif
6267 
6268             if( pNJPEGContext->_Progressive_ROI_flag[pNJPEGContext->eNJPDNum] == FALSE )
6269             {
6270                 if((mcu_block == (pNJPEGContext->_u8Blocks_per_mcu[pNJPEGContext->eNJPDNum] - 1))
6271                 && (mcu_row == (pNJPEGContext->_u16Mcus_per_row[pNJPEGContext->eNJPDNum] - 1))
6272                 && (pNJPEGContext->_u16Total_lines_left[pNJPEGContext->eNJPDNum] == pNJPEGContext->gu8Max_mcu_y_size[pNJPEGContext->eNJPDNum]))
6273                 {
6274                     JPEG_DEBUG_API_MSG("EOF!!!!!ROI enable!!!\n");
6275                     if(!JPEG_do_RLE(p, TRUE, component_id, TRUE))   // means it is end of picture
6276                         return FALSE;
6277                 }
6278                 else
6279                 {
6280                     if(!JPEG_do_RLE(p, FALSE, component_id, TRUE))
6281                         return FALSE;
6282                 }
6283             }
6284             else
6285             {
6286                 if( pNJPEGContext->_u16Total_lines_left[pNJPEGContext->eNJPDNum] == pNJPEGContext->gu8Max_mcu_y_size[pNJPEGContext->eNJPDNum] )//Last Line
6287                 {
6288                     //JPEG_DEBUG_API_MSG("_u16Total_lines_left[pNJPEGContext->eNJPDNum] ==%d,%d,%d \n", gu8Max_mcu_y_size[pNJPEGContext->eNJPDNum], mcu_block, mcu_row);
6289 
6290                     if((mcu_block == (pNJPEGContext->_u8Blocks_per_mcu[pNJPEGContext->eNJPDNum] - 1))
6291                     && ((mcu_row + 2) * pNJPEGContext->gu8Max_mcu_x_size[pNJPEGContext->eNJPDNum] >  pNJPEGContext->ROI_width[pNJPEGContext->eNJPDNum]))//Last line last block within rang
6292                     {
6293                         if( EOF_Flag == FALSE )
6294                         {
6295                             EOF_Flag = TRUE;
6296                             JPEG_DEBUG_API_MSG("EOF!!!!!No ROI!!!\n");
6297                             if(!JPEG_do_RLE(p, TRUE, component_id, TRUE))   // means it is end of picture
6298                                 return FALSE;
6299                         }
6300                     }
6301                     else
6302                     {
6303                          if(!JPEG_do_RLE(p, FALSE, component_id, TRUE))
6304                             return FALSE;
6305                     }
6306                 }
6307                 else
6308                 {
6309                     if((mcu_row + 1) * pNJPEGContext->gu8Max_mcu_x_size[pNJPEGContext->eNJPDNum] >  pNJPEGContext->ROI_width[pNJPEGContext->eNJPDNum])//ever line out rang block
6310                     {
6311                         //JPEG_do_RLE(p, FALSE, component_id, FALSE);
6312                     }
6313                     else
6314                     {
6315                         if(!JPEG_do_RLE(p, FALSE, component_id, TRUE))
6316                             return FALSE;
6317                     }
6318                 }
6319             }
6320 
6321             if ( pNJPEGContext->_u8Comps_in_scan[pNJPEGContext->eNJPDNum] == 1 )
6322             {
6323                 block_x_mcu[component_id]++;
6324             }
6325             else
6326             {
6327                 if ( ++block_x_mcu_ofs == pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][component_id] )
6328                 {
6329                     block_x_mcu_ofs = 0;
6330 
6331                     if ( ++block_y_mcu_ofs == pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][component_id] )
6332                     {
6333                         block_y_mcu_ofs = 0;
6334 
6335                         block_x_mcu[component_id] += pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][component_id];
6336                     }
6337                 }
6338             }
6339         }
6340     }
6341 
6342     if ( pNJPEGContext->_u8Comps_in_scan[pNJPEGContext->eNJPDNum] == 1 )
6343     {
6344         pNJPEGContext->_u32Block_y_mcu[pNJPEGContext->eNJPDNum][pNJPEGContext->_u8Comp_list[pNJPEGContext->eNJPDNum][0]]++;
6345     }
6346     else
6347     {
6348         for ( component_num = 0; component_num < pNJPEGContext->_u8Comps_in_scan[pNJPEGContext->eNJPDNum]; component_num++ )
6349         {
6350             component_id = pNJPEGContext->_u8Comp_list[pNJPEGContext->eNJPDNum][component_num];
6351 
6352             pNJPEGContext->_u32Block_y_mcu[pNJPEGContext->eNJPDNum][component_id] += pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][component_id];
6353         }
6354     }
6355     return TRUE;
6356 }
6357 #endif
6358 
6359 //------------------------------------------------------------------------------
6360 /******************************************************************************/
6361 ///Start JPEG decoding
6362 /******************************************************************************/
JPEG_StartDecode(void)6363 JPEG_STATIC MS_BOOL JPEG_StartDecode(void)
6364 {
6365     MS_U16 pic_width, pic_height;
6366     MS_U8 Y_VSF = pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][0];
6367     MS_U8 Y_HSF = pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][0];
6368     MS_BOOL bUV_en;
6369     MS_U16 reg_value;
6370     MS_U8 i;
6371     MS_U8 com_num = 0;
6372     MS_U8 comp[JPEG_MAXCOMPONENTS];
6373     NJPD_BufCfg structBuf;
6374 
6375     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
6376 #ifdef NJPD_LONGJUMP_SUPPORT
6377     if ( setjmp( _jmp_state ) )
6378     {
6379         return FALSE;
6380     }
6381 #endif
6382 
6383 #if ENABLE_JPEG_NO_SIZE_LOWER_BOUND
6384     MDrv_NJPD_SetPicDimension(0xFF, 0xFF);
6385 #endif
6386 
6387     // reset NJPD hardware
6388     //MDrv_NJPD_Reset();
6389     MDrv_NJPD_Rst();
6390 
6391     // Calculate how many valid quantization tables for components
6392     JPEG_memset((void *)comp, 0, JPEG_MAXCOMPONENTS);
6393     for(i = 0; i<pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum]; i++)
6394     {
6395         comp[pNJPEGContext->_u8Comp_quant[pNJPEGContext->eNJPDNum][i]] = 1;
6396     }
6397 
6398     for(i = 0; i<JPEG_MAXCOMPONENTS; i++)
6399     {
6400         if(comp[i]==1)
6401             com_num++;
6402     }
6403 
6404     if(pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum]>1)
6405         bUV_en = TRUE;
6406     else
6407         bUV_en = FALSE;
6408 
6409     //Get Aligned width & height
6410     JPEG_GetAlignedResolution(&pic_width, &pic_height);
6411 
6412 #if 1
6413     structBuf.bProgressive = pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum];
6414     structBuf.bThumbnailAccessMode = pNJPEGContext->_bThumbnailAccessMode[pNJPEGContext->eNJPDNum];
6415     structBuf.u32ThumbnailBufAddr = pNJPEGContext->_u32InternalBufferAddr_PA[pNJPEGContext->eNJPDNum];
6416     structBuf.u32ThumbnailBufSize = JPEG_DEFAULT_EXIF_SIZE;
6417     structBuf.u32ThumbnailBufOffset = pNJPEGContext->_u32ThumbnailOffset[pNJPEGContext->eNJPDNum] + JPEG_GetECS();
6418     structBuf.u32MRCBufAddr = pNJPEGContext->_u32ReadBufferAddr_PA[pNJPEGContext->eNJPDNum];
6419     structBuf.u32MRCBufSize = MRC_BUFFER_SIZE;
6420     structBuf.u32MRCBufOffset = JPEG_GetECS();
6421     structBuf.u32MWCBufAddr = pNJPEGContext->_u32WriteBufferAddr_PA[pNJPEGContext->eNJPDNum];
6422     //HW limitation:if we don't enable write-protect mode, set this value to zero.
6423 
6424 #if (ENABLE_TEST_09_NJPEGWriteProtectTest==FALSE)
6425     structBuf.u16MWCBufLineNum = 0;
6426 //    structBuf.u16MWCBufLineNum = ((pic_height/_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] + 8) < 0x07FF)?(pic_height/_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] + 8):0x7FF;
6427 #else
6428     structBuf.u16MWCBufLineNum = 32;
6429 #endif
6430 
6431     JPEG_DEBUG_API_MSG("bProgressive = %td, bThumbnailAccessMode = %td\n"
6432     , (ptrdiff_t)structBuf.bProgressive, (ptrdiff_t)structBuf.bThumbnailAccessMode);
6433     JPEG_DEBUG_API_MSG("u32ThumbnailBufAddr = 0x%tx, u32ThumbnailBufSize = 0x%tx, u32ThumbnailBufOffset = 0x%tx\n"
6434     , (ptrdiff_t)structBuf.u32ThumbnailBufAddr, (ptrdiff_t)structBuf.u32ThumbnailBufSize, (ptrdiff_t)structBuf.u32ThumbnailBufOffset);
6435     JPEG_DEBUG_API_MSG("u32MRCBufAddr = 0x%tx, u32MRCBufSize = 0x%tx, u32MRCBufOffset = 0x%tx\n"
6436     , (ptrdiff_t)structBuf.u32MRCBufAddr, (ptrdiff_t)structBuf.u32MRCBufSize, (ptrdiff_t)structBuf.u32MRCBufOffset);
6437     JPEG_DEBUG_API_MSG("u32MWCBufAddr = 0x%tx, u16MWCBufLineNum = %td\n"
6438     , (ptrdiff_t)structBuf.u32MWCBufAddr, (ptrdiff_t)structBuf.u16MWCBufLineNum);
6439 
6440     pNJPEGContext->u32DataOffset[pNJPEGContext->eNJPDNum] += JPEG_GetECS();
6441 
6442     if(structBuf.u32MRCBufOffset >= MRC_BUFFER_SIZE)
6443     {
6444         JPEG_terminate(E_JPEG_NOTENOUGHMEM);
6445         JPEG_DEBUG_API_ERR("%s [%d] not enough MRC size(0x%tx, 0x%tx)\n",
6446             __FUNCTION__, __LINE__, (ptrdiff_t)pNJPEGContext->u32DataOffset[pNJPEGContext->eNJPDNum], (ptrdiff_t)MRC_BUFFER_SIZE);
6447         return FALSE;
6448     }
6449     else
6450     {
6451         JPEG_DEBUG_API_MSG("%s [%d] enough MRC size(0x%tx, 0x%tx)\n",
6452             __FUNCTION__, __LINE__, (ptrdiff_t)pNJPEGContext->u32DataOffset[pNJPEGContext->eNJPDNum], (ptrdiff_t)MRC_BUFFER_SIZE);
6453     }
6454 #if SUPPORT_HIGH_LOW_REVERSE
6455     pNJPEGContext->bHighLowReverse[pNJPEGContext->eNJPDNum] = MDrv_NJPD_InitBuf(structBuf, pNJPEGContext->__bIsMjpeg[pNJPEGContext->eNJPDNum]);
6456     //printf_red("bHighLowReverse[pNJPEGContext->eNJPDNum]=%d\n", bHighLowReverse[pNJPEGContext->eNJPDNum]);
6457     JPEG_DEBUG_API_MSG("bHighLowReverse[pNJPEGContext->eNJPDNum]=%d\n", pNJPEGContext->bHighLowReverse[pNJPEGContext->eNJPDNum]);
6458 #else
6459     pNJPEGContext->bDifferentHL[pNJPEGContext->eNJPDNum] = MDrv_NJPD_InitBuf(structBuf, pNJPEGContext->__bIsMjpeg[pNJPEGContext->eNJPDNum]);
6460 #endif
6461 
6462 //    JPEG_DEBUG_API_MSG("MWCLineNum = %d, pic_height = %d, DwnScaleRatio = %d\n"
6463 //            , structBuf.u16MWCBufLineNum, pic_height, _u8ScaleDownFactor[pNJPEGContext->eNJPDNum]);
6464 #else
6465     if(_bThumbnailAccessMode[pNJPEGContext->eNJPDNum])
6466     {
6467         // Set MRC buffer for NJPD
6468         MDrv_NJPD_SetReadBuffer(INTERNAL_BUFFER_ADDR, JPEG_DEFAULT_EXIF_SIZE);
6469         // Set MRC start access byte address
6470         MDrv_NJPD_SetMRCStartAddr(INTERNAL_BUFFER_ADDR + _u32ThumbnailOffset[pNJPEGContext->eNJPDNum] + JPEG_GetECS());
6471     }
6472     else
6473     {
6474         if(_bProgressive_flag[pNJPEGContext->eNJPDNum])
6475         {
6476             // Set MRC buffer for NJPD
6477             MDrv_NJPD_SetReadBuffer(MRC_BUFFER_ADDR, MRC_BUFFER_SIZE);
6478             // Set MRC start access byte address
6479             MDrv_NJPD_SetMRCStartAddr(MRC_BUFFER_ADDR);
6480         }
6481         else
6482         {
6483             // Set MRC buffer for NJPD
6484             MDrv_NJPD_SetReadBuffer(MRC_BUFFER_ADDR, MRC_BUFFER_SIZE);
6485             // Set MRC start access byte address
6486             MDrv_NJPD_SetMRCStartAddr(MRC_BUFFER_ADDR + JPEG_GetECS());
6487         }
6488     }
6489 
6490     // Set MWC buffer for NJPD
6491     MDrv_NJPD_SetOutputFrameBuffer(MWC_BUFFER_ADDR);
6492 #endif
6493 
6494     // Set picture width and height
6495 #if (ENABLE_JPEG_NO_SIZE_LOWER_BOUND == 0)
6496     if(pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum])
6497     {
6498         // This setting is only needed in NPJD
6499         // ROI is implemented by HW in NJPD
6500         MDrv_NJPD_SetPicDimension(pNJPEGContext->ROI_width[pNJPEGContext->eNJPDNum], pic_height);
6501     }
6502     else
6503     {
6504         MDrv_NJPD_SetPicDimension(pic_width, pic_height);
6505     }
6506 #endif
6507 
6508     pNJPEGContext->_u16NonAlignmentImage_x_size[pNJPEGContext->eNJPDNum] = pic_width;
6509     pNJPEGContext->_u16NonAlignmentImage_y_size[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum];
6510 
6511     pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] = pic_width/pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum];
6512     pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum] = pic_height/pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum];
6513     JPEG_DEBUG_API_MSG("ScaleDownFactor = %d\n", pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum]);
6514 
6515 #if (ENABLE_TEST_NJPD_21_No_Reset_Table_Test == TRUE)
6516     static MS_BOOL bFirstTime=0;
6517     MDrv_NJPD_SetDifferentHTable(pNJPEGContext->bIs3HuffTbl[pNJPEGContext->eNJPDNum]);  // This function must be set before JPEG_WriteGrpinf()
6518     if(bFirstTime ==0)
6519     {
6520         MDrv_NJPD_GTable_Rst(ENABLE);
6521          JPEG_WriteGrpinf();
6522          JPEG_WriteSymidx();
6523          JPEG_WriteIQTbl();
6524          MsOS_FlushMemory();
6525         MDrv_NJPD_TableLoadingStart();
6526         bFirstTime =1;
6527     }
6528 #else
6529     if(MDrv_NJPD_GetVerificationMode()==E_NJPD21_NO_RESET_TABLE)
6530     {
6531         static MS_BOOL bFirstTime[E_NJPD_NJPD_TOTAL]={0, 0};
6532         MDrv_NJPD_SetDifferentHTable(pNJPEGContext->bIs3HuffTbl[pNJPEGContext->eNJPDNum]);  // This function must be set before JPEG_WriteGrpinf()
6533         if(bFirstTime[pNJPEGContext->eNJPDNum] ==0)
6534         {
6535             MDrv_NJPD_GTable_Rst(ENABLE);
6536              JPEG_WriteGrpinf();
6537              JPEG_WriteSymidx();
6538              JPEG_WriteIQTbl();
6539              MsOS_FlushMemory();
6540             MDrv_NJPD_TableLoadingStart();
6541             bFirstTime[pNJPEGContext->eNJPDNum] =1;
6542         }
6543     }
6544     else
6545     {
6546 #if PRINT_NJPD_DECODE_TIME
6547         pNJPEGContext->u32MeasureDecodeTimeTable[pNJPEGContext->eNJPDNum] = MDrv_TIMER_GetUs(E_TIMER_1);
6548 #endif
6549         // In NJPD, software VLD mode, we don't need to write huff & symbol tables
6550         if(pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum]==FALSE)
6551         {
6552             MDrv_NJPD_SetDifferentHTable(pNJPEGContext->bIs3HuffTbl[pNJPEGContext->eNJPDNum]);  // This function must be set before JPEG_WriteGrpinf()
6553             MDrv_NJPD_GTable_Rst(ENABLE);
6554             JPEG_WriteGrpinf();
6555             JPEG_WriteSymidx();
6556         }
6557 
6558         JPEG_WriteIQTbl();
6559 #if PRINT_NJPD_DECODE_TIME
6560         pNJPEGContext->u32MeasureDecodeTimeTable[pNJPEGContext->eNJPDNum] = MDrv_TIMER_GetUs(E_TIMER_1)-pNJPEGContext->u32MeasureDecodeTimeTable[pNJPEGContext->eNJPDNum];
6561 #endif
6562         MsOS_FlushMemory();
6563         MDrv_NJPD_TableLoadingStart();
6564     }
6565 #endif
6566     Y_VSF -= 1;
6567     Y_HSF -= 1;
6568 
6569     reg_value = MDrv_NJPD_Get_GlobalSetting00();
6570     if(pNJPEGContext->_u16Restart_interval[pNJPEGContext->eNJPDNum])
6571     {
6572         JPEG_DEBUG_API_MSG("RST found! Enable NJPD_RST_EN! Restart_interval = %d\n", pNJPEGContext->_u16Restart_interval[pNJPEGContext->eNJPDNum]);
6573         //MDrv_Write2Byte(BK_NJPD_RSTINTV, _u16Restart_interval[pNJPEGContext->eNJPDNum] - 1);
6574         MDrv_NJPD_SetRSTIntv(pNJPEGContext->_u16Restart_interval[pNJPEGContext->eNJPDNum]);
6575         MDrv_NJPD_SetScalingDownFactor((NJPD_SCALING_DOWN_FACTOR)pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum]);
6576         reg_value |= ( NJPD_RST_EN | ((MS_U32) bUV_en) << 3 | ( Y_VSF << 2 ) | Y_HSF );
6577     }
6578     else
6579     {
6580         MDrv_NJPD_SetScalingDownFactor((NJPD_SCALING_DOWN_FACTOR)pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum]);
6581         reg_value |= ( ((MS_U32) bUV_en) << 3 | ( Y_VSF << 2 ) | Y_HSF );
6582     }
6583 
6584     /* Check the read pointer. If it is in HIGH buffer, we need
6585        to preload data to LOW buffer and then start decode.
6586        Progressive mode & thumbnail don't need to check it. */
6587     if((FALSE == pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum])
6588     && (FALSE == pNJPEGContext->_bThumbnailAccessMode[pNJPEGContext->eNJPDNum]))
6589     {
6590         MS_VIRT start_offset = JPEG_GetECS();
6591         JPEG_DEBUG_API_MSG("start offset = 0x%tx\n", (ptrdiff_t)start_offset);
6592         if ( start_offset >= (MRC_BUFFER_SIZE/2) )
6593         {
6594             JPEG_DEBUG_API_MSG("ReadPtr is in HIGH, Load LOW!!\n");
6595             if(pNJPEGContext->_pFillHdrFunc[pNJPEGContext->eNJPDNum])
6596             {
6597                 MS_S32 byte_read = JPEG_FillHeaderFunction((MS_PHY)MS_VA2PA((MS_VIRT)pNJPEGContext->_pu8In_buf[pNJPEGContext->eNJPDNum]),(MS_VIRT)(MRC_BUFFER_SIZE/2));
6598                 if(byte_read < 0)
6599                 {
6600                     JPEG_terminate(E_JPEG_STREAM_READ);
6601                     return FALSE;
6602                 }
6603                 pNJPEGContext->u8PreLHFlag[pNJPEGContext->eNJPDNum] = E_JPEG_BUFFER_LOW;
6604                 pNJPEGContext->u32MRCheckCount[pNJPEGContext->eNJPDNum] = 0;
6605             }
6606             else
6607             {
6608                 JPEG_DEBUG_API_MSG("pNJPEGContext->_pFillHdrFunc[pNJPEGContext->eNJPDNum] is not registered!!, still need to start decode.\n");
6609             }
6610         }
6611     }
6612 
6613     if(pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum])
6614     {
6615         MDrv_NJPD_SetSoftwareVLD(ENABLE);
6616     }
6617 
6618     // Check if it needs to do ROI
6619     if(E_NJPD_DOWNSCALE_ORG != pNJPEGContext->_u8DownScaleRatio[pNJPEGContext->eNJPDNum])
6620     {
6621         if(pNJPEGContext->ROI_width[pNJPEGContext->eNJPDNum] != pic_width && !pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum])
6622         {
6623             JPEG_DEBUG_API_MSG("ROI!! ROI_width[pNJPEGContext->eNJPDNum] = %d, ROI_height = %d\n", pNJPEGContext->ROI_width[pNJPEGContext->eNJPDNum], pic_height);
6624             MDrv_NJPD_SetROI(0, 0, (pNJPEGContext->ROI_width[pNJPEGContext->eNJPDNum]>>3), (pic_height>>3));
6625             reg_value = reg_value | NJPD_ROI_EN;
6626         }
6627         pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] = pNJPEGContext->ROI_width[pNJPEGContext->eNJPDNum]/pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum];
6628     }
6629 
6630 #if ENABLE_TEST_NJPD_13_ROI_Test
6631     MDrv_NJPD_SetROI(20, 20, 100, 80);
6632     reg_value = reg_value | NJPD_ROI_EN;
6633 #else
6634     if(MDrv_NJPD_GetVerificationMode()==E_NJPD13_ROI)
6635     {
6636         MDrv_NJPD_SetROI(20, 20, 100, 80);
6637         reg_value = reg_value | NJPD_ROI_EN;
6638     }
6639 #endif
6640 
6641     if(!pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum]) //progressive buffer vld setting is in writeRLE
6642     {
6643         MsOS_FlushMemory();
6644         if(MDrv_NJPD_IsNeedToPatch(E_NJPD_EAGLE_SW_PATCH))
6645         {
6646 #if SUPPORT_HIGH_LOW_REVERSE
6647             if(pNJPEGContext->bHighLowReverse[pNJPEGContext->eNJPDNum])
6648             {
6649                 MDrv_NJPD_SetMRC_Valid(NJPD_MRC1_VALID);
6650                 MsOS_DelayTaskUs(100);
6651                 MDrv_NJPD_SetMRC_Valid(NJPD_MRC0_VALID);
6652             }
6653             else
6654 #endif
6655             {
6656                 MDrv_NJPD_SetMRC_Valid(NJPD_MRC0_VALID);
6657             }
6658         }
6659         else
6660         {
6661             MDrv_NJPD_SetMRC_Valid(NJPD_MRC0_VALID);
6662             MsOS_DelayTaskUs(100);
6663             MDrv_NJPD_SetMRC_Valid(NJPD_MRC1_VALID);
6664         }
6665     }
6666 
6667     // enable NJPD decoding
6668 #if ENABLE_JPEG_NO_SIZE_LOWER_BOUND
6669     MDrv_NJPD_SetPicDimension(pic_width, pic_height);
6670 #endif
6671     MDrv_NJPD_EnablePowerSaving();
6672 
6673 #ifndef MSOS_TYPE_LINUX_KERNEL
6674     MDrv_NJPD_SetAutoProtect(TRUE);
6675     #if (ENABLE_TEST_22_AutoProtectFailTest == TRUE)
6676         MDrv_NJPD_SetWPENStartAddr(pNJPEGContext->_u32WriteBufferAddr_PA[pNJPEGContext->eNJPDNum]);
6677         MDrv_NJPD_SetWPENEndAddr(pNJPEGContext->_u32WriteBufferAddr_PA[pNJPEGContext->eNJPDNum]+0x50000-1);
6678         JPEG_DEBUG_API_MSG("Set Auto protect address =0x%tx!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n", (ptrdiff_t)(MWC_BUFFER_ADDR+0x50000));
6679     #else
6680         if(MDrv_NJPD_GetVerificationMode()==E_NJPD23_WRITE_PROTECT)
6681         {
6682             MDrv_NJPD_SetWPENStartAddr(pNJPEGContext->_u32WriteBufferAddr_PA[pNJPEGContext->eNJPDNum]);
6683             MDrv_NJPD_SetWPENEndAddr(pNJPEGContext->_u32WriteBufferAddr_PA[pNJPEGContext->eNJPDNum]+0x50000-1);
6684             JPEG_DEBUG_API_MSG("Set Auto protect address =0x%tx!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n", (ptrdiff_t)(MWC_BUFFER_ADDR+0x50000));
6685         }
6686         else
6687         {
6688             MDrv_NJPD_SetWPENStartAddr(pNJPEGContext->_u32WriteBufferAddr_PA[pNJPEGContext->eNJPDNum]);
6689             MDrv_NJPD_SetWPENEndAddr(pNJPEGContext->_u32WriteBufferAddr_PA[pNJPEGContext->eNJPDNum]+MWC_BUFFER_SIZE-1);
6690         }
6691     #endif
6692 #else
6693     MDrv_NJPD_SetAutoProtect(FALSE);
6694 #endif
6695 
6696 
6697     MDrv_NJPD_Set_GlobalSetting00(reg_value | NJPD_SWRST);
6698     MDrv_NJPD_DecodeEnable();
6699     JPEG_DEBUG_API_MSG("After Setting SCONFIG, NJPD START!!\n");
6700     //JPEG_GO;
6701     if(MDrv_NJPD_IsNeedToPatch(E_NJPD_EAGLE_SW_PATCH))
6702     {
6703         if(!pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum]) //progressive buffer vld setting is in writeRLE
6704         {
6705 #if SUPPORT_HIGH_LOW_REVERSE
6706 #if 0
6707             if(bHighLowReverse[pNJPEGContext->eNJPDNum])
6708             {
6709                 JPEG_DEBUG_API_MSG("before Wait E_NJPD_EVENT_MRC1_EMPTY done!!\n");
6710                 JPEG_DEBUG_API_MSG("Flush~~~\n");
6711                 MsOS_FlushMemory();
6712                 MS_U32 u32Time=MsOS_GetSystemTime();
6713                 MS_U16 u16Event;
6714                 while(1)
6715                 {
6716                     u16Event = MDrv_NJPD_GetEventFlag();
6717                     if(u16Event &
6718                         (E_NJPD_EVENT_MRC1_EMPTY |E_NJPD_EVENT_DEC_DONE))
6719                     {
6720                         JPEG_DEBUG_API_MSG("after Wait E_NJPD_EVENT_MRC1_EMPTY done!!\n");
6721                         break;
6722                     }
6723                     else if(u16Event & NJPD_EVENT_ERROR)
6724                     {
6725                         JPEG_DEBUG_API_ERR("JPEG DECODE ERROR!!!!!!!!!!!\n");
6726                         MApi_JPEG_SetErrCode(E_JPEG_DECODE_ERROR);
6727                         MDrv_NJPD_Debug();
6728                         break;
6729                     }
6730                     else if((MsOS_GetSystemTime() - u32Time) >= MRC_DECODE_TIMEOUT)
6731                     {
6732                         JPEG_DEBUG_API_ERR("JPEG DECODE TIMEOUT!!!!!!!!!!!\n");
6733                         MDrv_NJPD_Debug();
6734                         break;
6735                     }
6736                 }
6737 
6738                 if(u16Event & E_NJPD_EVENT_MRC1_EMPTY)
6739                 {
6740                     MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC0_EMPTY);
6741                     MDrv_NJPD_SetMRC_Valid(NJPD_MRC0_VALID);
6742                 }
6743             }
6744             else
6745 #endif
6746 #endif
6747             {
6748                 JPEG_DEBUG_API_MSG("before Wait E_NJPD_EVENT_MRC0_EMPTY done!!\n");
6749                 JPEG_DEBUG_API_MSG("Flush~~~\n");
6750                 MsOS_FlushMemory();
6751                 MS_U32 u32Time=MsOS_GetSystemTime();
6752                 MS_U16 u16Event;
6753                 while(1)
6754                 {
6755                     u16Event = MDrv_NJPD_GetEventFlag();
6756                     if(u16Event &
6757                         (E_NJPD_EVENT_MRC0_EMPTY |E_NJPD_EVENT_DEC_DONE))
6758                     {
6759                         JPEG_DEBUG_API_MSG("after Wait E_NJPD_EVENT_MRC0_EMPTY done!!\n");
6760                         break;
6761                     }
6762                     else if(u16Event & NJPD_EVENT_ERROR)
6763                     {
6764                         JPEG_DEBUG_API_ERR("JPEG DECODE ERROR!!!!!!!!!!!\n");
6765                         JPEG_terminate(E_JPEG_DECODE_ERROR);
6766                         MDrv_NJPD_Debug();
6767                         break;
6768                     }
6769                     else if((MsOS_GetSystemTime() - u32Time) >= MRC_DECODE_TIMEOUT)
6770                     {
6771                         JPEG_DEBUG_API_ERR("JPEG DECODE TIMEOUT!!!!!!!!!!!\n");
6772                         MDrv_NJPD_Debug();
6773                         break;
6774                     }
6775                 }
6776 
6777                 if(u16Event & E_NJPD_EVENT_MRC0_EMPTY)
6778                 {
6779                     MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC1_EMPTY);
6780                     MDrv_NJPD_SetMRC_Valid(NJPD_MRC1_VALID);
6781                 }
6782             }
6783         }
6784     }
6785     return TRUE;
6786 }
6787 
6788 #if SUPPORT_PROGRESSIVE_MODE
6789 //------------------------------------------------------------------------------
6790 /******************************************************************************/
6791 ///Start Progressive JPEG decode for NJPD
6792 /******************************************************************************/
JPEG_Progressive_Decode(void)6793 JPEG_STATIC JPEG_Result JPEG_Progressive_Decode(void)
6794 {
6795     if(pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum]==FALSE)
6796         return (E_JPEG_FAILED);
6797 
6798     if ( pNJPEGContext->_u16Total_lines_left[pNJPEGContext->eNJPDNum] == 0 )
6799     {
6800         return ( E_JPEG_OKAY );
6801     }
6802 
6803 #ifdef NJPD_LONGJUMP_SUPPORT
6804     if ( setjmp( _jmp_state ) )
6805     {
6806         return ( E_JPEG_FAILED );
6807     }
6808 #endif
6809 
6810     //JPEG_DEBUG_API_MSG("_u16Mcus_per_row[pNJPEGContext->eNJPDNum] is %d!\n",_u16Mcus_per_row[pNJPEGContext->eNJPDNum]);
6811     //JPEG_DEBUG_API_MSG("_u16Mcus_per_col[pNJPEGContext->eNJPDNum] is %d!\n",_u16Mcus_per_col[pNJPEGContext->eNJPDNum]);
6812     //JPEG_DEBUG_API_MSG("_u8Blocks_per_mcu[pNJPEGContext->eNJPDNum] is %d!\n",_u8Blocks_per_mcu[pNJPEGContext->eNJPDNum]);
6813     //JPEG_DEBUG_API_MSG("gu8Max_mcu_x_size[pNJPEGContext->eNJPDNum] is %d!\n",gu8Max_mcu_x_size[pNJPEGContext->eNJPDNum]);
6814     //JPEG_DEBUG_API_MSG("gu8Max_mcu_y_size[pNJPEGContext->eNJPDNum] is %d!\n",gu8Max_mcu_y_size[pNJPEGContext->eNJPDNum]);
6815 
6816     if( pNJPEGContext->_u16Total_lines_left[pNJPEGContext->eNJPDNum] > 0 )
6817     {
6818         JPEG_DEBUG_API_MSG("%s:_u16Total_lines_left[pNJPEGContext->eNJPDNum] = %d\n", __FUNCTION__ , pNJPEGContext->_u16Total_lines_left[pNJPEGContext->eNJPDNum]);
6819         if(!JPEG_load_next_row())
6820             return E_JPEG_FAILED;
6821 
6822 #if SW_NJPD_RGB_CMYK
6823         if((E_JPEG_CMYK == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum])
6824         || (E_JPEG_RGB == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum]))
6825         {
6826             if(!msAPI_JPEG_transform_row()) //IDCT
6827             {
6828                 JPEG_DEBUG_API_MSG("CMYK and RGB decode failed!!\n");
6829                 return ( E_JPEG_FAILED );
6830             }
6831         }
6832 #endif
6833 
6834         pNJPEGContext->_u16Total_lines_left[pNJPEGContext->eNJPDNum] -= pNJPEGContext->gu8Max_mcu_y_size[pNJPEGContext->eNJPDNum];
6835     }
6836 
6837     return (E_JPEG_DONE);
6838 }
6839 #endif
6840 
6841 //------------------------------------------------------------------------------
JPEG_GetAlignedResolution(MS_U16 * width,MS_U16 * height)6842 JPEG_STATIC void JPEG_GetAlignedResolution(MS_U16 *width, MS_U16 *height)
6843 {
6844     MS_U8 mcu_width, mcu_height;
6845     MS_U8 Y_VSF = pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][0];
6846     MS_U8 Y_HSF = pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][0];
6847 
6848     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
6849 
6850     *width = pNJPEGContext->_u16OriginalImage_x_size[pNJPEGContext->eNJPDNum];
6851     *height = pNJPEGContext->_u16OriginalImage_y_size[pNJPEGContext->eNJPDNum];
6852 
6853     mcu_width = pNJPEGContext->_u16OriginalImage_x_size[pNJPEGContext->eNJPDNum] % (Y_HSF * 8);
6854     if (mcu_width)
6855     {
6856         *width += (Y_HSF * 8 - mcu_width);
6857     }
6858 
6859     mcu_height = pNJPEGContext->_u16OriginalImage_y_size[pNJPEGContext->eNJPDNum] % (Y_VSF * 8);
6860     if (mcu_height)
6861     {
6862         *height += (Y_VSF * 8 - mcu_height);
6863     }
6864 
6865     JPEG_DEBUG_API_MSG("_u8Comp_v_samp[pNJPEGContext->eNJPDNum] = %d, _u8Comp_h_samp[pNJPEGContext->eNJPDNum] = %d\n", pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][0], pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][0]);
6866     JPEG_DEBUG_API_MSG("_u16OriginalImage_x_size[pNJPEGContext->eNJPDNum] = %d, _u16OriginalImage_y_size[pNJPEGContext->eNJPDNum] = %d\n", pNJPEGContext->_u16OriginalImage_x_size[pNJPEGContext->eNJPDNum], pNJPEGContext->_u16OriginalImage_y_size[pNJPEGContext->eNJPDNum]);
6867     JPEG_DEBUG_API_MSG("AlignWidth = %d, AlignHeight = %d\n", *width, *height);
6868 }
6869 
6870 //-------------------------------------------------------------------------------------------------
6871 //  Global Functions
6872 //-------------------------------------------------------------------------------------------------
6873 #if 0
6874 //------------------------------------------------------------------------------
6875 /******************************************************************************/
6876 ///This will set MRC buffer address & size, MWC buffer address, and internal buffer
6877 ///address & size.
6878 ///@param *pInitParam \b The pointer of information for JPEG Buffer initialization
6879 /// structure {
6880 ///         U32 u32MRCBufAddr, \b IN MRC buffer address
6881 ///         U32 u32MRCBufSize, \b IN MRC buffer size
6882 ///         U32 u32MWCBufAddr, \b IN MWC buffer address
6883 ///                                 JPEG decompress data (YUV422)
6884 ///         U32 u32InternalBufAddr, \b IN internal buffer address
6885 ///                                 (exif:64K + memory pool)
6886 ///         U32 u32InternalBufSize, \b IN internal buffer size
6887 ///         BOOL bInitMem, \b IN initialize memory pool or not
6888 ///         };
6889 ///@return TRUE or FALSE
6890 /******************************************************************************/
6891 MS_BOOL MApi_JPEG_SetInitParameter(JPEG_InitParam *pInitParam)
6892 {
6893     // the buffer size must be multiple of 4 bytes
6894     if((!pInitParam)
6895     || (pInitParam->u32MRCBufSize < MIN_READBUFFER_SIZE))
6896     {
6897         JPEG_terminate(E_JPEG_READBUFFER_TOOSMALL);
6898         return FALSE;
6899     }
6900     // the buffer size must be multiple of 8 bytes
6901     pInitParam->u32MRCBufSize = pInitParam->u32MRCBufSize & ~0x7;
6902 
6903     MRC_BUFFER_ADDR = pInitParam->u32MRCBufAddr | AEON_NON_CACHE_MASK;
6904     MWC_BUFFER_ADDR = pInitParam->u32MWCBufAddr | AEON_NON_CACHE_MASK;
6905     INTERNAL_BUFFER_ADDR = pInitParam->u32InternalBufAddr | AEON_NON_CACHE_MASK;
6906     MRC_BUFFER_SIZE = pInitParam->u32MRCBufSize;
6907     INTERNAL_BUFFER_SIZE = pInitParam->u32InternalBufSize;
6908 
6909     _pu8In_buf[pNJPEGContext->eNJPDNum] = (MS_U8 *) pInitParam->u32MRCBufAddr;
6910 
6911     if (pInitParam->bInitMem)
6912     {
6913         JPEG_MEMORY_init_mempool(((MS_U8 *)(pInitParam->u32InternalBufAddr + JPEG_DEFAULT_EXIF_SIZE))
6914                                 , (pInitParam->u32InternalBufSize - JPEG_DEFAULT_EXIF_SIZE));
6915     }
6916 
6917     return TRUE;
6918 }
6919 //------------------------------------------------------------------------------
6920 // Call get_error_code() after constructing to determine if the stream
6921 // was valid or not. You may call the get_width(), get_height(), etc.
6922 // methods after the constructor is called.
6923 // You may then either destruct the object, or begin decoding the image
6924 // by calling begin(), then decode().
6925 void MApi_JPEG_Constructor( PJPEG_FILE_FileSystem_t Pstream, MS_U8 decode_type)
6926 {
6927     if ( setjmp( _jmp_state ) )
6928     {
6929         return;
6930     }
6931 
6932     _u8DecodeType[pNJPEGContext->eNJPDNum] = decode_type;
6933     JPEG_init_thumbnail();
6934     JPEG_decode_init( Pstream);
6935 
6936 }
6937 #endif
6938 
6939 #if SW_NJPD_RGB_CMYK
MApi_JPEG_Is_RGB_CMYK(void)6940 JPEG_STATIC MS_BOOL MApi_JPEG_Is_RGB_CMYK(void)
6941 {
6942     if (pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum] == 3)
6943     {
6944         //support only U_H1V1 & V_H1V1
6945         if ((pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][1] != 1 || pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][1] != 1)
6946             || (pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][2] != 1 || pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][2] != 1))
6947         {
6948             JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
6949             return FALSE;
6950         }
6951 
6952         if (pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][0] == 1 && pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][0] == 1)
6953         {
6954             if (pNJPEGContext->_u8Comp_ident[pNJPEGContext->eNJPDNum][0] == 82 || pNJPEGContext->_u8Comp_ident[pNJPEGContext->eNJPDNum][0] == 71 || pNJPEGContext->_u8Comp_ident[pNJPEGContext->eNJPDNum][0] == 66)
6955                 return TRUE; // RGB
6956         }
6957     }
6958     else
6959     if (pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum] == 4) //handle YCCK & CMYK case, must distinguish YCCK and CMYK later
6960     {
6961         if (pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][0] == 1 && pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][0] == 1)
6962             return TRUE; // CMYK
6963     }
6964 
6965     return FALSE;
6966 }
6967 #endif
6968 //------------------------------------------------------------------------------
6969 #if SUPPORT_OJPD
6970 #define _USE_OJPD(fun, args...) \
6971    do { \
6972        if(pNJPEGContext->bUseOJPD) \
6973        {    \
6974            return fun##_OJPD(args);\
6975        }    \
6976    }while(0)
6977 #else
6978 #define _USE_OJPD(fun, args...)
6979 #endif
6980 
6981 #if 0
6982 static MS_BOOL bUseOJPD =FALSE;
6983 static MS_BOOL bOJPDOn = FALSE;
6984 static MS_BOOL bForceNJPD2 = FALSE;
6985 #endif
_NJPEG_Context_Init(void)6986 static void _NJPEG_Context_Init(void)
6987 {
6988     MS_U8 u8Cnt;
6989     for (u8Cnt = 0; u8Cnt<2; u8Cnt++)
6990     {
6991         pNJPEGContext->JPEG_MAX_HEIGHT[u8Cnt] =1080;
6992         pNJPEGContext->JPEG_MAX_WIDTH[u8Cnt] =1920;
6993         pNJPEGContext->JPEG_PRO_MAX_HEIGHT[u8Cnt] =768;
6994         pNJPEGContext->JPEG_PRO_MAX_WIDTH[u8Cnt] =1024;
6995         pNJPEGContext->MAX_JPEG_WIDTH_HD[u8Cnt] =0;
6996         pNJPEGContext->MAX_JPEG_HEIGHT_HD[u8Cnt] =0;
6997         pNJPEGContext->bMHEG5[u8Cnt] =FALSE;
6998 
6999 #if SUPPORT_MPO_FORMAT
7000         pNJPEGContext->JPEG_MPO_MAX_HEIGHT[u8Cnt] =1080;
7001         pNJPEGContext->JPEG_MPO_MAX_WIDTH[u8Cnt] =1920;
7002         pNJPEGContext->JPEG_MPO_PRO_MAX_HEIGHT[u8Cnt] =768;
7003         pNJPEGContext->JPEG_MPO_PRO_MAX_WIDTH[u8Cnt] =1024;
7004         pNJPEGContext->_u32In_buf_MPO_left[u8Cnt] =0xFFFFFFFFUL;
7005 #endif
7006     }
7007     pNJPEGContext->_u8JPEG_ApiDbgLevel =E_JPEG_DEBUG_NONE;
7008 
7009     pNJPEGContext->bUseOJPD = FALSE;
7010     pNJPEGContext->bOJPDOn = FALSE;
7011     pNJPEGContext->bForceNJPD2 = FALSE;
7012 
7013 
7014 #if SW_NJPD_RGB_CMYK
7015     pNJPEGContext->bEnableCMYK = TRUE;
7016     pNJPEGContext->bEnableRGB = TRUE;
7017 #endif
7018 
7019 
7020 }
7021 
7022 
_JPEG_Init_Share_Mem()7023 static JPEG_Result _JPEG_Init_Share_Mem()
7024 {
7025 #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL) || defined(MSOS_TYPE_ECOS)
7026     MS_U32 u32ShmId;
7027     MS_VIRT u32Addr;
7028     MS_U32 u32BufSize;
7029 
7030     if(pNJPEGContext)
7031     {
7032         return E_JPEG_OKAY;
7033     }
7034     if (FALSE == MsOS_SHM_GetId( (MS_U8*)"Linux JPEG driver",
7035                                           sizeof(NJPEG_EX_CTX),
7036                                           &u32ShmId,
7037                                           &u32Addr,
7038                                           &u32BufSize,
7039                                           MSOS_SHM_QUERY))
7040     {
7041         if (FALSE == MsOS_SHM_GetId((MS_U8*)"Linux JPEG driver",
7042                                              sizeof(NJPEG_EX_CTX),
7043                                              &u32ShmId,
7044                                              &u32Addr,
7045                                              &u32BufSize,
7046                                              MSOS_SHM_CREATE))
7047         {
7048             if(pNJPEGContext == NULL)
7049             {
7050                 pNJPEGContext = &gNJPEGContext;
7051                 memset(pNJPEGContext,0,sizeof(NJPEG_EX_CTX));
7052                 _NJPEG_Context_Init();
7053             }
7054             else
7055             {
7056                 JPEG_DEBUG_API_MSG("[%s]Global structure exists!!!\n",__FUNCTION__);
7057             }
7058             return E_JPEG_FAILED;
7059         }
7060         else
7061         {
7062             memset((MS_U8*)u32Addr, 0, sizeof(NJPEG_EX_CTX));
7063             pNJPEGContext = (NJPEG_EX_CTX*)u32Addr; // for one process
7064             _NJPEG_Context_Init();
7065         }
7066     }
7067     else
7068     {
7069         pNJPEGContext = (NJPEG_EX_CTX*)u32Addr; // for another process
7070     }
7071 
7072 
7073 #else
7074     if(pNJPEGContext == NULL)
7075     {
7076         pNJPEGContext = &gNJPEGContext;
7077         memset(pNJPEGContext,0,sizeof(NJPEG_EX_CTX));
7078         _NJPEG_Context_Init();
7079     }
7080 #endif
7081 
7082     return E_JPEG_OKAY;
7083 }
7084 
_MApi_JPEG_EnableOJPD(MS_BOOL bOnOff)7085 void _MApi_JPEG_EnableOJPD(MS_BOOL bOnOff)
7086 {
7087     _JPEG_Init_Share_Mem();
7088     _NJPEG_SHM_POINTER_CHECK();
7089     pNJPEGContext->bOJPDOn = bOnOff;
7090 }
7091 
_MApi_JPEG_Init_UsingOJPD(JPEG_InitParam * pInitParam)7092 JPEG_Result _MApi_JPEG_Init_UsingOJPD(JPEG_InitParam *pInitParam)
7093 {
7094     _JPEG_Init_Share_Mem();
7095     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
7096     pNJPEGContext->bUseOJPD = TRUE;
7097     _USE_OJPD(MApi_JPEG_Init, pInitParam);
7098     return MApi_JPEG_Init(pInitParam);
7099 }
7100 
7101 
7102 /********************************************************************/
7103 ///This function will\n
7104 ///1. set MRC buffer address & size, MWC buffer address, and internal buffer address & size.\n
7105 ///2. power on NJPD\n
7106 ///3. reset thumbnail parameters\n
7107 ///4. set the stream and its size, the number of components, etc.\n
7108 ///Call MApi_JPEG_GetErrorCode() after it to determine if the stream was valid or not.\n
7109 ///@param -pInitParam \b IN : \n
7110 /// structure {\n
7111 ///     MS_PHY \b u32MRCBufAddr : MRC buffer address\n
7112 ///     MS_U32 \b u32MRCBufSize : MRC buffer size\n
7113 ///     MS_PHY \b u32MWCBufAddr : MWC buffer address(JPEG decompress data (YUV422))\n
7114 ///     MS_U32 \b u32MWCBufSize : MWC buffer size\n
7115 ///     MS_PHY \b u32InternalBufAddr : Internal buffer address(exif:64K + memory pool)\n
7116 ///     MS_U32 \b u32InternalBufSize : Internal buffer size\n
7117 ///     MS_U32 \b u32DecByteRead : how many byte read for JPEG decoder initialization\n
7118 ///     MS_BOOL \b bEOF : has read to the end of file\n
7119 ///     MS_U8 \b u8DecoderType : 3 types: JPEG main, thumbnail, or MJPEG\n
7120 ///     MS_BOOL \b bInitMem : initialize memory pool or not\n
7121 ///     JPEG_FillHdrFunc \b pFillHdrFunc : the function for fill header information\n
7122 /// };
7123 ///@return \b JPEG_Result : JPEG init status
7124 ///     - E_JPEG_OKAY : Success
7125 ///     - E_JPEG_FAILED : Failed
7126 /********************************************************************/
_MApi_JPEG_Init(JPEG_InitParam * pInitParam)7127 JPEG_Result _MApi_JPEG_Init(JPEG_InitParam *pInitParam)
7128 {
7129     _JPEG_Init_Share_Mem();
7130     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
7131     _USE_OJPD(MApi_JPEG_Init, pInitParam);
7132 
7133 #if 0
7134     MApi_JPEG_SetDbgLevel(E_JPEG_DEBUG_ALL);
7135 #endif
7136 
7137 #if PRINT_NJPD_DECODE_TIME
7138     //printf("init WDT and timer1....\n");
7139     MDrv_WDT_Init((WDT_DbgLv)E_WDT_DBGLV_ERR_ONLY);
7140     MDrv_TIMER_Count(E_TIMER_1, 1);
7141 #endif
7142 
7143 #if LOG_DATA_TO_USB
7144     static MS_U8 fileName2[]={'/','u','s','b','/','s','d','a','1','/','l','o', 'g', '0', '0', '0', '.', 'b', 'i', 'n',0};
7145     fileName2[15]++;
7146     if(fileName2[15] > '9')
7147     {
7148         fileName2[14]++;
7149         fileName2[15] = '0';
7150     }
7151     if(fileName2[14] > '9')
7152     {
7153         fileName2[13]++;
7154         fileName2[14] = '0';
7155     }
7156 
7157     if((logBinfp = fopen((char *)fileName2, "wb"))==NULL)
7158     {
7159         printf("Can't open /usb/sda1/log.bin\n");
7160     }
7161     else
7162     {
7163         printf("open /usb/sda1/log.bin success\n");
7164     }
7165 #endif
7166 
7167     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
7168 
7169     // jpeg constructor
7170 #ifdef NJPD_LONGJUMP_SUPPORT
7171     if ( setjmp( _jmp_state ) )
7172     {
7173         return  E_JPEG_FAILED;
7174     }
7175 #endif
7176 
7177 
7178     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == TRUE)
7179     {
7180 #if SUPPORT_MPO_FORMAT
7181         if(MApi_JPEG_IsMPOFormat()==FALSE)
7182         {
7183             JPEG_terminate(E_JPEG_RE_INIT);
7184             return E_JPEG_FAILED;
7185         }
7186 #else
7187         JPEG_terminate(E_JPEG_RE_INIT);
7188         return E_JPEG_FAILED;
7189 #endif
7190     }
7191     else
7192     {
7193         if(s32NJPEGMutexID[pNJPEGContext->eNJPDNum] == -1)
7194         {
7195             if(_NJPEG_EX_API_MutexCreate(pNJPEGContext->eNJPDNum) != TRUE)
7196             {
7197                 JPEG_DEBUG_API_ERR("[%s]Mutex create failed!\n",__FUNCTION__);
7198                 return E_JPEG_FAILED;
7199             }
7200         }
7201         _NJPEG_EX_API_MutexLock(pNJPEGContext->eNJPDNum);
7202         pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] = TRUE;
7203     }
7204 
7205     if(!pInitParam)
7206     {
7207         JPEG_terminate(E_JPEG_DECODE_ERROR);
7208         _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
7209         return E_JPEG_FAILED;
7210     }
7211 
7212 //    if(pInitParam->u32MRCBufSize < MIN_READBUFFER_SIZE)
7213     if(pInitParam->u32MRCBufSize < JPEG_DEFAULT_EXIF_SIZE)
7214     {
7215         JPEG_terminate(E_JPEG_READBUFFER_TOOSMALL);
7216         _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
7217         return E_JPEG_FAILED;
7218     }
7219 
7220     // the buffer size must be multiple of 8 bytes
7221     pInitParam->u32MRCBufSize = pInitParam->u32MRCBufSize & ~0x7;
7222 
7223     pNJPEGContext->_u32ReadBufferAddr_PA[pNJPEGContext->eNJPDNum] = pInitParam->u32MRCBufAddr;
7224     pNJPEGContext->_u32WriteBufferAddr_PA[pNJPEGContext->eNJPDNum] = pInitParam->u32MWCBufAddr;
7225     pNJPEGContext->_u32InternalBufferAddr_PA[pNJPEGContext->eNJPDNum] = pInitParam->u32InternalBufAddr;
7226 
7227     MRC_BUFFER_ADDR = MS_PA2KSEG1((MS_U32)pInitParam->u32MRCBufAddr);// | AEON_NON_CACHE_MASK;
7228 #ifndef MSOS_TYPE_LINUX_KERNEL
7229     MWC_BUFFER_ADDR = MS_PA2KSEG1((MS_U32)pInitParam->u32MWCBufAddr);// | AEON_NON_CACHE_MASK;
7230 #endif
7231     INTERNAL_BUFFER_ADDR = MS_PA2KSEG1((MS_U32)pInitParam->u32InternalBufAddr);// | AEON_NON_CACHE_MASK;
7232 
7233 #if ENABLE_NJPD_DEBUG_MSG
7234 #ifndef MSOS_TYPE_LINUX_KERNEL
7235     JPEG_memset((void*)(MWC_BUFFER_ADDR), 0x37, pInitParam->u32MWCBufSize);
7236     JPEG_DEBUG_API_MSG("set output buffer to 0x37............................................\n");
7237 #endif
7238 #else
7239     if(MDrv_NJPD_GetVerificationMode()==E_NJPD01_TABLE_READ_WRITE
7240         || MDrv_NJPD_GetVerificationMode()==E_NJPD23_WRITE_PROTECT
7241         || (pNJPEGContext->_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API))
7242     {
7243 #ifndef MSOS_TYPE_LINUX_KERNEL
7244         JPEG_memset((void*)(MS_VIRT)(MWC_BUFFER_ADDR),(MS_U8)0x37, pInitParam->u32MWCBufSize);
7245         JPEG_DEBUG_API_MSG("set output buffer to 0x37............................................\n");
7246 #endif
7247     }
7248 #endif
7249 
7250     if (pNJPEGContext->__bIsMjpeg[pNJPEGContext->eNJPDNum])
7251     {
7252         JPEG_DEBUG_API_MSG ("MJPEG Read buffer address CONVERT : 0x%tx - 0x%tx + 0x%tx ",
7253                 (ptrdiff_t)pNJPEGContext->_u32ReadBufferAddr_PA[pNJPEGContext->eNJPDNum], (ptrdiff_t)MS_VA2PA(pNJPEGContext->__u32RealMjpegBase[pNJPEGContext->eNJPDNum]), (ptrdiff_t)MS_VA2PA(pNJPEGContext->__u32TrickyMjpegBase[pNJPEGContext->eNJPDNum]));
7254 #if MJPEG_SW_PARSING_IN_MIU0
7255         MRC_BUFFER_ADDR -= pNJPEGContext->__u32RealMjpegBase[pNJPEGContext->eNJPDNum];
7256         MRC_BUFFER_ADDR += pNJPEGContext->__u32TrickyMjpegBase[pNJPEGContext->eNJPDNum];
7257 #endif
7258         JPEG_DEBUG_API_MSG ("= 0x%tx\n", (ptrdiff_t)pNJPEGContext->_u32ReadBufferAddr_PA[pNJPEGContext->eNJPDNum]);
7259     }
7260     pNJPEGContext->_pu8In_buf[pNJPEGContext->eNJPDNum] = (MS_U8 *)(MS_VIRT)MRC_BUFFER_ADDR;//pInitParam->u32MRCBufAddr;
7261 
7262     MRC_BUFFER_SIZE = pInitParam->u32MRCBufSize;
7263     MWC_BUFFER_SIZE = pInitParam->u32MWCBufSize;
7264     INTERNAL_BUFFER_SIZE = pInitParam->u32InternalBufSize;
7265 
7266     JPEG_DEBUG_API_MSG("MRC_ADDR = 0x%tx, MRC_BUFFER_SIZE = 0x%tX\n", (ptrdiff_t)pNJPEGContext->_u32ReadBufferAddr[pNJPEGContext->eNJPDNum], (ptrdiff_t)pNJPEGContext->_u32ReadBufferSize[pNJPEGContext->eNJPDNum]);
7267 #ifndef MSOS_TYPE_LINUX_KERNEL
7268     JPEG_DEBUG_API_MSG("MWC_ADDR = 0x%tx, MWC_BUFFER_SIZE = 0x%tX\n", (ptrdiff_t)pNJPEGContext->_u32WriteBufferAddr[pNJPEGContext->eNJPDNum], (ptrdiff_t)pNJPEGContext->_u32WriteBufferSize[pNJPEGContext->eNJPDNum]);
7269 #endif
7270     JPEG_DEBUG_API_MSG("INTERNAL_ADDR  0x%tx, INTERNAL_BUFFER_SIZE = 0x%tX\n", (ptrdiff_t)pNJPEGContext->_u32InternalBufferAddr[pNJPEGContext->eNJPDNum], (ptrdiff_t)pNJPEGContext->_u32InternalBufferSize[pNJPEGContext->eNJPDNum]);
7271     JPEG_DEBUG_API_MSG ("MRC_PA= 0x%tx\n", (ptrdiff_t)pNJPEGContext->_u32ReadBufferAddr_PA[pNJPEGContext->eNJPDNum]);
7272 #ifndef MSOS_TYPE_LINUX_KERNEL
7273     JPEG_DEBUG_API_MSG ("MWC_PA= 0x%tx\n", (ptrdiff_t)pNJPEGContext->_u32WriteBufferAddr_PA[pNJPEGContext->eNJPDNum]);
7274 #endif
7275     JPEG_DEBUG_API_MSG ("INTER_PA= 0x%tx\n", (ptrdiff_t)pNJPEGContext->_u32InternalBufferAddr_PA[pNJPEGContext->eNJPDNum]);
7276 
7277 #ifdef CONFIG_UTOPIA_PROC_DBG_SUPPORT
7278     gNJPEGMDebug._u32ReadBufferAddr_PA = pNJPEGContext->_u32ReadBufferAddr_PA[pNJPEGContext->eNJPDNum];
7279     gNJPEGMDebug._u32WriteBufferAddr_PA= pNJPEGContext->_u32WriteBufferAddr_PA[pNJPEGContext->eNJPDNum];
7280     gNJPEGMDebug._u32InternalBufferAddr_PA= pNJPEGContext->_u32InternalBufferAddr_PA[pNJPEGContext->eNJPDNum];
7281 
7282     gNJPEGMDebug._u32ReadBufferAddr = pNJPEGContext->_u32ReadBufferAddr[pNJPEGContext->eNJPDNum];
7283 #ifndef MSOS_TYPE_LINUX_KERNEL
7284     gNJPEGMDebug._u32WriteBufferAddr= pNJPEGContext->_u32WriteBufferAddr[pNJPEGContext->eNJPDNum];
7285 #endif
7286     gNJPEGMDebug._u32InternalBufferAddr= pNJPEGContext->_u32InternalBufferAddr[pNJPEGContext->eNJPDNum];
7287 
7288     gNJPEGMDebug._u32ReadBufferSize = pNJPEGContext->_u32ReadBufferSize[pNJPEGContext->eNJPDNum];
7289     gNJPEGMDebug._u32WriteBufferSize= pNJPEGContext->_u32WriteBufferSize[pNJPEGContext->eNJPDNum];
7290     gNJPEGMDebug._u32InternalBufferSize= pNJPEGContext->_u32InternalBufferSize[pNJPEGContext->eNJPDNum];
7291 #endif
7292 
7293 
7294 #ifdef MSOS_TYPE_LINUX_KERNEL
7295     if(pInitParam->pFillHdrFunc)
7296     {
7297         pNJPEGContext->_pFillHdrFunc[pNJPEGContext->eNJPDNum] = JPEG_FillHdrFunc_KernlDummy;
7298     }
7299     else
7300     {
7301         pNJPEGContext->_pFillHdrFunc[pNJPEGContext->eNJPDNum] = pInitParam->pFillHdrFunc;
7302     }
7303 #else
7304     pNJPEGContext->_pFillHdrFunc[pNJPEGContext->eNJPDNum] = pInitParam->pFillHdrFunc;
7305 #endif
7306 
7307 #if SW_NJPD_RGB_CMYK
7308     u8Out_buf = (MS_U8 *)(MS_VIRT) MWC_BUFFER_ADDR;
7309     u32_Decode_Line = 0;
7310 #endif
7311 
7312     //JPEG_GO;
7313 
7314     // powner on NJPD
7315     MDrv_NJPD_PowerOn();
7316     JPEG_DEBUG_API_MSG("MDrv_NJPD_PowerOn OK!!\n");
7317 
7318     pNJPEGContext->_u8DecodeType[pNJPEGContext->eNJPDNum] = pInitParam->u8DecodeType;
7319 
7320     pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum] = pInitParam->u32DecByteRead;
7321     pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum] = pInitParam->bEOF;
7322 
7323     JPEG_DEBUG_API_MSG("@1,  _pu8In_buf_ofs[pNJPEGContext->eNJPDNum]=0x%tx, _u32In_buf_left[pNJPEGContext->eNJPDNum]=0x%tx, _bEOF_flag[pNJPEGContext->eNJPDNum]=%d========\n",
7324     (ptrdiff_t)pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum], (ptrdiff_t)pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum], pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum]);
7325         // Try to get more bytes.
7326         if(!JPEG_force_fill_read_buffer(pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum]))
7327         {
7328             JPEG_DEBUG_API_MSG("JPEG_force_fill_read_buffer failed!!!\n");
7329             pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum] = pInitParam->u32DecByteRead;
7330         }
7331     JPEG_DEBUG_API_MSG("@2,  _pu8In_buf_ofs[pNJPEGContext->eNJPDNum]=0x%tx, _u32In_buf_left[pNJPEGContext->eNJPDNum]=0x%tx, _bEOF_flag[pNJPEGContext->eNJPDNum]=%d========\n",
7332     (ptrdiff_t)pNJPEGContext->_pu8In_buf_ofs[pNJPEGContext->eNJPDNum], (ptrdiff_t)pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum], pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum]);
7333 
7334 #if SUPPORT_MPO_FORMAT
7335     if(pNJPEGContext->_u32In_buf_MPO_left[pNJPEGContext->eNJPDNum] ==0xFFFFFFFFUL)
7336     {
7337         pNJPEGContext->_pu8In_buf_MPO_ofs[pNJPEGContext->eNJPDNum] = (MS_U8*)pNJPEGContext->_pu8In_buf[pNJPEGContext->eNJPDNum];
7338         pNJPEGContext->_u32In_buf_MPO_left[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u32In_buf_left[pNJPEGContext->eNJPDNum];
7339         pNJPEGContext->mpo_load_data[pNJPEGContext->eNJPDNum] = TRUE;
7340         pNJPEGContext->bIsMPOFormat[pNJPEGContext->eNJPDNum] = FALSE;
7341         pNJPEGContext->u32MPFOffset[pNJPEGContext->eNJPDNum] = 0;
7342         pNJPEGContext->_u32App2MarkerOffset[pNJPEGContext->eNJPDNum] = 0;
7343 
7344         //Init MPO database
7345         JPEG_InitMPO();
7346     }
7347 #endif
7348 
7349     pNJPEGContext->u32DataOffset[pNJPEGContext->eNJPDNum] = 0;
7350     pNJPEGContext->u32SOFOffset[pNJPEGContext->eNJPDNum] = 0;
7351 
7352     JPEG_init_thumbnail();
7353 
7354     if (pNJPEGContext->_u8DecodeType[pNJPEGContext->eNJPDNum] == E_JPEG_TYPE_MJPEG)
7355     {
7356         pNJPEGContext->__bIsMjpeg[pNJPEGContext->eNJPDNum] = TRUE;
7357 #if MJPEG_SW_PARSING_IN_MIU0
7358         pNJPEGContext->__u32RealMjpegBase[pNJPEGContext->eNJPDNum] = MRC_BUFFER_ADDR;
7359         pNJPEGContext->__u32TrickyMjpegBase[pNJPEGContext->eNJPDNum] = INTERNAL_BUFFER_ADDR;
7360 #endif
7361 
7362         _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
7363         return E_JPEG_OKAY;
7364     }
7365 
7366     if(!JPEG_decode_init())
7367     {
7368         _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
7369         return E_JPEG_FAILED;
7370     }
7371 
7372     if (pNJPEGContext->bMHEG5[pNJPEGContext->eNJPDNum])
7373     {
7374         if(pNJPEGContext->_Error_code[pNJPEGContext->eNJPDNum] == E_JPEG_UNSUPPORTED_MARKER)
7375         {
7376             _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
7377             return E_JPEG_FAILED;
7378         }
7379     }
7380 
7381     //init mempool for progressive decoding.
7382 #if SW_NJPD_RGB_CMYK
7383     if (pInitParam->bInitMem && (pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum] || MApi_JPEG_Is_RGB_CMYK()))
7384 #else
7385     if (pInitParam->bInitMem && pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum])
7386 #endif
7387     {
7388         if(!JPEG_MEMORY_init_mempool((void *)(INTERNAL_BUFFER_ADDR + JPEG_DEFAULT_EXIF_SIZE)
7389                                 , (INTERNAL_BUFFER_SIZE - JPEG_DEFAULT_EXIF_SIZE)))
7390         {
7391             JPEG_DEBUG_API_MSG("JPEG_MEMORY_init_mempool FAIL!!\n");
7392             _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
7393             return E_JPEG_FAILED;
7394         }
7395         JPEG_DEBUG_API_MSG("JPEG_MEMORY_init_mempool OK!!\n");
7396     }
7397 
7398     //JPEG_GO;
7399 
7400     _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
7401     return E_JPEG_OKAY;
7402 }
7403 //------------------------------------------------------------------------------
7404 /********************************************************************/
7405 ///Decode JPEG header
7406 ///@return \b JPEG_Result : JPEG header decode status
7407 ///     - E_JPEG_OKAY : Success
7408 ///     - E_JPEG_FAILED : Failed
7409 /********************************************************************/
_MApi_JPEG_DecodeHdr(void)7410 JPEG_Result _MApi_JPEG_DecodeHdr(void)
7411 {
7412     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
7413     _USE_OJPD(MApi_JPEG_DecodeHdr);
7414 #if SW_NJPD_RGB_CMYK
7415     MS_U8 mcu_width, mcu_height;
7416     MS_U16 pic_width = pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum];
7417     MS_U16 pic_height = pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum];
7418     MS_U8 Y_VSF = pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][0];
7419     MS_U8 Y_HSF = pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][0];
7420 #endif
7421 
7422 #if PRINT_NJPD_DECODE_TIME
7423     pNJPEGContext->u32MeasureDecodeTime[pNJPEGContext->eNJPDNum] = MDrv_TIMER_GetUs(E_TIMER_1);
7424     pNJPEGContext->u32MeasureDecodeTimeSW[pNJPEGContext->eNJPDNum] = 0;
7425     pNJPEGContext->u32MeasureDecodeTimeHW[pNJPEGContext->eNJPDNum] = 0;
7426     pNJPEGContext->u32MeasureDecodeTimeTable[pNJPEGContext->eNJPDNum] = 0;
7427 #endif
7428 
7429     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
7430     {
7431         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
7432         return E_JPEG_FAILED;
7433     }
7434     _NJPEG_EX_API_MutexLock(pNJPEGContext->eNJPDNum);
7435 
7436     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
7437 
7438 #ifdef NJPD_LONGJUMP_SUPPORT
7439     if ( setjmp( _jmp_state ) )
7440     {
7441         _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
7442         return ( E_JPEG_FAILED );
7443     }
7444 #endif
7445 
7446     if(!JPEG_init_frame())
7447     {
7448         JPEG_DEBUG_API_ERR("%s [%d]\n", __FUNCTION__, __LINE__);
7449         _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
7450         return E_JPEG_FAILED;
7451     }
7452 
7453     if ( pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum] )
7454     {
7455 #if SUPPORT_PROGRESSIVE_MODE
7456         if(!JPEG_init_progressive())
7457         {
7458             _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
7459             return E_JPEG_FAILED;
7460         }
7461 #endif
7462     }
7463     else
7464     {
7465         if(!JPEG_init_sequential())
7466         {
7467             _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
7468             return E_JPEG_FAILED;
7469         }
7470     }
7471 
7472 #if SW_NJPD_RGB_CMYK
7473     if((E_JPEG_CMYK == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum])
7474     || (E_JPEG_RGB == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum]))
7475     {
7476         if ( ( mcu_width = pic_width % ( Y_HSF * 8 ) ) )
7477         {
7478             pic_width += ( Y_HSF * 8 - mcu_width );
7479         }
7480 
7481         if ( ( mcu_height = pic_height% ( Y_VSF * 8 ) ) )
7482         {
7483             pic_height += ( Y_VSF * 8 - mcu_height );
7484         }
7485 
7486         JPEG_DEBUG_API_MSG("Y_HSF = %d and Y_VSF = %d\n",Y_HSF, Y_VSF);
7487 
7488         JPEG_DEBUG_API_MSG("mcu_width = %d and mcu_height = %d\n",mcu_width, mcu_height);
7489 
7490         pNJPEGContext->_u16NonAlignmentImage_x_size[pNJPEGContext->eNJPDNum] = pic_width;
7491         pNJPEGContext->_u16NonAlignmentImage_y_size[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum];
7492         pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] = pic_width;
7493         pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum] = pic_height;
7494 
7495         JPEG_DEBUG_API_MSG("Width = %d and Height = %d\n",pNJPEGContext->JPEG_MAX_WIDTH[pNJPEGContext->eNJPDNum], pNJPEGContext->JPEG_MAX_HEIGHT[pNJPEGContext->eNJPDNum]);
7496 
7497         //Set the Scale down variable
7498         if(pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] > pNJPEGContext->JPEG_MAX_WIDTH[pNJPEGContext->eNJPDNum]*4 || pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum]>pNJPEGContext->JPEG_MAX_HEIGHT[pNJPEGContext->eNJPDNum]*4)
7499         {
7500             pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] = E_NJPD_DOWNSCALE_EIGHTH;
7501             pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum]= (pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum]/ 64)*64;
7502             pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum]/ 8;
7503             pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum]/ 8;
7504             JPEG_DEBUG_API_MSG("down scale 1/8!!\n");
7505         }
7506         else if(pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] > pNJPEGContext->JPEG_MAX_WIDTH[pNJPEGContext->eNJPDNum]*2 || pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum]>pNJPEGContext->JPEG_MAX_HEIGHT[pNJPEGContext->eNJPDNum]*2)
7507         {
7508             pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] = E_NJPD_DOWNSCALE_FOURTH;
7509             pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum]= (pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum]/ 32)*32;
7510             pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum]/ 4;
7511             pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum]/ 4;
7512              JPEG_DEBUG_API_MSG("down scale 1/4!!\n");
7513         }
7514         else if (pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] > pNJPEGContext->JPEG_MAX_WIDTH[pNJPEGContext->eNJPDNum] || pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum]>pNJPEGContext->JPEG_MAX_HEIGHT[pNJPEGContext->eNJPDNum])
7515         {
7516             pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] = E_NJPD_DOWNSCALE_HALF;
7517             pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum]= (pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum]/ 16)*16;
7518             pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum]/ 2;
7519             pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum] = pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum]/ 2;
7520              JPEG_DEBUG_API_MSG("down scale 1/2!!\n");
7521         }
7522         else
7523         {
7524              JPEG_DEBUG_API_MSG("down scale 1/1!!\n");
7525             pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] = E_NJPD_DOWNSCALE_ORG;
7526 
7527         }
7528 
7529         _u16PaddingMcuNumber = (pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum] << pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum])/pNJPEGContext->gu8Max_mcu_x_size[pNJPEGContext->eNJPDNum];
7530         pNJPEGContext->_u32Max_blocks_per_row[pNJPEGContext->eNJPDNum] = _u16PaddingMcuNumber* pNJPEGContext->_u16Max_blocks_per_mcu[pNJPEGContext->eNJPDNum];
7531 
7532 #ifdef CONFIG_UTOPIA_PROC_DBG_SUPPORT
7533     gNJPEGMDebug._u16Image_x_size = pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum];
7534     gNJPEGMDebug._u16Image_y_size= pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum];
7535     gNJPEGMDebug._u8ScaleDownFactor = pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum];
7536 #endif
7537 
7538         JPEG_DEBUG_API_MSG("down scale width : %d\n",pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum]);
7539         JPEG_DEBUG_API_MSG("down scale height : %d\n",pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum]);
7540         JPEG_DEBUG_API_MSG("down scale MCU : %td\n", (ptrdiff_t)pNJPEGContext->_u32Max_blocks_per_row[pNJPEGContext->eNJPDNum]);
7541     }
7542 #endif
7543 
7544     if (pNJPEGContext->__bIsMjpeg[pNJPEGContext->eNJPDNum])
7545     {
7546         JPEG_DEBUG_API_MSG ("MJPEG Read buffer address RECOVER : 0x%tx - 0x%tx + 0x%tx ",
7547                 (ptrdiff_t)pNJPEGContext->_u32ReadBufferAddr_PA[pNJPEGContext->eNJPDNum], (ptrdiff_t)MS_VA2PA(pNJPEGContext->__u32TrickyMjpegBase[pNJPEGContext->eNJPDNum]), (ptrdiff_t)MS_VA2PA(pNJPEGContext->__u32RealMjpegBase[pNJPEGContext->eNJPDNum]));
7548 #if MJPEG_SW_PARSING_IN_MIU0
7549         MRC_BUFFER_ADDR -= pNJPEGContext->__u32TrickyMjpegBase[pNJPEGContext->eNJPDNum];
7550         MRC_BUFFER_ADDR += pNJPEGContext->__u32RealMjpegBase[pNJPEGContext->eNJPDNum];
7551 #endif
7552         JPEG_DEBUG_API_MSG ("= 0x%tx\n", (ptrdiff_t)pNJPEGContext->_u32ReadBufferAddr_PA[pNJPEGContext->eNJPDNum]);
7553     }
7554 
7555     _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
7556     return ( E_JPEG_OKAY );
7557 }
7558 //------------------------------------------------------------------------------
7559 /********************************************************************/
7560 ///Decode JPEG data (baseline & progressive)
7561 ///@return \b JPEG_Result : JPEG decode status
7562 ///     - E_JPEG_DONE : For progressive decoding one line done.
7563 ///     - E_JPEG_OKAY : Success
7564 ///     - E_JPEG_FAILED : Failed
7565 /********************************************************************/
_MApi_JPEG_Decode(void)7566 JPEG_Result _MApi_JPEG_Decode(void)
7567 {
7568     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
7569     _USE_OJPD(MApi_JPEG_Decode);
7570     JPEG_Result retVal = E_JPEG_FAILED;
7571 
7572     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
7573     {
7574         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
7575         return E_JPEG_FAILED;
7576     }
7577 
7578     _NJPEG_EX_API_MutexLock(pNJPEGContext->eNJPDNum);
7579     JPEG_DEBUG_API_MSG("%s: _bProgressive_flag[pNJPEGContext->eNJPDNum] = %d\n", __FUNCTION__ , pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum]);
7580 
7581     if(pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum])
7582     {
7583 #if SUPPORT_PROGRESSIVE_MODE
7584         retVal = JPEG_Progressive_Decode();
7585 #endif
7586     }
7587     else
7588     {
7589 #if SW_NJPD_RGB_CMYK
7590         if((E_JPEG_CMYK == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum])
7591         || (E_JPEG_RGB == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum]))
7592         {
7593             retVal = msAPI_JPEG_Baseline_Decode();
7594             _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
7595             return retVal;
7596         }
7597 #endif
7598 
7599         JPEG_StartDecode();
7600 #if PRINT_NJPD_DECODE_TIME
7601         pNJPEGContext->u32MeasureDecodeTimeSW[pNJPEGContext->eNJPDNum] = MDrv_TIMER_GetUs(E_TIMER_1)-pNJPEGContext->u32MeasureDecodeTime[pNJPEGContext->eNJPDNum];
7602         pNJPEGContext->u32MeasureDecodeTime[pNJPEGContext->eNJPDNum] = MDrv_TIMER_GetUs(E_TIMER_1);
7603 #endif
7604 #ifdef CONFIG_UTOPIA_PROC_DBG_SUPPORT
7605         gNJPEGMDebug._u32HWStartTime= MsOS_GetSystemTime();
7606 #endif
7607 
7608         if(pNJPEGContext->_Error_code[pNJPEGContext->eNJPDNum] == E_JPEG_NO_ERROR)
7609             retVal = E_JPEG_OKAY;
7610         else
7611             retVal = E_JPEG_FAILED;
7612     }
7613     _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
7614     return retVal;
7615 }
7616 
_MApi_NJPD_PrintMem(MS_VIRT u32Addr,MS_U32 u32Size)7617 void _MApi_NJPD_PrintMem(MS_VIRT u32Addr, MS_U32 u32Size)
7618 {
7619     MS_U32 u32i;
7620     printf("===========================================================\n");
7621     printf("print memory addr=0x%tx, size=0x%tx\n", (ptrdiff_t)u32Addr, (ptrdiff_t)u32Size);
7622     printf("===========================================================\n");
7623 
7624 #if 0
7625     for(u32i=0; u32i<u32Size/8+((u32Size%8)? 1:0); u32i++)
7626     {
7627         NJPD_DEBUG_DRV_MSG("%02x %02x %02x %02x %02x %02x %02x %02x \n",
7628         *((MS_U8*)(u32Addr+u32i*8)), *((MS_U8*)(u32Addr+u32i*8+1)), *((MS_U8*)(u32Addr+u32i*8+2)), *((MS_U8*)(u32Addr+u32i*8+3)),
7629         *((MS_U8*)(u32Addr+u32i*8+4)), *((MS_U8*)(u32Addr+u32i*8+5)), *((MS_U8*)(u32Addr+u32i*8+6)), *((MS_U8*)(u32Addr+u32i*8+7))
7630         );
7631     }
7632 #else
7633     for(u32i=0; u32i<u32Size/16+((u32Size%16)? 1:0); u32i++)
7634     {
7635         printf("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x \n",
7636         *((MS_U8*)(u32Addr+u32i*16)), *((MS_U8*)(u32Addr+u32i*16+1)), *((MS_U8*)(u32Addr+u32i*16+2)), *((MS_U8*)(u32Addr+u32i*16+3)),
7637         *((MS_U8*)(u32Addr+u32i*16+4)), *((MS_U8*)(u32Addr+u32i*16+5)), *((MS_U8*)(u32Addr+u32i*16+6)), *((MS_U8*)(u32Addr+u32i*16+7)),
7638         *((MS_U8*)(u32Addr+u32i*16+8)), *((MS_U8*)(u32Addr+u32i*16+9)), *((MS_U8*)(u32Addr+u32i*16+10)), *((MS_U8*)(u32Addr+u32i*16+11)),
7639         *((MS_U8*)(u32Addr+u32i*16+12)), *((MS_U8*)(u32Addr+u32i*16+13)), *((MS_U8*)(u32Addr+u32i*16+14)), *((MS_U8*)(u32Addr+u32i*16+15))
7640         );
7641     }
7642 #endif
7643     printf("===========================================================\n");
7644 }
7645 
7646 #if LOG_DATA_TO_USB
_PrintOutputMem(MS_U32 u32addr,MS_U32 u32Size)7647 static void _PrintOutputMem(MS_U32 u32addr, MS_U32 u32Size)
7648 {
7649     u32Size = ALIGN_16(u32Size);
7650     static MS_U8 fileName2[]={'/','u','s','b','/','s','d','a','1','/','0','0', '0', '0', 'x','0','0', '0', '0', '_','0', '0', '0', '.', 'y', 'u', 'y', 'v',0};
7651     fileName2[10]=MApi_JPEG_GetWidth()/1000+'0';
7652     fileName2[11]=(MApi_JPEG_GetWidth()/100)%10+'0';
7653     fileName2[12]=(MApi_JPEG_GetWidth()/10)%10+'0';
7654     fileName2[13]=MApi_JPEG_GetWidth()%10+'0';
7655     fileName2[15]=MApi_JPEG_GetHeight()/1000+'0';
7656     fileName2[16]=(MApi_JPEG_GetHeight()/100)%10+'0';
7657     fileName2[17]=(MApi_JPEG_GetHeight()/10)%10+'0';
7658     fileName2[18]=MApi_JPEG_GetHeight()%10+'0';
7659 
7660     fileName2[22]++;
7661     if(fileName2[22] > '9')
7662     {
7663         fileName2[21]++;
7664         fileName2[22] = '0';
7665     }
7666     if(fileName2[21] > '9')
7667     {
7668         fileName2[20]++;
7669         fileName2[21] = '0';
7670     }
7671 
7672     FILE *outBinfp;
7673     if((outBinfp = fopen((char *)fileName2, "wb"))==NULL)
7674     {
7675         printf("Can't open output yuyv file\n");
7676     }
7677     else
7678     {
7679         printf("open output yuyv file success\n");
7680     }
7681 
7682     fwrite((void *)u32addr, 1, u32Size, outBinfp);
7683     fclose(outBinfp);
7684 
7685 }
7686 #endif
7687 
7688 //------------------------------------------------------------------------------
7689 /********************************************************************/
7690 /// Free all block of NJPD. Complete destroy the decoder object.
7691 /// It could be called at any time.
7692 ///@return None
7693 /********************************************************************/
_MApi_JPEG_Exit(void)7694 void _MApi_JPEG_Exit(void)
7695 {
7696 
7697     _NJPEG_SHM_POINTER_CHECK();
7698 
7699 #if SUPPORT_OJPD
7700     if(pNJPEGContext->bUseOJPD)
7701     {
7702         pNJPEGContext->bUseOJPD = 0;
7703         MApi_JPEG_Exit_OJPD();
7704         return;
7705     }
7706 #endif
7707 
7708     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
7709     {
7710         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
7711         return;
7712     }
7713 
7714     _NJPEG_EX_API_MutexLock(pNJPEGContext->eNJPDNum);
7715 
7716     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
7717     JPEG_DEBUG_API_MSG("MApi_JPEG_GetCurReadStatus : \nCurRow = %d, CurCol = %d ",
7718         MDrv_NJPD_GetCurRow(),
7719         MDrv_NJPD_GetCurCol());
7720     JPEG_DEBUG_API_MSG("CurMRCAddr = 0x%tx\n", (ptrdiff_t)MDrv_NJPD_GetCurMRCAddr());
7721 
7722     MDrv_NJPD_PowerOff();
7723     JPEG_free_all_blocks();
7724 
7725 #if SW_NJPD_RGB_CMYK
7726     pNJPEGContext->bEnableCMYK = TRUE;
7727     pNJPEGContext->bEnableRGB = TRUE;
7728 #endif
7729 
7730 #if SUPPORT_MPO_FORMAT
7731     pNJPEGContext->_u32In_buf_MPO_left[pNJPEGContext->eNJPDNum] = 0xFFFFFFFFUL;         // reset _u32In_buf_MPO_left[pNJPEGContext->eNJPDNum] to U32_MAX
7732     pNJPEGContext->bIsMPOFormat[pNJPEGContext->eNJPDNum] = FALSE;
7733 #endif
7734 
7735 #if LOG_DATA_TO_USB
7736 fclose(logBinfp);
7737 logBinfp = NULL;
7738 #endif
7739 
7740     pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] = FALSE;
7741     _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
7742 #if 0
7743     _NJPEG_EX_API_MutexDelete(pNJPEGContext->eNJPDNum);
7744 #endif
7745     JPEG_DEBUG_API_MSG("%s: done!!\n", __FUNCTION__);
7746     return;
7747 }
7748 //------------------------------------------------------------------------------
7749 /********************************************************************/
7750 ///Get JPEG decoder error code
7751 ///@return JPEG decoder error code
7752 /********************************************************************/
_MApi_JPEG_GetErrorCode(void)7753 JPEG_ErrCode _MApi_JPEG_GetErrorCode(void)
7754 {
7755     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_NOT_INIT);
7756     _USE_OJPD(MApi_JPEG_GetErrorCode);
7757 
7758     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
7759     {
7760         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
7761         return E_JPEG_NOT_INIT;
7762     }
7763     JPEG_DEBUG_API_MSG("%s: ErrCode = %d\n", __FUNCTION__ , pNJPEGContext->_Error_code[pNJPEGContext->eNJPDNum]);
7764     return pNJPEGContext->_Error_code[pNJPEGContext->eNJPDNum];
7765 }
7766 //------------------------------------------------------------------------------
7767 /********************************************************************/
7768 ///Get NJPD EVENT FLAG
7769 ///@return \b JPEG_Event : JPEG event flag
7770 /********************************************************************/
_MApi_JPEG_GetJPDEventFlag(void)7771 JPEG_Event _MApi_JPEG_GetJPDEventFlag(void)
7772 {
7773     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_EVENT_DEC_DONE | E_JPEG_EVENT_DEC_ERROR_MASK);
7774     _USE_OJPD(MApi_JPEG_GetJPDEventFlag);
7775     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
7776     {
7777         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
7778         return (E_JPEG_EVENT_DEC_DONE | E_JPEG_EVENT_DEC_ERROR_MASK);
7779     }
7780     _NJPEG_EX_API_MutexLock(pNJPEGContext->eNJPDNum);
7781 
7782 #if SW_NJPD_RGB_CMYK
7783     // It's pure software decode
7784     if((E_JPEG_CMYK == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum])
7785     || (E_JPEG_RGB == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum]))
7786     {
7787         _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
7788         return E_JPEG_EVENT_DEC_DONE;
7789     }
7790 #endif
7791 
7792     {
7793         NJPD_Event reg_val = (NJPD_Event)MDrv_NJPD_GetEventFlag();
7794         JPEG_Event reg_val_org = E_JPEG_EVENT_DEC_NONE;
7795         if(reg_val!=0)
7796         {
7797             JPEG_DEBUG_API_MSG("%s: reg_val = 0x%04X\n", __FUNCTION__ , reg_val);
7798         }
7799         if(E_NJPD_EVENT_DEC_DONE & reg_val)
7800         {
7801             if(MDrv_NJPD_IsNeedToPatch(E_NJPD_MIU_LAST_Z_PATCH))
7802             {
7803                 NJPD_Status *pDrvStatus = MDrv_NJPD_GetStatus();
7804                 if(pDrvStatus->bIsrEnable == 0)
7805                 {
7806                     // delay task is not allowed in ISR
7807                     MsOS_DelayTask(1);
7808                 }
7809             }
7810 
7811 #if PRINT_NJPD_DECODE_TIME
7812             pNJPEGContext->u32MeasureDecodeTimeHW[pNJPEGContext->eNJPDNum] = MDrv_TIMER_GetUs(E_TIMER_1)-pNJPEGContext->u32MeasureDecodeTime[pNJPEGContext->eNJPDNum];
7813             JPEG_DEBUG_API_MSG("SW decode header:[%td]us, HW decode: [%td]us, table:[%td]us\n", (ptrdiff_t)pNJPEGContext->u32MeasureDecodeTimeSW[pNJPEGContext->eNJPDNum],
7814                 (ptrdiff_t)pNJPEGContext->u32MeasureDecodeTimeHW[pNJPEGContext->eNJPDNum], (ptrdiff_t)pNJPEGContext->u32MeasureDecodeTimeTable[pNJPEGContext->eNJPDNum]);
7815 #endif
7816 #ifdef CONFIG_UTOPIA_PROC_DBG_SUPPORT
7817         gNJPEGMDebug._u32HWEndTime= MsOS_GetSystemTime();
7818 #endif
7819             if(pNJPEGContext->_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API)
7820             {
7821 #ifndef MSOS_TYPE_LINUX_KERNEL
7822                 verJPD_CRC32_Init();
7823                 verJPD_CRC32_Update((MS_U8 *)(MS_VIRT)MWC_BUFFER_ADDR,
7824                     (MS_U32)MApi_JPEG_GetWidth()*MApi_JPEG_GetHeight()*2);
7825                 JPEG_DEBUG_API_MSG("[%dx%d], u32CRCResult=0x%tx\n",MApi_JPEG_GetWidth(), MApi_JPEG_GetHeight(), (ptrdiff_t)verJPD_CRC32_GetResult());
7826 
7827                 _MApi_NJPD_Debug();
7828                 _MApi_NJPD_PrintMem(MWC_BUFFER_ADDR, 0x100);
7829 #endif
7830             }
7831 
7832 #if LOG_DATA_TO_USB
7833             if(MApi_JPEG_GetWidth() <=pNJPEGContext->JPEG_MAX_WIDTH[pNJPEGContext->eNJPDNum]
7834                 && MApi_JPEG_GetHeight() <=pNJPEGContext->JPEG_MAX_HEIGHT[pNJPEGContext->eNJPDNum])
7835             {
7836                 MS_U32 u32Size;
7837                 u32Size = MApi_JPEG_GetWidth()*MApi_JPEG_GetHeight()*2;
7838                 JPEG_DEBUG_API_MSG("[%dx%d], MWC_BUFFER_ADDR=0x%x, size=0x%x", MApi_JPEG_GetWidth(),
7839                     MApi_JPEG_GetHeight(), MS_VA2PA(MWC_BUFFER_ADDR),u32Size);
7840                 _PrintOutputMem(MWC_BUFFER_ADDR, u32Size);
7841             }
7842 #endif
7843         }
7844         // For the compatibility, the NJPD's event should be converted
7845         if(reg_val & E_NJPD_EVENT_DEC_DONE)
7846         {
7847             reg_val_org |=E_JPEG_EVENT_DEC_DONE;
7848 #if 0
7849             printf("=======================================================\n");
7850             printf("Decode done!!! dump stuck message!!!!!!!!!!!!!!!!!!!!!!!!!\n");
7851             printf("=======================================================\n");
7852             MApi_NJPD_Debug();
7853             while(1);
7854 #endif
7855         }
7856         if(reg_val & NJPD_EVENT_ERROR)
7857         {
7858             JPEG_terminate(E_JPEG_DECODE_ERROR);
7859             reg_val_org &= ~E_JPEG_EVENT_DEC_DONE;
7860             MDrv_NJPD_Debug();
7861         }
7862         if(reg_val & E_NJPD_EVENT_MINICODE_ERR)
7863         {
7864             JPEG_DEBUG_API_ERR("[%s]mini-code error!!\n", __FUNCTION__);
7865             reg_val_org |=E_JPEG_EVENT_DEC_ECS_ERROR;
7866         }
7867         if(reg_val & E_NJPD_EVENT_INV_SCAN_ERR )
7868         {
7869             JPEG_DEBUG_API_ERR("[%s]inverse scan error!!\n", __FUNCTION__);
7870             reg_val_org |=E_JPEG_EVENT_DEC_IS_ERROR;
7871         }
7872         if(reg_val & E_NJPD_EVENT_RES_MARKER_ERR )
7873         {
7874             JPEG_DEBUG_API_ERR("[%s]restart marker error!!\n", __FUNCTION__);
7875             reg_val_org |=E_JPEG_EVENT_DEC_RST_ERROR;
7876         }
7877         if(reg_val & E_NJPD_EVENT_RMID_ERR
7878             || reg_val & E_NJPD_EVENT_END_IMAGE_ERR
7879             || reg_val & E_NJPD_EVENT_DATA_LOSS_ERR
7880             || reg_val & E_NJPD_EVENT_HUFF_TABLE_ERR)
7881         {
7882             JPEG_DEBUG_API_ERR("[%s]other error!!\n", __FUNCTION__);
7883             reg_val_org |=E_JPEG_EVENT_DEC_ECS_ERROR;
7884         }
7885         if(reg_val & E_NJPD_EVENT_MRC0_EMPTY )
7886         {
7887             JPEG_DEBUG_API_MSG("%s : Get buffer 0 empty done with reg_val = 0x%04X\n", __FUNCTION__ , reg_val);
7888             reg_val_org |=E_JPEG_EVENT_DEC_MRBL_DONE;
7889         }
7890         if(reg_val & E_NJPD_EVENT_MRC1_EMPTY )
7891         {
7892             JPEG_DEBUG_API_MSG("%s : Get buffer 1 empty done with reg_val = 0x%04X\n", __FUNCTION__ , reg_val);
7893             reg_val_org |=E_JPEG_EVENT_DEC_MRBH_DONE;
7894         }
7895         if(reg_val & E_NJPD_EVENT_WRITE_PROTECT )
7896         {
7897             JPEG_DEBUG_API_MSG("[%s]Write protect!!\n", __FUNCTION__);
7898             reg_val_org |=E_JPEG_EVENT_DEC_MWB_FULL;
7899         }
7900         if(reg_val & E_NJPD_EVENT_IBUF_LOAD_DONE)
7901         {
7902         }
7903 
7904     _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
7905         return reg_val_org;
7906     }
7907 }
7908 //------------------------------------------------------------------------------
7909 /********************************************************************/
7910 ///Set NJPD EVENT FLAG
7911 ///@param -eEvtVal \b IN : JPEG_Event
7912 ///@return None
7913 /********************************************************************/
_MApi_JPEG_SetJPDEventFlag(JPEG_Event eEvtVal)7914 void _MApi_JPEG_SetJPDEventFlag(JPEG_Event eEvtVal)
7915 {
7916     _NJPEG_SHM_POINTER_CHECK();
7917     _USE_OJPD(MApi_JPEG_SetJPDEventFlag, eEvtVal);
7918     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
7919     {
7920         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
7921         return;
7922     }
7923 
7924     _NJPEG_EX_API_MutexLock(pNJPEGContext->eNJPDNum);
7925 #if SW_NJPD_RGB_CMYK
7926     // It's pure software decode
7927     if((E_JPEG_CMYK == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum])
7928     || (E_JPEG_RGB == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum]))
7929     {
7930         _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
7931         return;
7932     }
7933 #endif
7934 
7935     NJPD_Event reg_val =E_NJPD_EVENT_DEC_NONE;
7936     if(eEvtVal & E_JPEG_EVENT_DEC_DONE)
7937     {
7938         reg_val |=E_NJPD_EVENT_DEC_DONE;
7939     }
7940     if(eEvtVal & E_JPEG_EVENT_DEC_ECS_ERROR)
7941     {
7942         reg_val |=E_NJPD_EVENT_MINICODE_ERR;
7943     }
7944     if(eEvtVal & E_JPEG_EVENT_DEC_IS_ERROR)
7945     {
7946         reg_val |=E_NJPD_EVENT_INV_SCAN_ERR;
7947     }
7948     if(eEvtVal & E_JPEG_EVENT_DEC_RST_ERROR)
7949     {
7950         reg_val |=E_NJPD_EVENT_RES_MARKER_ERR;
7951     }
7952     if(eEvtVal & E_JPEG_EVENT_DEC_MRBL_DONE)
7953     {
7954         reg_val |=E_NJPD_EVENT_MRC0_EMPTY;
7955     }
7956     if(eEvtVal & E_JPEG_EVENT_DEC_MRBH_DONE)
7957     {
7958         reg_val |=E_NJPD_EVENT_MRC1_EMPTY;
7959     }
7960     if(eEvtVal & E_JPEG_EVENT_DEC_MRB_DONE)
7961     {
7962     }
7963     if(eEvtVal & E_JPEG_EVENT_DEC_MWB_FULL)
7964     {
7965         reg_val |=E_NJPD_EVENT_WRITE_PROTECT;
7966     }
7967     MDrv_NJPD_SetEventFlag((MS_U16)reg_val);
7968     _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
7969     return;
7970 }
7971 //------------------------------------------------------------------------------
7972 /********************************************************************/
7973 ///Reset NJPD -- Reset must be called before trigger NJPD\n
7974 ///This function always issue pause command and wait for both MRC & MWC\n
7975 ///becoming inactive, then reset NJPD.\n
7976 ///\b NOTE: The pause function can be only used by Pluto/T1/T2... not include ERIS.
7977 ///@return None
7978 /********************************************************************/
_MApi_JPEG_Rst(void)7979 void _MApi_JPEG_Rst(void)
7980 {
7981     _NJPEG_SHM_POINTER_CHECK();
7982     _USE_OJPD(MApi_JPEG_Rst);
7983     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
7984     {
7985         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
7986         return;
7987     }
7988     _NJPEG_EX_API_MutexLock(pNJPEGContext->eNJPDNum);
7989     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
7990     JPEG_DEBUG_API_MSG("MApi_JPEG_GetCurReadStatus : \nCurRow = %d, CurCol = %d ",
7991         MDrv_NJPD_GetCurRow(),
7992         MDrv_NJPD_GetCurCol());
7993     JPEG_DEBUG_API_MSG("CurMRCAddr = 0x%tx\n", (ptrdiff_t)MDrv_NJPD_GetCurMRCAddr());
7994 
7995     MDrv_NJPD_Rst();
7996     JPEG_DEBUG_API_MSG("%s:done!!\n", __FUNCTION__);
7997     _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
7998     return;
7999 }
8000 //------------------------------------------------------------------------------
8001 /********************************************************************/
8002 ///Power On JPEG decoder
8003 ///@return None
8004 /********************************************************************/
_MApi_JPEG_PowerOn(void)8005 void _MApi_JPEG_PowerOn(void)
8006 {
8007     _NJPEG_SHM_POINTER_CHECK();
8008     _USE_OJPD(MApi_JPEG_PowerOn);
8009     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
8010     {
8011         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8012         return;
8013     }
8014     _NJPEG_EX_API_MutexLock(pNJPEGContext->eNJPDNum);
8015     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
8016     MDrv_NJPD_PowerOn();
8017     _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
8018     return;
8019 }
8020 //------------------------------------------------------------------------------
8021 /********************************************************************/
8022 ///Power Off JPEG decoder
8023 ///@return None
8024 /********************************************************************/
_MApi_JPEG_PowerOff(void)8025 void _MApi_JPEG_PowerOff(void)
8026 {
8027     _NJPEG_SHM_POINTER_CHECK();
8028     _USE_OJPD(MApi_JPEG_PowerOff);
8029     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
8030     {
8031         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8032         return;
8033     }
8034     _NJPEG_EX_API_MutexLock(pNJPEGContext->eNJPDNum);
8035     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
8036     MDrv_NJPD_PowerOff();
8037     _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
8038     return;
8039 }
8040 //------------------------------------------------------------------------------
8041 /********************************************************************/
8042 ///Get current vertical line index written to memory
8043 ///@return Current vertical line index written to memory
8044 /********************************************************************/
_MApi_JPEG_GetCurVidx(void)8045 MS_U16 _MApi_JPEG_GetCurVidx(void) //new
8046 {
8047     _NJPEG_SHM_POINTER_CHECK_RETURN(0);
8048     _USE_OJPD(MApi_JPEG_GetCurVidx);
8049     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
8050     {
8051         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8052         return 0;
8053     }
8054     JPEG_DEBUG_API_MSG("%s:\n", __FUNCTION__);
8055 #if 1
8056     // NJPD do not support the register vidx
8057     // use other method to calculate this value
8058     if(MDrv_NJPD_GetEventFlag() & E_NJPD_EVENT_DEC_DONE)
8059     {
8060         return pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum];
8061     }
8062     else
8063     {
8064 
8065         MS_U32 u32MCURowCnt;
8066         u32MCURowCnt = (MDrv_NJPD_GetWritePtrAddr()-MDrv_NJPD_GetMWCStartAddr())/2/pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum]/16;
8067 
8068         if(u32MCURowCnt > 2)
8069         {
8070             return (u32MCURowCnt-2)*16;
8071         }
8072         else
8073         {
8074             return 0;
8075         }
8076     }
8077 #else
8078     return MDrv_NJPD_GetCurVidx();
8079 #endif
8080 }
8081 //------------------------------------------------------------------------------
8082 /********************************************************************/
8083 ///Check current JPEG image is progressive or not
8084 ///@return TRUE / FALSE
8085 /// - TRUE : progressive
8086 /// - FALSE : baseline
8087 /********************************************************************/
_MApi_JPEG_IsProgressive(void)8088 MS_BOOL _MApi_JPEG_IsProgressive(void)
8089 {
8090     _NJPEG_SHM_POINTER_CHECK_RETURN(0);
8091     _USE_OJPD(MApi_JPEG_IsProgressive);
8092     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
8093     {
8094         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8095         return FALSE;
8096     }
8097     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum]);
8098     return (pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum]);
8099 }
8100 //------------------------------------------------------------------------------
8101 /********************************************************************/
8102 ///Check current JPEG image has thumbnail or not
8103 ///@return TRUE / FALSE
8104 /// - TRUE : thumbnail found
8105 /// - FALSE : no thumbnail
8106 /********************************************************************/
_MApi_JPEG_ThumbnailFound(void)8107 MS_BOOL _MApi_JPEG_ThumbnailFound(void)
8108 {
8109     _NJPEG_SHM_POINTER_CHECK_RETURN(0);
8110     _USE_OJPD(MApi_JPEG_ThumbnailFound);
8111     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
8112     {
8113         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8114         return FALSE;
8115     }
8116     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , pNJPEGContext->_bThumbnailFound[pNJPEGContext->eNJPDNum]);
8117     return (pNJPEGContext->_bThumbnailFound[pNJPEGContext->eNJPDNum]);
8118 }
8119 //------------------------------------------------------------------------------
8120 /********************************************************************/
8121 ///The width may be the thumbnail or original image size, it based on decoding mode
8122 ///@return width
8123 /********************************************************************/
_MApi_JPEG_GetWidth(void)8124 MS_U16 _MApi_JPEG_GetWidth(void)
8125 {
8126     _NJPEG_SHM_POINTER_CHECK_RETURN(0);
8127     _USE_OJPD(MApi_JPEG_GetWidth);
8128     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
8129     {
8130         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8131         return 0;
8132     }
8133     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum]);
8134     return (pNJPEGContext->_u16Image_x_size[pNJPEGContext->eNJPDNum]);
8135 }
8136 //------------------------------------------------------------------------------
8137 /********************************************************************/
8138 ///The height may be the thumbnail or original image size, it based on decoding mode
8139 ///@return height
8140 /********************************************************************/
_MApi_JPEG_GetHeight(void)8141 MS_U16 _MApi_JPEG_GetHeight(void)
8142 {
8143     _NJPEG_SHM_POINTER_CHECK_RETURN(0);
8144     _USE_OJPD(MApi_JPEG_GetHeight);
8145     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
8146     {
8147         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8148         return 0;
8149     }
8150     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum]);
8151     return (pNJPEGContext->_u16Image_y_size[pNJPEGContext->eNJPDNum]);
8152 }
8153 //------------------------------------------------------------------------------
8154 /********************************************************************/
8155 ///Get the original width of this JPEG file after alignment
8156 ///@return original width
8157 /********************************************************************/
_MApi_JPEG_GetOriginalWidth(void)8158 MS_U16 _MApi_JPEG_GetOriginalWidth(void)
8159 {
8160     _NJPEG_SHM_POINTER_CHECK_RETURN(0);
8161     _USE_OJPD(MApi_JPEG_GetOriginalWidth);
8162     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
8163     {
8164         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8165         return 0;
8166     }
8167     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , pNJPEGContext->_u16OriginalImage_x_size[pNJPEGContext->eNJPDNum]);
8168     return (pNJPEGContext->_u16OriginalImage_x_size[pNJPEGContext->eNJPDNum]);
8169 }
8170 //------------------------------------------------------------------------------
8171 /********************************************************************/
8172 ///Get the original height of this JPEG file after alignment
8173 ///@return original height
8174 /********************************************************************/
_MApi_JPEG_GetOriginalHeight(void)8175 MS_U16 _MApi_JPEG_GetOriginalHeight(void)
8176 {
8177     _NJPEG_SHM_POINTER_CHECK_RETURN(0);
8178     _USE_OJPD(MApi_JPEG_GetOriginalHeight);
8179     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
8180     {
8181         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8182         return 0;
8183     }
8184     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , pNJPEGContext->_u16OriginalImage_y_size[pNJPEGContext->eNJPDNum]);
8185     return (pNJPEGContext->_u16OriginalImage_y_size[pNJPEGContext->eNJPDNum]);
8186 }
8187 //------------------------------------------------------------------------------
8188 /********************************************************************/
8189 ///Get the original width before alignment
8190 ///@return non-alignment width
8191 /********************************************************************/
_MApi_JPEG_GetNonAlignmentWidth(void)8192 MS_U16 _MApi_JPEG_GetNonAlignmentWidth(void)
8193 {
8194     _NJPEG_SHM_POINTER_CHECK_RETURN(0);
8195     _USE_OJPD(MApi_JPEG_GetNonAlignmentWidth);
8196     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
8197     {
8198         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8199         return 0;
8200     }
8201     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , pNJPEGContext->_u16NonAlignmentImage_x_size[pNJPEGContext->eNJPDNum]);
8202     return (pNJPEGContext->_u16NonAlignmentImage_x_size[pNJPEGContext->eNJPDNum]);
8203 }
8204 //------------------------------------------------------------------------------
8205 /********************************************************************/
8206 ///Get the original height before alignment
8207 ///@return non-alignment height
8208 /********************************************************************/
_MApi_JPEG_GetNonAlignmentHeight(void)8209 MS_U16 _MApi_JPEG_GetNonAlignmentHeight(void)
8210 {
8211     _NJPEG_SHM_POINTER_CHECK_RETURN(0);
8212     _USE_OJPD(MApi_JPEG_GetNonAlignmentHeight);
8213     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
8214     {
8215         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8216         return 0;
8217     }
8218     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , pNJPEGContext->_u16NonAlignmentImage_y_size[pNJPEGContext->eNJPDNum]);
8219     return (pNJPEGContext->_u16NonAlignmentImage_y_size[pNJPEGContext->eNJPDNum]);
8220 }
8221 //------------------------------------------------------------------------------
8222 /********************************************************************/
8223 ///Get the displayed pitch of JPEG image
8224 ///@return displayed pitch
8225 /********************************************************************/
_MApi_JPEG_GetAlignedPitch(void)8226 MS_U16 _MApi_JPEG_GetAlignedPitch(void)
8227 {
8228     _NJPEG_SHM_POINTER_CHECK_RETURN(0);
8229     _USE_OJPD(MApi_JPEG_GetAlignedPitch);
8230     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
8231     {
8232         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8233         return 0;
8234     }
8235     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , pNJPEGContext->_u16AlignedImagePitch[pNJPEGContext->eNJPDNum]);
8236     return (pNJPEGContext->_u16AlignedImagePitch[pNJPEGContext->eNJPDNum]);
8237 }
8238 
_MApi_JPEG_GetAlignedPitch_H(void)8239 MS_U16 _MApi_JPEG_GetAlignedPitch_H(void)
8240 {
8241     _NJPEG_SHM_POINTER_CHECK_RETURN(0);
8242     _USE_OJPD(MApi_JPEG_GetAlignedPitch_H);
8243     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
8244     {
8245         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8246         return 0;
8247     }
8248     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , pNJPEGContext->_u16AlignedImagePitch_H[pNJPEGContext->eNJPDNum]);
8249     return (pNJPEGContext->_u16AlignedImagePitch_H[pNJPEGContext->eNJPDNum]);
8250 }
8251 
8252 
8253 //------------------------------------------------------------------------------
8254 /********************************************************************/
8255 ///Get the displayed width of JPEG image
8256 ///@return displayed width
8257 /********************************************************************/
_MApi_JPEG_GetAlignedWidth(void)8258 MS_U16 _MApi_JPEG_GetAlignedWidth(void)
8259 {
8260     _NJPEG_SHM_POINTER_CHECK_RETURN(0);
8261     _USE_OJPD(MApi_JPEG_GetAlignedWidth);
8262     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
8263     {
8264         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8265         return 0;
8266     }
8267     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , pNJPEGContext->_u16AlignedImageWidth[pNJPEGContext->eNJPDNum]);
8268     return (pNJPEGContext->_u16AlignedImageWidth[pNJPEGContext->eNJPDNum]);
8269 }
8270 //------------------------------------------------------------------------------
8271 /********************************************************************/
8272 ///Get the displayed height of JPEG image
8273 ///@return displayed height
8274 /********************************************************************/
_MApi_JPEG_GetAlignedHeight(void)8275 MS_U16 _MApi_JPEG_GetAlignedHeight(void)
8276 {
8277     _NJPEG_SHM_POINTER_CHECK_RETURN(0);
8278     _USE_OJPD(MApi_JPEG_GetAlignedHeight);
8279     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
8280     {
8281         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8282         return 0;
8283     }
8284     JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , pNJPEGContext->_u16AlignedImageHeight[pNJPEGContext->eNJPDNum]);
8285     return (pNJPEGContext->_u16AlignedImageHeight[pNJPEGContext->eNJPDNum]);
8286 }
8287 //------------------------------------------------------------------------------
8288 /********************************************************************/
8289 ///Get scale down factor\n
8290 ///Depending on the real picture width & height, it will automatically set scale down\n
8291 ///factor to meet maximum JPEG width & height allowed.
8292 ///@return scale down factor
8293 /********************************************************************/
_MApi_JPEG_GetScaleDownFactor(void)8294 MS_U8 _MApi_JPEG_GetScaleDownFactor(void)
8295 {
8296     _NJPEG_SHM_POINTER_CHECK_RETURN(0);
8297     _USE_OJPD(MApi_JPEG_GetScaleDownFactor);
8298     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
8299     {
8300         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8301         return 0;
8302     }
8303 
8304 #if SW_NJPD_RGB_CMYK
8305     if((E_JPEG_CMYK == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum])
8306     || (E_JPEG_RGB == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum]))
8307     {
8308         JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum]*2);
8309         return (pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum]*2);
8310     }
8311 #endif
8312     {
8313         JPEG_DEBUG_API_MSG("%s: %d\n", __FUNCTION__ , pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum]);
8314         return (pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum]);
8315     }
8316 }
8317 //------------------------------------------------------------------------------
8318 /********************************************************************/
8319 /// Set Max decoding resolution
8320 ///@param -u16Width \b IN : indicate max decoding width
8321 ///@param -u16Height \b IN : indicate max decoding height
8322 ///@return None
8323 /********************************************************************/
_MApi_JPEG_SetMaxDecodeResolution(MS_U16 u16Width,MS_U16 u16Height)8324 void _MApi_JPEG_SetMaxDecodeResolution(MS_U16 u16Width, MS_U16 u16Height)
8325 {
8326     _JPEG_Init_Share_Mem();
8327     _NJPEG_SHM_POINTER_CHECK();
8328     _USE_OJPD(MApi_JPEG_SetMaxDecodeResolution, u16Width, u16Height);
8329     JPEG_DEBUG_API_MSG("%s: Width = %d, Height = %d\n", __FUNCTION__, u16Width, u16Height);
8330     _NJPEG_EX_API_MutexLock(pNJPEGContext->eNJPDNum);
8331     pNJPEGContext->JPEG_MAX_WIDTH[pNJPEGContext->eNJPDNum] = u16Width;
8332     pNJPEGContext->JPEG_MAX_HEIGHT[pNJPEGContext->eNJPDNum] = u16Height;
8333     _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
8334     return;
8335 }
8336 //------------------------------------------------------------------------------
8337 /********************************************************************/
8338 /// Set Max decoding resolution of Progressive JPEG
8339 ///@param -u16ProWidth \b IN : indicate max decoding width
8340 ///@param -u16ProHeight \b IN : indicate max decoding height
8341 ///@return None
8342 /********************************************************************/
_MApi_JPEG_SetProMaxDecodeResolution(MS_U16 u16ProWidth,MS_U16 u16ProHeight)8343 void _MApi_JPEG_SetProMaxDecodeResolution(MS_U16 u16ProWidth, MS_U16 u16ProHeight)
8344 {
8345     _JPEG_Init_Share_Mem();
8346     _NJPEG_SHM_POINTER_CHECK();
8347     _USE_OJPD(MApi_JPEG_SetProMaxDecodeResolution, u16ProWidth, u16ProHeight);
8348     JPEG_DEBUG_API_MSG("%s: ProWidth = %d, ProHeight = %d\n", __FUNCTION__, u16ProWidth, u16ProHeight);
8349     _NJPEG_EX_API_MutexLock(pNJPEGContext->eNJPDNum);
8350     pNJPEGContext->JPEG_PRO_MAX_WIDTH[pNJPEGContext->eNJPDNum] = u16ProWidth;
8351     pNJPEGContext->JPEG_PRO_MAX_HEIGHT[pNJPEGContext->eNJPDNum] = u16ProHeight;
8352     _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
8353     return;
8354 }
8355 //------------------------------------------------------------------------------
8356 /********************************************************************/
8357 /// Valid the JPEG read buffer flag
8358 ///@param -u8MRBuffType \b IN : the type of JPEG read buffer
8359 ///@return None
8360 /********************************************************************/
_MApi_JPEG_SetMRBufferValid(JPEG_BuffLoadType u8MRBuffType)8361 void _MApi_JPEG_SetMRBufferValid(JPEG_BuffLoadType u8MRBuffType)
8362 {
8363     _NJPEG_SHM_POINTER_CHECK();
8364     _USE_OJPD(MApi_JPEG_SetMRBufferValid, u8MRBuffType);
8365     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
8366     {
8367         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8368         return;
8369     }
8370     _NJPEG_EX_API_MutexLock(pNJPEGContext->eNJPDNum);
8371     JPEG_DEBUG_API_MSG("%s: MRBuffType = %d\n", __FUNCTION__ , u8MRBuffType);
8372     MsOS_FlushMemory();
8373     MS_U32 u32Time=MsOS_GetSystemTime();
8374 
8375 #if SUPPORT_HIGH_LOW_REVERSE
8376     if(MDrv_NJPD_IsNeedToPatch(E_NJPD_EAGLE_SW_PATCH))
8377     {
8378         switch(u8MRBuffType)
8379         {
8380             case E_JPEG_BUFFER_HIGH:
8381                 JPEG_DEBUG_API_MSG("parameter: E_JPEG_BUFFER_HIGH\n");
8382                 if(pNJPEGContext->bHighLowReverse[pNJPEGContext->eNJPDNum])
8383                 {
8384                     if(pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum])
8385                     {
8386                         MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC0_EMPTY);
8387                         MDrv_NJPD_SetMRC_Valid(NJPD_MRC0_VALID);
8388                     }
8389                 }
8390                 else
8391                 {
8392                     MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC0_EMPTY);
8393                     MDrv_NJPD_SetMRC_Valid(NJPD_MRC0_VALID);
8394 
8395                     while((MDrv_NJPD_GetEventFlag() & E_NJPD_EVENT_MRC0_EMPTY)==0)
8396                     {
8397                         if(pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum] || (MDrv_NJPD_GetEventFlag() & E_NJPD_EVENT_DEC_DONE))
8398                         {
8399                             break;
8400                         }
8401                         if((MsOS_GetSystemTime() - u32Time) >= MRC_DECODE_TIMEOUT)
8402                         {
8403                             JPEG_DEBUG_API_ERR("Timeout @1!!!\n");
8404                             MDrv_NJPD_Debug();
8405                             break;
8406                         }
8407                     }
8408                     JPEG_DEBUG_API_MSG("%s : Get buffer 1 empty done with reg_val = 0x%04X\n", __FUNCTION__ , MDrv_NJPD_GetEventFlag());
8409 
8410                     MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC1_EMPTY);
8411                     MDrv_NJPD_SetMRC_Valid(NJPD_MRC1_VALID);
8412                 }
8413                 break;
8414             case E_JPEG_BUFFER_LOW:
8415                 JPEG_DEBUG_API_MSG("parameter: E_JPEG_BUFFER_LOW ==> do nothing\n");
8416                 if(pNJPEGContext->bHighLowReverse[pNJPEGContext->eNJPDNum])
8417                 {
8418                     MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC1_EMPTY);
8419                     MDrv_NJPD_SetMRC_Valid(NJPD_MRC1_VALID);
8420 
8421                     while(MDrv_NJPD_GetEventFlag() & E_NJPD_EVENT_MRC1_EMPTY)
8422                     {
8423                         if(pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum] || (MDrv_NJPD_GetEventFlag() & E_NJPD_EVENT_DEC_DONE))
8424                         {
8425                             break;
8426                         }
8427                         if((MsOS_GetSystemTime() - u32Time) >= MRC_DECODE_TIMEOUT)
8428                         {
8429                             JPEG_DEBUG_API_ERR("Timeout @2!!!\n");
8430                             MDrv_NJPD_Debug();
8431                             break;
8432                         }
8433                     }
8434                     JPEG_DEBUG_API_MSG("%s : Get buffer 0 empty done with reg_val = 0x%04X\n", __FUNCTION__ , MDrv_NJPD_GetEventFlag());
8435 
8436                     MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC0_EMPTY);
8437                     MDrv_NJPD_SetMRC_Valid(NJPD_MRC0_VALID);
8438                 }
8439                 else
8440                 {
8441                     if(pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum])
8442                     {
8443                         MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC0_EMPTY);
8444                         MDrv_NJPD_SetMRC_Valid(NJPD_MRC0_VALID);
8445                     }
8446                 }
8447                 break;
8448             default:
8449                 break;
8450         }
8451     }
8452     else
8453     {
8454         switch(u8MRBuffType)
8455         {
8456             case E_JPEG_BUFFER_HIGH:
8457                 if(pNJPEGContext->bHighLowReverse[pNJPEGContext->eNJPDNum])
8458                 {
8459                     MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC0_EMPTY);
8460                     MDrv_NJPD_SetMRC_Valid(NJPD_MRC0_VALID);
8461                 }
8462                 else
8463                 {
8464                     MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC1_EMPTY);
8465                     MDrv_NJPD_SetMRC_Valid(NJPD_MRC1_VALID);
8466                 }
8467                 break;
8468             case E_JPEG_BUFFER_LOW:
8469                 if(pNJPEGContext->bHighLowReverse[pNJPEGContext->eNJPDNum])
8470                 {
8471                     MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC1_EMPTY);
8472                     MDrv_NJPD_SetMRC_Valid(NJPD_MRC1_VALID);
8473                 }
8474                 else
8475                 {
8476                     MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC0_EMPTY);
8477                     MDrv_NJPD_SetMRC_Valid(NJPD_MRC0_VALID);
8478                 }
8479                 break;
8480             default:
8481                 break;
8482         }
8483     }
8484 #else
8485     if(MDrv_NJPD_IsNeedToPatch(E_NJPD_EAGLE_SW_PATCH))
8486     {
8487         switch(u8MRBuffType)
8488         {
8489             case E_JPEG_BUFFER_HIGH:
8490                 JPEG_DEBUG_API_MSG("parameter: E_JPEG_BUFFER_HIGH\n");
8491                 MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC0_EMPTY);
8492                 MDrv_NJPD_SetMRC_Valid(NJPD_MRC0_VALID);
8493 
8494                 while((MDrv_NJPD_GetEventFlag() & E_NJPD_EVENT_MRC0_EMPTY)==0)
8495                 {
8496                     if(pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum] || (MDrv_NJPD_GetEventFlag() & E_NJPD_EVENT_DEC_DONE))
8497                     {
8498                         break;
8499                     }
8500                     if((MsOS_GetSystemTime() - u32Time) >= MRC_DECODE_TIMEOUT)
8501                     {
8502                         JPEG_DEBUG_API_ERR("Timeout @3!!!\n");
8503                         MDrv_NJPD_Debug();
8504                         break;
8505                     }
8506                 }
8507                 JPEG_DEBUG_API_MSG("%s : Get buffer 1 empty done with reg_val = 0x%04X\n", __FUNCTION__ , MDrv_NJPD_GetEventFlag());
8508                 MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC1_EMPTY);
8509                 MDrv_NJPD_SetMRC_Valid(NJPD_MRC1_VALID);
8510                 break;
8511             case E_JPEG_BUFFER_LOW:
8512                 JPEG_DEBUG_API_MSG("parameter: E_JPEG_BUFFER_LOW ==> do nothing\n");
8513                 if(pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum])
8514                 {
8515                     MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC0_EMPTY);
8516                     MDrv_NJPD_SetMRC_Valid(NJPD_MRC0_VALID);
8517                 }
8518                 break;
8519             default:
8520                 break;
8521         }
8522     }
8523     else
8524     {
8525         if(pNJPEGContext->bDifferentHL[pNJPEGContext->eNJPDNum])
8526         {
8527             switch(u8MRBuffType)
8528             {
8529                 case E_JPEG_BUFFER_HIGH:
8530                     JPEG_DEBUG_API_MSG("parameter: E_JPEG_BUFFER_HIGH\n");
8531                     MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC0_EMPTY);
8532                     MDrv_NJPD_SetMRC_Valid(NJPD_MRC0_VALID);
8533 
8534                     while((MDrv_NJPD_GetEventFlag() & E_NJPD_EVENT_MRC0_EMPTY)==0)
8535                     {
8536                         if(pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum] || (MDrv_NJPD_GetEventFlag() & E_NJPD_EVENT_DEC_DONE))
8537                         {
8538                             break;
8539                         }
8540                         if((MsOS_GetSystemTime() - u32Time) >= MRC_DECODE_TIMEOUT)
8541                         {
8542                             JPEG_DEBUG_API_ERR("Timeout @4!!!\n");
8543                             MDrv_NJPD_Debug();
8544                             break;
8545                         }
8546                     }
8547                     JPEG_DEBUG_API_MSG("%s : Get buffer 1 empty done with reg_val = 0x%04X\n", __FUNCTION__ , MDrv_NJPD_GetEventFlag());
8548                     MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC1_EMPTY);
8549                     MDrv_NJPD_SetMRC_Valid(NJPD_MRC1_VALID);
8550                     break;
8551                 case E_JPEG_BUFFER_LOW:
8552                     JPEG_DEBUG_API_MSG("parameter: E_JPEG_BUFFER_LOW ==> do nothing\n");
8553                     if(pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum])
8554                     {
8555                         MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC0_EMPTY);
8556                         MDrv_NJPD_SetMRC_Valid(NJPD_MRC0_VALID);
8557                     }
8558                     break;
8559                 default:
8560                     break;
8561             }
8562         }
8563         else
8564         {
8565             switch(u8MRBuffType)
8566             {
8567                 case E_JPEG_BUFFER_HIGH:
8568                     MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC1_EMPTY);
8569                     MDrv_NJPD_SetMRC_Valid(NJPD_MRC1_VALID);
8570                     break;
8571                 case E_JPEG_BUFFER_LOW:
8572                     MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC0_EMPTY);
8573                     MDrv_NJPD_SetMRC_Valid(NJPD_MRC0_VALID);
8574                     break;
8575                 default:
8576                     break;
8577             }
8578         }
8579     }
8580 
8581 #endif
8582     _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
8583     return;
8584 }
8585 //------------------------------------------------------------------------------
8586 /********************************************************************/
8587 /// Set JPEG EOF flag and the total byte-read of JPEG file
8588 ///@param -u32DataRead \b IN : the amount of byte of file reading
8589 ///@param -bEOFflag \b IN : the EOF flag of file reading
8590 ///@return None
8591 /********************************************************************/
_MApi_JPEG_UpdateReadInfo(MS_U32 u32DataRead,MS_BOOL bEOFflag)8592 void _MApi_JPEG_UpdateReadInfo(MS_U32 u32DataRead, MS_BOOL bEOFflag)
8593 {
8594     _NJPEG_SHM_POINTER_CHECK();
8595     _USE_OJPD(MApi_JPEG_UpdateReadInfo, u32DataRead, bEOFflag);
8596     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
8597     {
8598         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8599         return;
8600     }
8601 // Note: this function is used in callback function, we CANNOT add mutex lock on it!!!
8602 //    _NJPEG_EX_API_MutexLock(pNJPEGContext->eNJPDNum);
8603     JPEG_DEBUG_API_MSG("%s: DataRead = %td, EOFflag = %d\n", __FUNCTION__ , (ptrdiff_t)u32DataRead, bEOFflag);
8604 ////    _Total_Decoded_Size += data_read;
8605     pNJPEGContext->_u32Total_bytes_read[pNJPEGContext->eNJPDNum] += u32DataRead;
8606     pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum] = bEOFflag;
8607 
8608 //    _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
8609     return;
8610 }
8611 //------------------------------------------------------------------------------
8612 /********************************************************************/
8613 /// Process JPEG read buffer flag when EOF.
8614 ///@param -u8MRBuffType \b IN : The type of JPEG read buffer
8615 ///@return None
8616 /********************************************************************/
_MApi_JPEG_ProcessEOF(JPEG_BuffLoadType u8MRBuffType)8617 void _MApi_JPEG_ProcessEOF(JPEG_BuffLoadType u8MRBuffType)
8618 {
8619     _NJPEG_SHM_POINTER_CHECK();
8620     _USE_OJPD(MApi_JPEG_ProcessEOF, u8MRBuffType);
8621     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
8622     {
8623         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8624         return;
8625     }
8626     _NJPEG_EX_API_MutexLock(pNJPEGContext->eNJPDNum);
8627     JPEG_DEBUG_API_MSG("%s: end of file!! MRBuffType = %d\n", __FUNCTION__ , u8MRBuffType);
8628 ////    MDrv_UART_PutChar('t'); // DO NOT MARK THIS, THIS FUNCTION MUST BE CALLED. OR THE NJPD DECODE WILL FAIL for LARGE FILES
8629     if(u8MRBuffType == E_JPEG_BUFFER_HIGH)
8630     {
8631         // clear MRC high portion read complete event
8632 #if SUPPORT_HIGH_LOW_REVERSE
8633         if(pNJPEGContext->bHighLowReverse[pNJPEGContext->eNJPDNum])
8634         {
8635             MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC0_EMPTY);
8636         }
8637         else
8638 #endif
8639         {
8640             MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC1_EMPTY);
8641         }
8642     }
8643     else
8644     {
8645         // clear MRC low portion read complete event
8646 #if SUPPORT_HIGH_LOW_REVERSE
8647         if(pNJPEGContext->bHighLowReverse[pNJPEGContext->eNJPDNum])
8648         {
8649             MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC1_EMPTY);
8650         }
8651         else
8652 #endif
8653         {
8654             MDrv_NJPD_SetEventFlag(E_NJPD_EVENT_MRC0_EMPTY);
8655         }
8656     }
8657     _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
8658     return;
8659 }
8660 //------------------------------------------------------------------------------
8661 /********************************************************************/
8662 /// Set JPEG Error Code if something error on upper layer.
8663 ///@param -ErrCode \b IN : The error type of JPEG decoder
8664 ///@return None
8665 /********************************************************************/
_MApi_JPEG_SetErrCode(JPEG_ErrCode ErrCode)8666 void _MApi_JPEG_SetErrCode(JPEG_ErrCode ErrCode)
8667 {
8668     _NJPEG_SHM_POINTER_CHECK();
8669     _USE_OJPD(MApi_JPEG_SetErrCode, ErrCode);
8670     _NJPEG_EX_API_MutexLock(pNJPEGContext->eNJPDNum);
8671     JPEG_DEBUG_API_ERR("%s: ErrCode = %d\n", __FUNCTION__ , ErrCode);
8672     pNJPEGContext->_Error_code[pNJPEGContext->eNJPDNum] = ErrCode;
8673 
8674 #ifdef CONFIG_UTOPIA_PROC_DBG_SUPPORT
8675     gNJPEGMDebug._Error_code = pNJPEGContext->_Error_code[pNJPEGContext->eNJPDNum];
8676 #endif
8677 
8678 ////    JPEG_free_all_blocks();
8679     _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
8680     return;
8681 }
8682 //------------------------------------------------------------------------------
8683 /********************************************************************/
8684 /// Set JPEG debug level.
8685 ///@param -u8DbgLevel \b IN : The JPEG debug level, refer to JPEG_DbgLevel.
8686 ///@return None
8687 /********************************************************************/
_MApi_JPEG_SetDbgLevel(MS_U8 u8DbgLevel)8688 void _MApi_JPEG_SetDbgLevel(MS_U8 u8DbgLevel)
8689 {
8690     _JPEG_Init_Share_Mem();
8691     _NJPEG_SHM_POINTER_CHECK();
8692     _USE_OJPD(MApi_JPEG_SetDbgLevel, u8DbgLevel);
8693     _NJPEG_EX_API_MutexLock(pNJPEGContext->eNJPDNum);
8694     pNJPEGContext->_u8JPEG_ApiDbgLevel = u8DbgLevel;
8695     JPEG_DEBUG_API_MSG("%s: DbgLevel = 0x%04X\n", __FUNCTION__, u8DbgLevel);
8696     MDrv_NJPD_SetDbgLevel(u8DbgLevel);
8697     _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
8698     return;
8699 }
8700 //------------------------------------------------------------------------------
8701 /********************************************************************/
8702 /// Get JPEG debug level.
8703 ///@return JPEG debug level, refer to JPEG_DbgLevel.
8704 /********************************************************************/
_MApi_JPEG_GetDbgLevel(void)8705 MS_U8 _MApi_JPEG_GetDbgLevel(void)
8706 {
8707     _NJPEG_SHM_POINTER_CHECK_RETURN(0);
8708     _USE_OJPD(MApi_JPEG_GetDbgLevel);
8709     JPEG_DEBUG_API_MSG("%s: DbgLevel = 0x%04X\n", __FUNCTION__, pNJPEGContext->_u8JPEG_ApiDbgLevel);
8710     return pNJPEGContext->_u8JPEG_ApiDbgLevel;
8711 }
8712 //------------------------------------------------------------------------------
8713 /********************************************************************/
8714 /// Set MHEG5 Flag.
8715 ///@param -bEnable \b IN :
8716 ///@return None
8717 /********************************************************************/
_MApi_JPEG_SetMHEG5(MS_BOOL bEnable)8718 void _MApi_JPEG_SetMHEG5(MS_BOOL bEnable)
8719 {
8720     _NJPEG_SHM_POINTER_CHECK();
8721     _USE_OJPD(MApi_JPEG_SetMHEG5, bEnable);
8722     _NJPEG_EX_API_MutexLock(pNJPEGContext->eNJPDNum);
8723     pNJPEGContext->bMHEG5[pNJPEGContext->eNJPDNum] = bEnable;
8724     _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
8725 }
8726 //------------------------------------------------------------------------------
8727 /********************************************************************/
8728 /// Get JPEG information
8729 ///@param -pJPEG_Info \b OUT : JPEG information\n
8730 /// structure {\n
8731 ///    MS_U8* \b pu8DrvVer : JPEG DRV version\n
8732 ///    MS_U8* \b pu8HalVer : JPEG HAL version\n
8733 ///    MS_U8* \b pu8FwVer : JPEG FW version\n
8734 ///    JPEG_DrvCap \b stDrvCap : JPEG driver capability\n
8735 ///           };
8736 ///@return None
8737 /********************************************************************/
_MApi_JPEG_GetInfo(JPEG_Info * pJPEG_Info)8738 void _MApi_JPEG_GetInfo(JPEG_Info *pJPEG_Info)
8739 {
8740     _NJPEG_SHM_POINTER_CHECK();
8741     _USE_OJPD(MApi_JPEG_GetInfo, pJPEG_Info);
8742     NJPD_Info DrvInfo;
8743     const MSIF_Version *DrvVer;
8744     MDrv_NJPD_GetInfo(&DrvInfo);
8745     MDrv_NJPD_GetLibVer(&DrvVer);
8746     pJPEG_Info->pu8DrvVer = DrvVer;
8747     pJPEG_Info->pu8HalVer = DrvInfo.pu8HalVer;
8748     pJPEG_Info->pu8FwVer = DrvInfo.pu8FwVer;
8749     pJPEG_Info->stDrvCap.bBaseline = DrvInfo.stCap.bBaseline;
8750     pJPEG_Info->stDrvCap.bProgressive = DrvInfo.stCap.bProgressive;
8751     pJPEG_Info->stDrvCap.bMJPEG = DrvInfo.stCap.bMJPEG;
8752     pJPEG_Info->stDrvCap.u16MaxWidth = pNJPEGContext->JPEG_MAX_WIDTH[pNJPEGContext->eNJPDNum];
8753     pJPEG_Info->stDrvCap.u16MaxHeight = pNJPEGContext->JPEG_MAX_HEIGHT[pNJPEGContext->eNJPDNum];
8754     pJPEG_Info->stDrvCap.u16MaxProWidth = pNJPEGContext->JPEG_PRO_MAX_WIDTH[pNJPEGContext->eNJPDNum];
8755     pJPEG_Info->stDrvCap.u16MaxProHeight = pNJPEGContext->JPEG_PRO_MAX_HEIGHT[pNJPEGContext->eNJPDNum];
8756 
8757     JPEG_DEBUG_API_MSG("NJPD %04x, %04x, %04x, %s\n",
8758         DrvVer->DDI.customer, DrvVer->DDI.model, DrvVer->DDI.chip, &(DrvVer->DDI.cpu));
8759     JPEG_DEBUG_API_MSG("pu8HalVer = %s, pu8FwVer = %s\n", pJPEG_Info->pu8HalVer, pJPEG_Info->pu8FwVer);
8760     JPEG_DEBUG_API_MSG("%s: DrvCap_BL = %d, DrvCap_PRO = %d, DrvCap_MJPEG = %d\n", __FUNCTION__,
8761         pJPEG_Info->stDrvCap.bBaseline, pJPEG_Info->stDrvCap.bProgressive, pJPEG_Info->stDrvCap.bMJPEG);
8762     JPEG_DEBUG_API_MSG("%s: MaxWidth = %d, MaxHeight = %d\n", __FUNCTION__,
8763         pJPEG_Info->stDrvCap.u16MaxWidth, pJPEG_Info->stDrvCap.u16MaxHeight);
8764     JPEG_DEBUG_API_MSG("%s: MaxProWidth = %d, MaxProHeight = %d\n", __FUNCTION__,
8765         pJPEG_Info->stDrvCap.u16MaxProWidth, pJPEG_Info->stDrvCap.u16MaxProHeight);
8766     return;
8767 }
8768 //------------------------------------------------------------------------------
8769 /********************************************************************/
8770 /// Get JPEG status.
8771 ///@param -pJPEG_Status \b OUT : JPEG status\n
8772 /// structure {\n
8773 ///    MS_U32 \b u32CurMRCAddr : NJPD current decode address\n
8774 ///    MS_U16 \b u16CurVidx : NJPD current decode vertical index\n
8775 ///    MS_U16 \b u16CurRow : NJPD current decode row\n
8776 ///    MS_U16 \b u16CurCol : NJPD current decode column\n
8777 ///    MS_BOOL \b bDrvBusy : JPEG DRV busy status\n
8778 ///    MS_BOOL \b bIsrEnable : NJPD ISR status\n
8779 ///           };
8780 ///@return None
8781 /********************************************************************/
_MApi_JPEG_GetStatus(JPEG_Status * pJPEG_Status)8782 void _MApi_JPEG_GetStatus(JPEG_Status *pJPEG_Status)
8783 {
8784     _NJPEG_SHM_POINTER_CHECK();
8785     _USE_OJPD(MApi_JPEG_GetStatus, pJPEG_Status);
8786     NJPD_Status *pDrvStatus = MDrv_NJPD_GetStatus();
8787     pJPEG_Status->u32CurMRCAddr = pDrvStatus->u32CurMRCAddr;
8788     pJPEG_Status->u16CurVidx = pDrvStatus->u16CurVidx;
8789     pJPEG_Status->u16CurRow = pDrvStatus->u16CurRow;
8790     pJPEG_Status->u16CurCol = pDrvStatus->u16CurCol;
8791     pJPEG_Status->bDrvBusy = pDrvStatus->bIsBusy;
8792     pJPEG_Status->bIsrEnable = pDrvStatus->bIsrEnable;
8793     JPEG_DEBUG_API_MSG("%s: Drv_busy = %d, Isr_status = %d\n", __FUNCTION__ , pJPEG_Status->bDrvBusy, pJPEG_Status->bIsrEnable);
8794     JPEG_DEBUG_API_MSG("%s: CurVidx = %d, CurRow = %d, CurCol = %d\n", __FUNCTION__ ,
8795                         pJPEG_Status->u16CurVidx, pJPEG_Status->u16CurRow, pJPEG_Status->u16CurCol);
8796     JPEG_DEBUG_API_MSG("%s: CurMRCAddr = 0x%tx\n", __FUNCTION__ , (ptrdiff_t)pJPEG_Status->u32CurMRCAddr);
8797     return;
8798 }
8799 //------------------------------------------------------------------------------
8800 /********************************************************************/
8801 /// Get JPEG Version.
8802 ///@param -ppVersion \b OUT : JPEG Version
8803 ///@return \b JPEG_Result
8804 ///     - E_JPEG_OKAY : Success
8805 ///     - E_JPEG_FAILED : Failed
8806 /********************************************************************/
_MApi_JPEG_GetLibVer(const MSIF_Version ** ppVersion)8807 JPEG_Result _MApi_JPEG_GetLibVer(const MSIF_Version **ppVersion)
8808 {
8809     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
8810     _USE_OJPD(MApi_JPEG_GetLibVer, ppVersion);
8811     if (!ppVersion)
8812     {
8813         return E_JPEG_FAILED;
8814     }
8815     *ppVersion = &_api_jpeg_version;
8816     JPEG_DEBUG_API_MSG("%s: JPEG %04x, %04x, %04x, %s\n", __FUNCTION__ ,
8817         _api_jpeg_version.DDI.customer, _api_jpeg_version.DDI.model, _api_jpeg_version.DDI.chip, &(_api_jpeg_version.DDI.cpu));
8818     return E_JPEG_OKAY;
8819 }
8820 //------------------------------------------------------------------------------
8821 /********************************************************************/
8822 /// For H/W bug, some cases can not exit after decode done, Check
8823 /// Vidx to exit.
8824 ///@return \b JPEG_Result
8825 /// - E_JPEG_OKAY : Vidx checking is successful.
8826 /// - E_JPEG_FAILED : Vidx checking is failed.
8827 /********************************************************************/
_MApi_JPEG_HdlVidxChk(void)8828 JPEG_Result _MApi_JPEG_HdlVidxChk(void)
8829 {
8830     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
8831     // This function is only reserved for upper layer to call without change APIs.
8832     _USE_OJPD(MApi_JPEG_HdlVidxChk);
8833 
8834     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
8835     {
8836         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8837         return E_JPEG_FAILED;
8838     }
8839 
8840     return E_JPEG_OKAY;
8841 }
8842 //------------------------------------------------------------------------------
8843 /********************************************************************/
8844 /// Get Preload buffer information.
8845 ///@param -pBuffLoadType \b OUT : JPEG preload buffer type
8846 ///@return \b JPEG_Result
8847 /// - E_JPEG_OKAY : success.
8848 /// - E_JPEG_FAILED : fail.
8849 /// - E_JPEG_RETRY : we need to re-get preload buffer type
8850 /********************************************************************/
_MApi_JPEG_GetBuffLoadType(JPEG_BuffLoadType * pBuffLoadType)8851 JPEG_Result _MApi_JPEG_GetBuffLoadType(JPEG_BuffLoadType *pBuffLoadType)
8852 {
8853     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
8854     _USE_OJPD(MApi_JPEG_GetBuffLoadType, pBuffLoadType);
8855     MS_U16 reg_val = MDrv_NJPD_GetEventFlag();
8856     MS_U32 u32Time=MsOS_GetSystemTime();
8857 
8858     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
8859     {
8860         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
8861         return E_JPEG_FAILED;
8862     }
8863     _NJPEG_EX_API_MutexLock(pNJPEGContext->eNJPDNum);
8864 #if SUPPORT_HIGH_LOW_REVERSE
8865     if(pNJPEGContext->bHighLowReverse[pNJPEGContext->eNJPDNum])
8866     {
8867         if((E_NJPD_EVENT_MRC0_EMPTY & reg_val)
8868         && (E_JPEG_BUFFER_HIGH != pNJPEGContext->u8PreLHFlag[pNJPEGContext->eNJPDNum]))
8869         {
8870             if(MDrv_NJPD_IsNeedToPatch(E_NJPD_EAGLE_SW_PATCH))
8871             {
8872                 while((MDrv_NJPD_GetEventFlag() & E_NJPD_EVENT_MRC1_EMPTY)==0)
8873                 {
8874                     if(pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum] || (MDrv_NJPD_GetEventFlag() & E_NJPD_EVENT_DEC_DONE))
8875                     {
8876                         break;
8877                     }
8878                     if((MsOS_GetSystemTime() - u32Time) >= MRC_DECODE_TIMEOUT)
8879                     {
8880                         JPEG_DEBUG_API_ERR("Timeout 1!!!\n");
8881                         MDrv_NJPD_Debug();
8882                         break;
8883                     }
8884                 }
8885                 JPEG_DEBUG_API_MSG("%s : Get buffer 1 empty done with reg_val = 0x%04X\n", __FUNCTION__ , MDrv_NJPD_GetEventFlag());
8886             }
8887             JPEG_DEBUG_API_MSG("%s : @@MRBuffer Load HIGH!!!!\n", __FUNCTION__);
8888             pNJPEGContext->u8PreLHFlag[pNJPEGContext->eNJPDNum] = E_JPEG_BUFFER_HIGH;
8889             pNJPEGContext->u32MRCheckCount[pNJPEGContext->eNJPDNum] = 0;
8890             *pBuffLoadType = pNJPEGContext->u8PreLHFlag[pNJPEGContext->eNJPDNum];
8891             _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
8892             return E_JPEG_OKAY;
8893         }
8894         else if((E_NJPD_EVENT_MRC1_EMPTY & reg_val)
8895         && (E_JPEG_BUFFER_LOW != pNJPEGContext->u8PreLHFlag[pNJPEGContext->eNJPDNum]))
8896         {
8897             if(MDrv_NJPD_IsNeedToPatch(E_NJPD_EAGLE_SW_PATCH))
8898             {
8899                 while((MDrv_NJPD_GetEventFlag() & E_NJPD_EVENT_MRC0_EMPTY)==0)
8900                 {
8901                     if(pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum] || (MDrv_NJPD_GetEventFlag() & E_NJPD_EVENT_DEC_DONE))
8902                     {
8903                         break;
8904                     }
8905                     if((MsOS_GetSystemTime() - u32Time) >= MRC_DECODE_TIMEOUT)
8906                     {
8907                         JPEG_DEBUG_API_ERR("Timeout 2!!!\n");
8908                         MDrv_NJPD_Debug();
8909                         break;
8910                     }
8911                 }
8912                 JPEG_DEBUG_API_MSG("%s : Get buffer 0 empty done with reg_val = 0x%04X\n", __FUNCTION__ , MDrv_NJPD_GetEventFlag());
8913             }
8914             JPEG_DEBUG_API_MSG("%s : @@MRBuffer Load LOW!!!!\n", __FUNCTION__);
8915             pNJPEGContext->u8PreLHFlag[pNJPEGContext->eNJPDNum] = E_JPEG_BUFFER_LOW;
8916             pNJPEGContext->u32MRCheckCount[pNJPEGContext->eNJPDNum] = 0;
8917             *pBuffLoadType = pNJPEGContext->u8PreLHFlag[pNJPEGContext->eNJPDNum];
8918             _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
8919             return E_JPEG_OKAY;
8920         }
8921         else
8922         {
8923             JPEG_DEBUG_API_MSG("%s : MRBuffer Load NONE!!!!\n", __FUNCTION__);
8924             *pBuffLoadType = E_JPEG_BUFFER_NONE;
8925             pNJPEGContext->u32MRCheckCount[pNJPEGContext->eNJPDNum]++;
8926             if(pNJPEGContext->u32MRCheckCount[pNJPEGContext->eNJPDNum] >= MRC_CHECK_COUNT)
8927             {
8928                 JPEG_DEBUG_API_ERR("Decoding time out!!\n");
8929                 pNJPEGContext->u32MRCheckCount[pNJPEGContext->eNJPDNum] = 0;
8930                 _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
8931                 return E_JPEG_FAILED;
8932             }
8933         }
8934     }
8935     else
8936 #endif
8937     {
8938         if((E_NJPD_EVENT_MRC0_EMPTY & reg_val)
8939         && (E_JPEG_BUFFER_LOW != pNJPEGContext->u8PreLHFlag[pNJPEGContext->eNJPDNum]))
8940         {
8941             if(MDrv_NJPD_IsNeedToPatch(E_NJPD_EAGLE_SW_PATCH))
8942             {
8943                 while((MDrv_NJPD_GetEventFlag() & E_NJPD_EVENT_MRC1_EMPTY)==0)
8944                 {
8945                     if(pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum] || (MDrv_NJPD_GetEventFlag() & E_NJPD_EVENT_DEC_DONE))
8946                     {
8947                         break;
8948                     }
8949                     if((MsOS_GetSystemTime() - u32Time) >= MRC_DECODE_TIMEOUT)
8950                     {
8951                         JPEG_DEBUG_API_ERR("Timeout 3!!!\n");
8952                         MDrv_NJPD_Debug();
8953                         break;
8954                     }
8955                 }
8956                 JPEG_DEBUG_API_MSG("%s : Get buffer 1 empty done with reg_val = 0x%04X\n", __FUNCTION__ , MDrv_NJPD_GetEventFlag());
8957             }
8958             JPEG_DEBUG_API_MSG("%s : MRBuffer Load LOW!!!!\n", __FUNCTION__);
8959             pNJPEGContext->u8PreLHFlag[pNJPEGContext->eNJPDNum] = E_JPEG_BUFFER_LOW;
8960             pNJPEGContext->u32MRCheckCount[pNJPEGContext->eNJPDNum] = 0;
8961             *pBuffLoadType = pNJPEGContext->u8PreLHFlag[pNJPEGContext->eNJPDNum];
8962             _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
8963             return E_JPEG_OKAY;
8964         }
8965         else if((E_NJPD_EVENT_MRC1_EMPTY & reg_val)
8966         && (E_JPEG_BUFFER_HIGH != pNJPEGContext->u8PreLHFlag[pNJPEGContext->eNJPDNum]))
8967         {
8968             if(MDrv_NJPD_IsNeedToPatch(E_NJPD_EAGLE_SW_PATCH))
8969             {
8970                 while((MDrv_NJPD_GetEventFlag() & E_NJPD_EVENT_MRC0_EMPTY)==0)
8971                 {
8972                     if(pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum] || (MDrv_NJPD_GetEventFlag() & E_NJPD_EVENT_DEC_DONE))
8973                     {
8974                         break;
8975                     }
8976                     if((MsOS_GetSystemTime() - u32Time) >= MRC_DECODE_TIMEOUT)
8977                     {
8978                         JPEG_DEBUG_API_ERR("Timeout 4!!!\n");
8979                         MDrv_NJPD_Debug();
8980                         break;
8981                     }
8982                 }
8983                 JPEG_DEBUG_API_MSG("%s : Get buffer 0 empty done with reg_val = 0x%04X\n", __FUNCTION__ , MDrv_NJPD_GetEventFlag());
8984             }
8985             JPEG_DEBUG_API_MSG("%s : MRBuffer Load HIGH!!!!\n", __FUNCTION__);
8986             pNJPEGContext->u8PreLHFlag[pNJPEGContext->eNJPDNum] = E_JPEG_BUFFER_HIGH;
8987             pNJPEGContext->u32MRCheckCount[pNJPEGContext->eNJPDNum] = 0;
8988             *pBuffLoadType = pNJPEGContext->u8PreLHFlag[pNJPEGContext->eNJPDNum];
8989             _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
8990             return E_JPEG_OKAY;
8991         }
8992         else
8993         {
8994             JPEG_DEBUG_API_MSG("%s : MRBuffer Load NONE!!!!\n", __FUNCTION__);
8995             *pBuffLoadType = E_JPEG_BUFFER_NONE;
8996             pNJPEGContext->u32MRCheckCount[pNJPEGContext->eNJPDNum]++;
8997             if(pNJPEGContext->u32MRCheckCount[pNJPEGContext->eNJPDNum] >= MRC_CHECK_COUNT)
8998             {
8999                 JPEG_DEBUG_API_ERR("Decoding time out!!\n");
9000                 pNJPEGContext->u32MRCheckCount[pNJPEGContext->eNJPDNum] = 0;
9001                 _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
9002                 return E_JPEG_FAILED;
9003             }
9004         }
9005     }
9006     _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
9007     return E_JPEG_RETRY;
9008 }
9009 //------------------------------------------------------------------------------
9010 /********************************************************************/
9011 /// Enable NJPD ISR and register callback function.
9012 ///@param -IsrCb \b IN : NJPD ISR callback function
9013 ///@return \b JPEG_Result
9014 /// - E_JPEG_OKAY : success.
9015 /// - E_JPEG_FAILED : fail.
9016 /********************************************************************/
_MApi_JPEG_EnableISR(JPEG_IsrFuncCb IsrCb)9017 JPEG_Result _MApi_JPEG_EnableISR(JPEG_IsrFuncCb IsrCb)
9018 {
9019     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
9020     _USE_OJPD(MApi_JPEG_EnableISR, IsrCb);
9021     _NJPEG_EX_API_MutexLock(pNJPEGContext->eNJPDNum);
9022     if(TRUE == MDrv_NJPD_EnableISR((NJPD_IsrFuncCb)IsrCb))
9023     {
9024         JPEG_DEBUG_API_MSG("%s : Success!!!!\n", __FUNCTION__);
9025         _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
9026         return E_JPEG_OKAY;
9027     }
9028     else
9029     {
9030         JPEG_DEBUG_API_MSG("%s : Fail!!!!\n", __FUNCTION__);
9031         _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
9032         return E_JPEG_FAILED;
9033     }
9034 }
9035 //------------------------------------------------------------------------------
9036 /********************************************************************/
9037 /// Disable NJPD ISR and unregister callback function.
9038 ///@return \b JPEG_Result
9039 /// - E_JPEG_OKAY : success.
9040 /// - E_JPEG_FAILED : fail.
9041 /********************************************************************/
_MApi_JPEG_DisableISR(void)9042 JPEG_Result _MApi_JPEG_DisableISR(void)
9043 {
9044     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
9045     _USE_OJPD(MApi_JPEG_DisableISR);
9046     _NJPEG_EX_API_MutexLock(pNJPEGContext->eNJPDNum);
9047     if(TRUE == MDrv_NJPD_DisableISR())
9048     {
9049         JPEG_DEBUG_API_MSG("%s : Success!!!!\n", __FUNCTION__);
9050         _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
9051         return E_JPEG_OKAY;
9052     }
9053     else
9054     {
9055         JPEG_DEBUG_API_MSG("%s : Fail!!!!\n", __FUNCTION__);
9056         _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
9057         return E_JPEG_FAILED;
9058     }
9059 }
9060 //------------------------------------------------------------------------------
9061 /********************************************************************/
9062 /// JPEG wait done function, call it to check JPEG decoding status.
9063 ///@return \b JPEG_DecodeStatus
9064 /// - E_JPEG_DEC_DONE : JPEG decode done.
9065 /// - E_JPEG_DEC_FAILED : JPEG decode failed.
9066 /// - E_JPEG_DEC_MRBL_DONE : MRB low done, need to feed data.
9067 /// - E_JPEG_DEC_MRBH_DONE : MRB high done, need to feed data.
9068 /// - E_JPEG_DEC_DECODING : JPEG decoding
9069 /********************************************************************/
_MApi_JPEG_WaitDone(void)9070 JPEG_DecodeStatus _MApi_JPEG_WaitDone(void)
9071 {
9072     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_DEC_FAILED);
9073     _USE_OJPD(MApi_JPEG_WaitDone);
9074     MS_U16 reg_val = E_NJPD_EVENT_DEC_DONE;
9075 
9076     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
9077     {
9078         JPEG_DEBUG_API_ERR("%s: NJPD have not init!!\n", __FUNCTION__);
9079         return E_JPEG_DEC_FAILED;
9080     }
9081     _NJPEG_EX_API_MutexLock(pNJPEGContext->eNJPDNum);
9082 
9083 #if SW_NJPD_RGB_CMYK
9084     // It's pure software decode
9085     if((E_JPEG_CMYK == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum])
9086     || (E_JPEG_RGB == pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum]))
9087     {
9088         _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
9089         return E_JPEG_DEC_DONE;
9090     }
9091 #endif
9092 
9093     reg_val = MDrv_NJPD_GetEventFlag();
9094 
9095     if(reg_val & NJPD_EVENT_ERROR)
9096     {
9097         JPEG_terminate(E_JPEG_DECODE_ERROR);
9098         if(reg_val & NJPD_EVENT_WRITE_PROTECT)
9099         {
9100             JPEG_DEBUG_API_MSG("[%s]Write protect!!\n", __FUNCTION__);
9101         }
9102         if(reg_val & NJPD_EVENT_RES_MARKER_ERR)
9103         {
9104             JPEG_DEBUG_API_ERR("[%s]restart marker error!!\n", __FUNCTION__);
9105         }
9106         if(reg_val & NJPD_EVENT_RMID_ERR)
9107         {
9108             JPEG_DEBUG_API_ERR("[%s]restart marker index disorder error!!\n", __FUNCTION__);
9109         }
9110         if(reg_val & NJPD_EVENT_MINICODE_ERR)
9111         {
9112             JPEG_DEBUG_API_ERR("[%s]mini-code error!!\n", __FUNCTION__);
9113         }
9114         if(reg_val & NJPD_EVENT_INV_SCAN_ERR)
9115         {
9116             JPEG_DEBUG_API_ERR("[%s]inverse scan error!!\n", __FUNCTION__);
9117         }
9118         if(reg_val & NJPD_EVENT_DATA_LOSS_ERR)
9119         {
9120             JPEG_DEBUG_API_ERR("[%s]data loss error!!\n", __FUNCTION__);
9121         }
9122         if(reg_val & NJPD_EVENT_HUFF_TABLE_ERR)
9123         {
9124             JPEG_DEBUG_API_ERR("[%s]Huffman table error!!\n", __FUNCTION__);
9125         }
9126         #if ENABLE_NJPD_DEBUG_MSG
9127         MDrv_NJPD_Debug();
9128         #else
9129         if(MDrv_NJPD_GetVerificationMode()==E_NJPD01_TABLE_READ_WRITE)
9130         {
9131             MDrv_NJPD_Debug();
9132         }
9133         #endif
9134         if(reg_val & (NJPD_EVENT_RES_MARKER_ERR|NJPD_EVENT_RMID_ERR))
9135         {
9136             _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
9137             return E_JPEG_DEC_RST_ERROR;
9138         }
9139         if(reg_val & (NJPD_EVENT_MINICODE_ERR | NJPD_EVENT_INV_SCAN_ERR
9140             | NJPD_EVENT_DATA_LOSS_ERR | NJPD_EVENT_HUFF_TABLE_ERR))
9141         {
9142             _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
9143             return E_JPEG_DEC_BITSTREAM_ERROR;
9144         }
9145     }
9146 
9147     if(E_NJPD_EVENT_DEC_DONE & reg_val)
9148     {
9149         JPEG_DEBUG_API_MSG("%s:Decode Done!!\n", __FUNCTION__);
9150         if(MDrv_NJPD_IsNeedToPatch(E_NJPD_MIU_LAST_Z_PATCH))
9151         {
9152             MsOS_DelayTask(1);
9153         }
9154 #if PRINT_NJPD_DECODE_TIME
9155         pNJPEGContext->u32MeasureDecodeTimeHW[pNJPEGContext->eNJPDNum] = MDrv_TIMER_GetUs(E_TIMER_1)-pNJPEGContext->u32MeasureDecodeTime[pNJPEGContext->eNJPDNum];
9156         JPEG_DEBUG_API_MSG("SW decode header:[%td]us, HW decode: [%td]us, table:[%td]us\n", (ptrdiff_t)pNJPEGContext->u32MeasureDecodeTimeSW[pNJPEGContext->eNJPDNum],
9157             (ptrdiff_t)pNJPEGContext->u32MeasureDecodeTimeHW[pNJPEGContext->eNJPDNum], (ptrdiff_t)pNJPEGContext->u32MeasureDecodeTimeTable[pNJPEGContext->eNJPDNum]);
9158 #endif
9159 #ifdef CONFIG_UTOPIA_PROC_DBG_SUPPORT
9160         gNJPEGMDebug._u32HWEndTime= MsOS_GetSystemTime();
9161 #endif
9162         if(pNJPEGContext->_u8JPEG_ApiDbgLevel & E_JPEG_DEBUG_API)
9163         {
9164 #ifndef MSOS_TYPE_LINUX_KERNEL
9165             verJPD_CRC32_Init();
9166             verJPD_CRC32_Update((MS_U8 *)(MS_VIRT)MWC_BUFFER_ADDR,
9167                 (MS_U32)MApi_JPEG_GetWidth()*MApi_JPEG_GetHeight()*2);
9168             JPEG_DEBUG_API_MSG("[%dx%d], u32CRCResult=0x%tx\n",MApi_JPEG_GetWidth(), MApi_JPEG_GetHeight(), (ptrdiff_t)verJPD_CRC32_GetResult());
9169 
9170             _MApi_NJPD_Debug();
9171             _MApi_NJPD_PrintMem(MWC_BUFFER_ADDR, 0x100);
9172 #endif
9173         }
9174 #if LOG_DATA_TO_USB
9175             if(MApi_JPEG_GetWidth() <=pNJPEGContext->JPEG_MAX_WIDTH[pNJPEGContext->eNJPDNum]
9176                 && MApi_JPEG_GetHeight() <=pNJPEGContext->JPEG_MAX_HEIGHT[pNJPEGContext->eNJPDNum])
9177             {
9178                 MS_U32 u32Size;
9179                 u32Size = MApi_JPEG_GetWidth()*MApi_JPEG_GetHeight()*2;
9180                 JPEG_DEBUG_API_MSG("[%dx%d], MWC_BUFFER_ADDR=0x%x, size=0x%x", MApi_JPEG_GetWidth(),
9181                     MApi_JPEG_GetHeight(), MS_VA2PA(MWC_BUFFER_ADDR),u32Size);
9182                 _PrintOutputMem(MWC_BUFFER_ADDR, u32Size);
9183             }
9184 #endif
9185         _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
9186         return E_JPEG_DEC_DONE;
9187     }
9188     else
9189     {
9190 #if SUPPORT_HIGH_LOW_REVERSE
9191         if(pNJPEGContext->bHighLowReverse[pNJPEGContext->eNJPDNum])
9192         {
9193             if((E_NJPD_EVENT_MRC1_EMPTY & reg_val)
9194             && (E_JPEG_BUFFER_LOW != pNJPEGContext->u8PreLHFlag[pNJPEGContext->eNJPDNum]))
9195             {
9196                 pNJPEGContext->u8PreLHFlag[pNJPEGContext->eNJPDNum] = E_JPEG_BUFFER_LOW;
9197                 JPEG_DEBUG_API_MSG("[%s]MRBL done!!\n", __FUNCTION__);
9198                 if(pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum])
9199                 {
9200                     MDrv_NJPD_ReadLastBuffer();
9201                 }
9202                 _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
9203                 return E_JPEG_DEC_MRBL_DONE;
9204             }
9205             else if((E_NJPD_EVENT_MRC0_EMPTY & reg_val)
9206             && (E_JPEG_BUFFER_HIGH != pNJPEGContext->u8PreLHFlag[pNJPEGContext->eNJPDNum]))
9207             {
9208                 pNJPEGContext->u8PreLHFlag[pNJPEGContext->eNJPDNum] = E_JPEG_BUFFER_HIGH;
9209                 JPEG_DEBUG_API_MSG("[%s]MRBH done!!\n", __FUNCTION__);
9210                 if(pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum])
9211                 {
9212                     MDrv_NJPD_ReadLastBuffer();
9213                 }
9214                 _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
9215                 return E_JPEG_DEC_MRBH_DONE;
9216             }
9217         }
9218         else
9219 #endif
9220         {
9221             if((E_NJPD_EVENT_MRC0_EMPTY & reg_val)
9222             && (E_JPEG_BUFFER_LOW != pNJPEGContext->u8PreLHFlag[pNJPEGContext->eNJPDNum]))
9223             {
9224                 pNJPEGContext->u8PreLHFlag[pNJPEGContext->eNJPDNum] = E_JPEG_BUFFER_LOW;
9225                 JPEG_DEBUG_API_MSG("[%s]MRBL done!!\n", __FUNCTION__);
9226                 if(pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum])
9227                 {
9228                     MDrv_NJPD_ReadLastBuffer();
9229                 }
9230                 _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
9231                 return E_JPEG_DEC_MRBL_DONE;
9232             }
9233             else if((E_NJPD_EVENT_MRC1_EMPTY & reg_val)
9234             && (E_JPEG_BUFFER_HIGH != pNJPEGContext->u8PreLHFlag[pNJPEGContext->eNJPDNum]))
9235             {
9236                 pNJPEGContext->u8PreLHFlag[pNJPEGContext->eNJPDNum] = E_JPEG_BUFFER_HIGH;
9237                 JPEG_DEBUG_API_MSG("[%s]MRBH done!!\n", __FUNCTION__);
9238                 if(pNJPEGContext->_bEOF_flag[pNJPEGContext->eNJPDNum])
9239                 {
9240                     MDrv_NJPD_ReadLastBuffer();
9241                 }
9242                 _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
9243                 return E_JPEG_DEC_MRBH_DONE;
9244             }
9245         }
9246     }
9247     _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
9248     return E_JPEG_DEC_DECODING;
9249 }
9250 //------------------------------------------------------------------------------
9251 /********************************************************************/
9252 /// Get datetime info of JPEG EXIF
9253 ///@return \b JPEG_Result
9254 /// - E_JPEG_OKAY : success.
9255 /// - E_JPEG_FAILED : fail.
9256 /********************************************************************/
_MApi_JPEG_GetEXIFDateTime(JPEG_EXIF_DateTime * DateTime)9257 JPEG_Result _MApi_JPEG_GetEXIFDateTime(JPEG_EXIF_DateTime *DateTime)
9258 {
9259     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
9260     _USE_OJPD(MApi_JPEG_GetEXIFDateTime, DateTime);
9261     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
9262     {
9263         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
9264         return E_JPEG_FAILED;
9265     }
9266 
9267     DateTime->bHasDataTime = pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].bHasDataTime;
9268     DateTime->u32Year = pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Year;
9269     DateTime->u32Month = pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Month;
9270     DateTime->u32Day = pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Day;
9271     DateTime->u32Hour = pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Hour;
9272     DateTime->u32Minute = pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Minute;
9273     DateTime->u32Second = pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Second;
9274 
9275     JPEG_DEBUG_API_MSG("=======JPEG EXIF DateTime======= Exist = %td \n", (ptrdiff_t)pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].bHasDataTime);
9276     JPEG_DEBUG_API_MSG("Year = %td, Month = %td, Day = %td\n", (ptrdiff_t)pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Year, (ptrdiff_t)pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Month,(ptrdiff_t) pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Day);
9277     JPEG_DEBUG_API_MSG("Hour = %td, Minute = %td, Second = %td\n", (ptrdiff_t)pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Hour, (ptrdiff_t)pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Minute, (ptrdiff_t)pNJPEGContext->_stEXIF_DateTime[pNJPEGContext->eNJPDNum].u32Second);
9278 
9279     return E_JPEG_OKAY;
9280 }
9281 //------------------------------------------------------------------------------
9282 /********************************************************************/
9283 /// Get orientation info of JPEG EXIF
9284 ///@return \b JPEG_Result
9285 /// - E_JPEG_OKAY : success.
9286 /// - E_JPEG_FAILED : fail.
9287 /********************************************************************/
_MApi_JPEG_GetEXIFOrientation(JPEG_EXIF_Orientation * eOrientation)9288 JPEG_Result _MApi_JPEG_GetEXIFOrientation(JPEG_EXIF_Orientation *eOrientation)
9289 {
9290     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
9291     _USE_OJPD(MApi_JPEG_GetEXIFOrientation, eOrientation);
9292     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
9293     {
9294         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
9295         return E_JPEG_FAILED;
9296     }
9297     *eOrientation = pNJPEGContext->_eEXIF_Orientation[pNJPEGContext->eNJPDNum];
9298     JPEG_DEBUG_API_MSG("JPEG EXIF Orientation = %d\n", pNJPEGContext->_eEXIF_Orientation[pNJPEGContext->eNJPDNum]);
9299 #if ENABLE_NJPD_DEBUG_MSG
9300     MDrv_NJPD_Debug();
9301 #else
9302     if(MDrv_NJPD_GetVerificationMode()==E_NJPD01_TABLE_READ_WRITE)
9303     {
9304         MDrv_NJPD_Debug();
9305     }
9306 #endif
9307     return E_JPEG_OKAY;
9308 }
9309 
9310 #if SUPPORT_EXIF_EXTRA_INFO
_MApi_JPEG_GetEXIFManufacturer(MS_U8 * pu8Manufacturer,MS_U8 u8size)9311 JPEG_Result _MApi_JPEG_GetEXIFManufacturer(MS_U8 *pu8Manufacturer, MS_U8 u8size)
9312 {
9313     _USE_OJPD(MApi_JPEG_GetEXIFManufacturer, pu8Manufacturer, u8size);
9314     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
9315     {
9316         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
9317         return E_JPEG_FAILED;
9318     }
9319     MS_U8 u8i=0;
9320     JPEG_memset((void*)(pu8Manufacturer), 0, u8size);
9321     JPEG_DEBUG_API_MSG("JPEG EXIF Manufacturer =");
9322     while(pNJPEGContext->_u8EXIF_Manufacturer[pNJPEGContext->eNJPDNum][u8i] && u8i<JPEG_MANUFACTURER_SIZE)
9323     {
9324         *(pu8Manufacturer+u8i) =pNJPEGContext->_u8EXIF_Manufacturer[pNJPEGContext->eNJPDNum][u8i];
9325         JPEG_DEBUG_API_MSG("%c", *(pu8Manufacturer+u8i));
9326         u8i++;
9327         if(u8i>=u8size)
9328         {
9329             JPEG_DEBUG_API_ERR("%s: NOT enough space!!\n", __FUNCTION__);
9330             return E_JPEG_FAILED;
9331         }
9332     }
9333     JPEG_DEBUG_API_MSG("\n");
9334 //    JPEG_DEBUG_API_MSG("JPEG EXIF Manufacturer = %02x %02x %02x %02x %02x %02x %02x %02x\n",
9335 //        *pu8Manufacturer, *(pu8Manufacturer+1), *(pu8Manufacturer+2), *(pu8Manufacturer+3),
9336 //        *(pu8Manufacturer+4),*(pu8Manufacturer+5),*(pu8Manufacturer+6),*(pu8Manufacturer+7));
9337     return E_JPEG_OKAY;
9338 }
9339 
_MApi_JPEG_GetEXIFModel(MS_U8 * pu8Model,MS_U8 u8size)9340 JPEG_Result _MApi_JPEG_GetEXIFModel(MS_U8 *pu8Model, MS_U8 u8size)
9341 {
9342     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
9343     _USE_OJPD(MApi_JPEG_GetEXIFModel, pu8Model, u8size);
9344     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
9345     {
9346         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
9347         return E_JPEG_FAILED;
9348     }
9349     MS_U8 u8i=0;
9350     JPEG_memset((void*)(pu8Model), 0, u8size);
9351     JPEG_DEBUG_API_MSG("JPEG EXIF Model =");
9352     while(pNJPEGContext->_u8EXIF_Model[pNJPEGContext->eNJPDNum][u8i] && u8i<JPEG_MODEL_SIZE)
9353     {
9354         *(pu8Model+u8i) =pNJPEGContext->_u8EXIF_Model[pNJPEGContext->eNJPDNum][u8i];
9355         JPEG_DEBUG_API_MSG("%c", *(pu8Model+u8i));
9356         u8i++;
9357         if(u8i>=u8size)
9358         {
9359             JPEG_DEBUG_API_ERR("%s: NOT enough space!!\n", __FUNCTION__);
9360             return E_JPEG_FAILED;
9361         }
9362     }
9363     JPEG_DEBUG_API_MSG("\n");
9364 
9365 //    JPEG_DEBUG_API_MSG("JPEG EXIF Model = %02x %02x %02x %02x %02x %02x %02x %02x\n",
9366 //        *pu8Model, *(pu8Model+1), *(pu8Model+2), *(pu8Model+3),
9367 //        *(pu8Model+4),*(pu8Model+5),*(pu8Model+6),*(pu8Model+7));
9368     return E_JPEG_OKAY;
9369 }
9370 
_MApi_JPEG_GetEXIFFlash(MS_U16 * pu16Flash)9371 JPEG_Result _MApi_JPEG_GetEXIFFlash(MS_U16 *pu16Flash)
9372 {
9373     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
9374     _USE_OJPD(MApi_JPEG_GetEXIFFlash, pu16Flash);
9375     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
9376     {
9377         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
9378         return E_JPEG_FAILED;
9379     }
9380     *pu16Flash = pNJPEGContext->_u16EXIF_Flash[pNJPEGContext->eNJPDNum];
9381     JPEG_DEBUG_API_MSG("JPEG EXIF Flash = %d \n", *pu16Flash);
9382     return E_JPEG_OKAY;
9383 }
9384 
_MApi_JPEG_GetEXIFISOSpeedRatings(MS_U32 * pu32ISOSpeedRatings)9385 JPEG_Result _MApi_JPEG_GetEXIFISOSpeedRatings(MS_U32 *pu32ISOSpeedRatings)
9386 {
9387     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
9388     _USE_OJPD(MApi_JPEG_GetEXIFISOSpeedRatings, pu32ISOSpeedRatings);
9389     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
9390     {
9391         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
9392         return E_JPEG_FAILED;
9393     }
9394     *pu32ISOSpeedRatings = pNJPEGContext->_u32EXIF_ISOSpeedRatings[pNJPEGContext->eNJPDNum];
9395     JPEG_DEBUG_API_MSG("JPEG EXIF ISO = %td \n", (ptrdiff_t)(*pu32ISOSpeedRatings));
9396     return E_JPEG_OKAY;
9397 }
9398 
_MApi_JPEG_GetEXIFShutterSpeedValue(JPEG_RATIONAL * pShutterSpeedValue)9399 JPEG_Result _MApi_JPEG_GetEXIFShutterSpeedValue(JPEG_RATIONAL *pShutterSpeedValue)
9400 {
9401     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
9402     _USE_OJPD(MApi_JPEG_GetEXIFShutterSpeedValue, pShutterSpeedValue);
9403     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
9404     {
9405         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
9406         return E_JPEG_FAILED;
9407     }
9408     pShutterSpeedValue->numerator = pNJPEGContext->_stEXIF_ShutterSpeedValue[pNJPEGContext->eNJPDNum].numerator;
9409     pShutterSpeedValue->denominator= pNJPEGContext->_stEXIF_ShutterSpeedValue[pNJPEGContext->eNJPDNum].denominator;
9410     JPEG_DEBUG_API_MSG("ShutterSpeedValue numerator=%td, denominator=%td\n", (ptrdiff_t)pShutterSpeedValue->numerator, (ptrdiff_t)pShutterSpeedValue->denominator);
9411     return E_JPEG_OKAY;
9412 }
9413 
_MApi_JPEG_GetEXIFApertureValue(JPEG_RATIONAL * pApertureValue)9414 JPEG_Result _MApi_JPEG_GetEXIFApertureValue(JPEG_RATIONAL *pApertureValue)
9415 {
9416     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
9417     _USE_OJPD(MApi_JPEG_GetEXIFApertureValue, pApertureValue);
9418     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
9419     {
9420         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
9421         return E_JPEG_FAILED;
9422     }
9423     pApertureValue->s_numerator = pNJPEGContext->_stEXIF_ApertureValue[pNJPEGContext->eNJPDNum].s_numerator;
9424     pApertureValue->s_denominator= pNJPEGContext->_stEXIF_ApertureValue[pNJPEGContext->eNJPDNum].s_denominator;
9425     JPEG_DEBUG_API_MSG("ApertureValue numerator=%td, denominator=%td\n", (ptrdiff_t)pApertureValue->s_numerator, (ptrdiff_t)pApertureValue->s_denominator);
9426     return E_JPEG_OKAY;
9427 }
9428 
9429 
_MApi_JPEG_GetEXIFExposureBiasValue(JPEG_RATIONAL * pExposureBiasValue)9430 JPEG_Result _MApi_JPEG_GetEXIFExposureBiasValue(JPEG_RATIONAL *pExposureBiasValue)
9431 {
9432     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
9433     _USE_OJPD(MApi_JPEG_GetEXIFExposureBiasValue, pExposureBiasValue);
9434     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
9435     {
9436         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
9437         return E_JPEG_FAILED;
9438     }
9439     pExposureBiasValue->numerator = pNJPEGContext->_stEXIF_ExposureBiasValue[pNJPEGContext->eNJPDNum].numerator;
9440     pExposureBiasValue->denominator= pNJPEGContext->_stEXIF_ExposureBiasValue[pNJPEGContext->eNJPDNum].denominator;
9441     JPEG_DEBUG_API_MSG("ExposureBiasValue numerator=%td, denominator=%td\n", (ptrdiff_t)pExposureBiasValue->numerator, (ptrdiff_t)pExposureBiasValue->denominator);
9442     return E_JPEG_OKAY;
9443 }
9444 
_MApi_JPEG_GetEXIFFocalLength(JPEG_RATIONAL * pFocalLength)9445 JPEG_Result _MApi_JPEG_GetEXIFFocalLength(JPEG_RATIONAL *pFocalLength)
9446 {
9447     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
9448     _USE_OJPD(MApi_JPEG_GetEXIFFocalLength, pFocalLength);
9449     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
9450     {
9451         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
9452         return E_JPEG_FAILED;
9453     }
9454     pFocalLength->s_numerator = pNJPEGContext->_stEXIF_FocalLength[pNJPEGContext->eNJPDNum].s_numerator;
9455     pFocalLength->s_denominator= pNJPEGContext->_stEXIF_FocalLength[pNJPEGContext->eNJPDNum].s_denominator;
9456     JPEG_DEBUG_API_MSG("FocalLength numerator=%td, denominator=%td\n", (ptrdiff_t)pFocalLength->s_numerator, (ptrdiff_t)pFocalLength->s_denominator);
9457     return E_JPEG_OKAY;
9458 }
9459 
_MApi_JPEG_GetEXIFImageWidth(MS_U32 * pu32ImageWidth)9460 JPEG_Result _MApi_JPEG_GetEXIFImageWidth(MS_U32 *pu32ImageWidth)
9461 {
9462     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
9463     _USE_OJPD(MApi_JPEG_GetEXIFImageWidth, pu32ImageWidth);
9464     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
9465     {
9466         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
9467         return E_JPEG_FAILED;
9468     }
9469     *pu32ImageWidth = pNJPEGContext->_u32EXIF_ImageWidth[pNJPEGContext->eNJPDNum];
9470     JPEG_DEBUG_API_MSG("JPEG EXIF Image Width = %td \n", (ptrdiff_t)(*pu32ImageWidth));
9471     return E_JPEG_OKAY;
9472 }
9473 
_MApi_JPEG_GetEXIFImageHeight(MS_U32 * pu32ImageHeight)9474 JPEG_Result _MApi_JPEG_GetEXIFImageHeight(MS_U32 *pu32ImageHeight)
9475 {
9476     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
9477     _USE_OJPD(MApi_JPEG_GetEXIFImageHeight, pu32ImageHeight);
9478     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
9479     {
9480         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
9481         return E_JPEG_FAILED;
9482     }
9483     *pu32ImageHeight = pNJPEGContext->_u32EXIF_ImageHeight[pNJPEGContext->eNJPDNum];
9484     JPEG_DEBUG_API_MSG("JPEG EXIF Image Height = %td \n", (ptrdiff_t)(*pu32ImageHeight));
9485     return E_JPEG_OKAY;
9486 }
9487 
_MApi_JPEG_GetEXIFExposureTime(JPEG_RATIONAL * pExposureTime)9488 JPEG_Result _MApi_JPEG_GetEXIFExposureTime(JPEG_RATIONAL *pExposureTime)
9489 {
9490     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
9491     _USE_OJPD(MApi_JPEG_GetEXIFApertureValue, pExposureTime);
9492     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
9493     {
9494         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
9495         return E_JPEG_FAILED;
9496     }
9497     pExposureTime->s_numerator = pNJPEGContext->_stEXIF_ExposureTime[pNJPEGContext->eNJPDNum].s_numerator;
9498     pExposureTime->s_denominator= pNJPEGContext->_stEXIF_ExposureTime[pNJPEGContext->eNJPDNum].s_denominator;
9499     JPEG_DEBUG_API_MSG("ExposureTime numerator=%td, denominator=%td\n", (ptrdiff_t)pExposureTime->s_numerator, (ptrdiff_t)pExposureTime->s_denominator);
9500     return E_JPEG_OKAY;
9501 }
9502 
9503 
_MApi_JPEG_GetEXIFFNumber(JPEG_RATIONAL * pFNumber)9504 JPEG_Result _MApi_JPEG_GetEXIFFNumber(JPEG_RATIONAL *pFNumber)
9505 {
9506     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
9507     _USE_OJPD(MApi_JPEG_GetEXIFApertureValue, pFNumber);
9508     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
9509     {
9510         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
9511         return E_JPEG_FAILED;
9512     }
9513     pFNumber->s_numerator = pNJPEGContext->_stEXIF_FNumber[pNJPEGContext->eNJPDNum].s_numerator;
9514     pFNumber->s_denominator= pNJPEGContext->_stEXIF_FNumber[pNJPEGContext->eNJPDNum].s_denominator;
9515     JPEG_DEBUG_API_MSG("FNumber numerator=%td, denominator=%td\n", (ptrdiff_t)pFNumber->s_numerator, (ptrdiff_t)pFNumber->s_denominator);
9516     return E_JPEG_OKAY;
9517 }
9518 
9519 
9520 #endif
9521 
_MApi_JPEG_GetControl(EN_JPEG_GET_CTRL_ID eGetID,MS_U32 * param,MS_U32 u32size)9522 JPEG_Result _MApi_JPEG_GetControl(EN_JPEG_GET_CTRL_ID eGetID, MS_U32 *param, MS_U32 u32size)
9523 {
9524     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
9525     JPEG_Result eResult = E_JPEG_OKAY;
9526     _USE_OJPD(MApi_JPEG_GetControl, eGetID, param, u32size);
9527     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
9528     {
9529         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
9530         return E_JPEG_FAILED;
9531     }
9532 
9533     switch(eGetID)
9534     {
9535         case E_JPEG_GET_EXIF_MANUFACTURER:
9536             eResult = MApi_JPEG_GetEXIFManufacturer((MS_U8 *)param, u32size*4);
9537             JPEG_DEBUG_API_MSG("@JPEG EXIF Manufacturer = %c%c%c%c%c%c%c%c%c%c%c%c\n",
9538                 *((MS_U8 *)param), *((MS_U8 *)param+1), *((MS_U8 *)param+2), *((MS_U8 *)param+3),
9539                 *((MS_U8 *)param+4),*((MS_U8 *)param+5),*((MS_U8 *)param+6),*((MS_U8 *)param+7),
9540                 *((MS_U8 *)param+8),*((MS_U8 *)param+9),*((MS_U8 *)param+10),*((MS_U8 *)param+11)
9541                 );
9542             break;
9543         case E_JPEG_GET_EXIF_MODEL:
9544             eResult = MApi_JPEG_GetEXIFModel((MS_U8 *)param, u32size*4);
9545             JPEG_DEBUG_API_MSG("@JPEG EXIF Model = %c%c%c%c%c%c%c%c%c%c%c%c\n",
9546                 *((MS_U8 *)param), *((MS_U8 *)param+1), *((MS_U8 *)param+2), *((MS_U8 *)param+3),
9547                 *((MS_U8 *)param+4),*((MS_U8 *)param+5),*((MS_U8 *)param+6),*((MS_U8 *)param+7),
9548                 *((MS_U8 *)param+8),*((MS_U8 *)param+9),*((MS_U8 *)param+10),*((MS_U8 *)param+11)
9549                 );
9550             break;
9551         case E_JPEG_GET_EXIF_FLASH:
9552             *param = (MS_U32)pNJPEGContext->_u16EXIF_Flash[pNJPEGContext->eNJPDNum];
9553             JPEG_DEBUG_API_MSG("@JPEG EXIF Flash = %td \n", (ptrdiff_t)(*param));
9554             break;
9555         case E_JPEG_GET_EXIF_ISO_SPEED_RATINGS:
9556             *param = pNJPEGContext->_u32EXIF_ISOSpeedRatings[pNJPEGContext->eNJPDNum];
9557             JPEG_DEBUG_API_MSG("@JPEG EXIF ISO = %td \n", (ptrdiff_t)(*param));
9558             break;
9559         case E_JPEG_GET_EXIF_SHUTTER_SPEED_VALUE:
9560             if(u32size<2)
9561             {
9562                 eResult = E_JPEG_FAILED;
9563             }
9564             *param = pNJPEGContext->_stEXIF_ShutterSpeedValue[pNJPEGContext->eNJPDNum].numerator;
9565             *(param+1) = pNJPEGContext->_stEXIF_ShutterSpeedValue[pNJPEGContext->eNJPDNum].denominator;
9566             JPEG_DEBUG_API_MSG("@ShutterSpeedValue numerator=%td, denominator=%td\n", (ptrdiff_t)(*param), (ptrdiff_t)(*(param+1)));
9567             break;
9568         case E_JPEG_GET_EXIF_APERTURE_VALUE:
9569             if(u32size<2)
9570             {
9571                 eResult = E_JPEG_FAILED;
9572             }
9573             *param = (MS_U32)pNJPEGContext->_stEXIF_ApertureValue[pNJPEGContext->eNJPDNum].s_numerator;
9574             *(param+1) = (MS_U32)pNJPEGContext->_stEXIF_ApertureValue[pNJPEGContext->eNJPDNum].s_denominator;
9575             JPEG_DEBUG_API_MSG("@ApertureValue numerator=%td, denominator=%td\n", (ptrdiff_t)(*param), (ptrdiff_t)(*(param+1)));
9576             break;
9577         case E_JPEG_GET_EXIF_EXPOSURE_BIAS_VALUE:
9578             if(u32size<2)
9579             {
9580                 eResult = E_JPEG_FAILED;
9581             }
9582             *param = pNJPEGContext->_stEXIF_ExposureBiasValue[pNJPEGContext->eNJPDNum].numerator;
9583             *(param+1) = pNJPEGContext->_stEXIF_ExposureBiasValue[pNJPEGContext->eNJPDNum].denominator;
9584             JPEG_DEBUG_API_MSG("@ExposureBiasValue numerator=%td, denominator=%td\n", (ptrdiff_t)(*param), (ptrdiff_t)(*(param+1)));
9585             break;
9586         case E_JPEG_GET_EXIF_FOCAL_LENGTH:
9587             if(u32size<2)
9588             {
9589                 eResult = E_JPEG_FAILED;
9590             }
9591             *param = (MS_U32)pNJPEGContext->_stEXIF_FocalLength[pNJPEGContext->eNJPDNum].s_numerator;
9592             *(param+1) = (MS_U32)pNJPEGContext->_stEXIF_FocalLength[pNJPEGContext->eNJPDNum].s_denominator;
9593             JPEG_DEBUG_API_MSG("@FocalLength numerator=%td, denominator=%td\n", (ptrdiff_t)(*param), (ptrdiff_t)*((param+1)));
9594             break;
9595         case E_JPEG_GET_EXIF_IMAGE_WIDTH:
9596             *param = pNJPEGContext->_u32EXIF_ImageWidth[pNJPEGContext->eNJPDNum];
9597             JPEG_DEBUG_API_MSG("@JPEG EXIF Image Width = %td \n", (ptrdiff_t)(*param));
9598             break;
9599         case E_JPEG_GET_EXIF_IMAGE_HEIGHT:
9600             *param = pNJPEGContext->_u32EXIF_ImageHeight[pNJPEGContext->eNJPDNum];
9601             JPEG_DEBUG_API_MSG("@JPEG EXIF Image Height = %td \n", (ptrdiff_t)(*param));
9602             break;
9603         case E_JPEG_GET_EXIF_EXPOSURE_TIME:
9604             if(u32size<2)
9605             {
9606                 eResult = E_JPEG_FAILED;
9607             }
9608             *param = (MS_U32)pNJPEGContext->_stEXIF_ExposureTime[pNJPEGContext->eNJPDNum].s_numerator;
9609             *(param+1) = (MS_U32)pNJPEGContext->_stEXIF_ExposureTime[pNJPEGContext->eNJPDNum].s_denominator;
9610             JPEG_DEBUG_API_MSG("@ExposureTime numerator=%td, denominator=%td\n", (ptrdiff_t)(*param), (ptrdiff_t)(*(param+1)));
9611             break;
9612         case E_JPEG_GET_EXIF_F_NUMBER:
9613             if(u32size<2)
9614             {
9615                 eResult = E_JPEG_FAILED;
9616             }
9617             *param = (MS_U32)pNJPEGContext->_stEXIF_FNumber[pNJPEGContext->eNJPDNum].s_numerator;
9618             *(param+1) = (MS_U32)pNJPEGContext->_stEXIF_FNumber[pNJPEGContext->eNJPDNum].s_denominator;
9619             JPEG_DEBUG_API_MSG("@FNumber numerator=%td, denominator=%td\n", (ptrdiff_t)(*param), (ptrdiff_t)(*(param+1)));
9620             break;
9621         case E_JPEG_GET_EXIF_EXPOSURE_PROGRAM:
9622             *param = (MS_U32)pNJPEGContext->_u16EXIF_Exposureprogram[pNJPEGContext->eNJPDNum];
9623             JPEG_DEBUG_API_MSG("@JPEG EXIF Exposure Program = %td \n", (ptrdiff_t)(*param));
9624             break;
9625         case E_JPEG_GET_Y_SAMPLING_FACTOR_HORIZONTAL:
9626             *param = (MS_U32)pNJPEGContext->_u8Comp_h_samp[pNJPEGContext->eNJPDNum][0];
9627             JPEG_DEBUG_API_MSG("@JPEG Horizontal sampling factor(Y) = %td \n", (ptrdiff_t)(*param));
9628             break;
9629         case E_JPEG_GET_Y_SAMPLING_FACTOR_VERTICAL:
9630             *param = (MS_U32)pNJPEGContext->_u8Comp_v_samp[pNJPEGContext->eNJPDNum][0];
9631             JPEG_DEBUG_API_MSG("@JPEG Vertical sampling factor(Y) = %td \n", (ptrdiff_t)(*param));
9632             break;
9633         case E_JPEG_GET_COMPONENTS_NUM:
9634             *param = (MS_U32)pNJPEGContext->_u8Comps_in_frame[pNJPEGContext->eNJPDNum];
9635             JPEG_DEBUG_API_MSG("@JPEG componemts num = %td \n", (ptrdiff_t)(*param));
9636             break;
9637         case E_JPEG_GET_IS_PROGRESSIVE:
9638             *param = (MS_U32)pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum];
9639             JPEG_DEBUG_API_MSG("@JPEG is progressive = %td \n", (ptrdiff_t)(*param));
9640             break;
9641         case E_JPEG_GET_COLOR_FORMAT:
9642             switch(pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum])
9643             {
9644                 case E_JPEG_GRAYSCALE:
9645                     *param = (MS_U32)E_JPEG_INPUT_FORMAT_GRAY_SCALE;
9646                     break;
9647                 case E_JPEG_YH1V1:
9648                     *param = (MS_U32)E_JPEG_INPUT_FORMAT_YUV444;
9649                     break;
9650                 case E_JPEG_YH2V1:
9651                 case E_JPEG_YH1V2:
9652                     *param = (MS_U32)E_JPEG_INPUT_FORMAT_YUV422;
9653                     break;
9654                 case E_JPEG_YH2V2:
9655                     *param = (MS_U32)E_JPEG_INPUT_FORMAT_YUV420;
9656                     break;
9657                 case E_JPEG_YH4V1:
9658                     *param = (MS_U32)E_JPEG_INPUT_FORMAT_YUV411;
9659                     break;
9660 #if SW_NJPD_RGB_CMYK
9661                 case E_JPEG_RGB:
9662                     *param = (MS_U32)E_JPEG_INPUT_FORMAT_RGB;
9663                     break;
9664                 case E_JPEG_CMYK:
9665                     *param = (MS_U32)E_JPEG_INPUT_FORMAT_CMYK;
9666                     break;
9667 #endif
9668                 default:
9669                     *param = (MS_U32)E_JPEG_INPUT_FORMAT_GRAY_SCALE;
9670                     break;
9671             }
9672             JPEG_DEBUG_API_MSG("@JPEG input color format = %td \n", (ptrdiff_t)(*param));
9673             break;
9674 
9675         default:
9676             eResult = E_JPEG_FAILED;
9677             break;
9678     }
9679     return eResult;
9680 }
9681 
9682 ////////////////////////////////////////////////////////////////////////////////////////
9683 ///   current unused function, maybe removed in new MDDI
9684 ////////////////////////////////////////////////////////////////////////////////////////
9685 
9686 
9687 #if SW_NJPD_RGB_CMYK
9688 // Decodes and dequantizes the next row of coefficients.
msAPI_JPEG_decode_next_row(void)9689 JPEG_STATIC MS_BOOL msAPI_JPEG_decode_next_row( void )
9690 {
9691     MS_U16 row_block = 0;
9692     MS_U16 mcu_row, mcu_block, k;
9693 
9694     // Clearing the entire row block buffer can take a lot of time!
9695     // Instead of clearing the entire buffer each row, keep track
9696     // of the number of nonzero entries written to each block and do
9697     // selective clears.
9698     //memset(_ps16Block_seg[0], 0, _u16Mcus_per_row[pNJPEGContext->eNJPDNum] * _u8Blocks_per_mcu[pNJPEGContext->eNJPDNum] * 64 * sizeof(BLOCK_TYPE));
9699 
9700     for ( mcu_row = 0; mcu_row < pNJPEGContext->_u16Mcus_per_row[pNJPEGContext->eNJPDNum]; mcu_row++ )
9701     {
9702         if ( ( pNJPEGContext->_u16Restart_interval[pNJPEGContext->eNJPDNum] ) && ( pNJPEGContext->_u16Restarts_left[pNJPEGContext->eNJPDNum] == 0 ) )
9703         {
9704             if(!JPEG_process_restart())
9705                 return FALSE;
9706         }
9707 
9708         for ( mcu_block = 0; mcu_block < pNJPEGContext->_u8Blocks_per_mcu[pNJPEGContext->eNJPDNum]; mcu_block++ )
9709         {
9710             MS_U8 component_id = pNJPEGContext->_u8Mcu_org[pNJPEGContext->eNJPDNum][mcu_block];
9711             MS_U8 prev_num_set;
9712             JPEG_HuffTbl *Ph;
9713 
9714             JPEG_BLOCK_TYPE *p = pNJPEGContext->_ps16Block_seg[row_block];
9715             JPEG_QUANT_TYPE *q = pNJPEGContext->_QuantTables[pNJPEGContext->eNJPDNum][pNJPEGContext->_u8Comp_quant[pNJPEGContext->eNJPDNum][component_id]].s16Value;
9716             MS_S32 r, s;
9717 
9718             if ( ( s = JPEG_huff_decode( &pNJPEGContext->_Huff_tbls[pNJPEGContext->eNJPDNum][pNJPEGContext->_u8Comp_dc_tab[pNJPEGContext->eNJPDNum][component_id]] ) ) != 0 )
9719             {
9720                 r = JPEG_get_bits_2( s );
9721                 s = HUFF_EXTEND( r, s );
9722             }
9723 
9724             //printf("r : %d s : %d\n",s,r);
9725 
9726             pNJPEGContext->_u32Last_dc_val[pNJPEGContext->eNJPDNum][component_id] = ( s += pNJPEGContext->_u32Last_dc_val[pNJPEGContext->eNJPDNum][component_id] );
9727 
9728             p[0] = s * q[0];
9729 
9730             prev_num_set = pNJPEGContext->_u8Block_max_zag_set[row_block];
9731 
9732             Ph = &pNJPEGContext->_Huff_tbls[pNJPEGContext->eNJPDNum][pNJPEGContext->_u8Comp_ac_tab[pNJPEGContext->eNJPDNum][component_id]];
9733 
9734             for ( k = 1; k < 64; k++ )
9735             {
9736                 s = JPEG_huff_decode( Ph );
9737 
9738                 //printf("Decode s :%d\n",s);
9739 
9740                 r = s >> 4;
9741                 s &= 15;
9742 
9743                 if ( s )
9744                 {
9745                     if ( r )
9746                     {
9747                         if ( ( k + r ) > 63 )
9748                         {
9749                             JPEG_terminate( E_JPEG_DECODE_ERROR );
9750                             return FALSE;
9751                         }
9752 
9753                         if ( k < prev_num_set )
9754                         {
9755                             MS_U32 n = MIN( r, prev_num_set - k );
9756                             MS_U16 kt = k;
9757                             while ( n-- )
9758                             {
9759                                 p[_u8ZAG[kt++]] = 0;
9760                             }
9761                         }
9762 
9763                         k += r;
9764                     }
9765 
9766                     r = JPEG_get_bits_2( s );
9767                     s = HUFF_EXTEND( r, s );
9768 
9769                     //assert(k < 64);
9770 
9771                     p[_u8ZAG[k]] = s * q[k];
9772                 }
9773                 else
9774                 {
9775                     if ( r == 15 )
9776                     {
9777                         if ( ( k + 15 ) > 63 )
9778                         {
9779                             JPEG_terminate( E_JPEG_DECODE_ERROR );
9780                             return FALSE;
9781                         }
9782 
9783                         if ( k < prev_num_set )
9784                         {
9785                             MS_U16 n = MIN( 16, prev_num_set - k );        //bugfix Dec. 19, 2001 - was 15!
9786                             MS_U16 kt = k;
9787                             while ( n-- )
9788                             {
9789                                 p[_u8ZAG[kt++]] = 0;
9790                             }
9791                         }
9792 
9793                         k += 15;
9794                     }
9795                     else
9796                     {
9797                         //while (k < 64)
9798                         //  p[ZAG[k++]] = 0;
9799 
9800                         break;
9801                     }
9802                 }
9803             }
9804 
9805             if ( k < prev_num_set )
9806             {
9807                 MS_U16 kt = k;
9808                 while ( kt < prev_num_set && kt < 64)           // kt < 64 is for coverity check
9809                 {
9810                     p[_u8ZAG[kt++]] = 0;
9811                 }
9812             }
9813 
9814             pNJPEGContext->_u8Block_max_zag_set[row_block] = k;
9815 
9816             //block_num[row_block++] = k;
9817             row_block++;
9818         }
9819 
9820         pNJPEGContext->_u16Restarts_left[pNJPEGContext->eNJPDNum]--;
9821     }
9822     return TRUE;
9823 }
9824 
9825 /*----------------------------------------------------------------------------*/
msAPI_JPEG_idct(JPEG_BLOCK_TYPE * data,MS_U8 * Pdst_ptr)9826 JPEG_STATIC void msAPI_JPEG_idct( JPEG_BLOCK_TYPE *data, MS_U8 *Pdst_ptr )
9827 {
9828     MS_S32 t0, t1, t2, t3;
9829     MS_S32 t10, t11, t12, t13;
9830     MS_S32 a1, a2, a3, a4, a5;
9831     MS_S32 rowctl;
9832     register JPEG_BLOCK_TYPE *pdata;
9833 
9834     //kevinhuang, use an internal array in idct to avoid memcpy to save time
9835     JPEG_BLOCK_TYPE workspace[64];
9836     JPEG_BLOCK_TYPE *wsptr;
9837 
9838     pdata = data;
9839     wsptr = workspace;
9840     for ( rowctl = 8 - 1; rowctl >= 0; rowctl-- )
9841     {
9842         if ( ( pdata[1] | pdata[2] | pdata[3] | pdata[4] | pdata[5] | pdata[6] | pdata[7] ) == 0 )
9843         {
9844             MS_S16 dc_val = ( MS_S16 )( pdata[0] << 2 );
9845 
9846             wsptr[0] = dc_val;
9847             wsptr[1] = dc_val;
9848             wsptr[2] = dc_val;
9849             wsptr[3] = dc_val;
9850             wsptr[4] = dc_val;
9851             wsptr[5] = dc_val;
9852             wsptr[6] = dc_val;
9853             wsptr[7] = dc_val;
9854 
9855             pdata += 8;       /* advance pointer to next row */
9856             wsptr += 8;
9857             continue;
9858         }
9859 
9860         a2 = ( MS_S32 )pdata[2];
9861         a3 = ( MS_S32 )pdata[6];
9862 
9863         a1 = (FIX_0_5411) * (a2 + a3);
9864         t2 = (-FIX_1_8477) * a3 + a1;
9865         t3 = (FIX_0_7653) * a2 + a1;
9866 
9867         t0 = ( ( MS_S32 )pdata[0] + ( MS_S32 )pdata[4] ) << 13;
9868         t1 = ( ( MS_S32 )pdata[0] - ( MS_S32 )pdata[4] ) << 13;
9869 
9870         t10 = t0 + t3;
9871         t13 = t0 - t3;
9872         t11 = t1 + t2;
9873         t12 = t1 - t2;
9874 
9875         t0 = ( MS_S32 )pdata[7];
9876         t1 = ( MS_S32 )pdata[5];
9877         t2 = ( MS_S32 )pdata[3];
9878         t3 = ( MS_S32 )pdata[1];
9879 
9880         a1 = t0 + t3;
9881         a2 = t1 + t2;
9882         a3 = t0 + t2;
9883         a4 = t1 + t3;
9884         a5 = (FIX_1_1758) * (a3 + a4);
9885 
9886         a1 = (-FIX_0_8999) * a1;
9887         a2 = (-FIX_2_5629) * a2;
9888         a3 = (-FIX_1_9615) * a3;
9889         a4 = (-FIX_0_3901) * a4;
9890         t0 = (FIX_0_2986) * t0;
9891         t1 = (FIX_2_0531) * t1;
9892         t2 = (FIX_3_0727) * t2;
9893         t3 = (FIX_1_5013) * t3;
9894 
9895         a3 += a5;
9896         a4 += a5;
9897 
9898         t0 += a1 + a3;
9899         t1 += a2 + a4;
9900         t2 += a2 + a3;
9901         t3 += a1 + a4;
9902 
9903         wsptr[0] = ( MS_S16 )DESCALE( t10 + t3, 13 - 2 );
9904         wsptr[1] = ( MS_S16 )DESCALE( t11 + t2, 13 - 2 );
9905         wsptr[2] = ( MS_S16 )DESCALE( t12 + t1, 13 - 2 );
9906         wsptr[3] = ( MS_S16 )DESCALE( t13 + t0, 13 - 2 );
9907         wsptr[4] = ( MS_S16 )DESCALE( t13 - t0, 13 - 2 );
9908         wsptr[5] = ( MS_S16 )DESCALE( t12 - t1, 13 - 2 );
9909         wsptr[6] = ( MS_S16 )DESCALE( t11 - t2, 13 - 2 );
9910         wsptr[7] = ( MS_S16 )DESCALE( t10 - t3, 13 - 2 );
9911 
9912         pdata += 8;
9913         wsptr += 8;
9914     }
9915 
9916     pdata = workspace;
9917     for ( rowctl = 8 - 1; rowctl >= 0; rowctl-- )
9918     {
9919         MS_S16 i;
9920 
9921         if ( ( pdata[8 * 1] | pdata[8 * 2] | pdata[8 * 3] | pdata[8 * 4] | pdata[8 * 5] | pdata[8 * 6] | pdata[8 * 7] ) == 0 )
9922         {
9923             MS_S16 dc_val = ( MS_S16 )DESCALE( ( MS_S32 )pdata[0], 2 + 3 ) + 128;
9924 
9925             jpeg_clamp( dc_val );
9926 
9927             Pdst_ptr[8 * 0] = ( MS_U8 )dc_val;
9928 
9929 #if SW_OPTIMIZE
9930             if(pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] == 3)
9931             {
9932                 pdata++;
9933                 Pdst_ptr++;
9934                 continue;
9935             }
9936 #endif
9937 
9938             Pdst_ptr[8 * 4] = ( MS_U8 )dc_val;
9939 
9940 #if SW_OPTIMIZE
9941             if(pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] == 2)
9942             {
9943                 pdata++;
9944                 Pdst_ptr++;
9945                 continue;
9946             }
9947 #endif
9948 
9949             Pdst_ptr[8 * 2] = ( MS_U8 )dc_val;
9950             Pdst_ptr[8 * 6] = ( MS_U8 )dc_val;
9951 
9952 #if SW_OPTIMIZE
9953             if(pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum] == 1)
9954             {
9955                 pdata++;
9956                 Pdst_ptr++;
9957                 continue;
9958             }
9959 #endif
9960 
9961             Pdst_ptr[8 * 1] = ( MS_U8 )dc_val;
9962             Pdst_ptr[8 * 5] = ( MS_U8 )dc_val;
9963             Pdst_ptr[8 * 3] = ( MS_U8 )dc_val;
9964             Pdst_ptr[8 * 7] = ( MS_U8 )dc_val;
9965 
9966             pdata++;
9967             Pdst_ptr++;
9968             continue;
9969         }
9970 
9971         a2 = ( MS_S32 )pdata[8 * 2];
9972         a3 = ( MS_S32 )pdata[8 * 6];
9973 
9974         a1 = (FIX_0_5411) * (a2 + a3);
9975         t2 = (-FIX_1_8477) * a3 + a1;
9976         t3 = (FIX_0_7653) * a2 + a1;
9977 
9978         t0 = ( ( MS_S32 )pdata[8 * 0] + ( MS_S32 )pdata[8 * 4] ) << 13;
9979         t1 = ( ( MS_S32 )pdata[8 * 0] - ( MS_S32 )pdata[8 * 4] ) << 13;
9980 
9981         t10 = t0 + t3;
9982         t13 = t0 - t3;
9983         t11 = t1 + t2;
9984         t12 = t1 - t2;
9985 
9986         t0 = ( MS_S32 )pdata[8 * 7];
9987         t1 = ( MS_S32 )pdata[8 * 5];
9988         t2 = ( MS_S32 )pdata[8 * 3];
9989         t3 = ( MS_S32 )pdata[8 * 1];
9990 
9991         a1 = t0 + t3;
9992         a2 = t1 + t2;
9993         a3 = t0 + t2;
9994         a4 = t1 + t3;
9995         a5 = (FIX_1_1758) * (a3 + a4);
9996 
9997         a1 = (-FIX_0_8999) * a1;
9998         a2 = (-FIX_2_5629) * a2;
9999         a3 = (-FIX_1_9615) * a3;
10000         a4 = (-FIX_0_3901) * a4;
10001         t0 = (FIX_0_2986) * t0;
10002         t1 = (FIX_2_0531) * t1;
10003         t2 = (FIX_3_0727) * t2;
10004         t3 = (FIX_1_5013) * t3;
10005 
10006         a3 += a5;
10007         a4 += a5;
10008 
10009         t0 += a1 + a3;
10010         t1 += a2 + a4;
10011         t2 += a2 + a3;
10012         t3 += a1 + a4;
10013 
10014         i = ( MS_S16 )DESCALE( t10 + t3, 13 + 2 + 3 ) + 128;
10015         jpeg_clamp( i )
10016         Pdst_ptr[8 * 0] = ( MS_U8 )i;
10017 
10018 #if SW_OPTIMIZE
10019         if(pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum]== 3)
10020         {
10021             pdata++;
10022             Pdst_ptr++;
10023             continue;
10024         }
10025 #endif
10026 
10027         i = ( MS_S16 )DESCALE( t13 - t0, 13 + 2 + 3 ) + 128;
10028         jpeg_clamp( i )
10029         Pdst_ptr[8 * 4] = ( MS_U8 )i;
10030 
10031 #if SW_OPTIMIZE
10032         if(pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum]== 2)
10033         {
10034             pdata++;
10035             Pdst_ptr++;
10036             continue;
10037         }
10038 #endif
10039 
10040         i = ( MS_S16 )DESCALE( t12 + t1, 13 + 2 + 3 ) + 128;
10041         jpeg_clamp( i )
10042         Pdst_ptr[8 * 2] = ( MS_U8 )i;
10043 
10044         i = ( MS_S16 )DESCALE( t11 - t2, 13 + 2 + 3 ) + 128;
10045         jpeg_clamp( i )
10046         Pdst_ptr[8 * 6] = ( MS_U8 )i;
10047 
10048 #if SW_OPTIMIZE
10049         if(pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum]== 1)
10050         {
10051             pdata++;
10052             Pdst_ptr++;
10053             continue;
10054         }
10055 #endif
10056 
10057         i = ( MS_S16 )DESCALE( t11 + t2, 13 + 2 + 3 ) + 128;
10058         jpeg_clamp( i )
10059         Pdst_ptr[8 * 1] = ( MS_U8 )i;
10060 
10061 
10062         i = ( MS_S16 )DESCALE( t13 + t0, 13 + 2 + 3 ) + 128;
10063         jpeg_clamp( i )
10064         Pdst_ptr[8 * 3] = ( MS_U8 )i;
10065 
10066 
10067         i = ( MS_S16 )DESCALE( t12 - t1, 13 + 2 + 3 ) + 128;
10068         jpeg_clamp( i )
10069         Pdst_ptr[8 * 5] = ( MS_U8 )i;
10070 
10071 
10072         i = ( MS_S16 )DESCALE( t10 - t3, 13 + 2 + 3 ) + 128;
10073         jpeg_clamp( i )
10074         Pdst_ptr[8 * 7] = ( MS_U8 )i;
10075 
10076         pdata++;
10077         Pdst_ptr++;
10078     }
10079 }
10080 
msAPI_JPEG_Idct_CMYKConvert(void)10081 JPEG_STATIC MS_BOOL msAPI_JPEG_Idct_CMYKConvert(void)
10082 {
10083     JPEG_BLOCK_TYPE *Psrc_ptr = pNJPEGContext->_ps16Block_seg[0];
10084     MS_U8 *Pdst_ptr = pNJPEGContext->gpu8Sample_buf;
10085     MS_U8 *u8Start_Each_Block, *u8Start_Each_Row;
10086     MS_U32 u32_y_Blcok_Pos = 0, Max_Pixel_Per_Row;
10087     MS_S32 i;
10088     MS_U8  u8Row_in_block, k;
10089     MS_U16 u16Pixel_Per_Block_x = 8, u16Pixel_Per_Block_y = 8;
10090     MS_U16 u16Pixel_Per_Pack_row = 16, u16TotalBlock_Per_Row, u16ScaleDownStep = 1 << pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum];
10091 
10092     u16TotalBlock_Per_Row = (pNJPEGContext->_u32Max_blocks_per_row[pNJPEGContext->eNJPDNum])/2;
10093 
10094     u16Pixel_Per_Pack_row = u16Pixel_Per_Pack_row >> pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum];
10095     u16Pixel_Per_Block_x = u16Pixel_Per_Block_x/* >> pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum]*/;
10096     u16Pixel_Per_Block_y = u16Pixel_Per_Block_y >> pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum];
10097 
10098 
10099     Max_Pixel_Per_Row = (u16TotalBlock_Per_Row*u16Pixel_Per_Block_x >> pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum]);
10100 
10101     //Get start position of each row
10102     u8Start_Each_Row = (u8Out_buf + (u32_Decode_Line*(Max_Pixel_Per_Row*u16Pixel_Per_Block_y)));
10103 
10104     for ( i = (MS_S32)pNJPEGContext->_u32Max_blocks_per_row[pNJPEGContext->eNJPDNum]; i > 0;)
10105     {
10106         //===================GET Y1 BLOCKs=======================
10107         msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
10108 
10109         //Get start position of block
10110         u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
10111 
10112         //Write value to destination buffer
10113         for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
10114         {
10115             for(k=0;k<u16Pixel_Per_Block_y;k++)
10116             {
10117                 *(u8Start_Each_Block + (k*2) ) = 255 - Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
10118             }
10119             u8Start_Each_Block += Max_Pixel_Per_Row;
10120         }
10121 
10122         //Skip U. V block for 422 format
10123         Psrc_ptr += 256;
10124         Pdst_ptr += 256;
10125         i-=4;
10126 
10127         if(i == 0)
10128         {
10129             //Already decoded all blocks
10130             continue;
10131         }
10132         else if(i < 0)
10133         {
10134             printf("GET BLOCK NUMBER ERROR!\n");
10135             JPEG_terminate( E_JPEG_DECODE_ERROR );
10136             return FALSE;
10137         }
10138 
10139         //Move y block position in a row
10140         u32_y_Blcok_Pos++;
10141         //===================GET Y2 BLOCKs=======================
10142         msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
10143 
10144         //Get start position of block
10145         u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
10146 
10147         //Write value to destination buffer
10148         for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
10149         {
10150             for(k=0;k<u16Pixel_Per_Block_y;k++)
10151             {
10152                 *(u8Start_Each_Block + (k*2) ) = 255 - Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
10153             }
10154             u8Start_Each_Block += Max_Pixel_Per_Row;
10155         }
10156 
10157         //Move idct data position
10158         Psrc_ptr += 64;
10159         Pdst_ptr += 64;
10160         i--;
10161 
10162         //Move y block position in a row, Reset position for U block
10163         u32_y_Blcok_Pos--;
10164         //===================GET U BLOCKs=======================
10165         msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
10166 
10167         //Get start position of block
10168         u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
10169 
10170         //Write value to destination buffer
10171         for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
10172         {
10173             for(k=0;k<u16Pixel_Per_Block_y;k++)
10174             {
10175                 *(u8Start_Each_Block + ((k*4) + 1) ) = 255 - Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
10176             }
10177             u8Start_Each_Block += Max_Pixel_Per_Row;
10178         }
10179 
10180         //Move idct data position
10181         Psrc_ptr += 64;
10182         Pdst_ptr += 64;
10183         i--;
10184 
10185         //===================GET V BLOCKs=======================
10186         msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
10187 
10188         //Get start position of block
10189         u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
10190 
10191         //Write value to destination buffer
10192         for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
10193         {
10194             for(k=0;k<u16Pixel_Per_Block_y;k++)
10195             {
10196                 *(u8Start_Each_Block + ((k*4) + 3) ) =  255 - Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
10197             }
10198             u8Start_Each_Block += Max_Pixel_Per_Row;
10199         }
10200 
10201         //Move idct data position
10202         Psrc_ptr += 128;
10203         Pdst_ptr += 128;
10204         i-=2;
10205 
10206         //Move y block position in a row, Reset position for U block
10207         u32_y_Blcok_Pos+=2;
10208 
10209     }
10210 
10211     u32_Decode_Line++;
10212     return TRUE;
10213 }
10214 
msAPI_JPEG_Idct_RGBConvert(void)10215 JPEG_STATIC MS_BOOL msAPI_JPEG_Idct_RGBConvert(void)
10216 {
10217     JPEG_BLOCK_TYPE *Psrc_ptr = pNJPEGContext->_ps16Block_seg[0];
10218     MS_U8 *Pdst_ptr = pNJPEGContext->gpu8Sample_buf;
10219     MS_U8 *u8Start_Each_Block, *u8Start_Each_Row;
10220     MS_U32 u32_y_Blcok_Pos = 0, Max_Pixel_Per_Row;
10221     MS_S32 i;
10222     MS_U8  u8Row_in_block, k;
10223     MS_U16 u16Pixel_Per_Block_x = 8, u16Pixel_Per_Block_y = 8;
10224     MS_U16 u16Pixel_Per_Pack_row = 16, u16TotalBlock_Per_Row, u16ScaleDownStep = 1 << pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum];
10225 
10226     u16TotalBlock_Per_Row = (pNJPEGContext->_u32Max_blocks_per_row[pNJPEGContext->eNJPDNum]*2)/3;
10227 
10228     u16Pixel_Per_Pack_row = u16Pixel_Per_Pack_row >> pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum];
10229     u16Pixel_Per_Block_x = u16Pixel_Per_Block_x/* >> _u8ScaleDownFactor[pNJPEGContext->eNJPDNum]*/;
10230     u16Pixel_Per_Block_y = u16Pixel_Per_Block_y >> pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum];
10231 
10232 
10233     Max_Pixel_Per_Row = (u16TotalBlock_Per_Row*u16Pixel_Per_Block_x >> pNJPEGContext->_u8ScaleDownFactor[pNJPEGContext->eNJPDNum]);
10234 
10235     //Get start position of each row
10236     u8Start_Each_Row = (u8Out_buf + (u32_Decode_Line*(Max_Pixel_Per_Row*u16Pixel_Per_Block_y)));
10237 
10238     for ( i = (MS_S32)pNJPEGContext->_u32Max_blocks_per_row[pNJPEGContext->eNJPDNum]; i > 0;)
10239     {
10240 
10241         //===================GET R BLOCKs========================
10242         msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
10243 
10244         //Get start position of block
10245         u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
10246 
10247         //Write value to destination buffer
10248         for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
10249         {
10250             for(k=0;k<u16Pixel_Per_Block_y;k++)
10251             {
10252                 *(u8Start_Each_Block + (k*2) ) = Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
10253             }
10254             u8Start_Each_Block += Max_Pixel_Per_Row;
10255         }
10256 
10257         //Skip U. V block for 422 format
10258         Psrc_ptr += 64;
10259         Pdst_ptr += 64;
10260         i--;
10261 
10262         //===================GET G BLOCKs=======================
10263         msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
10264 
10265         //Get start position of block
10266         u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
10267         //Write value to destination buffer
10268         for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
10269         {
10270             for(k=0;k<u16Pixel_Per_Block_y;k++)
10271             {
10272                 *(u8Start_Each_Block + ((k*4) + 1) ) = Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
10273             }
10274             u8Start_Each_Block += Max_Pixel_Per_Row;
10275         }
10276 
10277         //Move idct data position
10278         Psrc_ptr += 64;
10279         Pdst_ptr += 64;
10280         i--;
10281 
10282         //===================GET B BLOCKs=======================
10283         msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
10284 
10285         //Get start position of block
10286         u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
10287         //Write value to destination buffer
10288         for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
10289         {
10290             for(k=0;k<u16Pixel_Per_Block_y;k++)
10291             {
10292                 *(u8Start_Each_Block + ((k*4) + 3) ) =  Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
10293             }
10294             u8Start_Each_Block += Max_Pixel_Per_Row;
10295         }
10296 
10297         //Move idct data position
10298         Psrc_ptr += 64;
10299         Pdst_ptr += 64;
10300         i--;
10301 
10302         if(i == 0)
10303         {
10304             //Already decoded all blocks
10305             continue;
10306         }
10307         else if(i < 0)
10308         {
10309             printf("GET BLOCK NUMBER ERROR!\n");
10310             JPEG_terminate( E_JPEG_DECODE_ERROR );
10311             return FALSE;
10312         }
10313 
10314         //Move y block position in a row
10315         u32_y_Blcok_Pos++;
10316         //===================GET R BLOCKs=======================
10317         msAPI_JPEG_idct( Psrc_ptr, Pdst_ptr );
10318 
10319         //Get start position of block
10320         u8Start_Each_Block = u8Start_Each_Row + (u32_y_Blcok_Pos*u16Pixel_Per_Pack_row);
10321         //Write value to destination buffer
10322         for(u8Row_in_block=0;u8Row_in_block<u16Pixel_Per_Block_x;u8Row_in_block+=u16ScaleDownStep)
10323         {
10324             for(k=0;k<u16Pixel_Per_Block_y;k++)
10325             {
10326                 *(u8Start_Each_Block + (k*2) ) = Pdst_ptr[(u8Row_in_block*8)+(k*u16ScaleDownStep)];
10327             }
10328             u8Start_Each_Block += Max_Pixel_Per_Row;
10329         }
10330 
10331         //Move idct data position
10332         Psrc_ptr += 192;
10333         Pdst_ptr += 192;
10334         i-=3;
10335 
10336         //Move y block position in a row, Reset position for U block
10337         u32_y_Blcok_Pos++;
10338 
10339     }
10340 
10341     u32_Decode_Line++;
10342     return TRUE;
10343 }
10344 
10345 //------------------------------------------------------------------------------
10346 // Performs a 2D IDCT over the entire row's coefficient buffer.
msAPI_JPEG_transform_row(void)10347 JPEG_STATIC MS_BOOL msAPI_JPEG_transform_row( void )
10348 {
10349     JPEG_DEBUG_API_MSG("Max block : %td\n", (ptrdiff_t)pNJPEGContext->_u32Max_blocks_per_row[pNJPEGContext->eNJPDNum]);
10350 
10351     switch ( pNJPEGContext->gu8Scan_type[pNJPEGContext->eNJPDNum] )
10352     {
10353         case E_JPEG_CMYK:
10354             if(!msAPI_JPEG_Idct_CMYKConvert())
10355                 return FALSE;
10356             break;
10357         case E_JPEG_RGB:
10358             if(!msAPI_JPEG_Idct_RGBConvert())
10359                 return FALSE;
10360             break;
10361         default :
10362             JPEG_DEBUG_API_ERR("System don`t support this format!\n");
10363             JPEG_terminate( E_JPEG_UNSUPPORTED_SAMP_FACTORS );
10364             return FALSE;
10365             break;
10366     }
10367     return TRUE;
10368 
10369 }
10370 
msAPI_JPEG_Baseline_Decode(void)10371 JPEG_STATIC JPEG_Result msAPI_JPEG_Baseline_Decode(void)
10372 {
10373 
10374     if(pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum]==TRUE)
10375         return (E_JPEG_FAILED);
10376 
10377     if ( pNJPEGContext->_u16Total_lines_left[pNJPEGContext->eNJPDNum] == 0 )
10378     {
10379         return ( E_JPEG_OKAY );
10380     }
10381 
10382 #ifdef NJPD_LONGJUMP_SUPPORT
10383 if ( setjmp( _jmp_state ) )
10384     {
10385         return ( E_JPEG_FAILED );
10386     }
10387 #endif
10388 
10389     if( pNJPEGContext->_u16Total_lines_left[pNJPEGContext->eNJPDNum] > 0 )
10390     {
10391 
10392         if(!msAPI_JPEG_decode_next_row())
10393             return E_JPEG_FAILED;
10394 
10395         JPEG_DEBUG_API_MSG("Max line num : %d\n",(pNJPEGContext->_u16Total_lines_left[pNJPEGContext->eNJPDNum]));
10396 
10397         if(!msAPI_JPEG_transform_row()) //IDCT
10398             return E_JPEG_FAILED;
10399 
10400         pNJPEGContext->_u16Total_lines_left[pNJPEGContext->eNJPDNum] -= pNJPEGContext->gu8Max_mcu_y_size[pNJPEGContext->eNJPDNum];
10401     }
10402 
10403     return (E_JPEG_DONE);
10404 }
10405 #endif //SW_NJPD_RGB_CMYK
10406 
10407 
10408 
MApi_JPEG_DisableAddressConvert(void)10409 void MApi_JPEG_DisableAddressConvert(void)
10410 {
10411     _NJPEG_SHM_POINTER_CHECK();
10412     _USE_OJPD(MApi_JPEG_DisableAddressConvert);
10413     _NJPEG_EX_API_MutexLock(pNJPEGContext->eNJPDNum);
10414     // reset bForceNJPD2 to FALSE when MJPEG stop
10415     pNJPEGContext->bForceNJPD2 = FALSE;
10416 
10417     JPEG_DEBUG_API_MSG("%s\n", __FUNCTION__);
10418     pNJPEGContext->__bIsMjpeg[pNJPEGContext->eNJPDNum] = FALSE;
10419     pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] = FALSE;
10420     _NJPEG_EX_API_MutexUnlock(pNJPEGContext->eNJPDNum);
10421 }
10422 
10423 //------------------------------------------------------------------------------
10424 /********************************************************************/
10425 ///Get the free memory for temporary usage.
10426 ///@param size \b IN indicate the size of wanted free memory
10427 ///@return the physical address of free memory
10428 /********************************************************************/
_MApi_JPEG_GetFreeMemory(MS_U32 size)10429 MS_PHY _MApi_JPEG_GetFreeMemory(MS_U32 size)
10430 {
10431     _NJPEG_SHM_POINTER_CHECK_RETURN(0);
10432     _USE_OJPD(MApi_JPEG_GetFreeMemory, size);
10433     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
10434     {
10435         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
10436         return 0;
10437     }
10438 
10439     if(pNJPEGContext->_bProgressive_flag[pNJPEGContext->eNJPDNum] == TRUE)
10440     {
10441         return 0;
10442     }
10443 
10444     if(size > (INTERNAL_BUFFER_SIZE - JPEG_DEFAULT_EXIF_SIZE))
10445     {
10446         return 0;
10447     }
10448 
10449     INTERNAL_BUFFER_SIZE = INTERNAL_BUFFER_SIZE - size;
10450 
10451     return (pNJPEGContext->_u32InternalBufferAddr_PA[pNJPEGContext->eNJPDNum] + INTERNAL_BUFFER_SIZE);
10452 }
10453 
10454 //------------------------------------------------------------------------------
10455 /********************************************************************/
10456 ///Get the data offset of JPEG file.
10457 ///@return the data offset of JPEG file
10458 /********************************************************************/
_MApi_JPEG_GetDataOffset(void)10459 MS_U32 _MApi_JPEG_GetDataOffset(void)
10460 {
10461     _NJPEG_SHM_POINTER_CHECK_RETURN(0);
10462     _USE_OJPD(MApi_JPEG_GetDataOffset);
10463     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
10464     {
10465         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
10466         return 0;
10467     }
10468 
10469     if(pNJPEGContext->_bThumbnailAccessMode[pNJPEGContext->eNJPDNum])
10470     {
10471         JPEG_DEBUG_API_MSG("%s: Thumbnail mode!!\n", __FUNCTION__);
10472         return 0;
10473     }
10474 
10475     JPEG_DEBUG_API_MSG("%s : u32DataOffset[pNJPEGContext->eNJPDNum] =  0x%tx\n", __FUNCTION__ , (ptrdiff_t)pNJPEGContext->u32DataOffset[pNJPEGContext->eNJPDNum]);
10476     return pNJPEGContext->u32DataOffset[pNJPEGContext->eNJPDNum];
10477 }
10478 
10479 //------------------------------------------------------------------------------
10480 /********************************************************************/
10481 ///Get the sof marker offset of JPEG file.
10482 ///@return the sof marker offset of JPEG file
10483 /********************************************************************/
_MApi_JPEG_GetSOFOffset(void)10484 MS_U32 _MApi_JPEG_GetSOFOffset(void)
10485 {
10486     _NJPEG_SHM_POINTER_CHECK_RETURN(0);
10487     _USE_OJPD(MApi_JPEG_GetSOFOffset);
10488     if(pNJPEGContext->_bIsInit[pNJPEGContext->eNJPDNum] == FALSE)
10489     {
10490         JPEG_DEBUG_API_MSG("%s: NJPD have not init!!\n", __FUNCTION__);
10491         return 0;
10492     }
10493 
10494     if(pNJPEGContext->_bThumbnailAccessMode[pNJPEGContext->eNJPDNum])
10495     {
10496         JPEG_DEBUG_API_MSG("%s: Thumbnail mode!!\n", __FUNCTION__);
10497         return 0;
10498     }
10499 
10500     JPEG_DEBUG_API_MSG("%s : u32SOFOffset[pNJPEGContext->eNJPDNum] =  0x%tx\n", __FUNCTION__ , (ptrdiff_t)pNJPEGContext->u32SOFOffset[pNJPEGContext->eNJPDNum]);
10501     return pNJPEGContext->u32SOFOffset[pNJPEGContext->eNJPDNum];
10502 }
10503 
10504 // This function is only for MJPEG use only!!!!
_MApi_JPEG_SetNJPDInstance(MS_U8 JPDNum)10505 void _MApi_JPEG_SetNJPDInstance(MS_U8 JPDNum)
10506 {
10507     _JPEG_Init_Share_Mem();
10508     _NJPEG_SHM_POINTER_CHECK();
10509     if(pNJPEGContext->bOJPDOn || pNJPEGContext->bForceNJPD2)
10510     {
10511         JPEG_DEBUG_API_MSG("OJPD is in use, force NJPD to E_NJPD_NJPD2\n");
10512         pNJPEGContext->bForceNJPD2 = TRUE;
10513         JPDNum = E_NJPD_NJPD2;
10514     }
10515 
10516     if(JPDNum==E_NJPD_MJPEG_ON)
10517     {
10518         pNJPEGContext->__bIsMjpeg[E_NJPD_NJPD1] = TRUE;
10519         pNJPEGContext->__bIsMjpeg[E_NJPD_NJPD2] = TRUE;
10520         return;
10521     }
10522     if(JPDNum==E_NJPD_MJPEG_OFF)
10523     {
10524         pNJPEGContext->__bIsMjpeg[E_NJPD_NJPD1] = FALSE;
10525         pNJPEGContext->__bIsMjpeg[E_NJPD_NJPD2] = FALSE;
10526         return;
10527     }
10528 
10529     if(JPDNum >= E_NJPD_NJPD_TOTAL)
10530     {
10531         JPEG_DEBUG_API_ERR("Error!!!! input parameter of JPDNum out of range!!!!\n");
10532         JPDNum %= E_NJPD_NJPD_TOTAL;
10533     }
10534     pNJPEGContext->eNJPDNum = (JPD_Number)JPDNum;
10535     MDrv_NJPD_SetNJPDInstance(pNJPEGContext->eNJPDNum);
10536 }
10537 
10538 
10539 //------------------------------------------------------------------------------
10540 /********************************************************************/
10541 ///Enable/Disable NJPD CMYK support.
10542 ///@param bEnable \b IN enable/disable supporting NJPD CMYK
10543 ///@return E_JPEG_OKAY/E_JPEG_FAILED
10544 ///Note: It need to be called before init. The default is NJPD CMYK support.
10545 /********************************************************************/
_MApi_JPEG_SupportCMYK(MS_BOOL bEnable)10546 JPEG_Result _MApi_JPEG_SupportCMYK(MS_BOOL bEnable)
10547 {
10548     _JPEG_Init_Share_Mem();
10549     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
10550     _USE_OJPD(MApi_JPEG_SupportCMYK, bEnable);
10551 #if SW_NJPD_RGB_CMYK
10552     pNJPEGContext->bEnableCMYK = bEnable;
10553     return E_JPEG_OKAY;
10554 #else
10555     JPEG_DEBUG_API_MSG("Not Support CMYK formant!!!\n");
10556     UNUSED(bEnable);
10557     return E_JPEG_FAILED;
10558 #endif
10559 }
10560 
10561 //------------------------------------------------------------------------------
10562 /********************************************************************/
10563 ///Enable/Disable NJPD RGB support.
10564 ///@param bEnable \b IN enable/disable supporting NJPD RGB
10565 ///@return E_JPEG_OKAY/E_JPEG_FAILED
10566 ///Note: It need to be called before init. The default is NJPD RGB support.
10567 /********************************************************************/
_MApi_JPEG_SupportRGB(MS_BOOL bEnable)10568 JPEG_Result _MApi_JPEG_SupportRGB(MS_BOOL bEnable)
10569 {
10570     _JPEG_Init_Share_Mem();
10571     _NJPEG_SHM_POINTER_CHECK_RETURN(E_JPEG_FAILED);
10572     _USE_OJPD(MApi_JPEG_SupportRGB, bEnable);
10573 #if SW_NJPD_RGB_CMYK
10574     pNJPEGContext->bEnableRGB = bEnable;
10575     return E_JPEG_OKAY;
10576 #else
10577     JPEG_DEBUG_API_MSG("Not Support RGB formant!!!\n");
10578     UNUSED(bEnable);
10579     return E_JPEG_FAILED;
10580 #endif
10581 }
10582 
10583 
10584 #if SUPPORT_MPO_FORMAT
_MApi_JPEG_IsMPOFormat(void)10585 MS_BOOL _MApi_JPEG_IsMPOFormat( void )
10586 {
10587     _NJPEG_SHM_POINTER_CHECK_RETURN(0);
10588     _USE_OJPD(MApi_JPEG_IsMPOFormat);
10589     JPEG_DEBUG_API_MSG("MApi_JPEG_IsMPOFormat=%d\n", pNJPEGContext->bIsMPOFormat[pNJPEGContext->eNJPDNum]);
10590     return pNJPEGContext->bIsMPOFormat[pNJPEGContext->eNJPDNum];
10591 }
10592 
_MApi_JPEG_GetMPOIndex(JPEG_MPO_INDEX_INFO * pMPOIndex)10593 MS_BOOL _MApi_JPEG_GetMPOIndex(JPEG_MPO_INDEX_INFO *pMPOIndex)
10594 {
10595     _NJPEG_SHM_POINTER_CHECK_RETURN(0);
10596     _USE_OJPD(MApi_JPEG_GetMPOIndex, pMPOIndex);
10597     if(pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].num_of_image == 0xFFFFFFFFUL)
10598     {
10599         JPEG_DEBUG_API_MSG("No MPO Index\n");
10600         return FALSE;
10601     }
10602     JPEG_memcpy((void *)pMPOIndex, (void *)&pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum], sizeof( JPEG_MPO_INDEX_INFO ) );
10603     return TRUE;
10604 }
10605 
_MApi_JPEG_GetMPOAttr(MS_U32 image_no,JPEG_MPO_ATTRIBUTE_INFO * pMPOAttr)10606 MS_BOOL _MApi_JPEG_GetMPOAttr(MS_U32 image_no, JPEG_MPO_ATTRIBUTE_INFO *pMPOAttr)
10607 {
10608     _NJPEG_SHM_POINTER_CHECK_RETURN(0);
10609     _USE_OJPD(MApi_JPEG_GetMPOAttr, image_no, pMPOAttr);
10610     if((JPEG_MPO_MAX_SUPPORT_IMAGE < image_no)
10611     || (FALSE == pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_no - 1].used))
10612     {
10613         JPEG_DEBUG_API_MSG("No MPO Attribute with image no. %td\n", (ptrdiff_t)image_no);
10614         return FALSE;
10615     }
10616     JPEG_memcpy((void *)pMPOAttr, (void *)&pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][image_no - 1], sizeof( JPEG_MPO_ATTRIBUTE_INFO ) );
10617     return TRUE;
10618 }
10619 
_MApi_JPEG_DumpMPO(void)10620 void _MApi_JPEG_DumpMPO(void)
10621 {
10622     _NJPEG_SHM_POINTER_CHECK();
10623     _USE_OJPD(MApi_JPEG_DumpMPO);
10624     MS_U32 i = 0;
10625 
10626     if(pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].num_of_image == 0xFFFFFFFFUL)
10627     {
10628         JPEG_DEBUG_API_MSG("No MPO Index\n");
10629         return;
10630     }
10631 
10632     JPEG_DEBUG_API_MSG("start_of_offset = %td, num_of_image = %td\n", (ptrdiff_t)pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].start_of_offset, (ptrdiff_t)pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].num_of_image);
10633     for(i = 0; i<JPEG_MPO_MAX_SUPPORT_IMAGE; i++)
10634     {
10635         JPEG_DEBUG_API_MSG("mp_entry[%td]:attribute = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].mp_entry[i].attribute);
10636         JPEG_DEBUG_API_MSG("mp_entry[%td]:size = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].mp_entry[i].size);
10637         JPEG_DEBUG_API_MSG("mp_entry[%td]:offset = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].mp_entry[i].offset);
10638         JPEG_DEBUG_API_MSG("mp_entry[%td]:image1_no = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].mp_entry[i].image1_no);
10639         JPEG_DEBUG_API_MSG("mp_entry[%td]:image2_no = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOIndex[pNJPEGContext->eNJPDNum].mp_entry[i].image2_no);
10640 
10641         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:MPIndividualNum = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].MPIndividualNum);
10642         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:PanOrientation = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].PanOrientation);
10643         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:PanOverlap_H.numerator = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].PanOverlap_H.numerator);
10644         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:PanOverlap_H.denominator = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].PanOverlap_H.denominator);
10645         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:PanOverlap_V.numerator = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].PanOverlap_V.numerator);
10646         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:PanOverlap_V.denominator = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].PanOverlap_V.denominator);
10647         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:BaseViewpointNum = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].BaseViewpointNum);
10648         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:ConvergenceAngle.s_numerator = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].ConvergenceAngle.s_numerator);
10649         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:ConvergenceAngle.s_denominator = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].ConvergenceAngle.s_denominator);
10650         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:BaselineLength.numerator = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].BaselineLength.numerator);
10651         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:BaselineLength.denominator = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].BaselineLength.denominator);
10652         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:VerticalDivergence.s_numerator = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].VerticalDivergence.s_numerator);
10653         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:VerticalDivergence.s_denominator = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].VerticalDivergence.s_denominator);
10654         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:AxisDistance_X.s_numerator = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].AxisDistance_X.s_numerator);
10655         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:AxisDistance_X.s_denominator = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].AxisDistance_X.s_denominator);
10656         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:AxisDistance_Y.s_numerator = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].AxisDistance_Y.s_numerator);
10657         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:AxisDistance_Y.s_denominator = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].AxisDistance_Y.s_denominator);
10658         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:AxisDistance_Z.s_numerator = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].AxisDistance_Z.s_numerator);
10659         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:AxisDistance_Z.s_denominator = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].AxisDistance_Z.s_denominator);
10660         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:YawAngle.s_numerator = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].YawAngle.s_numerator);
10661         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:YawAngle.s_denominator = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].YawAngle.s_denominator);
10662         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:PitchAngle.s_numerator = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].PitchAngle.s_numerator);
10663         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:PitchAngle.s_denominator = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].PitchAngle.s_denominator);
10664         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:RollAngle.s_numerator = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].RollAngle.s_numerator);
10665         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:RollAngle.s_denominator = 0x%tx\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].RollAngle.s_denominator);
10666         JPEG_DEBUG_API_MSG("pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][%td]:used = 0x%td\n", (ptrdiff_t)i, (ptrdiff_t)pNJPEGContext->_stMPOAttri[pNJPEGContext->eNJPDNum][i].used);
10667     }
10668     return;
10669 }
10670 
_MApi_JPEG_SetMPOBuffer(MS_U32 read_offset,MS_U32 output_start)10671 MS_BOOL _MApi_JPEG_SetMPOBuffer(MS_U32 read_offset, MS_U32 output_start)
10672 {
10673     _NJPEG_SHM_POINTER_CHECK_RETURN(0);
10674     _USE_OJPD(MApi_JPEG_SetMPOBuffer, read_offset, output_start);
10675     read_offset = MS_PA2KSEG1((MS_U32)read_offset);// | AEON_NON_CACHE_MASK;
10676     output_start = MS_PA2KSEG1((MS_U32)output_start);// | AEON_NON_CACHE_MASK;
10677 
10678     if((read_offset < MRC_BUFFER_ADDR)
10679     || (read_offset > (MRC_BUFFER_ADDR + MRC_BUFFER_SIZE)))
10680     {
10681         JPEG_DEBUG_API_MSG("JPEG_SetMPOBuffer, read_offset invalid\n");
10682         return FALSE;
10683     }
10684 
10685     if(read_offset > (MRC_BUFFER_ADDR + MRC_BUFFER_SIZE/2))
10686     {
10687         pNJPEGContext->mpo_load_data[pNJPEGContext->eNJPDNum] = FALSE;
10688     }
10689 
10690 #ifndef MSOS_TYPE_LINUX_KERNEL
10691     if(output_start < MWC_BUFFER_ADDR)
10692     {
10693         JPEG_DEBUG_API_MSG("JPEG_SetMPOBuffer, output_start invalid\n");
10694         return FALSE;
10695     }
10696 #endif
10697 
10698     pNJPEGContext->_pu8In_buf_MPO_ofs[pNJPEGContext->eNJPDNum] = (MS_U8*)(MS_VIRT)read_offset;
10699     pNJPEGContext->_u32In_buf_MPO_left[pNJPEGContext->eNJPDNum] = (MRC_BUFFER_ADDR + MRC_BUFFER_SIZE) - read_offset;
10700     JPEG_DEBUG_API_MSG("After MApi_JPEG_SetMPOBuffer(), _pu8In_buf_MPO_ofs[pNJPEGContext->eNJPDNum]=0x%tx, _u32In_buf_MPO_left[pNJPEGContext->eNJPDNum]=0x%tx=============\n", (ptrdiff_t)pNJPEGContext->_pu8In_buf_MPO_ofs[pNJPEGContext->eNJPDNum], (ptrdiff_t)pNJPEGContext->_u32In_buf_MPO_left[pNJPEGContext->eNJPDNum]);
10701 #ifndef MSOS_TYPE_LINUX_KERNEL
10702     MWC_BUFFER_ADDR = output_start;
10703 #endif
10704     return TRUE;
10705 }
10706 
10707 /********************************************************************/
10708 /// Set Max decoding resolution for MPO
10709 ///@param -u16Width \b IN : indicate max decoding width
10710 ///@param -u16Height \b IN : indicate max decoding height
10711 ///@return None
10712 /********************************************************************/
_MApi_JPEG_SetMPOMaxDecodeResolution(MS_U16 u16Width,MS_U16 u16Height)10713 void _MApi_JPEG_SetMPOMaxDecodeResolution(MS_U16 u16Width, MS_U16 u16Height)
10714 {
10715     _JPEG_Init_Share_Mem();
10716     _NJPEG_SHM_POINTER_CHECK();
10717     _USE_OJPD(MApi_JPEG_SetMPOMaxDecodeResolution, u16Width, u16Height);
10718     JPEG_DEBUG_API_MSG("%s: Width = %d, Height = %d\n", __FUNCTION__, u16Width, u16Height);
10719     pNJPEGContext->JPEG_MPO_MAX_WIDTH[pNJPEGContext->eNJPDNum] = u16Width;
10720     pNJPEGContext->JPEG_MPO_MAX_HEIGHT[pNJPEGContext->eNJPDNum] = u16Height;
10721     return;
10722 }
10723 //------------------------------------------------------------------------------
10724 /********************************************************************/
10725 /// Set Max decoding resolution of Progressive MPO
10726 ///@param -u16ProWidth \b IN : indicate max decoding width
10727 ///@param -u16ProHeight \b IN : indicate max decoding height
10728 ///@return None
10729 /********************************************************************/
_MApi_JPEG_SetMPOProMaxDecodeResolution(MS_U16 u16ProWidth,MS_U16 u16ProHeight)10730 void _MApi_JPEG_SetMPOProMaxDecodeResolution(MS_U16 u16ProWidth, MS_U16 u16ProHeight)
10731 {
10732     _JPEG_Init_Share_Mem();
10733     _NJPEG_SHM_POINTER_CHECK();
10734     _USE_OJPD(MApi_JPEG_SetMPOProMaxDecodeResolution, u16ProWidth, u16ProHeight);
10735     JPEG_DEBUG_API_MSG("%s: ProWidth = %d, ProHeight = %d\n", __FUNCTION__, u16ProWidth, u16ProHeight);
10736     pNJPEGContext->JPEG_MPO_PRO_MAX_WIDTH[pNJPEGContext->eNJPDNum] = u16ProWidth;
10737     pNJPEGContext->JPEG_MPO_PRO_MAX_HEIGHT[pNJPEGContext->eNJPDNum] = u16ProHeight;
10738     return;
10739 }
10740 
10741 #endif
10742 
10743 #ifdef VDEC_UTOPIA_2K
MApi_JPEG_GetEvent(JPEG_CB_EVENT_PARAM * CbEventParam)10744 JPEG_Result MApi_JPEG_GetEvent(JPEG_CB_EVENT_PARAM* CbEventParam)//user
10745 {
10746     if(pInstantNJPD==NULL)
10747     {
10748         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10749         return E_JPEG_FAILED;
10750     }
10751 
10752     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetCbEvent, (void*)(CbEventParam)) != UTOPIA_STATUS_SUCCESS)
10753     {
10754         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10755         return E_JPEG_FAILED;
10756     }
10757     return E_JPEG_OKAY;
10758 }
10759 
MApi_JPEG_SetEvent(JPEG_CB_EVENT_PARAM * CbEventParam)10760 JPEG_Result MApi_JPEG_SetEvent(JPEG_CB_EVENT_PARAM* CbEventParam)//user
10761 {
10762     if(pInstantNJPD==NULL)
10763     {
10764         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10765         return E_JPEG_FAILED;
10766     }
10767 
10768     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_SetCbEvent, (void*)(CbEventParam)) != UTOPIA_STATUS_SUCCESS)
10769     {
10770         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
10771         return E_JPEG_FAILED;
10772     }
10773     return E_JPEG_OKAY;
10774 }
10775 #endif
10776 
_MApi_JPEG_GetEvent(JPEG_CB_EVENT_PARAM * CbEventParam)10777 JPEG_Result _MApi_JPEG_GetEvent(JPEG_CB_EVENT_PARAM* CbEventParam)//kernel
10778 {
10779 #ifndef MSOS_TYPE_LINUX_KERNEL
10780     UNUSED(CbEventParam);
10781     return E_JPEG_FAILED;
10782 #else
10783     if(CbEventParam->type == JPEG_CB_EVENT_FILL_HDR)
10784     {
10785         if(s32FillHdrIdx!=-1)
10786         {
10787             CbEventParam->param = s32FillHdrIdx;
10788             CbEventParam->BufAddr = FillHdrPhyAddr[CbEventParam->param];
10789             CbEventParam->BufLength = u32FillHdrLength[CbEventParam->param];
10790         }
10791         else
10792         {
10793             CbEventParam->param = -1;
10794             CbEventParam->BufAddr = 0;
10795             CbEventParam->BufLength = 0;
10796         }
10797     }
10798     else if(CbEventParam->type == JPEG_CB_EVENT_ISR)
10799     {
10800         CbEventParam->param = JPEG_Get_ISR();
10801     }
10802     return E_JPEG_OKAY;
10803 #endif
10804 }
10805 
_MApi_JPEG_SetEvent(JPEG_CB_EVENT_PARAM * CbEventParam)10806 JPEG_Result _MApi_JPEG_SetEvent(JPEG_CB_EVENT_PARAM* CbEventParam)//kernel
10807 {
10808 #ifndef MSOS_TYPE_LINUX_KERNEL
10809     UNUSED(CbEventParam);
10810     return E_JPEG_FAILED;
10811 #else
10812     if(CbEventParam->type == JPEG_CB_EVENT_FILL_HDR)
10813     {
10814         if(s32FillHdrIdx!=-1)
10815         {
10816             s32FillHdrIdx = -1;
10817             s32FillHdrRes = CbEventParam->param;
10818         }
10819     }
10820     else if(CbEventParam->type == JPEG_CB_EVENT_ISR)
10821     {
10822         JPEG_Set_ISR(FALSE);
10823     }
10824     return E_JPEG_OKAY;
10825 #endif
10826 }
10827 
10828 #ifdef VDEC_UTOPIA_2K
_MApi_JPEG_Callback_Proc(void)10829 void _MApi_JPEG_Callback_Proc(void)//user space
10830 {
10831     while(bJpegCallbackTaskRunning)
10832     {
10833         JPEG_CB_EVENT_PARAM CbEventParam;
10834 
10835 //////////////////////////////////////////////////////////////////////////
10836 // polling fill_header, for feeding data use
10837         memset(&CbEventParam,0,sizeof(JPEG_CB_EVENT_PARAM));
10838         CbEventParam.type = JPEG_CB_EVENT_FILL_HDR;
10839         MApi_JPEG_GetEvent(&CbEventParam);
10840 
10841         if(CbEventParam.param != -1)//get event
10842         {
10843             //invoke callback
10844             if(gNJPEGContext._pFillHdrFunc[CbEventParam.param])
10845                 CbEventParam.param = gNJPEGContext._pFillHdrFunc[CbEventParam.param](CbEventParam.BufAddr, CbEventParam.BufLength);
10846             MApi_JPEG_SetEvent(&CbEventParam);
10847         }
10848 
10849 //////////////////////////////////////////////////////////////////////////
10850 // IsrCb, for ISR use (independent with fill header function)
10851         memset(&CbEventParam,0,sizeof(JPEG_CB_EVENT_PARAM));
10852         CbEventParam.type = JPEG_CB_EVENT_ISR;
10853         MApi_JPEG_GetEvent(&CbEventParam);
10854 
10855         if(CbEventParam.param > 0 && gIsrCB)
10856         {
10857             //invoke callback
10858             gIsrCB();
10859             MApi_JPEG_SetEvent(FALSE);
10860         }
10861 //////////////////////////////////////////////////////////////////////////
10862 
10863         MsOS_DelayTask(10);
10864     }
10865 }
10866 
10867 
10868 
_MApi_JPEG_Create_Callback_task(void)10869 MS_BOOL _MApi_JPEG_Create_Callback_task(void)
10870 {
10871     // Create callback task in user space
10872     UTOPIA_20_DBG("_MApi_JPEG_Create_Callback_task\n");
10873 
10874     bJpegCallbackTaskRunning = TRUE;
10875     if(_s32JPEG_Callback_TaskId == -1)
10876     {
10877         MS_U32 u32Id = 0;
10878         _s32JPEG_Callback_TaskId = MsOS_CreateTask((TaskEntry)_MApi_JPEG_Callback_Proc,
10879                                               u32Id,
10880                                               E_TASK_PRI_MEDIUM,
10881                                               TRUE,
10882                                               (void*)u8JpegCallbackStack,
10883                                               JPEG_STACK_SIZE,
10884                                               "JPEG_Callback");
10885 
10886         if (_s32JPEG_Callback_TaskId < 0)
10887         {
10888             return FALSE;
10889         }
10890     }
10891     return TRUE;
10892 }
10893 
_MApi_JPEG_Delete_Callback_Task(void)10894 void _MApi_JPEG_Delete_Callback_Task(void)
10895 {
10896     if(_s32JPEG_Callback_TaskId != -1 )
10897     {
10898         bJpegCallbackTaskRunning = FALSE;
10899         MsOS_DeleteTask(_s32JPEG_Callback_TaskId);
10900         _s32JPEG_Callback_TaskId = -1;
10901     }
10902 }
10903 #endif
10904 
10905 
_MApi_JPEG_SetVerificationMode(NJPEG_VerificationMode VerificationMode)10906 void _MApi_JPEG_SetVerificationMode(NJPEG_VerificationMode VerificationMode)
10907 {
10908     _JPEG_Init_Share_Mem();
10909     _NJPEG_SHM_POINTER_CHECK();
10910     MDrv_NJPD_SetVerificationMode((NJPD_VerificationMode)VerificationMode);
10911 }
_MApi_JPEG_GetVerificationMode(void)10912 NJPEG_VerificationMode _MApi_JPEG_GetVerificationMode(void)
10913 {
10914     return (NJPEG_VerificationMode)MDrv_NJPD_GetVerificationMode();
10915 }
10916 
_MApi_NJPD_Debug(void)10917 void _MApi_NJPD_Debug(void)
10918 {
10919     MDrv_NJPD_Debug();
10920 
10921 }
10922 
10923 #else
10924 
10925 JPEG_STATIC JPEG_FillHdrFunc _pFillHdrFunc[E_NJPD_NJPD_TOTAL];
10926 JPEG_STATIC JPD_Number eNJPDNum = E_NJPD_NJPD1;
10927 static MS_BOOL bOJPDOn = FALSE;
10928 
10929 #ifdef VDEC_UTOPIA_2K
10930 #ifndef JPEG_STACK_SIZE
10931 #define JPEG_STACK_SIZE 4096
10932 #endif
10933 MS_S32 _s32JPEG_Callback_TaskId = -1;
10934 MS_U8   u8JpegCallbackStack[JPEG_STACK_SIZE];
10935 MS_BOOL bJpegCallbackTaskRunning = FALSE;
10936 
10937 JPEG_IsrFuncCb gIsrCB;
10938 
10939 MS_BOOL _MApi_JPEG_Create_Callback_task(void);
10940 MS_BOOL _MApi_JPEG_Delete_Callback_task(void);
10941 void _MApi_JPEG_Callback_Proc(void);
10942 #endif
10943 
10944 #ifdef MSOS_TYPE_LINUX_KERNEL
10945 MS_S32 s32FillHdrIdx = -1;
10946 MS_S32 s32FillHdrRes = 0;
10947 MS_PHY FillHdrPhyAddr[E_NJPD_NJPD_TOTAL];
10948 MS_U32 u32FillHdrLength[E_NJPD_NJPD_TOTAL];
10949 MS_BOOL JPEG_Get_ISR(void);
10950 void JPEG_Set_ISR(MS_BOOL val);
JPEG_FillHdrFunc_KernlDummy(MS_PHY BufAddr,MS_U32 BufLength)10951 MS_S32 JPEG_FillHdrFunc_KernlDummy(MS_PHY BufAddr, MS_U32 BufLength)
10952 {
10953     return 0;
10954 }
10955 #endif
10956 
JPEG_FillHeaderFunction(MS_PHY mFillHdrPhyAddr,MS_U32 mu32FillHdrLength)10957 MS_U32 JPEG_FillHeaderFunction(MS_PHY mFillHdrPhyAddr,MS_U32 mu32FillHdrLength)//kernel
10958 {
10959 #ifdef MSOS_TYPE_LINUX_KERNEL
10960     FillHdrPhyAddr[eNJPDNum] = mFillHdrPhyAddr;
10961     u32FillHdrLength[eNJPDNum] = mu32FillHdrLength;
10962     s32FillHdrIdx = eNJPDNum;
10963     int timeout = 1000;
10964     while(s32FillHdrIdx != -1)
10965     {
10966         timeout--;
10967         MsOS_DelayTask(1);
10968         if(timeout<=0)
10969         {
10970             return -1;
10971         }
10972     }
10973     return s32FillHdrRes;
10974 #else
10975     return _pFillHdrFunc[eNJPDNum](mFillHdrPhyAddr,mu32FillHdrLength);
10976 #endif
10977 }
10978 
10979 #ifdef MSOS_TYPE_LINUX_KERNEL
JPEG_Get_ISR()10980 MS_BOOL JPEG_Get_ISR()//kernel
10981 {
10982     return MDrv_NJPD_Get_ISR();
10983 }
10984 
JPEG_Set_ISR(MS_BOOL val)10985 void JPEG_Set_ISR(MS_BOOL val)
10986 {
10987     MDrv_NJPD_Set_ISR(val);
10988 }
10989 #endif
10990 
10991 JPEG_STATIC MS_U8 _u8JPEG_ApiDbgLevel = E_JPEG_DEBUG_NONE;
10992 
10993 
10994 #ifdef VDEC_UTOPIA_2K
MApi_JPEG_GetEvent(JPEG_CB_EVENT_PARAM * CbEventParam)10995 JPEG_Result MApi_JPEG_GetEvent(JPEG_CB_EVENT_PARAM* CbEventParam)//user
10996 {
10997     if(pInstantNJPD==NULL)
10998     {
10999         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11000         return E_JPEG_FAILED;
11001     }
11002 
11003     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetCbEvent, (void*)(CbEventParam)) != UTOPIA_STATUS_SUCCESS)
11004     {
11005         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11006         return E_JPEG_FAILED;
11007     }
11008     return E_JPEG_OKAY;
11009 }
11010 
MApi_JPEG_SetEvent(JPEG_CB_EVENT_PARAM * CbEventParam)11011 JPEG_Result MApi_JPEG_SetEvent(JPEG_CB_EVENT_PARAM* CbEventParam)//user
11012 {
11013     if(pInstantNJPD==NULL)
11014     {
11015         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11016         return E_JPEG_FAILED;
11017     }
11018 
11019     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_SetCbEvent, (void*)(CbEventParam)) != UTOPIA_STATUS_SUCCESS)
11020     {
11021         JPEG_DEBUG_API_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11022         return E_JPEG_FAILED;
11023     }
11024     return E_JPEG_OKAY;
11025 }
11026 #endif
11027 
_MApi_JPEG_GetEvent(JPEG_CB_EVENT_PARAM * CbEventParam)11028 JPEG_Result _MApi_JPEG_GetEvent(JPEG_CB_EVENT_PARAM* CbEventParam)//kernel
11029 {
11030 #ifndef MSOS_TYPE_LINUX_KERNEL
11031     UNUSED(CbEventParam);
11032     return E_JPEG_FAILED;
11033 #else
11034     if(CbEventParam->type == JPEG_CB_EVENT_FILL_HDR)
11035     {
11036         if(s32FillHdrIdx!=-1)
11037         {
11038             CbEventParam->param = s32FillHdrIdx;
11039             CbEventParam->BufAddr = FillHdrPhyAddr[CbEventParam->param];
11040             CbEventParam->BufLength = u32FillHdrLength[CbEventParam->param];
11041         }
11042         else
11043         {
11044             CbEventParam->param = -1;
11045             CbEventParam->BufAddr = 0;
11046             CbEventParam->BufLength = 0;
11047         }
11048     }
11049     else if(CbEventParam->type == JPEG_CB_EVENT_ISR)
11050     {
11051         CbEventParam->param = JPEG_Get_ISR();
11052     }
11053     return E_JPEG_OKAY;
11054 #endif
11055 }
11056 
_MApi_JPEG_SetEvent(JPEG_CB_EVENT_PARAM * CbEventParam)11057 JPEG_Result _MApi_JPEG_SetEvent(JPEG_CB_EVENT_PARAM* CbEventParam)//kernel
11058 {
11059 #ifndef MSOS_TYPE_LINUX_KERNEL
11060     UNUSED(CbEventParam);
11061     return E_JPEG_FAILED;
11062 #else
11063     if(CbEventParam->type == JPEG_CB_EVENT_FILL_HDR)
11064     {
11065         if(s32FillHdrIdx!=-1)
11066         {
11067             s32FillHdrIdx = -1;
11068             s32FillHdrRes = CbEventParam->param;
11069         }
11070     }
11071     else if(CbEventParam->type == JPEG_CB_EVENT_ISR)
11072     {
11073         JPEG_Set_ISR(FALSE);
11074     }
11075     return E_JPEG_OKAY;
11076 #endif
11077 }
11078 
11079 #ifdef VDEC_UTOPIA_2K
_MApi_JPEG_Callback_Proc(void)11080 void _MApi_JPEG_Callback_Proc(void)//user space
11081 {
11082     while(bJpegCallbackTaskRunning)
11083     {
11084         JPEG_CB_EVENT_PARAM CbEventParam;
11085 
11086 //////////////////////////////////////////////////////////////////////////
11087 // polling fill_header, for feeding data use
11088         memset(&CbEventParam,0,sizeof(JPEG_CB_EVENT_PARAM));
11089         CbEventParam.type = JPEG_CB_EVENT_FILL_HDR;
11090         MApi_JPEG_GetEvent(&CbEventParam);
11091 
11092         if(CbEventParam.param != -1)//get event
11093         {
11094             //invoke callback
11095             if(_pFillHdrFunc[CbEventParam.param])
11096                 CbEventParam.param = _pFillHdrFunc[CbEventParam.param](CbEventParam.BufAddr, CbEventParam.BufLength);
11097             MApi_JPEG_SetEvent(&CbEventParam);
11098         }
11099 
11100 //////////////////////////////////////////////////////////////////////////
11101 // IsrCb, for ISR use (independent with fill header function)
11102         memset(&CbEventParam,0,sizeof(JPEG_CB_EVENT_PARAM));
11103         CbEventParam.type = JPEG_CB_EVENT_ISR;
11104         MApi_JPEG_GetEvent(&CbEventParam);
11105 
11106         if(CbEventParam.param > 0)
11107         {
11108             //invoke callback
11109             gIsrCB();
11110             MApi_JPEG_SetEvent(FALSE);
11111         }
11112 //////////////////////////////////////////////////////////////////////////
11113 
11114         MsOS_DelayTask(100);
11115     }
11116 }
11117 
11118 
11119 
_MApi_JPEG_Create_Callback_task(void)11120 MS_BOOL _MApi_JPEG_Create_Callback_task(void)
11121 {
11122     // Create callback task in user space
11123     JPEG_DEBUG_API_MSG("_MApi_JPEG_Create_Callback_task\n");
11124 
11125     bJpegCallbackTaskRunning = TRUE;
11126     if(_s32JPEG_Callback_TaskId == -1)
11127     {
11128         MS_U32 u32Id = 0;
11129         _s32JPEG_Callback_TaskId = MsOS_CreateTask((TaskEntry)_MApi_JPEG_Callback_Proc,
11130                                               u32Id,
11131                                               E_TASK_PRI_MEDIUM,
11132                                               TRUE,
11133                                               (void*)u8JpegCallbackStack,
11134                                               JPEG_STACK_SIZE,
11135                                               "MAPI_JPEG_Callback_Task");
11136 
11137         if (_s32JPEG_Callback_TaskId < 0)
11138         {
11139             return FALSE;
11140         }
11141     }
11142     return TRUE;
11143 }
11144 
_MApi_JPEG_Delete_Callback_Task(void)11145 void _MApi_JPEG_Delete_Callback_Task(void)
11146 {
11147     if(_s32JPEG_Callback_TaskId != -1 )
11148     {
11149         bJpegCallbackTaskRunning = FALSE;
11150         MsOS_DeleteTask(_s32JPEG_Callback_TaskId);
11151         _s32JPEG_Callback_TaskId = -1;
11152     }
11153 }
11154 #endif
11155 
11156 #if 1
_MApi_JPEG_Init(JPEG_InitParam * pInitParam)11157 JPEG_Result _MApi_JPEG_Init(JPEG_InitParam *pInitParam)
11158 {
11159     UNUSED(pInitParam);
11160     return E_JPEG_FAILED;
11161 }
_MApi_JPEG_DecodeHdr(void)11162 JPEG_Result _MApi_JPEG_DecodeHdr(void)
11163 {
11164     return E_JPEG_FAILED;
11165 }
_MApi_JPEG_Decode(void)11166 JPEG_Result _MApi_JPEG_Decode(void)
11167 {
11168     return E_JPEG_FAILED;
11169 }
_MApi_JPEG_Exit(void)11170 void _MApi_JPEG_Exit(void)
11171 {
11172     return;
11173 }
_MApi_JPEG_GetErrorCode(void)11174 JPEG_ErrCode _MApi_JPEG_GetErrorCode(void)
11175 {
11176     return E_JPEG_NO_ERROR;
11177 }
_MApi_JPEG_GetJPDEventFlag(void)11178 JPEG_Event _MApi_JPEG_GetJPDEventFlag(void)
11179 {
11180     return E_JPEG_EVENT_DEC_NONE;
11181 }
_MApi_JPEG_Rst(void)11182 void _MApi_JPEG_Rst(void)
11183 {
11184     return;
11185 }
11186 
_MApi_JPEG_GetCurVidx(void)11187 MS_U16 _MApi_JPEG_GetCurVidx(void)
11188 {
11189     return 0;
11190 }
_MApi_JPEG_GetWidth(void)11191 MS_U16 _MApi_JPEG_GetWidth(void)
11192 {
11193     return 0;
11194 }
_MApi_JPEG_GetHeight(void)11195 MS_U16 _MApi_JPEG_GetHeight(void)
11196 {
11197     return 0;
11198 }
11199 
_MApi_JPEG_SetMaxDecodeResolution(MS_U16 u16Width,MS_U16 u16Height)11200 void _MApi_JPEG_SetMaxDecodeResolution(MS_U16 u16Width, MS_U16 u16Height)
11201 {
11202     UNUSED(u16Width);
11203     UNUSED(u16Height);
11204     return;
11205 }
_MApi_JPEG_SetDbgLevel(MS_U8 u8DbgLevel)11206 void _MApi_JPEG_SetDbgLevel(MS_U8 u8DbgLevel)
11207 {
11208     UNUSED(u8DbgLevel);
11209     return;
11210 }
_MApi_JPEG_GetAlignedPitch(void)11211 MS_U16 _MApi_JPEG_GetAlignedPitch(void)
11212 {
11213     return 0;
11214 }
_MApi_JPEG_SetNJPDInstance(MS_U8 JPDNum)11215 void _MApi_JPEG_SetNJPDInstance(MS_U8 JPDNum)
11216 {
11217     UNUSED(JPDNum);
11218     return;
11219 }
11220 
11221 #endif
11222 #endif
11223 
_MApi_NJPD_JPDCount(void)11224 MS_U8 _MApi_NJPD_JPDCount(void)
11225 {
11226     return MDrv_NJPD_JPDCount();
11227 }
11228 
MApi_JPEG_IsNJPD(void)11229 MS_BOOL MApi_JPEG_IsNJPD(void)
11230 {
11231     return TRUE;
11232 }
11233 
11234 
11235 #ifdef CONFIG_UTOPIA_PROC_DBG_SUPPORT
_MApi_JPEG_GetMdbInfo(MS_U64 * u64ReqHdl)11236 void _MApi_JPEG_GetMdbInfo(MS_U64* u64ReqHdl)
11237 {
11238     MdbPrint(u64ReqHdl,"---------MStar NJPD Info---------\n\n");
11239     MdbPrint(u64ReqHdl,"Input buffer address PA               : 0x%lx\n", gNJPEGMDebug._u32ReadBufferAddr_PA);
11240     MdbPrint(u64ReqHdl,"Output buffer address PA              : 0x%lx\n", gNJPEGMDebug._u32WriteBufferAddr_PA);
11241     MdbPrint(u64ReqHdl,"Internal buffer address PA            : 0x%lx\n", gNJPEGMDebug._u32InternalBufferAddr_PA);
11242     MdbPrint(u64ReqHdl,"Input buffer address VA               : 0x%lx\n", gNJPEGMDebug._u32ReadBufferAddr);
11243 #ifndef MSOS_TYPE_LINUX_KERNEL
11244     MdbPrint(u64ReqHdl,"Output buffer address VA              : 0x%lx\n", gNJPEGMDebug._u32WriteBufferAddr);
11245 #endif
11246     MdbPrint(u64ReqHdl,"Internal buffer address VA            : 0x%lx\n", gNJPEGMDebug._u32InternalBufferAddr);
11247     MdbPrint(u64ReqHdl,"Input buffer size                     : 0x%lx\n", gNJPEGMDebug._u32ReadBufferSize);
11248     MdbPrint(u64ReqHdl,"Output buffer size                    : 0x%lx\n", gNJPEGMDebug._u32WriteBufferSize);
11249     MdbPrint(u64ReqHdl,"Internal buffer size                  : 0x%lx\n", gNJPEGMDebug._u32InternalBufferSize);
11250     MdbPrint(u64ReqHdl,"Picture resolution                    : %dx%d\n", gNJPEGMDebug._u16Image_x_size, gNJPEGMDebug._u16Image_y_size);
11251     if(gNJPEGMDebug._bProgressive_flag)
11252     {
11253         MdbPrint(u64ReqHdl,"JPEG format type                      : progressive\n");
11254     }
11255     else
11256     {
11257         MdbPrint(u64ReqHdl,"JPEG format type                      : baseline\n");
11258     }
11259     switch(gNJPEGMDebug.eJPEGColorFormat)
11260     {
11261         case E_JPEG_YUV444:
11262             MdbPrint(u64ReqHdl,"JPEG color format                     : YUV444\n");
11263             break;
11264         case E_JPEG_YUV422:
11265             MdbPrint(u64ReqHdl,"JPEG color format                     : YUV422\n");
11266             break;
11267         case E_JPEG_YUV420:
11268             MdbPrint(u64ReqHdl,"JPEG color format                     : YUV420\n");
11269             break;
11270         case E_JPEG_YUV411:
11271             MdbPrint(u64ReqHdl,"JPEG color format                     : YUV411\n");
11272             break;
11273         case E_JPEG_YUV440:
11274             MdbPrint(u64ReqHdl,"JPEG color format                     : YUV440\n");
11275             break;
11276         case E_JPEG_YUV400:
11277             MdbPrint(u64ReqHdl,"JPEG color format                     : YUV400\n");
11278             break;
11279         case E_JPEG_CMYK_FORMAT:
11280             MdbPrint(u64ReqHdl,"JPEG color format                     : CMYK\n");
11281             break;
11282         case E_JPEG_RGB_FORMAT:
11283             MdbPrint(u64ReqHdl,"JPEG color format                     : RGB\n");
11284             break;
11285         default:
11286             break;
11287     }
11288 
11289     MdbPrint(u64ReqHdl,"Scaling down factor                   : %d\n", gNJPEGMDebug._u8ScaleDownFactor);
11290     MdbPrint(u64ReqHdl,"HW decoding time                      : %dms\n", gNJPEGMDebug._u32HWEndTime - gNJPEGMDebug._u32HWStartTime);
11291     MdbPrint(u64ReqHdl,"JPEG error code                       : %d\n", gNJPEGMDebug._Error_code);
11292 }
11293 #endif
11294 
11295 //=====================================================================
11296 
MApi_JPEG_EnableOJPD(MS_BOOL bOnOff)11297 void MApi_JPEG_EnableOJPD(MS_BOOL bOnOff)
11298 {
11299 #if (JPEG_UTOPIA20)
11300     if (pInstantNJPD == NULL && bOnOff==TRUE)
11301     {
11302         UTOPIA_20_DBG("%s(): UtopiaOpen()\n", __FUNCTION__);
11303         if(UtopiaOpen(MODULE_NJPEG_EX | VDEC_DRIVER_BASE, &pInstantNJPD, 0, NULL) !=  UTOPIA_STATUS_SUCCESS)
11304         {
11305             UTOPIA_20_ERR("Open NJPD fail\n");
11306             return;
11307         }
11308     }
11309 
11310     if(pInstantNJPD==NULL)
11311     {
11312         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11313         //UtopiaClose(pInstantNJPD); //coverity [90015] var_deref_model: Passing null pointer "pInstantNJPD" to function "UtopiaClose(void *)", which dereferences it.
11314         return;
11315     }
11316 
11317     JPEG_BOOL_PARAM bPARA;
11318     bPARA.bValue = bOnOff;
11319     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_EnableOJPD\n");
11320     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_EnableOJPD, (void*)(&bPARA)) != UTOPIA_STATUS_SUCCESS)
11321     {
11322         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11323         UtopiaClose(pInstantNJPD);
11324         pInstantNJPD = NULL;
11325     }
11326     else if(bOnOff==FALSE)
11327     {
11328         UTOPIA_20_DBG("%s(): UtopiaClose()\n", __FUNCTION__);
11329         if(UtopiaClose(pInstantNJPD) != UTOPIA_STATUS_SUCCESS)
11330         {
11331             UTOPIA_20_ERR("Utopia Close NJPD failed\n");
11332             return;
11333         }
11334         pInstantNJPD = NULL;
11335     }
11336 #else
11337     _MApi_JPEG_EnableOJPD(bOnOff);
11338 #endif
11339 }
MApi_JPEG_Init_UsingOJPD(JPEG_InitParam * pInitParam)11340 JPEG_Result MApi_JPEG_Init_UsingOJPD(JPEG_InitParam *pInitParam)
11341 {
11342 #if (JPEG_UTOPIA20)
11343     if (pInstantNJPD == NULL)
11344     {
11345         UTOPIA_20_DBG("%s(): UtopiaOpen()\n", __FUNCTION__);
11346         if(UtopiaOpen(MODULE_NJPEG_EX | VDEC_DRIVER_BASE, &pInstantNJPD, 0, NULL) !=  UTOPIA_STATUS_SUCCESS)
11347         {
11348             UTOPIA_20_ERR("Open NJPD fail\n");
11349             return E_JPEG_FAILED;
11350         }
11351     }
11352 
11353     if(pInstantNJPD==NULL)
11354     {
11355         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11356         //UtopiaClose(pInstantNJPD);
11357         return E_JPEG_FAILED;
11358     }
11359 #ifdef VDEC_UTOPIA_2K
11360     gNJPEGContext._pFillHdrFunc[gNJPEGContext.eNJPDNum] = pInitParam->pFillHdrFunc;
11361     _MApi_JPEG_Create_Callback_task();
11362 #endif
11363 
11364 
11365     JPEG_INIT_PARAM InitPara;
11366     memset(&InitPara , 0 ,sizeof(JPEG_INIT_PARAM));
11367     InitPara.pInitParam = pInitParam;
11368     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_Init_UsingOJPD\n");
11369     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_Init_UsingOJPD, (void*)(&InitPara)) != UTOPIA_STATUS_SUCCESS)
11370     {
11371         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11372         UtopiaClose(pInstantNJPD);
11373         pInstantNJPD = NULL;
11374         return E_JPEG_FAILED;
11375     }
11376     return InitPara.retVal;
11377 #else
11378     return _MApi_JPEG_Init_UsingOJPD(pInitParam);
11379 #endif
11380 }
11381 
msAPI_JPEG_get_APP0_info(MS_U8 * unit,MS_U16 * x,MS_U16 * y)11382 void msAPI_JPEG_get_APP0_info( MS_U8 *unit,MS_U16 *x, MS_U16 *y )
11383 {
11384 #if (JPEG_UTOPIA20)
11385     if(pInstantNJPD==NULL)
11386     {
11387         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11388         return;
11389     }
11390 
11391     JPEG_GETAPP0INFO_PARAM App0Info;
11392     memset(&App0Info , 0 ,sizeof(JPEG_GETAPP0INFO_PARAM));
11393     App0Info.unit= unit;
11394     App0Info.x= x;
11395     App0Info.y= y;
11396     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_get_APP0_info\n");
11397     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_get_APP0_info, (void*)(&App0Info)) != UTOPIA_STATUS_SUCCESS)
11398     {
11399         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11400     }
11401 #else
11402     _msAPI_JPEG_get_APP0_info(unit, x, y );
11403 #endif
11404 }
11405 
MApi_JPEG_Init(JPEG_InitParam * pInitParam)11406 JPEG_Result MApi_JPEG_Init(JPEG_InitParam *pInitParam)
11407 {
11408 #if (JPEG_UTOPIA20)
11409     if (pInstantNJPD == NULL)
11410     {
11411         UTOPIA_20_DBG("%s(): UtopiaOpen()\n", __FUNCTION__);
11412         if(UtopiaOpen(MODULE_NJPEG_EX | VDEC_DRIVER_BASE, &pInstantNJPD, 0, NULL) !=  UTOPIA_STATUS_SUCCESS)
11413         {
11414             UTOPIA_20_ERR("Open NJPD fail\n");
11415             return E_JPEG_FAILED;
11416         }
11417     }
11418 
11419     if(pInstantNJPD==NULL)
11420     {
11421         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11422         //UtopiaClose(pInstantNJPD);
11423         return E_JPEG_FAILED;
11424     }
11425 #ifdef VDEC_UTOPIA_2K
11426     // gNJPEGContext._pFillHdrFunc() in user space, create callback task in user space
11427     gNJPEGContext._pFillHdrFunc[gNJPEGContext.eNJPDNum] = pInitParam->pFillHdrFunc;
11428     _MApi_JPEG_Create_Callback_task();
11429 #endif
11430     JPEG_INIT_PARAM InitPara;
11431     memset(&InitPara , 0 ,sizeof(JPEG_INIT_PARAM));
11432     InitPara.pInitParam = pInitParam;
11433     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_Init\n");
11434     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_Init, (void*)(&InitPara)) != UTOPIA_STATUS_SUCCESS)
11435     {
11436         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11437         InitPara.retVal= E_JPEG_FAILED;
11438         UtopiaClose(pInstantNJPD);
11439         pInstantNJPD = NULL;
11440     }
11441     return InitPara.retVal;
11442 #else
11443     return _MApi_JPEG_Init(pInitParam);
11444 #endif
11445 }
11446 
MApi_JPEG_DecodeHdr(void)11447 JPEG_Result MApi_JPEG_DecodeHdr(void)
11448 {
11449 #if (JPEG_UTOPIA20)
11450     if(pInstantNJPD==NULL)
11451     {
11452         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11453         return E_JPEG_FAILED;
11454     }
11455 
11456     JPEG_RESULT_PARAM ResPara;
11457     memset(&ResPara , 0 ,sizeof(JPEG_RESULT_PARAM));
11458     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_DecodeHdr\n");
11459     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_DecodeHdr, (void*)(&ResPara)) != UTOPIA_STATUS_SUCCESS)
11460     {
11461         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11462         return E_JPEG_FAILED;
11463     }
11464     return ResPara.retVal;
11465 #else
11466     return _MApi_JPEG_DecodeHdr();
11467 #endif
11468 }
11469 
MApi_JPEG_Decode(void)11470 JPEG_Result MApi_JPEG_Decode(void)
11471 {
11472 #if (JPEG_UTOPIA20)
11473     if(pInstantNJPD==NULL)
11474     {
11475         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11476         return E_JPEG_FAILED;
11477     }
11478 
11479     JPEG_RESULT_PARAM ResPara;
11480     memset(&ResPara , 0 ,sizeof(JPEG_RESULT_PARAM));
11481     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_Decode\n");
11482     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_Decode, (void*)(&ResPara)) != UTOPIA_STATUS_SUCCESS)
11483     {
11484         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11485         return E_JPEG_FAILED;
11486     }
11487     return ResPara.retVal;
11488 #else
11489     return _MApi_JPEG_Decode();
11490 #endif
11491 }
11492 
MApi_JPEG_Exit(void)11493 void MApi_JPEG_Exit(void)
11494 {
11495 #if (JPEG_UTOPIA20)
11496     if(pInstantNJPD==NULL)
11497     {
11498         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11499         return;
11500     }
11501 #ifdef VDEC_UTOPIA_2K
11502     _MApi_JPEG_Delete_Callback_Task();
11503 #endif
11504     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_Exit\n");
11505     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_Exit, NULL) != UTOPIA_STATUS_SUCCESS)
11506     {
11507         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11508     }
11509     else
11510     {
11511         if(gNJPEGContext.bOJPDOn==FALSE)
11512         {
11513             UTOPIA_20_DBG("%s(): UtopiaClose()\n", __FUNCTION__);
11514             if(UtopiaClose(pInstantNJPD) != UTOPIA_STATUS_SUCCESS)
11515             {
11516                 UTOPIA_20_ERR("Utopia Close NJPD failed\n");
11517                 return;
11518             }
11519             pInstantNJPD = NULL;
11520         }
11521     }
11522 
11523 #else
11524     _MApi_JPEG_Exit();
11525 #endif
11526 }
11527 
MApi_JPEG_GetErrorCode(void)11528 JPEG_ErrCode MApi_JPEG_GetErrorCode(void)
11529 {
11530 #if (JPEG_UTOPIA20)
11531     if(pInstantNJPD==NULL)
11532     {
11533         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11534         return E_JPEG_NOT_INIT;
11535     }
11536 
11537     JPEG_GETERRORCODE_PARAM GetErrorCode;
11538     memset(&GetErrorCode , 0 ,sizeof(JPEG_GETERRORCODE_PARAM));
11539     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetErrorCode\n");
11540     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetErrorCode, (void*)(&GetErrorCode)) != UTOPIA_STATUS_SUCCESS)
11541     {
11542         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11543         return E_JPEG_NOT_INIT;
11544     }
11545     return GetErrorCode.ErrCode;
11546 #else
11547     return _MApi_JPEG_GetErrorCode();
11548 #endif
11549 }
11550 
MApi_JPEG_GetJPDEventFlag(void)11551 JPEG_Event MApi_JPEG_GetJPDEventFlag(void)
11552 {
11553 #if (JPEG_UTOPIA20)
11554     if(pInstantNJPD==NULL)
11555     {
11556         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11557         return 0;
11558     }
11559 
11560     JPEG_JPEGEVENT_PARAM JpegEvent;
11561     memset(&JpegEvent , 0 ,sizeof(JPEG_JPEGEVENT_PARAM));
11562     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetJPDEventFlag\n");
11563     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetJPDEventFlag, (void*)(&JpegEvent)) != UTOPIA_STATUS_SUCCESS)
11564     {
11565         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11566         return 0;
11567     }
11568     return JpegEvent.eEvtVal;
11569 #else
11570     return _MApi_JPEG_GetJPDEventFlag();
11571 #endif
11572 }
11573 
MApi_JPEG_SetJPDEventFlag(JPEG_Event eEvtVal)11574 void MApi_JPEG_SetJPDEventFlag(JPEG_Event eEvtVal)
11575 {
11576 #if (JPEG_UTOPIA20)
11577     if(pInstantNJPD==NULL)
11578     {
11579         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11580         return;
11581     }
11582 
11583     JPEG_JPEGEVENT_PARAM JpegEvent;
11584     memset(&JpegEvent , 0 ,sizeof(JPEG_JPEGEVENT_PARAM));
11585     JpegEvent.eEvtVal = eEvtVal;
11586     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetJPDEventFlag\n");
11587     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_SetJPDEventFlag, (void*)(&JpegEvent)) != UTOPIA_STATUS_SUCCESS)
11588     {
11589         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11590     }
11591 #else
11592     _MApi_JPEG_SetJPDEventFlag(eEvtVal);
11593 #endif
11594 }
11595 
MApi_JPEG_Rst(void)11596 void MApi_JPEG_Rst(void)
11597 {
11598 #if (JPEG_UTOPIA20)
11599     if(pInstantNJPD==NULL)
11600     {
11601         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11602         return;
11603     }
11604 
11605     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_Rst\n");
11606     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_Rst, NULL) != UTOPIA_STATUS_SUCCESS)
11607     {
11608         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11609     }
11610 #else
11611     _MApi_JPEG_Rst();
11612 #endif
11613 }
11614 
MApi_JPEG_PowerOn(void)11615 void MApi_JPEG_PowerOn(void)
11616 {
11617 #if (JPEG_UTOPIA20)
11618     if(pInstantNJPD==NULL)
11619     {
11620         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11621         return;
11622     }
11623 
11624     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_PowerOn\n");
11625     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_PowerOn, NULL) != UTOPIA_STATUS_SUCCESS)
11626     {
11627         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11628     }
11629 #else
11630     _MApi_JPEG_PowerOn();
11631 #endif
11632 }
11633 
MApi_JPEG_PowerOff(void)11634 void MApi_JPEG_PowerOff(void)
11635 {
11636 #if (JPEG_UTOPIA20)
11637     if(pInstantNJPD==NULL)
11638     {
11639         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11640         return;
11641     }
11642 
11643     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_PowerOff\n");
11644     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_PowerOff, NULL) != UTOPIA_STATUS_SUCCESS)
11645     {
11646         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11647     }
11648 #else
11649     _MApi_JPEG_PowerOff();
11650 #endif
11651 }
11652 
MApi_JPEG_GetCurVidx(void)11653 MS_U16 MApi_JPEG_GetCurVidx(void)
11654 {
11655 #if (JPEG_UTOPIA20)
11656     if(pInstantNJPD==NULL)
11657     {
11658         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11659         return 0;
11660     }
11661 
11662     JPEG_U16_PARAM U16PARA;
11663     memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
11664     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetCurVidx\n");
11665     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetCurVidx, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
11666     {
11667         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11668         return 0;
11669     }
11670     return U16PARA.u16Value;
11671 #else
11672     return _MApi_JPEG_GetCurVidx();
11673 #endif
11674 }
11675 
MApi_JPEG_IsProgressive(void)11676 MS_BOOL MApi_JPEG_IsProgressive(void)
11677 {
11678 #if (JPEG_UTOPIA20)
11679     if(pInstantNJPD==NULL)
11680     {
11681         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11682         return 0;
11683     }
11684 
11685     JPEG_BOOL_PARAM bPARA;
11686     memset(&bPARA , 0 ,sizeof(JPEG_BOOL_PARAM));
11687     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_IsProgressive\n");
11688     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_IsProgressive, (void*)(&bPARA)) != UTOPIA_STATUS_SUCCESS)
11689     {
11690         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11691         return 0;
11692     }
11693     return bPARA.bValue;
11694 #else
11695     return _MApi_JPEG_IsProgressive();
11696 #endif
11697 }
11698 
MApi_JPEG_ThumbnailFound(void)11699 MS_BOOL MApi_JPEG_ThumbnailFound(void)
11700 {
11701 #if (JPEG_UTOPIA20)
11702     if(pInstantNJPD==NULL)
11703     {
11704         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11705         return 0;
11706     }
11707 
11708     JPEG_BOOL_PARAM bPARA;
11709     memset(&bPARA , 0 ,sizeof(JPEG_BOOL_PARAM));
11710     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_ThumbnailFound\n");
11711     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_ThumbnailFound, (void*)(&bPARA)) != UTOPIA_STATUS_SUCCESS)
11712     {
11713         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11714         return 0;
11715     }
11716     return bPARA.bValue;
11717 #else
11718     return _MApi_JPEG_ThumbnailFound();
11719 #endif
11720 }
11721 
MApi_JPEG_GetWidth(void)11722 MS_U16 MApi_JPEG_GetWidth(void)
11723 {
11724 #if (JPEG_UTOPIA20)
11725     if(pInstantNJPD==NULL)
11726     {
11727         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11728         return 0;
11729     }
11730 
11731     JPEG_U16_PARAM U16PARA;
11732     memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
11733     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetWidth\n");
11734     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetWidth, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
11735     {
11736         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11737         return 0;
11738     }
11739     return U16PARA.u16Value;
11740 #else
11741     return _MApi_JPEG_GetWidth();
11742 #endif
11743 }
11744 
MApi_JPEG_GetHeight(void)11745 MS_U16 MApi_JPEG_GetHeight(void)
11746 {
11747 #if (JPEG_UTOPIA20)
11748     if(pInstantNJPD==NULL)
11749     {
11750         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11751         return 0;
11752     }
11753 
11754     JPEG_U16_PARAM U16PARA;
11755     memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
11756     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetHeight\n");
11757     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetHeight, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
11758     {
11759         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11760         return 0;
11761     }
11762     return U16PARA.u16Value;
11763 #else
11764     return _MApi_JPEG_GetHeight();
11765 #endif
11766 }
11767 
MApi_JPEG_GetOriginalWidth(void)11768 MS_U16 MApi_JPEG_GetOriginalWidth(void)
11769 {
11770 #if (JPEG_UTOPIA20)
11771     if(pInstantNJPD==NULL)
11772     {
11773         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11774         return 0;
11775     }
11776 
11777     JPEG_U16_PARAM U16PARA;
11778     memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
11779     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetOriginalWidth\n");
11780     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetOriginalWidth, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
11781     {
11782         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11783         return 0;
11784     }
11785     return U16PARA.u16Value;
11786 #else
11787     return _MApi_JPEG_GetOriginalWidth();
11788 #endif
11789 }
11790 
MApi_JPEG_GetOriginalHeight(void)11791 MS_U16 MApi_JPEG_GetOriginalHeight(void)
11792 {
11793 #if (JPEG_UTOPIA20)
11794     if(pInstantNJPD==NULL)
11795     {
11796         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11797         return 0;
11798     }
11799 
11800     JPEG_U16_PARAM U16PARA;
11801     memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
11802     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetOriginalHeight\n");
11803     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetOriginalHeight, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
11804     {
11805         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11806         return 0;
11807     }
11808     return U16PARA.u16Value;
11809 #else
11810     return _MApi_JPEG_GetOriginalHeight();
11811 #endif
11812 }
11813 
MApi_JPEG_GetNonAlignmentWidth(void)11814 MS_U16 MApi_JPEG_GetNonAlignmentWidth(void)
11815 {
11816 #if (JPEG_UTOPIA20)
11817     if(pInstantNJPD==NULL)
11818     {
11819         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11820         return 0;
11821     }
11822 
11823     JPEG_U16_PARAM U16PARA;
11824     memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
11825     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetNonAlignmentWidth\n");
11826     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetNonAlignmentWidth, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
11827     {
11828         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11829         return 0;
11830     }
11831     return U16PARA.u16Value;
11832 #else
11833     return _MApi_JPEG_GetNonAlignmentWidth();
11834 #endif
11835 }
11836 
MApi_JPEG_GetNonAlignmentHeight(void)11837 MS_U16 MApi_JPEG_GetNonAlignmentHeight(void)
11838 {
11839 #if (JPEG_UTOPIA20)
11840     if(pInstantNJPD==NULL)
11841     {
11842         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11843         return 0;
11844     }
11845 
11846     JPEG_U16_PARAM U16PARA;
11847     memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
11848     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetNonAlignmentHeight\n");
11849     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetNonAlignmentHeight, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
11850     {
11851         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11852         return 0;
11853     }
11854     return U16PARA.u16Value;
11855 #else
11856     return _MApi_JPEG_GetWidth();
11857 #endif
11858 }
11859 
MApi_JPEG_GetAlignedPitch(void)11860 MS_U16 MApi_JPEG_GetAlignedPitch(void)
11861 {
11862 #if (JPEG_UTOPIA20)
11863     if(pInstantNJPD==NULL)
11864     {
11865         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11866         return 0;
11867     }
11868 
11869     JPEG_U16_PARAM U16PARA;
11870     memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
11871     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetAlignedPitch\n");
11872     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetAlignedPitch, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
11873     {
11874         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11875         return 0;
11876     }
11877     return U16PARA.u16Value;
11878 #else
11879     return _MApi_JPEG_GetAlignedPitch();
11880 #endif
11881 }
11882 
MApi_JPEG_GetAlignedPitch_H(void)11883 MS_U16 MApi_JPEG_GetAlignedPitch_H(void)
11884 {
11885 #if (JPEG_UTOPIA20)
11886     if(pInstantNJPD==NULL)
11887     {
11888         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11889         return 0;
11890     }
11891 
11892     JPEG_U16_PARAM U16PARA;
11893     memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
11894     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetAlignedPitch_H\n");
11895     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetAlignedPitch_H, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
11896     {
11897         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11898         return 0;
11899     }
11900     return U16PARA.u16Value;
11901 #else
11902     return _MApi_JPEG_GetAlignedPitch_H();
11903 #endif
11904 }
11905 
MApi_JPEG_GetAlignedWidth(void)11906 MS_U16 MApi_JPEG_GetAlignedWidth(void)
11907 {
11908 #if (JPEG_UTOPIA20)
11909     if(pInstantNJPD==NULL)
11910     {
11911         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11912         return 0;
11913     }
11914 
11915     JPEG_U16_PARAM U16PARA;
11916     memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
11917     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetAlignedWidth\n");
11918     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetAlignedWidth, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
11919     {
11920         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11921         return 0;
11922     }
11923     return U16PARA.u16Value;
11924 #else
11925     return _MApi_JPEG_GetAlignedWidth();
11926 #endif
11927 }
11928 
MApi_JPEG_GetAlignedHeight(void)11929 MS_U16 MApi_JPEG_GetAlignedHeight(void)
11930 {
11931 #if (JPEG_UTOPIA20)
11932     if(pInstantNJPD==NULL)
11933     {
11934         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11935         return 0;
11936     }
11937 
11938     JPEG_U16_PARAM U16PARA;
11939     memset(&U16PARA , 0 ,sizeof(JPEG_U16_PARAM));
11940     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetAlignedHeight\n");
11941     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetAlignedHeight, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
11942     {
11943         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11944         return 0;
11945     }
11946     return U16PARA.u16Value;
11947 #else
11948     return _MApi_JPEG_GetAlignedHeight();
11949 #endif
11950 }
11951 
MApi_JPEG_GetScaleDownFactor(void)11952 MS_U8 MApi_JPEG_GetScaleDownFactor(void)
11953 {
11954 #if (JPEG_UTOPIA20)
11955     if(pInstantNJPD==NULL)
11956     {
11957         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11958         return 0;
11959     }
11960 
11961     JPEG_U8_PARAM U8PARA;
11962     memset(&U8PARA , 0 ,sizeof(JPEG_U8_PARAM));
11963     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetScaleDownFactor\n");
11964     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetScaleDownFactor, (void*)(&U8PARA)) != UTOPIA_STATUS_SUCCESS)
11965     {
11966         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11967         return 0;
11968     }
11969     return U8PARA.u8Value;
11970 #else
11971     return _MApi_JPEG_GetScaleDownFactor();
11972 #endif
11973 }
11974 
MApi_JPEG_SetMaxDecodeResolution(MS_U16 u16Width,MS_U16 u16Height)11975 void MApi_JPEG_SetMaxDecodeResolution(MS_U16 u16Width, MS_U16 u16Height)
11976 {
11977 #if (JPEG_UTOPIA20)
11978     if (pInstantNJPD == NULL)
11979     {
11980         UTOPIA_20_DBG("%s(): UtopiaOpen()\n", __FUNCTION__);
11981         if(UtopiaOpen(MODULE_NJPEG_EX | VDEC_DRIVER_BASE, &pInstantNJPD, 0, NULL) !=  UTOPIA_STATUS_SUCCESS)
11982         {
11983             UTOPIA_20_ERR("Open NJPD fail\n");
11984             return;
11985         }
11986     }
11987 
11988     if(pInstantNJPD==NULL)
11989     {
11990         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
11991         //UtopiaClose(pInstantNJPD);
11992         return;
11993     }
11994 
11995     JPEG_RESOLUTION_PARAM Resol;
11996     memset(&Resol , 0 ,sizeof(JPEG_RESOLUTION_PARAM));
11997     Resol.u16Width= u16Width;
11998     Resol.u16Height= u16Height;
11999     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetMaxDecodeResolution\n");
12000     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_SetMaxDecodeResolution, (void*)(&Resol)) != UTOPIA_STATUS_SUCCESS)
12001     {
12002         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12003         UtopiaClose(pInstantNJPD);
12004         pInstantNJPD = NULL;
12005     }
12006 #else
12007     _MApi_JPEG_SetMaxDecodeResolution(u16Width, u16Height);
12008 #endif
12009 }
12010 
MApi_JPEG_SetProMaxDecodeResolution(MS_U16 u16ProWidth,MS_U16 u16ProHeight)12011 void MApi_JPEG_SetProMaxDecodeResolution(MS_U16 u16ProWidth, MS_U16 u16ProHeight)
12012 {
12013 #if (JPEG_UTOPIA20)
12014     if (pInstantNJPD == NULL)
12015     {
12016         UTOPIA_20_DBG("%s(): UtopiaOpen()\n", __FUNCTION__);
12017         if(UtopiaOpen(MODULE_NJPEG_EX | VDEC_DRIVER_BASE, &pInstantNJPD, 0, NULL) !=  UTOPIA_STATUS_SUCCESS)
12018         {
12019             UTOPIA_20_ERR("Open NJPD fail\n");
12020             return;
12021         }
12022     }
12023 
12024     if(pInstantNJPD==NULL)
12025     {
12026         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12027         //UtopiaClose(pInstantNJPD);
12028         return;
12029     }
12030 
12031     JPEG_RESOLUTION_PARAM Resol;
12032     memset(&Resol , 0 ,sizeof(JPEG_RESOLUTION_PARAM));
12033     Resol.u16Width= u16ProWidth;
12034     Resol.u16Height= u16ProHeight;
12035     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetProMaxDecodeResolution\n");
12036     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_SetProMaxDecodeResolution, (void*)(&Resol)) != UTOPIA_STATUS_SUCCESS)
12037     {
12038         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12039         UtopiaClose(pInstantNJPD);
12040         pInstantNJPD = NULL;
12041     }
12042 #else
12043     _MApi_JPEG_SetProMaxDecodeResolution(u16ProWidth, u16ProHeight);
12044 #endif
12045 }
12046 
MApi_JPEG_SetMRBufferValid(JPEG_BuffLoadType u8MRBuffType)12047 void MApi_JPEG_SetMRBufferValid(JPEG_BuffLoadType u8MRBuffType)
12048 {
12049 #if (JPEG_UTOPIA20)
12050     if(pInstantNJPD==NULL)
12051     {
12052         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12053         return;
12054     }
12055 
12056     JPEG_SETMBUFFERVALID_PARAM MBuffValid;
12057     memset(&MBuffValid , 0 ,sizeof(JPEG_SETMBUFFERVALID_PARAM));
12058     MBuffValid.u8MRBuffType = u8MRBuffType;
12059     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetMRBufferValid\n");
12060     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_SetMRBufferValid, (void*)(&MBuffValid)) != UTOPIA_STATUS_SUCCESS)
12061     {
12062         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12063     }
12064 #else
12065     _MApi_JPEG_SetMRBufferValid(u8MRBuffType);
12066 #endif
12067 }
12068 
MApi_JPEG_UpdateReadInfo(MS_U32 u32DataRead,MS_BOOL bEOFflag)12069 void MApi_JPEG_UpdateReadInfo(MS_U32 u32DataRead, MS_BOOL bEOFflag)
12070 {
12071 #if (JPEG_UTOPIA20)
12072     if(pInstantNJPD==NULL)
12073     {
12074         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12075         return;
12076     }
12077 
12078     JPEG_UPDATEREADINFO_PARAM ReadInfo;
12079     memset(&ReadInfo , 0 ,sizeof(JPEG_UPDATEREADINFO_PARAM));
12080     ReadInfo.u32DataRead = u32DataRead;
12081     ReadInfo.bEOFflag = bEOFflag;
12082     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_UpdateReadInfo\n");
12083     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_UpdateReadInfo, (void*)(&ReadInfo)) != UTOPIA_STATUS_SUCCESS)
12084     {
12085         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12086     }
12087 #else
12088     _MApi_JPEG_UpdateReadInfo(u32DataRead, bEOFflag);
12089 #endif
12090 }
12091 
MApi_JPEG_ProcessEOF(JPEG_BuffLoadType u8MRBuffType)12092 void MApi_JPEG_ProcessEOF(JPEG_BuffLoadType u8MRBuffType)
12093 {
12094 #if (JPEG_UTOPIA20)
12095     if(pInstantNJPD==NULL)
12096     {
12097         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12098         return;
12099     }
12100 
12101     JPEG_PROCESSEOF_PARAM EofPara;
12102     memset(&EofPara , 0 ,sizeof(JPEG_PROCESSEOF_PARAM));
12103     EofPara.u8MRBuffType = u8MRBuffType;
12104     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_ProcessEOF\n");
12105     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_ProcessEOF, (void*)(&EofPara)) != UTOPIA_STATUS_SUCCESS)
12106     {
12107         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12108     }
12109 #else
12110     _MApi_JPEG_ProcessEOF(u8MRBuffType);
12111 #endif
12112 }
12113 
MApi_JPEG_SetErrCode(JPEG_ErrCode ErrStatus)12114 void MApi_JPEG_SetErrCode(JPEG_ErrCode ErrStatus)
12115 {
12116 #if (JPEG_UTOPIA20)
12117     if(pInstantNJPD==NULL)
12118     {
12119         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12120         return;
12121     }
12122 
12123     JPEG_SETERRORCODE_PARAM ErrCode;
12124     memset(&ErrCode , 0 ,sizeof(JPEG_SETERRORCODE_PARAM));
12125     ErrCode.ErrStatus = ErrStatus;
12126     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetErrCode\n");
12127     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_SetErrCode, (void*)(&ErrCode)) != UTOPIA_STATUS_SUCCESS)
12128     {
12129         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12130     }
12131 #else
12132     _MApi_JPEG_SetErrCode(ErrStatus);
12133 #endif
12134 }
12135 
MApi_JPEG_SetDbgLevel(MS_U8 u8DbgLevel)12136 void MApi_JPEG_SetDbgLevel(MS_U8 u8DbgLevel)
12137 {
12138 #if (JPEG_UTOPIA20)
12139     gNJPEGContext._u8JPEG_ApiDbgLevel = u8DbgLevel;
12140     UTOPIA_20_DBG("%s: DbgLevel = 0x%04X\n", __FUNCTION__, u8DbgLevel);
12141     JPEG_SetDbgLevel_V2(u8DbgLevel);
12142     if (pInstantNJPD == NULL)
12143     {
12144         UTOPIA_20_DBG("%s(): UtopiaOpen()\n", __FUNCTION__);
12145         if(UtopiaOpen(MODULE_NJPEG_EX | VDEC_DRIVER_BASE, &pInstantNJPD, 0, NULL) !=  UTOPIA_STATUS_SUCCESS)
12146         {
12147             UTOPIA_20_ERR("Open NJPD fail\n");
12148             return;
12149         }
12150     }
12151     if(pInstantNJPD==NULL)
12152     {
12153         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12154         //UtopiaClose(pInstantNJPD);
12155         return;
12156     }
12157 
12158     JPEG_U8_PARAM U8PARA;
12159     memset(&U8PARA , 0 ,sizeof(JPEG_U8_PARAM));
12160     U8PARA.u8Value = u8DbgLevel;
12161     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetDbgLevel\n");
12162     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_SetDbgLevel, (void*)(&U8PARA)) != UTOPIA_STATUS_SUCCESS)
12163     {
12164         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12165         UtopiaClose(pInstantNJPD);
12166         pInstantNJPD = NULL;
12167     }
12168 #else
12169     _MApi_JPEG_SetDbgLevel(u8DbgLevel);
12170 #endif
12171 }
12172 
MApi_JPEG_GetDbgLevel(void)12173 MS_U8 MApi_JPEG_GetDbgLevel(void)
12174 {
12175 #if (JPEG_UTOPIA20)
12176     if(pInstantNJPD==NULL)
12177     {
12178         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12179         return 0;
12180     }
12181 
12182     JPEG_U8_PARAM U8PARA;
12183     memset(&U8PARA , 0 ,sizeof(JPEG_U8_PARAM));
12184     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetDbgLevel\n");
12185     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetDbgLevel, (void*)(&U8PARA)) != UTOPIA_STATUS_SUCCESS)
12186     {
12187         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12188     }
12189     return U8PARA.u8Value;
12190 #else
12191     return _MApi_JPEG_GetDbgLevel();
12192 #endif
12193 }
12194 
MApi_JPEG_GetInfo(JPEG_Info * pJPEG_Info)12195 void MApi_JPEG_GetInfo(JPEG_Info *pJPEG_Info)
12196 {
12197 #if (JPEG_UTOPIA20)
12198     if(pInstantNJPD==NULL)
12199     {
12200         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12201         return;
12202     }
12203 
12204     JPEG_GETINFO_PARAM eGETINFO;
12205     memset(&eGETINFO , 0 ,sizeof(JPEG_GETINFO_PARAM));
12206     eGETINFO.pJPEG_Info = pJPEG_Info;
12207     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetInfo\n");
12208     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetInfo, (void*)(&eGETINFO)) != UTOPIA_STATUS_SUCCESS)
12209     {
12210         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12211     }
12212 #else
12213     _MApi_JPEG_GetInfo(pJPEG_Info);
12214 #endif
12215 }
12216 
MApi_JPEG_GetStatus(JPEG_Status * pJPEG_Status)12217 void MApi_JPEG_GetStatus(JPEG_Status *pJPEG_Status)
12218 {
12219 #if (JPEG_UTOPIA20)
12220     if(pInstantNJPD==NULL)
12221     {
12222         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12223         return;
12224     }
12225 
12226     JPEG_GETSTATUS_PARAM eGETSTATUS;
12227     memset(&eGETSTATUS , 0 ,sizeof(JPEG_GETSTATUS_PARAM));
12228     eGETSTATUS.pJPEG_Status = pJPEG_Status;
12229     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetStatus\n");
12230     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetStatus, (void*)(&eGETSTATUS)) != UTOPIA_STATUS_SUCCESS)
12231     {
12232         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12233     }
12234 #else
12235     _MApi_JPEG_GetStatus(pJPEG_Status);
12236 #endif
12237 }
12238 
MApi_JPEG_GetLibVer(const MSIF_Version ** ppVersion)12239 JPEG_Result MApi_JPEG_GetLibVer(const MSIF_Version **ppVersion)
12240 {
12241 #if (JPEG_UTOPIA20)
12242     if(pInstantNJPD==NULL)
12243     {
12244         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12245         return E_JPEG_FAILED;
12246     }
12247 
12248     JPEG_GETLIBVER_PARAM eLIBVER;
12249     memset(&eLIBVER , 0 ,sizeof(JPEG_GETLIBVER_PARAM));
12250     eLIBVER.ppVersion = ppVersion;
12251     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetLibVer\n");
12252     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetLibVer, (void*)(&eLIBVER)) != UTOPIA_STATUS_SUCCESS)
12253     {
12254         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12255     }
12256     return eLIBVER.retVal;
12257 #else
12258     return _MApi_JPEG_GetLibVer(ppVersion);
12259 #endif
12260 }
12261 
MApi_JPEG_HdlVidxChk(void)12262 JPEG_Result MApi_JPEG_HdlVidxChk(void)
12263 {
12264 #if (JPEG_UTOPIA20)
12265     if(pInstantNJPD==NULL)
12266     {
12267         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12268         return E_JPEG_FAILED;
12269     }
12270 
12271     JPEG_RESULT_PARAM ResPara;
12272     memset(&ResPara , 0 ,sizeof(JPEG_RESULT_PARAM));
12273     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_HdlVidxChk\n");
12274     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_HdlVidxChk, (void*)(&ResPara)) != UTOPIA_STATUS_SUCCESS)
12275     {
12276         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12277     }
12278     return ResPara.retVal;
12279 #else
12280     return _MApi_JPEG_HdlVidxChk();
12281 #endif
12282 }
12283 
MApi_JPEG_GetBuffLoadType(JPEG_BuffLoadType * pBuffLoadType)12284 JPEG_Result MApi_JPEG_GetBuffLoadType(JPEG_BuffLoadType *pBuffLoadType)
12285 {
12286 #if (JPEG_UTOPIA20)
12287     if(pInstantNJPD==NULL)
12288     {
12289         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12290         return E_JPEG_FAILED;
12291     }
12292 
12293     JPEG_GETBUFFLOADTYPE_PARAM eBufferLoad;
12294     memset(&eBufferLoad , 0 ,sizeof(JPEG_GETBUFFLOADTYPE_PARAM));
12295     eBufferLoad.pBuffLoadType = pBuffLoadType;
12296     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetBuffLoadType\n");
12297     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetBuffLoadType, (void*)(&eBufferLoad)) != UTOPIA_STATUS_SUCCESS)
12298     {
12299         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12300     }
12301     return eBufferLoad.retVal;
12302 #else
12303     return _MApi_JPEG_GetBuffLoadType(pBuffLoadType);
12304 #endif
12305 }
12306 
MApi_JPEG_EnableISR(JPEG_IsrFuncCb IsrCb)12307 JPEG_Result MApi_JPEG_EnableISR(JPEG_IsrFuncCb IsrCb)
12308 {
12309 #if (JPEG_UTOPIA20)
12310     if(pInstantNJPD==NULL)
12311     {
12312         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12313         return E_JPEG_FAILED;
12314     }
12315 
12316     JPEG_ENABLEISR_PARAM eISR;
12317     memset(&eISR , 0 ,sizeof(JPEG_ENABLEISR_PARAM));
12318     eISR.IsrCb = IsrCb;
12319 #ifdef VDEC_UTOPIA_2K
12320     gIsrCB = IsrCb;
12321 #endif
12322 
12323     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_EnableISR\n");
12324     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_EnableISR, (void*)(&eISR)) != UTOPIA_STATUS_SUCCESS)
12325     {
12326         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12327     }
12328     return eISR.retVal;
12329 #else
12330     return _MApi_JPEG_EnableISR(IsrCb);
12331 #endif
12332 }
12333 
MApi_JPEG_DisableISR(void)12334 JPEG_Result MApi_JPEG_DisableISR(void)
12335 {
12336 #if (JPEG_UTOPIA20)
12337     if(pInstantNJPD==NULL)
12338     {
12339         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12340         return E_JPEG_FAILED;
12341     }
12342 
12343     JPEG_RESULT_PARAM ResPara;
12344     memset(&ResPara , 0 ,sizeof(JPEG_RESULT_PARAM));
12345     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_DisableISR\n");
12346     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_DisableISR, (void*)(&ResPara)) != UTOPIA_STATUS_SUCCESS)
12347     {
12348         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12349     }
12350 #ifdef VDEC_UTOPIA_2K
12351     gIsrCB = NULL;
12352 #endif
12353     return ResPara.retVal;
12354 #else
12355     return _MApi_JPEG_DisableISR();
12356 #endif
12357 }
12358 
MApi_JPEG_WaitDone(void)12359 JPEG_DecodeStatus MApi_JPEG_WaitDone(void)
12360 {
12361 #if (JPEG_UTOPIA20)
12362     if(pInstantNJPD==NULL)
12363     {
12364         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12365         return E_JPEG_DEC_DECODING;
12366     }
12367 
12368     JPEG_WAITDONE_PARAM eWaitDone;
12369     memset(&eWaitDone , 0 ,sizeof(JPEG_WAITDONE_PARAM));
12370     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_WaitDone\n");
12371     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_WaitDone, (void*)(&eWaitDone)) != UTOPIA_STATUS_SUCCESS)
12372     {
12373         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12374     }
12375     return eWaitDone.retVal;
12376 #else
12377     return _MApi_JPEG_WaitDone();
12378 #endif
12379 }
12380 
MApi_JPEG_GetEXIFDateTime(JPEG_EXIF_DateTime * DateTime)12381 JPEG_Result MApi_JPEG_GetEXIFDateTime(JPEG_EXIF_DateTime *DateTime)
12382 {
12383 #if (JPEG_UTOPIA20)
12384     if(pInstantNJPD==NULL)
12385     {
12386         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12387         return E_JPEG_FAILED;
12388     }
12389 
12390     JPEG_GETEXIFDATETIME_PARAM eEXIFDate;
12391     memset(&eEXIFDate , 0 ,sizeof(JPEG_GETEXIFDATETIME_PARAM));
12392     eEXIFDate.DateTime = DateTime;
12393     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFDateTime\n");
12394     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetEXIFDateTime, (void*)(&eEXIFDate)) != UTOPIA_STATUS_SUCCESS)
12395     {
12396         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12397     }
12398     return eEXIFDate.retVal;
12399 #else
12400     return _MApi_JPEG_GetEXIFDateTime(DateTime);
12401 #endif
12402 }
12403 
MApi_JPEG_GetEXIFOrientation(JPEG_EXIF_Orientation * eOrientation)12404 JPEG_Result MApi_JPEG_GetEXIFOrientation(JPEG_EXIF_Orientation *eOrientation)
12405 {
12406 #if (JPEG_UTOPIA20)
12407     if(pInstantNJPD==NULL)
12408     {
12409         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12410         return E_JPEG_FAILED;
12411     }
12412 
12413     JPEG_GETEXIFORIENTATION_PARAM eEXIFOri;
12414     memset(&eEXIFOri , 0 ,sizeof(JPEG_GETEXIFORIENTATION_PARAM));
12415     eEXIFOri.eOrientation = eOrientation;
12416     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFOrientation\n");
12417     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetEXIFOrientation, (void*)(&eEXIFOri)) != UTOPIA_STATUS_SUCCESS)
12418     {
12419         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12420     }
12421     return eEXIFOri.retVal;
12422 #else
12423     return _MApi_JPEG_GetEXIFOrientation(eOrientation);
12424 #endif
12425 }
12426 
12427 #if SUPPORT_EXIF_EXTRA_INFO
MApi_JPEG_GetEXIFManufacturer(MS_U8 * pu8Manufacturer,MS_U8 u8size)12428 JPEG_Result MApi_JPEG_GetEXIFManufacturer(MS_U8 *pu8Manufacturer, MS_U8 u8size)
12429 {
12430 #if (JPEG_UTOPIA20)
12431     if(pInstantNJPD==NULL)
12432     {
12433         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12434         return E_JPEG_FAILED;
12435     }
12436 
12437 #if 0
12438 
12439     JPEG_GET_CTRL_PARAM eGetCTRL;
12440     memset(&eGetCTRL , 0 ,sizeof(JPEG_GET_CTRL_PARAM));
12441     eGetCTRL.eGetID = E_JPEG_GET_EXIF_MANUFACTURER;
12442     eGetCTRL.param = (MS_U32 *)pu8Manufacturer;
12443     eGetCTRL.u32size = (MS_U32)u8size;
12444 
12445     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetControl\n");
12446     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetControl, (void*)(&eGetCTRL)) != UTOPIA_STATUS_SUCCESS)
12447     {
12448         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12449         return E_JPEG_FAILED;
12450     }
12451     return eGetCTRL.retVal;
12452 
12453 #else
12454     JPEG_GETEXIFSTRING_PARAM eEXIFStr;
12455     memset(&eEXIFStr , 0 ,sizeof(JPEG_GETEXIFSTRING_PARAM));
12456     eEXIFStr.pu8String = pu8Manufacturer;
12457     eEXIFStr.u8size = u8size;
12458     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFManufacturer\n");
12459     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetEXIFManufacturer, (void*)(&eEXIFStr)) != UTOPIA_STATUS_SUCCESS)
12460     {
12461         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12462     }
12463     return eEXIFStr.retVal;
12464 #endif
12465 #else
12466     return _MApi_JPEG_GetEXIFManufacturer(pu8Manufacturer, u8size);
12467 #endif
12468 }
12469 
MApi_JPEG_GetEXIFModel(MS_U8 * pu8Model,MS_U8 u8size)12470 JPEG_Result MApi_JPEG_GetEXIFModel(MS_U8 *pu8Model, MS_U8 u8size)
12471 {
12472 #if (JPEG_UTOPIA20)
12473     if(pInstantNJPD==NULL)
12474     {
12475         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12476         return E_JPEG_FAILED;
12477     }
12478 
12479 #if 0
12480 
12481 
12482     JPEG_GET_CTRL_PARAM eGetCTRL;
12483     memset(&eGetCTRL , 0 ,sizeof(JPEG_GET_CTRL_PARAM));
12484     eGetCTRL.eGetID = E_JPEG_GET_EXIF_MODEL;
12485     eGetCTRL.param = (MS_U32 *)pu8Model;
12486     eGetCTRL.u32size = (MS_U32)u8size;
12487 
12488     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetControl\n");
12489     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetControl, (void*)(&eGetCTRL)) != UTOPIA_STATUS_SUCCESS)
12490     {
12491         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12492         return E_JPEG_FAILED;
12493     }
12494     return eGetCTRL.retVal;
12495 
12496 #else
12497     JPEG_GETEXIFSTRING_PARAM eEXIFStr;
12498     memset(&eEXIFStr , 0 ,sizeof(JPEG_GETEXIFSTRING_PARAM));
12499     eEXIFStr.pu8String = pu8Model;
12500     eEXIFStr.u8size = u8size;
12501     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFModel\n");
12502     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetEXIFModel, (void*)(&eEXIFStr)) != UTOPIA_STATUS_SUCCESS)
12503     {
12504         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12505     }
12506     return eEXIFStr.retVal;
12507 #endif
12508 #else
12509     return _MApi_JPEG_GetEXIFModel(pu8Model, u8size);
12510 #endif
12511 }
12512 
MApi_JPEG_GetEXIFFlash(MS_U16 * pu16Flash)12513 JPEG_Result MApi_JPEG_GetEXIFFlash(MS_U16 *pu16Flash)
12514 {
12515 #if (JPEG_UTOPIA20)
12516     if(pInstantNJPD==NULL)
12517     {
12518         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12519         return E_JPEG_FAILED;
12520     }
12521 
12522     JPEG_GETEXIFU16_PARAM U16PARA;
12523     memset(&U16PARA , 0 ,sizeof(JPEG_GETEXIFU16_PARAM));
12524     U16PARA.pu16Value = pu16Flash;
12525     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFFlash\n");
12526     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetEXIFFlash, (void*)(&U16PARA)) != UTOPIA_STATUS_SUCCESS)
12527     {
12528         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12529     }
12530     return U16PARA.retVal;
12531 #else
12532     return _MApi_JPEG_GetEXIFFlash(pu16Flash);
12533 #endif
12534 }
12535 
MApi_JPEG_GetEXIFISOSpeedRatings(MS_U32 * pu32ISOSpeedRatings)12536 JPEG_Result MApi_JPEG_GetEXIFISOSpeedRatings(MS_U32 *pu32ISOSpeedRatings)
12537 {
12538 #if (JPEG_UTOPIA20)
12539     if(pInstantNJPD==NULL)
12540     {
12541         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12542         return E_JPEG_FAILED;
12543     }
12544 
12545     JPEG_GETEXIFU32_PARAM U32PARA;
12546     memset(&U32PARA , 0 ,sizeof(JPEG_GETEXIFU32_PARAM));
12547     U32PARA.pu32Value = pu32ISOSpeedRatings;
12548     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFISOSpeedRatings\n");
12549     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetEXIFISOSpeedRatings, (void*)(&U32PARA)) != UTOPIA_STATUS_SUCCESS)
12550     {
12551         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12552     }
12553     return U32PARA.retVal;
12554 #else
12555     return _MApi_JPEG_GetEXIFISOSpeedRatings(pu32ISOSpeedRatings);
12556 #endif
12557 }
12558 
MApi_JPEG_GetEXIFShutterSpeedValue(JPEG_RATIONAL * pShutterSpeedValue)12559 JPEG_Result MApi_JPEG_GetEXIFShutterSpeedValue(JPEG_RATIONAL *pShutterSpeedValue)
12560 {
12561 #if (JPEG_UTOPIA20)
12562     if(pInstantNJPD==NULL)
12563     {
12564         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12565         return E_JPEG_FAILED;
12566     }
12567 
12568     JPEG_GETEXIFRATIONAL_PARAM RATIONALPARA;
12569     memset(&RATIONALPARA , 0 ,sizeof(JPEG_GETEXIFRATIONAL_PARAM));
12570     RATIONALPARA.pRational = pShutterSpeedValue;
12571     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFShutterSpeedValue\n");
12572     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetEXIFShutterSpeedValue, (void*)(&RATIONALPARA)) != UTOPIA_STATUS_SUCCESS)
12573     {
12574         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12575     }
12576     return RATIONALPARA.retVal;
12577 #else
12578     return _MApi_JPEG_GetEXIFShutterSpeedValue(pShutterSpeedValue);
12579 #endif
12580 }
12581 
MApi_JPEG_GetEXIFApertureValue(JPEG_RATIONAL * pApertureValue)12582 JPEG_Result MApi_JPEG_GetEXIFApertureValue(JPEG_RATIONAL *pApertureValue)
12583 {
12584 #if (JPEG_UTOPIA20)
12585     if(pInstantNJPD==NULL)
12586     {
12587         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12588         return E_JPEG_FAILED;
12589     }
12590 
12591     JPEG_GETEXIFRATIONAL_PARAM RATIONALPARA;
12592     memset(&RATIONALPARA , 0 ,sizeof(JPEG_GETEXIFRATIONAL_PARAM));
12593     RATIONALPARA.pRational = pApertureValue;
12594     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFApertureValue\n");
12595     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetEXIFApertureValue, (void*)(&RATIONALPARA)) != UTOPIA_STATUS_SUCCESS)
12596     {
12597         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12598     }
12599     return RATIONALPARA.retVal;
12600 #else
12601     return _MApi_JPEG_GetEXIFApertureValue(pApertureValue);
12602 #endif
12603 }
12604 
MApi_JPEG_GetEXIFExposureBiasValue(JPEG_RATIONAL * pExposureBiasValue)12605 JPEG_Result MApi_JPEG_GetEXIFExposureBiasValue(JPEG_RATIONAL *pExposureBiasValue)
12606 {
12607 #if (JPEG_UTOPIA20)
12608     if(pInstantNJPD==NULL)
12609     {
12610         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12611         return E_JPEG_FAILED;
12612     }
12613 
12614     JPEG_GETEXIFRATIONAL_PARAM RATIONALPARA;
12615     memset(&RATIONALPARA , 0 ,sizeof(JPEG_GETEXIFRATIONAL_PARAM));
12616     RATIONALPARA.pRational = pExposureBiasValue;
12617     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFExposureBiasValue\n");
12618     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetEXIFExposureBiasValue, (void*)(&RATIONALPARA)) != UTOPIA_STATUS_SUCCESS)
12619     {
12620         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12621     }
12622     return RATIONALPARA.retVal;
12623 #else
12624     return _MApi_JPEG_GetEXIFExposureBiasValue(pExposureBiasValue);
12625 #endif
12626 }
12627 
MApi_JPEG_GetEXIFFocalLength(JPEG_RATIONAL * pFocalLength)12628 JPEG_Result MApi_JPEG_GetEXIFFocalLength(JPEG_RATIONAL *pFocalLength)
12629 {
12630 #if (JPEG_UTOPIA20)
12631     if(pInstantNJPD==NULL)
12632     {
12633         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12634         return E_JPEG_FAILED;
12635     }
12636 
12637     JPEG_GETEXIFRATIONAL_PARAM RATIONALPARA;
12638     memset(&RATIONALPARA , 0 ,sizeof(JPEG_GETEXIFRATIONAL_PARAM));
12639     RATIONALPARA.pRational = pFocalLength;
12640     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFFocalLength\n");
12641     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetEXIFFocalLength, (void*)(&RATIONALPARA)) != UTOPIA_STATUS_SUCCESS)
12642     {
12643         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12644     }
12645     return RATIONALPARA.retVal;
12646 #else
12647     return _MApi_JPEG_GetEXIFFocalLength(pFocalLength);
12648 #endif
12649 }
12650 
MApi_JPEG_GetEXIFImageWidth(MS_U32 * pu32ImageWidth)12651 JPEG_Result MApi_JPEG_GetEXIFImageWidth(MS_U32 *pu32ImageWidth)
12652 {
12653 #if (JPEG_UTOPIA20)
12654     if(pInstantNJPD==NULL)
12655     {
12656         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12657         return E_JPEG_FAILED;
12658     }
12659 
12660     JPEG_GETEXIFU32_PARAM U32PARA;
12661     memset(&U32PARA , 0 ,sizeof(JPEG_GETEXIFU32_PARAM));
12662     U32PARA.pu32Value = pu32ImageWidth;
12663     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFImageWidth\n");
12664     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetEXIFImageWidth, (void*)(&U32PARA)) != UTOPIA_STATUS_SUCCESS)
12665     {
12666         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12667     }
12668     return U32PARA.retVal;
12669 #else
12670     return _MApi_JPEG_GetEXIFImageWidth(pu32ImageWidth);
12671 #endif
12672 }
12673 
MApi_JPEG_GetEXIFImageHeight(MS_U32 * pu32ImageHeight)12674 JPEG_Result MApi_JPEG_GetEXIFImageHeight(MS_U32 *pu32ImageHeight)
12675 {
12676 #if (JPEG_UTOPIA20)
12677     if(pInstantNJPD==NULL)
12678     {
12679         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12680         return E_JPEG_FAILED;
12681     }
12682 
12683     JPEG_GETEXIFU32_PARAM U32PARA;
12684     memset(&U32PARA , 0 ,sizeof(JPEG_GETEXIFU32_PARAM));
12685     U32PARA.pu32Value = pu32ImageHeight;
12686     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFImageHeight\n");
12687     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetEXIFImageHeight, (void*)(&U32PARA)) != UTOPIA_STATUS_SUCCESS)
12688     {
12689         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12690     }
12691     return U32PARA.retVal;
12692 #else
12693     return _MApi_JPEG_GetEXIFImageHeight(pu32ImageHeight);
12694 #endif
12695 }
12696 
MApi_JPEG_GetEXIFExposureTime(JPEG_RATIONAL * pExposureTime)12697 JPEG_Result MApi_JPEG_GetEXIFExposureTime(JPEG_RATIONAL *pExposureTime)
12698 {
12699 #if (JPEG_UTOPIA20)
12700     if(pInstantNJPD==NULL)
12701     {
12702         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12703         return E_JPEG_FAILED;
12704     }
12705 
12706     JPEG_GETEXIFRATIONAL_PARAM RATIONALPARA;
12707     memset(&RATIONALPARA , 0 ,sizeof(JPEG_GETEXIFRATIONAL_PARAM));
12708     RATIONALPARA.pRational = pExposureTime;
12709     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFExposureTime\n");
12710     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetEXIFExposureTime, (void*)(&RATIONALPARA)) != UTOPIA_STATUS_SUCCESS)
12711     {
12712         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12713     }
12714     return RATIONALPARA.retVal;
12715 #else
12716     return _MApi_JPEG_GetEXIFExposureTime(pExposureTime);
12717 #endif
12718 }
12719 
MApi_JPEG_GetEXIFFNumber(JPEG_RATIONAL * pFNumber)12720 JPEG_Result MApi_JPEG_GetEXIFFNumber(JPEG_RATIONAL *pFNumber)
12721 {
12722 #if (JPEG_UTOPIA20)
12723     if(pInstantNJPD==NULL)
12724     {
12725         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12726         return E_JPEG_FAILED;
12727     }
12728 
12729     JPEG_GETEXIFRATIONAL_PARAM RATIONALPARA;
12730     memset(&RATIONALPARA , 0 ,sizeof(JPEG_GETEXIFRATIONAL_PARAM));
12731     RATIONALPARA.pRational = pFNumber;
12732     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetEXIFFNumber\n");
12733     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetEXIFFNumber, (void*)(&RATIONALPARA)) != UTOPIA_STATUS_SUCCESS)
12734     {
12735         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12736     }
12737     return RATIONALPARA.retVal;
12738 #else
12739     return _MApi_JPEG_GetEXIFFNumber(pFNumber);
12740 #endif
12741 }
12742 
12743 #endif
12744 
MApi_JPEG_GetFreeMemory(MS_U32 size)12745 MS_PHY MApi_JPEG_GetFreeMemory(MS_U32 size)
12746 {
12747 #if (JPEG_UTOPIA20)
12748     if(pInstantNJPD==NULL)
12749     {
12750         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12751         return 0;
12752     }
12753 
12754     JPEG_GETFREEMEMORY_PARAM MEMORYPARA;
12755     memset(&MEMORYPARA , 0 ,sizeof(JPEG_GETFREEMEMORY_PARAM));
12756     MEMORYPARA.size = size;
12757     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetFreeMemory\n");
12758     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetFreeMemory, (void*)(&MEMORYPARA)) != UTOPIA_STATUS_SUCCESS)
12759     {
12760         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12761     }
12762     return MEMORYPARA.addr;
12763 #else
12764     return _MApi_JPEG_GetFreeMemory(size);
12765 #endif
12766 }
12767 
12768 
MApi_JPEG_GetDataOffset(void)12769 MS_U32 MApi_JPEG_GetDataOffset(void)
12770 {
12771 #if (JPEG_UTOPIA20)
12772     if(pInstantNJPD==NULL)
12773     {
12774         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12775         return 0;
12776     }
12777 
12778     JPEG_U32_PARAM U32PARA;
12779     memset(&U32PARA , 0 ,sizeof(JPEG_U32_PARAM));
12780     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetDataOffset\n");
12781     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetDataOffset, (void*)(&U32PARA)) != UTOPIA_STATUS_SUCCESS)
12782     {
12783         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12784         return 0;
12785     }
12786     return U32PARA.u32Value;
12787 #else
12788     return _MApi_JPEG_GetDataOffset();
12789 #endif
12790 }
12791 
MApi_JPEG_GetSOFOffset(void)12792 MS_U32 MApi_JPEG_GetSOFOffset(void)
12793 {
12794 #if (JPEG_UTOPIA20)
12795     if(pInstantNJPD==NULL)
12796     {
12797         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12798         return 0;
12799     }
12800 
12801     JPEG_U32_PARAM U32PARA;
12802     memset(&U32PARA , 0 ,sizeof(JPEG_U32_PARAM));
12803     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetSOFOffset\n");
12804     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetSOFOffset, (void*)(&U32PARA)) != UTOPIA_STATUS_SUCCESS)
12805     {
12806         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12807         return 0;
12808     }
12809     return U32PARA.u32Value;
12810 #else
12811     return _MApi_JPEG_GetSOFOffset();
12812 #endif
12813 }
12814 
MApi_JPEG_SetNJPDInstance(MS_U8 JPDNum)12815 void MApi_JPEG_SetNJPDInstance(MS_U8 JPDNum)
12816 {
12817 #if (JPEG_UTOPIA20)
12818     if (pInstantNJPD == NULL)
12819     {
12820         UTOPIA_20_DBG("%s(): UtopiaOpen()\n", __FUNCTION__);
12821         if(UtopiaOpen(MODULE_NJPEG_EX | VDEC_DRIVER_BASE, &pInstantNJPD, 0, NULL) !=  UTOPIA_STATUS_SUCCESS)
12822         {
12823             UTOPIA_20_ERR("Open NJPD fail\n");
12824             return;
12825         }
12826     }
12827     if(pInstantNJPD==NULL)
12828     {
12829         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12830         //UtopiaClose(pInstantNJPD);
12831         return;
12832     }
12833 #ifdef VDEC_UTOPIA_2K
12834     gNJPEGContext.eNJPDNum = (JPD_Number)JPDNum;
12835 #endif
12836     JPEG_U8_PARAM U8PARA;
12837     memset(&U8PARA , 0 ,sizeof(JPEG_U8_PARAM));
12838     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetNJPDInstance\n");
12839     U8PARA.u8Value = JPDNum;
12840     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_SetNJPDInstance, (void*)(&U8PARA)) != UTOPIA_STATUS_SUCCESS)
12841     {
12842         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12843         UtopiaClose(pInstantNJPD);
12844         pInstantNJPD = NULL;
12845         return;
12846     }
12847     return;
12848 #else
12849     _MApi_JPEG_SetNJPDInstance(JPDNum);
12850 #endif
12851 }
12852 
MApi_JPEG_SupportCMYK(MS_BOOL bEnable)12853 JPEG_Result MApi_JPEG_SupportCMYK(MS_BOOL bEnable)
12854 {
12855 #if (JPEG_UTOPIA20)
12856     if (pInstantNJPD == NULL)
12857     {
12858         UTOPIA_20_DBG("%s(): UtopiaOpen()\n", __FUNCTION__);
12859         if(UtopiaOpen(MODULE_NJPEG_EX | VDEC_DRIVER_BASE, &pInstantNJPD, 0, NULL) !=  UTOPIA_STATUS_SUCCESS)
12860         {
12861             UTOPIA_20_ERR("Open NJPD fail\n");
12862             return E_JPEG_FAILED;
12863         }
12864     }
12865 
12866     if(pInstantNJPD==NULL)
12867     {
12868         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12869         //UtopiaClose(pInstantNJPD);
12870         return E_JPEG_FAILED;
12871     }
12872 
12873     JPEG_SUPPORTCMYK_PARAM CMYKRGB;
12874     memset(&CMYKRGB , 0 ,sizeof(JPEG_SUPPORTCMYK_PARAM));
12875     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SupportCMYK\n");
12876     CMYKRGB.bEnable = bEnable;
12877     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_SupportCMYK, (void*)(&CMYKRGB)) != UTOPIA_STATUS_SUCCESS)
12878     {
12879         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12880         UtopiaClose(pInstantNJPD);
12881         pInstantNJPD = NULL;
12882         return E_JPEG_FAILED;
12883     }
12884     return CMYKRGB.retVal;
12885 #else
12886     return _MApi_JPEG_SupportCMYK(bEnable);
12887 #endif
12888 }
12889 
MApi_JPEG_SupportRGB(MS_BOOL bEnable)12890 JPEG_Result MApi_JPEG_SupportRGB(MS_BOOL bEnable)
12891 {
12892 #if (JPEG_UTOPIA20)
12893     if (pInstantNJPD == NULL)
12894     {
12895         UTOPIA_20_DBG("%s(): UtopiaOpen()\n", __FUNCTION__);
12896         if(UtopiaOpen(MODULE_NJPEG_EX | VDEC_DRIVER_BASE, &pInstantNJPD, 0, NULL) !=  UTOPIA_STATUS_SUCCESS)
12897         {
12898             UTOPIA_20_ERR("Open NJPD fail\n");
12899             return E_JPEG_FAILED;
12900         }
12901     }
12902     if(pInstantNJPD==NULL)
12903     {
12904         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12905         //UtopiaClose(pInstantNJPD);
12906         return E_JPEG_FAILED;
12907     }
12908 
12909     JPEG_SUPPORTCMYK_PARAM CMYKRGB;
12910     memset(&CMYKRGB , 0 ,sizeof(JPEG_SUPPORTCMYK_PARAM));
12911     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SupportRGB\n");
12912     CMYKRGB.bEnable = bEnable;
12913     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_SupportRGB, (void*)(&CMYKRGB)) != UTOPIA_STATUS_SUCCESS)
12914     {
12915         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12916         UtopiaClose(pInstantNJPD);
12917         pInstantNJPD = NULL;
12918         return E_JPEG_FAILED;
12919     }
12920     return CMYKRGB.retVal;
12921 #else
12922     return _MApi_JPEG_SupportRGB(bEnable);
12923 #endif
12924 }
12925 
MApi_JPEG_SetMHEG5(MS_BOOL bEnable)12926 void MApi_JPEG_SetMHEG5(MS_BOOL bEnable)
12927 {
12928 #if (JPEG_UTOPIA20)
12929     if(pInstantNJPD==NULL)
12930     {
12931         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12932         return;
12933     }
12934 
12935     JPEG_BOOL_PARAM bPARA;
12936     memset(&bPARA , 0 ,sizeof(JPEG_BOOL_PARAM));
12937     bPARA.bValue= bEnable;
12938     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetMHEG5\n");
12939     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_SetMHEG5, (void*)(&bPARA)) != UTOPIA_STATUS_SUCCESS)
12940     {
12941         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12942         return;
12943     }
12944     return;
12945 #else
12946     _MApi_JPEG_SetMHEG5(bEnable);
12947 #endif
12948 }
12949 
12950 
12951 #if SUPPORT_MPO_FORMAT
12952 //For MPO
MApi_JPEG_IsMPOFormat(void)12953 MS_BOOL MApi_JPEG_IsMPOFormat(void)
12954 {
12955 #if (JPEG_UTOPIA20)
12956     if(pInstantNJPD==NULL)
12957     {
12958         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12959         return 0;
12960     }
12961 
12962     JPEG_BOOL_PARAM bPARA;
12963     memset(&bPARA , 0 ,sizeof(JPEG_BOOL_PARAM));
12964     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_IsMPOFormat\n");
12965     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_IsMPOFormat, (void*)(&bPARA)) != UTOPIA_STATUS_SUCCESS)
12966     {
12967         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12968         return 0;
12969     }
12970     return bPARA.bValue;
12971 #else
12972     return _MApi_JPEG_IsMPOFormat();
12973 #endif
12974 }
12975 
12976 
MApi_JPEG_GetMPOIndex(JPEG_MPO_INDEX_INFO ** ppMPOIndex)12977 MS_BOOL MApi_JPEG_GetMPOIndex(JPEG_MPO_INDEX_INFO **ppMPOIndex)
12978 {
12979 #if (JPEG_UTOPIA20)
12980     if(pInstantNJPD==NULL)
12981     {
12982         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12983         return 0;
12984     }
12985 
12986     JPEG_GETMPOINDEX_PARAM eMPOIndex;
12987     memset(&eMPOIndex , 0 ,sizeof(JPEG_GETMPOINDEX_PARAM));
12988     eMPOIndex.pMPOIndex = &gNJPEGContext._stMPOIndex[gNJPEGContext.eNJPDNum];
12989     *ppMPOIndex = eMPOIndex.pMPOIndex;
12990 
12991     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetMPOIndex\n");
12992     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetMPOIndex, (void*)(&eMPOIndex)) != UTOPIA_STATUS_SUCCESS)
12993     {
12994         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
12995         return 0;
12996     }
12997     return eMPOIndex.bretVal;
12998 #else
12999     return _MApi_JPEG_GetMPOIndex(ppMPOIndex);
13000 #endif
13001 }
13002 
MApi_JPEG_GetMPOAttr(MS_U32 image_no,JPEG_MPO_ATTRIBUTE_INFO ** ppMPOAttr)13003 MS_BOOL MApi_JPEG_GetMPOAttr(MS_U32 image_no, JPEG_MPO_ATTRIBUTE_INFO **ppMPOAttr)
13004 {
13005 #if (JPEG_UTOPIA20)
13006     if(pInstantNJPD==NULL)
13007     {
13008         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
13009         return 0;
13010     }
13011 
13012     JPEG_GETMPOATTR_PARAM eMPOAttr;
13013     memset(&eMPOAttr , 0 ,sizeof(JPEG_GETMPOATTR_PARAM));
13014     eMPOAttr.image_no = image_no;
13015     eMPOAttr.pMPOAttr = &gNJPEGContext._stMPOAttri[gNJPEGContext.eNJPDNum][image_no - 1];
13016     *ppMPOAttr = eMPOAttr.pMPOAttr;
13017 
13018     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetMPOAttr\n");
13019     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetMPOAttr, (void*)(&eMPOAttr)) != UTOPIA_STATUS_SUCCESS)
13020     {
13021         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
13022         return 0;
13023     }
13024     return eMPOAttr.bretVal;
13025 #else
13026     return _MApi_JPEG_GetMPOAttr(image_no, ppMPOAttr);
13027 #endif
13028 }
13029 
MApi_JPEG_DumpMPO(void)13030 void MApi_JPEG_DumpMPO(void)
13031 {
13032 #if (JPEG_UTOPIA20)
13033     if(pInstantNJPD==NULL)
13034     {
13035         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
13036         return;
13037     }
13038 
13039     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_DumpMPO\n");
13040     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_DumpMPO, NULL) != UTOPIA_STATUS_SUCCESS)
13041     {
13042         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
13043     }
13044 #else
13045     _MApi_JPEG_DumpMPO();
13046 #endif
13047 }
13048 
MApi_JPEG_SetMPOBuffer(MS_U32 read_offset,MS_U32 output_start)13049 MS_BOOL MApi_JPEG_SetMPOBuffer(MS_U32 read_offset, MS_U32 output_start)
13050 {
13051 #if (JPEG_UTOPIA20)
13052     if(pInstantNJPD==NULL)
13053     {
13054         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
13055         return 0;
13056     }
13057 
13058     JPEG_SETMPOBUFFER_PARAM eMPOBuff;
13059     memset(&eMPOBuff , 0 ,sizeof(JPEG_SETMPOBUFFER_PARAM));
13060     eMPOBuff.read_offset = read_offset;
13061     eMPOBuff.output_start = output_start;
13062     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetMPOBuffer\n");
13063     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_SetMPOBuffer, (void*)(&eMPOBuff)) != UTOPIA_STATUS_SUCCESS)
13064     {
13065         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
13066         return 0;
13067     }
13068     return eMPOBuff.bretVal;
13069 #else
13070     return _MApi_JPEG_SetMPOBuffer(read_offset, output_start);
13071 #endif
13072 }
13073 
MApi_JPEG_SetMPOMaxDecodeResolution(MS_U16 u16Width,MS_U16 u16Height)13074 void MApi_JPEG_SetMPOMaxDecodeResolution(MS_U16 u16Width, MS_U16 u16Height)
13075 {
13076 #if (JPEG_UTOPIA20)
13077     if (pInstantNJPD == NULL)
13078     {
13079         UTOPIA_20_DBG("%s(): UtopiaOpen()\n", __FUNCTION__);
13080         if(UtopiaOpen(MODULE_NJPEG_EX | VDEC_DRIVER_BASE, &pInstantNJPD, 0, NULL) !=  UTOPIA_STATUS_SUCCESS)
13081         {
13082             UTOPIA_20_ERR("Open NJPD fail\n");
13083             return;
13084         }
13085     }
13086     if(pInstantNJPD==NULL)
13087     {
13088         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
13089         //UtopiaClose(pInstantNJPD);
13090         return;
13091     }
13092 
13093     JPEG_RESOLUTION_PARAM Resol;
13094     memset(&Resol , 0 ,sizeof(JPEG_RESOLUTION_PARAM));
13095     Resol.u16Width= u16Width;
13096     Resol.u16Height= u16Height;
13097     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetMPOMaxDecodeResolution\n");
13098     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_SetMPOMaxDecodeResolution, (void*)(&Resol)) != UTOPIA_STATUS_SUCCESS)
13099     {
13100         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
13101         UtopiaClose(pInstantNJPD);
13102         pInstantNJPD = NULL;
13103     }
13104 #else
13105     _MApi_JPEG_SetMPOMaxDecodeResolution(u16Width, u16Height);
13106 #endif
13107 }
13108 
MApi_JPEG_SetMPOProMaxDecodeResolution(MS_U16 u16ProWidth,MS_U16 u16ProHeight)13109 void MApi_JPEG_SetMPOProMaxDecodeResolution(MS_U16 u16ProWidth, MS_U16 u16ProHeight)
13110 {
13111 #if (JPEG_UTOPIA20)
13112     if (pInstantNJPD == NULL)
13113     {
13114         UTOPIA_20_DBG("%s(): UtopiaOpen()\n", __FUNCTION__);
13115         if(UtopiaOpen(MODULE_NJPEG_EX | VDEC_DRIVER_BASE, &pInstantNJPD, 0, NULL) !=  UTOPIA_STATUS_SUCCESS)
13116         {
13117             UTOPIA_20_ERR("Open NJPD fail\n");
13118             return;
13119         }
13120     }
13121     if(pInstantNJPD==NULL)
13122     {
13123         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
13124         //UtopiaClose(pInstantNJPD);
13125         return;
13126     }
13127 
13128     JPEG_RESOLUTION_PARAM Resol;
13129     memset(&Resol , 0 ,sizeof(JPEG_RESOLUTION_PARAM));
13130     Resol.u16Width= u16ProWidth;
13131     Resol.u16Height= u16ProHeight;
13132     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetMPOProMaxDecodeResolution\n");
13133     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_SetMPOProMaxDecodeResolution, (void*)(&Resol)) != UTOPIA_STATUS_SUCCESS)
13134     {
13135         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
13136         UtopiaClose(pInstantNJPD);
13137         pInstantNJPD = NULL;
13138     }
13139 #else
13140     _MApi_JPEG_SetMPOProMaxDecodeResolution(u16ProWidth, u16ProHeight);
13141 #endif
13142 }
13143 
13144 #endif
13145 
MApi_JPEG_SetVerificationMode(NJPEG_VerificationMode VerificationMode)13146 void MApi_JPEG_SetVerificationMode(NJPEG_VerificationMode VerificationMode)
13147 {
13148 #if (JPEG_UTOPIA20)
13149     if (pInstantNJPD == NULL)
13150     {
13151         UTOPIA_20_DBG("%s(): UtopiaOpen()\n", __FUNCTION__);
13152         if(UtopiaOpen(MODULE_NJPEG_EX | VDEC_DRIVER_BASE, &pInstantNJPD, 0, NULL) !=  UTOPIA_STATUS_SUCCESS)
13153         {
13154             UTOPIA_20_ERR("Open NJPD fail\n");
13155             return;
13156         }
13157     }
13158     if(pInstantNJPD==NULL)
13159     {
13160         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
13161         //UtopiaClose(pInstantNJPD);
13162         return;
13163     }
13164 
13165     JPEG_VERIFICATION_PARAM VERIFY;
13166     memset(&VERIFY , 0 ,sizeof(JPEG_VERIFICATION_PARAM));
13167     VERIFY.VerificationMode = VerificationMode;
13168     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_SetVerificationMode\n");
13169     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_SetVerificationMode, (void*)(&VERIFY)) != UTOPIA_STATUS_SUCCESS)
13170     {
13171         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
13172         UtopiaClose(pInstantNJPD);
13173         pInstantNJPD = NULL;
13174     }
13175 #else
13176     _MApi_JPEG_SetVerificationMode(VerificationMode);
13177 #endif
13178 }
13179 
MApi_JPEG_GetVerificationMode(void)13180 NJPEG_VerificationMode MApi_JPEG_GetVerificationMode(void)
13181 {
13182 #if (JPEG_UTOPIA20)
13183     if(pInstantNJPD==NULL)
13184     {
13185         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
13186         return E_NJPEG00_NONE;
13187     }
13188 
13189     JPEG_VERIFICATION_PARAM VERIFY;
13190     memset(&VERIFY , 0 ,sizeof(JPEG_VERIFICATION_PARAM));
13191     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetVerificationMode\n");
13192     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetVerificationMode, (void*)(&VERIFY)) != UTOPIA_STATUS_SUCCESS)
13193     {
13194         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
13195         return E_NJPEG00_NONE;
13196     }
13197     return VERIFY.VerificationMode;
13198 #else
13199     return _MApi_JPEG_GetVerificationMode();
13200 #endif
13201 }
13202 
MApi_NJPD_Debug(void)13203 void MApi_NJPD_Debug(void)
13204 {
13205 #if (JPEG_UTOPIA20)
13206     if(pInstantNJPD==NULL)
13207     {
13208         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
13209         return;
13210     }
13211 
13212     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_Debug\n");
13213     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_Debug, NULL) != UTOPIA_STATUS_SUCCESS)
13214     {
13215         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
13216     }
13217 #else
13218     _MApi_NJPD_Debug();
13219 #endif
13220 }
13221 
MApi_JPEG_GetControl(EN_JPEG_GET_CTRL_ID eGetID,MS_U32 * param,MS_U32 u32size)13222 JPEG_Result MApi_JPEG_GetControl(EN_JPEG_GET_CTRL_ID eGetID, MS_U32 *param, MS_U32 u32size)
13223 {
13224 #if (JPEG_UTOPIA20)
13225     if(pInstantNJPD==NULL)
13226     {
13227         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
13228         return E_JPEG_FAILED;
13229     }
13230 
13231     JPEG_GET_CTRL_PARAM eGetCTRL;
13232     memset(&eGetCTRL , 0 ,sizeof(JPEG_GET_CTRL_PARAM));
13233     eGetCTRL.eGetID = eGetID;
13234     eGetCTRL.param = param;
13235     eGetCTRL.u32size = u32size;
13236 
13237     UTOPIA_20_DBG("UtopiaIoctl(): MApi_CMD_JPEG_GetControl\n");
13238     if(UtopiaIoctl(pInstantNJPD,MApi_CMD_JPEG_GetControl, (void*)(&eGetCTRL)) != UTOPIA_STATUS_SUCCESS)
13239     {
13240         UTOPIA_20_ERR("[Fail][%s,%d]\n",__FUNCTION__,__LINE__);
13241         return E_JPEG_FAILED;
13242     }
13243     return eGetCTRL.retVal;
13244 #else
13245     return _MApi_JPEG_GetControl(eGetID, param, u32size);
13246 #endif
13247 }
13248 
MApi_JPEG_GetConfig(void)13249 void MApi_JPEG_GetConfig(void)
13250 {
13251     MApi_JPEG_SetVerificationMode(E_NJPEG00_NONE);
13252 }
13253 
13254