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